Skip to content

Commit 31d929d

Browse files
authored
Merge pull request #695 from Emurgo/evgenii/bootstrap_witnesses_fakes
12.1.1
2 parents e3ef4b1 + 0afdbe5 commit 31d929d

File tree

10 files changed

+136
-30
lines changed

10 files changed

+136
-30
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cardano-serialization-lib",
3-
"version": "12.1.0",
3+
"version": "12.1.1",
44
"description": "(De)serialization functions for the Cardano blockchain along with related utility functions",
55
"scripts": {
66
"rust:build-nodejs": "(rimraf ./rust/pkg && cd rust; wasm-pack build --target=nodejs; cd ..; npm run js:ts-json-gen; cd rust; wasm-pack pack) && npm run js:flowgen",

rust/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cardano-serialization-lib"
3-
version = "12.1.0"
3+
version = "12.1.1"
44
edition = "2018"
55
authors = ["EMURGO"]
66
license = "MIT"

rust/json-gen/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/src/builders/fakes.rs

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{Bip32PrivateKey, Ed25519Signature, PublicKey};
1+
use crate::{Bip32PrivateKey, BootstrapWitness, ByronAddress, Ed25519Signature, PublicKey, Vkey};
22

33
pub(crate) fn fake_private_key() -> Bip32PrivateKey {
44
Bip32PrivateKey::from_bytes(&[
@@ -10,7 +10,7 @@ pub(crate) fn fake_private_key() -> Bip32PrivateKey {
1010
0xfd, 0xa5, 0x78, 0x60, 0xac, 0x87, 0x6b, 0xc4, 0x89, 0x19, 0x2c, 0x1e, 0xf4, 0xce, 0x25,
1111
0x3c, 0x19, 0x7e, 0xe2, 0x19, 0xa4,
1212
])
13-
.unwrap()
13+
.unwrap()
1414
}
1515

1616
pub(crate) fn fake_raw_key_sig() -> Ed25519Signature {
@@ -20,18 +20,65 @@ pub(crate) fn fake_raw_key_sig() -> Ed25519Signature {
2020
24, 40, 73, 45, 119, 122, 103, 39, 253, 102, 194, 251, 204, 189, 168, 194, 174, 237, 146,
2121
3, 44, 153, 121, 10,
2222
])
23-
.unwrap()
23+
.unwrap()
2424
}
2525

2626
pub(crate) fn fake_raw_key_public(x: u64) -> PublicKey {
27-
let mut bytes = [0u8; 64];
27+
let mut x_bytes = [0u8; 8];
2828
for i in 0..8 {
29-
bytes[i] = ((x >> (i * 8)) & 0xff) as u8;
29+
x_bytes[i] = ((x >> (i * 8)) & 0xff) as u8;
3030
}
3131
PublicKey::from_bytes(&[
3232
207, 118, 57, 154, 33, 13, 232, 114, 14, 159, 168, 148, 228, 94, 65, 226, 154, 181, 37,
33-
227, 11, 196, 2, 128, bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6],
34-
bytes[7]
33+
227, 11, 196, 2, 128, x_bytes[0], x_bytes[1], x_bytes[2], x_bytes[3], x_bytes[4],
34+
x_bytes[5], x_bytes[6], x_bytes[7],
3535
])
36-
.unwrap()
37-
}
36+
.unwrap()
37+
}
38+
39+
pub(crate) fn fake_bootstrap_witness(index: u64, addr: &ByronAddress) -> BootstrapWitness {
40+
let mut bytes = [0u8; 32];
41+
for i in 0..32 {
42+
bytes[i] = i as u8;
43+
}
44+
let vkey = fake_vkey_numbered(index);
45+
let signature = fake_signature(index);
46+
let chain_code = fake_chain_code();
47+
BootstrapWitness::new(&vkey, &signature, chain_code, addr.attributes())
48+
}
49+
50+
fn fake_vkey_numbered(x: u64) -> Vkey {
51+
let mut bytes = [0u8; 8];
52+
for i in 0..8 {
53+
bytes[i] = ((x >> (i * 8)) & 0xff) as u8;
54+
}
55+
let bytes = [
56+
0x82, 0x2c, 0x1e, 0xf4, 0xce, 0x25, 0x3c, 0x19, 0x7e, 0xe2, 0x19, 0xa4, 0x36, 0xf8, 0x99,
57+
0xd3, 0x9b, 0x17, 0xfd, 0x5d, 0x66, 0xc1, 0x92, 0xc4, bytes[0], bytes[1], bytes[2],
58+
bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
59+
];
60+
Vkey::new(&PublicKey::from_bytes(&bytes).unwrap())
61+
}
62+
63+
fn fake_signature(x: u64) -> Ed25519Signature {
64+
let mut x_bytes = [0u8; 8];
65+
for i in 0..8 {
66+
x_bytes[i] = ((x >> (i * 8)) & 0xff) as u8;
67+
}
68+
let bytes = [
69+
0x24, 0xf8, 0x99, 0xd3, 0x9b, 0x17, 0xfd, 0x5d, 0x66, 0xc1, 0x92, 0xc4, 0xb5, 0x0d, 0x34,
70+
0x3e, 0x42, 0xf7, 0x23, 0x5b, 0x30, 0x4c, 0x8a, 0xe7, 0x61, 0x9f, 0x93, 0xc8, 0x28, 0xdc,
71+
0x6d, 0xce, 0x45, 0x68, 0xdd, 0x69, 0x17, 0x7c, 0x55, 0x18, 0x28, 0x49, 0x2d, 0x77, 0x7a,
72+
0xc2, 0xfb, 0xcc, 0xbd, 0xa8, 0xc2, 0xae, 0xed, 0x92, 0x03, 0x2c, x_bytes[0], x_bytes[1],
73+
x_bytes[2], x_bytes[3], x_bytes[4], x_bytes[5], x_bytes[6], x_bytes[7],
74+
];
75+
Ed25519Signature::from_bytes(bytes.to_vec()).unwrap()
76+
}
77+
78+
fn fake_chain_code() -> Vec<u8> {
79+
let mut bytes = Vec::with_capacity(32);
80+
for i in 0..32 {
81+
bytes.push(i as u8);
82+
}
83+
bytes
84+
}

