Skip to content

Commit c065577

Browse files
Alessandro KonradAlessandro Konrad
authored andcommitted
added is_valid to transaction
1 parent 1bc6a81 commit c065577

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

rust/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub enum DeserializeFailure {
3030
DuplicateKey(Key),
3131
EndingBreakMissing,
3232
ExpectedNull,
33+
ExpectedBool,
3334
FixedValueMismatch{
3435
found: Key,
3536
expected: Key,
@@ -95,6 +96,7 @@ impl std::fmt::Display for DeserializeError {
9596
DeserializeFailure::DuplicateKey(key) => write!(f, "Duplicate key: {}", key),
9697
DeserializeFailure::EndingBreakMissing => write!(f, "Missing ending CBOR Break"),
9798
DeserializeFailure::ExpectedNull => write!(f, "Expected null, found other type"),
99+
DeserializeFailure::ExpectedBool => write!(f, "Expected bool, found other type"),
98100
DeserializeFailure::FixedValueMismatch{ found, expected } => write!(f, "Expected fixed value {} found {}", expected, found),
99101
DeserializeFailure::MandatoryFieldMissing(key) => write!(f, "Mandatory field {} not found", key),
100102
DeserializeFailure::Metadata(e) => write!(f, "Metadata error: {:?}", e),

rust/src/fees.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,18 @@ mod tests {
7676
let signed_tx = Transaction::new(
7777
&body,
7878
&w,
79+
true,
7980
None,
8081
);
8182

8283
let linear_fee = LinearFee::new(&to_bignum(500), &to_bignum(2));
8384
assert_eq!(
8485
hex::encode(signed_tx.to_bytes()),
85-
"83a400818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00016f32030aa10081825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840fae5de40c94d759ce13bf9886262159c4f26a289fd192e165995b785259e503f6887bf39dfa23a47cf163784c6eee23f61440e749bc1df3c73975f5231aeda0ff6"
86+
"83a400818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00016f32030aa10081825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840fae5de40c94d759ce13bf9886262159c4f26a289fd192e165995b785259e503f6887bf39dfa23a47cf163784c6eee23f61440e749bc1df3c73975f5231aeda0ff5f6"
8687
);
8788
assert_eq!(
8889
min_fee(&signed_tx, &linear_fee).unwrap().to_str(),
89-
"94002" // todo: compare to Haskell fee to make sure the diff is not too big
90+
"94502" // todo: compare to Haskell fee to make sure the diff is not too big
9091
);
9192
}
9293

@@ -122,17 +123,18 @@ mod tests {
122123
let signed_tx = Transaction::new(
123124
&body,
124125
&w,
126+
true,
125127
None,
126128
);
127129

128130
let linear_fee = LinearFee::new(&to_bignum(500), &to_bignum(2));
129131
assert_eq!(
130132
hex::encode(signed_tx.to_bytes()),
131-
"83a400818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a0001b582030aa10281845820473811afd4d939b337c9be1a2ceeb2cb2c75108bddf224c5c21c51592a7b204a5840f0b04a852353eb23b9570df80b2aa6a61b723341ab45a2024a05b07cf58be7bdfbf722c09040db6cee61a0d236870d6ad1e1349ac999ec0db28f9471af25fb0c5820c8b95d0d35fe75a70f9f5633a3e2439b2994b9e2bc851c49e9f91d1a5dcbb1a341a0f6"
133+
"83a400818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a0001b582030aa10281845820473811afd4d939b337c9be1a2ceeb2cb2c75108bddf224c5c21c51592a7b204a5840f0b04a852353eb23b9570df80b2aa6a61b723341ab45a2024a05b07cf58be7bdfbf722c09040db6cee61a0d236870d6ad1e1349ac999ec0db28f9471af25fb0c5820c8b95d0d35fe75a70f9f5633a3e2439b2994b9e2bc851c49e9f91d1a5dcbb1a341a0f5f6"
132134
);
133135
assert_eq!(
134136
min_fee(&signed_tx, &linear_fee).unwrap().to_str(),
135-
"112002" // todo: compare to Haskell fee to make sure the diff is not too big
137+
"112502" // todo: compare to Haskell fee to make sure the diff is not too big
136138
);
137139
}
138140

@@ -192,17 +194,18 @@ mod tests {
192194
let signed_tx = Transaction::new(
193195
&body,
194196
&w,
197+
true,
195198
None,
196199
);
197200

198201
let linear_fee = LinearFee::new(&to_bignum(500), &to_bignum(2));
199202
assert_eq!(
200203
hex::encode(signed_tx.to_bytes()),
201-
"83a400828258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b7182a82582082839f8200d81858248258203b40265111d8bb3c3c608d95b3a0bf83461ace3207018282581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c19012182581d61bcd18fcffa797c16c007014e2b8553b8b9b1e94c507688726243d6111a3420989c021a0002ccce031903e7a10082825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee58401ec3e56008650282ba2e1f8a20e81707810b2d0973c4d42a1b4df65b732bda81567c7824904840b2554d2f33861da5d70588a29d33b2b61042e3c3445301d8008258206872b0a874acfe1cace12b20ea348559a7ecc912f2fc7f674f43481df973d92c5840a0718fb5b37d89ddf926c08e456d3f4c7f749e91f78bb3e370751d5b632cbd20d38d385805291b1ef2541b02543728a235e01911f4b400bfb50e5fce589de907f6"
204+
"83a400828258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b7182a82582082839f8200d81858248258203b40265111d8bb3c3c608d95b3a0bf83461ace3207018282581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c19012182581d61bcd18fcffa797c16c007014e2b8553b8b9b1e94c507688726243d6111a3420989c021a0002ccce031903e7a10082825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee58401ec3e56008650282ba2e1f8a20e81707810b2d0973c4d42a1b4df65b732bda81567c7824904840b2554d2f33861da5d70588a29d33b2b61042e3c3445301d8008258206872b0a874acfe1cace12b20ea348559a7ecc912f2fc7f674f43481df973d92c5840a0718fb5b37d89ddf926c08e456d3f4c7f749e91f78bb3e370751d5b632cbd20d38d385805291b1ef2541b02543728a235e01911f4b400bfb50e5fce589de907f5f6"
202205
);
203206
assert_eq!(
204207
min_fee(&signed_tx, &linear_fee).unwrap().to_str(),
205-
"183502" // todo: compare to Haskell fee to make sure the diff is not too big
208+
"184002" // todo: compare to Haskell fee to make sure the diff is not too big
206209
);
207210
}
208211

@@ -288,17 +291,18 @@ mod tests {
288291
let signed_tx = Transaction::new(
289292
&body,
290293
&w,
294+
true,
291295
None,
292296
);
293297

294298
let linear_fee = LinearFee::new(&to_bignum(500), &to_bignum(2));
295299
assert_eq!(
296300
hex::encode(signed_tx.to_bytes()),
297-
"83a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00040f12030a04818a03581c1c13374874c68016df54b1339b6cacdd801098431e7659b24928efc15820bd0000f498ccacdc917c28274cba51c415f3f21931ff41ca8dc1197499f8e1241a000f42401a000f4240d81e82031864581de151df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af7081581c51df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af7080f6a10083825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840a7f305d7e46abfe0f7bea6098bdf853ab9ce8e7aa381be5a991a871852f895a718e20614e22be43494c4dc3a8c78c56cd44fd38e0e5fff3e2fbd19f70402fc02825820b24c040e65994bd5b0621a060166d32d356ef4be3cc1f848426a4cf386887089584013c372f82f1523484eab273241d66d92e1402507760e279480912aa5f0d88d656d6f25d41e65257f2f38c65ac5c918a6735297741adfc718394994f20a1cfd0082582054d1a9c5ad69586ceeb839c438400c376c0bd34825fb4c17cc2f58c54e1437f35840d326b993dfec21b9b3e1bd2f80adadc2cd673a1d8d033618cc413b0b02bc3b7efbb23d1ff99138abd05c398ce98e7983a641b50dcf0f64ed33f26c6e636b0b0ff6"
301+
"83a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00040f12030a04818a03581c1c13374874c68016df54b1339b6cacdd801098431e7659b24928efc15820bd0000f498ccacdc917c28274cba51c415f3f21931ff41ca8dc1197499f8e1241a000f42401a000f4240d81e82031864581de151df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af7081581c51df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af7080f6a10083825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840a7f305d7e46abfe0f7bea6098bdf853ab9ce8e7aa381be5a991a871852f895a718e20614e22be43494c4dc3a8c78c56cd44fd38e0e5fff3e2fbd19f70402fc02825820b24c040e65994bd5b0621a060166d32d356ef4be3cc1f848426a4cf386887089584013c372f82f1523484eab273241d66d92e1402507760e279480912aa5f0d88d656d6f25d41e65257f2f38c65ac5c918a6735297741adfc718394994f20a1cfd0082582054d1a9c5ad69586ceeb839c438400c376c0bd34825fb4c17cc2f58c54e1437f35840d326b993dfec21b9b3e1bd2f80adadc2cd673a1d8d033618cc413b0b02bc3b7efbb23d1ff99138abd05c398ce98e7983a641b50dcf0f64ed33f26c6e636b0b0ff5f6"
298302
);
299303
assert_eq!(
300304
min_fee(&signed_tx, &linear_fee).unwrap().to_str(),
301-
"269002" // todo: compare to Haskell fee to make sure the diff is not too big
305+
"269502" // todo: compare to Haskell fee to make sure the diff is not too big
302306
);
303307
}
304308

@@ -482,17 +486,18 @@ mod tests {
482486
let signed_tx = Transaction::new(
483487
&body,
484488
&w,
489+
true,
485490
None,
486491
);
487492

488493
let linear_fee = LinearFee::new(&to_bignum(500), &to_bignum(2));
489494
assert_eq!(
490495
hex::encode(signed_tx.to_bytes()),
491-
"83a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00027ac6030a05a1581de151df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af70190539a10082825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840fc0493f7121efe385d72830680e735ccdef99c3a31953fe877b89ad3a97fcdb871cc7f2cdd6a8104e52f6963bd9e10d814d4fabdbcdc8475bc63e872dcc94d0a82582054d1a9c5ad69586ceeb839c438400c376c0bd34825fb4c17cc2f58c54e1437f35840a051ba927582004aedab736b9f1f9330ff867c260f4751135d480074256e83cd23d2a4bb109f955c43afdcdc5d1841b28d5c1ea2148dfbb6252693590692bb00f6"
496+
"83a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182581d611c616f1acb460668a9b2f123c80372c2adad3583b9c6cd2b1deeed1c01021a00027ac6030a05a1581de151df9ba1b74a1c9608a487e114184556801e927d31d96425cb80af70190539a10082825820f9aa3fccb7fe539e471188ccc9ee65514c5961c070b06ca185962484a4813bee5840fc0493f7121efe385d72830680e735ccdef99c3a31953fe877b89ad3a97fcdb871cc7f2cdd6a8104e52f6963bd9e10d814d4fabdbcdc8475bc63e872dcc94d0a82582054d1a9c5ad69586ceeb839c438400c376c0bd34825fb4c17cc2f58c54e1437f35840a051ba927582004aedab736b9f1f9330ff867c260f4751135d480074256e83cd23d2a4bb109f955c43afdcdc5d1841b28d5c1ea2148dfbb6252693590692bb00f5f6"
492497
);
493498
assert_eq!(
494499
min_fee(&signed_tx, &linear_fee).unwrap().to_str(),
495-
"162502" // todo: compare to Haskell fee to make sure the diff is not too big
500+
"163002" // todo: compare to Haskell fee to make sure the diff is not too big
496501
);
497502
}
498503
}

rust/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ type Slot = u32;
9797
pub struct Transaction {
9898
body: TransactionBody,
9999
witness_set: TransactionWitnessSet,
100+
is_valid: bool,
100101
auxiliary_data: Option<AuxiliaryData>,
101102
}
102103

@@ -112,18 +113,24 @@ impl Transaction {
112113
self.witness_set.clone()
113114
}
114115

116+
pub fn is_valid(&self) -> bool {
117+
self.is_valid.clone()
118+
}
119+
115120
pub fn auxiliary_data(&self) -> Option<AuxiliaryData> {
116121
self.auxiliary_data.clone()
117122
}
118123

119124
pub fn new(
120125
body: &TransactionBody,
121126
witness_set: &TransactionWitnessSet,
127+
is_valid: bool,
122128
auxiliary_data: Option<AuxiliaryData>,
123129
) -> Self {
124130
Self {
125131
body: body.clone(),
126132
witness_set: witness_set.clone(),
133+
is_valid: is_valid.clone(),
127134
auxiliary_data: auxiliary_data.clone(),
128135
}
129136
}

rust/src/serialization.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl cbor_event::se::Serialize for Transaction {
5959
serializer.write_array(cbor_event::Len::Len(3))?;
6060
self.body.serialize(serializer)?;
6161
self.witness_set.serialize(serializer)?;
62+
serializer.write_special(CBORSpecial::Bool(self.is_valid))?;
6263
match &self.auxiliary_data {
6364
Some(x) => {
6465
x.serialize(serializer)
@@ -94,6 +95,17 @@ impl DeserializeEmbeddedGroup for Transaction {
9495
let witness_set = (|| -> Result<_, DeserializeError> {
9596
Ok(TransactionWitnessSet::deserialize(raw)?)
9697
})().map_err(|e| e.annotate("witness_set"))?;
98+
let is_valid = (|| -> Result<_, DeserializeError> {
99+
Ok(match raw.cbor_type()? == CBORType::Special {
100+
true => {
101+
if let CBORSpecial::Bool(b) = raw.special()? {
102+
return Ok(b);
103+
}
104+
return Err(DeserializeFailure::ExpectedBool.into());
105+
},
106+
_ => return Err(DeserializeFailure::ExpectedBool.into())
107+
})
108+
})().map_err(|e| e.annotate("is_valid"))?;
97109
let auxiliary_data = (|| -> Result<_, DeserializeError> {
98110
Ok(match raw.cbor_type()? != CBORType::Special {
99111
true => {
@@ -110,6 +122,7 @@ impl DeserializeEmbeddedGroup for Transaction {
110122
Ok(Transaction {
111123
body,
112124
witness_set,
125+
is_valid,
113126
auxiliary_data,
114127
})
115128
}

rust/src/tx_builder.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ fn fake_full_tx(tx_builder: &TransactionBuilder, body: TransactionBody) -> Resul
9696
Ok(Transaction {
9797
body,
9898
witness_set,
99+
is_valid: true,
99100
auxiliary_data: tx_builder.auxiliary_data.clone(),
100101
})
101102
}
@@ -662,7 +663,7 @@ mod tests {
662663
tx_builder.get_explicit_input().unwrap().checked_add(&tx_builder.get_implicit_input().unwrap()).unwrap(),
663664
tx_builder.get_explicit_output().unwrap().checked_add(&Value::new(&tx_builder.get_fee_if_set().unwrap())).unwrap()
664665
);
665-
assert_eq!(tx_builder.full_size().unwrap(), 283);
666+
assert_eq!(tx_builder.full_size().unwrap(), 284);
666667
assert_eq!(tx_builder.output_sizes(), vec![61, 65]);
667668
let _final_tx = tx_builder.build(); // just test that it doesn't throw
668669
}
@@ -782,8 +783,8 @@ mod tests {
782783
tx_builder.add_change_if_needed(
783784
&change_addr
784785
).unwrap();
785-
assert_eq!(tx_builder.min_fee().unwrap().to_str(), "213502");
786-
assert_eq!(tx_builder.get_fee_if_set().unwrap().to_str(), "213502");
786+
assert_eq!(tx_builder.min_fee().unwrap().to_str(), "214002");
787+
assert_eq!(tx_builder.get_fee_if_set().unwrap().to_str(), "214002");
787788
assert_eq!(tx_builder.get_deposit().unwrap().to_str(), "1000000");
788789
assert_eq!(tx_builder.outputs.len(), 1);
789790
assert_eq!(

0 commit comments

Comments
 (0)