rust/src/builders/tx_builder.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::*;
44

55
use super::*;
6-
use crate::builders::fakes::{fake_private_key, fake_raw_key_public, fake_raw_key_sig};
6+
use crate::builders::fakes::{fake_bootstrap_witness, fake_raw_key_public, fake_raw_key_sig};
77
use crate::fees;
88
use crate::utils;
99
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
@@ -34,7 +34,6 @@ pub(crate) fn fake_full_tx(
3434
tx_builder: &TransactionBuilder,
3535
body: TransactionBody,
3636
) -> Result<Transaction, JsError> {
37-
let fake_key_root = fake_private_key();
3837
let fake_sig = fake_raw_key_sig();
3938

4039
// recall: this includes keys for input, certs and withdrawals
@@ -55,13 +54,11 @@ pub(crate) fn fake_full_tx(
5554
0 => None,
5655
_x => {
5756
let mut result = BootstrapWitnesses::new();
57+
let mut number = 1;
5858
for addr in bootstraps {
59+
number += 1;
5960
// picking icarus over daedalus for fake witness generation shouldn't matter
60-
result.add(&make_icarus_bootstrap_witness(
61-
&TransactionHash::from([0u8; TransactionHash::BYTE_COUNT]),
62-
&ByronAddress::from_bytes(addr.clone()).unwrap(),
63-
&fake_key_root,
64-
));
61+
result.add(&fake_bootstrap_witness(number, &ByronAddress::from_bytes(addr)?));
6562
}
6663
Some(result)
6764
}

rust/src/tests/builders/tx_builder.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::tests::helpers::harden;
2-
use crate::tests::fakes::{fake_byron_address, fake_anchor, fake_change_address, fake_default_tx_builder, fake_linear_fee, fake_reallistic_tx_builder, fake_redeemer, fake_redeemer_zero_cost, fake_rich_tx_builder, fake_tx_builder, fake_tx_builder_with_amount, fake_tx_builder_with_fee, fake_tx_builder_with_fee_and_pure_change, fake_tx_builder_with_fee_and_val_size, fake_tx_builder_with_key_deposit, fake_base_address, fake_bytes_32, fake_data_hash, fake_key_hash, fake_plutus_script_and_hash, fake_policy_id, fake_script_hash, fake_tx_hash, fake_tx_input, fake_tx_input2, fake_value, fake_value2, fake_vkey_witness, fake_root_key_15, fake_base_address_with_payment_cred};
2+
use crate::tests::fakes::{fake_byron_address, fake_anchor, fake_change_address, fake_default_tx_builder, fake_linear_fee, fake_reallistic_tx_builder, fake_redeemer, fake_redeemer_zero_cost, fake_rich_tx_builder, fake_tx_builder, fake_tx_builder_with_amount, fake_tx_builder_with_fee, fake_tx_builder_with_fee_and_pure_change, fake_tx_builder_with_fee_and_val_size, fake_tx_builder_with_key_deposit, fake_base_address, fake_bytes_32, fake_data_hash, fake_key_hash, fake_plutus_script_and_hash, fake_policy_id, fake_script_hash, fake_tx_hash, fake_tx_input, fake_tx_input2, fake_value, fake_value2, fake_vkey_witness, fake_root_key_15, fake_base_address_with_payment_cred, fake_bootsrap_witness, fake_bootsrap_witness_with_attrs};
33
use crate::*;
44

55
use crate::builders::fakes::fake_private_key;
@@ -6435,4 +6435,57 @@ fn ref_inputs_and_reg_inputs_no_intersection_error() {
64356435
let ref_inputs = tx.body().reference_inputs().unwrap();
64366436
assert!(ref_inputs.contains(&tx_in_3));
64376437
assert_eq!(ref_inputs.len(), 1);
6438+
}
6439+
6440+
#[test]
6441+
fn multiple_boostrap_witnesses() {
6442+
let mut tx_builder = fake_reallistic_tx_builder();
6443+
let change_address = fake_base_address(1);
6444+
let input_1 = fake_tx_input(1);
6445+
let input_2 = fake_tx_input(2);
6446+
let input_3 = fake_tx_input(3);
6447+
let input_4 = fake_tx_input(4);
6448+
let input_5 = fake_tx_input(5);
6449+
6450+
let addr_1 = ByronAddress::from_base58("Ae2tdPwUPEZBF8HDUYPkACXQrnZtmbKrdJfpBdx3NwcVs6TkvHsgTCi8DKJ").unwrap().to_address();
6451+
let addr_2 = ByronAddress::from_base58("Ae2tdPwUPEZAmhukfkcunjRRHJyuYEgM8YiKxMxUtaGvmEEy3fpcCdf8urC").unwrap().to_address();
6452+
let addr_3 = ByronAddress::from_base58("Ae2tdPwUPEZ2rukBdtHHiNpdXJ2BU6PbQUFZP6FsJ4ZdbRDCwdKpCEYPGWS").unwrap().to_address();
6453+
let addr_4 = ByronAddress::from_base58("Ae2tdPwUPEZ6EbrKDUyyv3tNr7tyC3SFumXvuLEZc8UUz9m65Sx8BFnkAm5").unwrap().to_address();
6454+
let addr_5 = ByronAddress::from_base58("Ae2tdPwUPEZ5N7ubvrUXM4YJPLsyeuc6A3bN2kAuFTEK9iYiumrn7REkb9V").unwrap().to_address();
6455+
6456+
let value_1 = Value::new(&Coin::from(4000000u64));
6457+
let value_2 = Value::new(&Coin::from(5000000u64));
6458+
let value_3 = Value::new(&Coin::from(2000000u64));
6459+
let value_4 = Value::new(&Coin::from(1000000u64));
6460+
let value_5 = Value::new(&Coin::from(3000000u64));
6461+
6462+
tx_builder.add_regular_input(&addr_1, &input_1, &value_1).unwrap();
6463+
tx_builder.add_regular_input(&addr_2, &input_2, &value_2).unwrap();
6464+
tx_builder.add_regular_input(&addr_3, &input_3, &value_3).unwrap();
6465+
tx_builder.add_regular_input(&addr_4, &input_4, &value_4).unwrap();
6466+
tx_builder.add_regular_input(&addr_5, &input_5, &value_5).unwrap();
6467+
6468+
tx_builder.add_change_if_needed(&change_address).unwrap();
6469+
6470+
let res = tx_builder.build_tx();
6471+
assert!(res.is_ok());
6472+
6473+
let attributes = vec![127u8];
6474+
let mut bootstrap_witnesses = BootstrapWitnesses::new();
6475+
bootstrap_witnesses.add(&fake_bootsrap_witness_with_attrs(1, attributes.clone()));
6476+
bootstrap_witnesses.add(&fake_bootsrap_witness_with_attrs(2, attributes.clone()));
6477+
bootstrap_witnesses.add(&fake_bootsrap_witness_with_attrs(3, attributes.clone()));
6478+
bootstrap_witnesses.add(&fake_bootsrap_witness_with_attrs(4, attributes.clone()));
6479+
bootstrap_witnesses.add(&fake_bootsrap_witness_with_attrs(5, attributes.clone()));
6480+
6481+
let mut tx = res.unwrap();
6482+
let mut wit_set = tx.witness_set();
6483+
wit_set.set_bootstraps(&bootstrap_witnesses);
6484+
tx = Transaction::new(&tx.body(), &wit_set, tx.auxiliary_data());
6485+
let tx_len = tx.to_bytes().len();
6486+
6487+
let total_tx_fee = tx.body().fee();
6488+
let min_fee = min_fee_for_size(tx_len, &fake_linear_fee(44, 155381)).unwrap();
6489+
6490+
assert!(total_tx_fee >= min_fee);
64386491
}

rust/src/tests/fakes.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ pub(crate) fn fake_vkey_witness(x: u8) -> Vkeywitness {
616616
Vkeywitness::new(&fake_vkey_numbered(x), &fake_signature(x))
617617
}
618618

619-
pub(crate) fn fake_boostrap_witness(x: u8) -> BootstrapWitness {
619+
pub(crate) fn fake_bootsrap_witness(x: u8) -> BootstrapWitness {
620620
BootstrapWitness::new(
621621
&fake_vkey_numbered(x),
622622
&fake_signature(x),
@@ -625,6 +625,15 @@ pub(crate) fn fake_boostrap_witness(x: u8) -> BootstrapWitness {
625625
)
626626
}
627627

628+
pub(crate) fn fake_bootsrap_witness_with_attrs(x: u8, attributes: Vec<u8>) -> BootstrapWitness {
629+
BootstrapWitness::new(
630+
&fake_vkey_numbered(x),
631+
&fake_signature(x),
632+
vec![x; 32],
633+
attributes,
634+
)
635+
}
636+
628637
pub(crate) fn fake_plutus_script_and_hash(x: u8) -> (PlutusScript, ScriptHash) {
629638
let s = PlutusScript::new(fake_bytes_32(x));
630639
(s.clone(), s.hash())

rust/src/tests/general.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::*;
22
use crate::tests::helpers::harden;
3-
use crate::tests::fakes::{fake_plutus_script, fake_boostrap_witness, fake_tx_input, fake_vkey_witness};
3+
use crate::tests::fakes::{fake_plutus_script, fake_bootsrap_witness, fake_tx_input, fake_vkey_witness};
44

55
#[test]
66
fn native_script_hash() {
@@ -462,8 +462,8 @@ fn ed25519_key_hashes_dedup() {
462462
#[test]
463463
fn bootstrap_witnesses_dedup() {
464464
let mut bootstrap_witnesses = BootstrapWitnesses::new();
465-
let bootstrap_witness1 = fake_boostrap_witness(1);
466-
let bootstrap_witness2 = fake_boostrap_witness(2);
465+
let bootstrap_witness1 = fake_bootsrap_witness(1);
466+
let bootstrap_witness2 = fake_bootsrap_witness(2);
467467

468468
assert!(bootstrap_witnesses.add(&bootstrap_witness1));
469469
assert!(bootstrap_witnesses.add(&bootstrap_witness2));

rust/src/tests/serialization/general.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{Address, BigInt, BigNum, Block, BlockHash, CborContainerType, Coin, Credential, DataHash, ExUnits, HeaderBody, HeaderLeaderCertEnum, Int, KESVKey, MIRPot, MIRToStakeCredentials, MoveInstantaneousReward, NativeScript, OperationalCert, PlutusData, PlutusList, PlutusScript, PlutusScripts, ProtocolVersion, Redeemer, RedeemerTag, Redeemers, ScriptHash, ScriptRef, TimelockStart, TransactionBody, TransactionInputs, TransactionOutput, TransactionOutputs, TransactionWitnessSet, VRFCert, VRFVKey, Value, Vkeywitness, Vkeywitnesses, VersionedBlock, BlockEra, to_bytes, BootstrapWitnesses, Credentials, Ed25519KeyHashes};
22

33
use crate::protocol_types::ScriptRefEnum;
4-
use crate::tests::fakes::{fake_base_address, fake_boostrap_witness, fake_bytes_32, fake_data_hash, fake_key_hash, fake_signature, fake_tx_input, fake_tx_output, fake_value, fake_value2, fake_vkey, fake_vkey_witness};
4+
use crate::tests::fakes::{fake_base_address, fake_bootsrap_witness, fake_bytes_32, fake_data_hash, fake_key_hash, fake_signature, fake_tx_input, fake_tx_output, fake_value, fake_value2, fake_vkey, fake_vkey_witness};
55

66
#[test]
77
fn tx_output_deser_lagacy() {
@@ -798,9 +798,9 @@ fn ref_script_serialization() {
798798
#[test]
799799
fn boostrap_witnesses_round_trip() {
800800
let mut witnesses = BootstrapWitnesses::new();
801-
let bootstrap_witness_1 = fake_boostrap_witness(1);
802-
let bootstrap_witness_2 = fake_boostrap_witness(2);
803-
let bootstrap_witness_3 = fake_boostrap_witness(3);
801+
let bootstrap_witness_1 = fake_bootsrap_witness(1);
802+
let bootstrap_witness_2 = fake_bootsrap_witness(2);
803+
let bootstrap_witness_3 = fake_bootsrap_witness(3);
804804

805805
witnesses.add(&bootstrap_witness_1);
806806
witnesses.add(&bootstrap_witness_2);

0 commit comments

Comments
 (0)