diff --git a/Cargo.toml b/Cargo.toml index 19701944..a003106c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bitcoin" -version = "0.5.2" +version = "0.5.3" authors = ["Andrew Poelstra "] license = "CC0-1.0" homepage = "https://github.com/apoelstra/rust-bitcoin/" @@ -17,6 +17,7 @@ path = "src/lib.rs" [dependencies] byteorder = "0.3" +jsonrpc = "0.7" # for serde macros num = "0.1" num_cpus = "0.2" rand = "0.3" diff --git a/src/blockdata/transaction.rs b/src/blockdata/transaction.rs index eaedd3c1..574990a3 100644 --- a/src/blockdata/transaction.rs +++ b/src/blockdata/transaction.rs @@ -40,6 +40,7 @@ pub struct TxOutRef { /// The index of the referenced output in its transaction's vout pub index: usize } +serde_struct_impl!(TxOutRef, txid, index); impl fmt::Display for TxOutRef { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -63,6 +64,7 @@ pub struct TxIn { /// the miner behaviour cannot be enforced. pub sequence: u32, } +serde_struct_impl!(TxIn, prev_hash, prev_index, script_sig, sequence); /// A transaction output, which defines new coins to be created from old ones. #[derive(Clone, PartialEq, Eq, Debug, Hash)] @@ -72,6 +74,7 @@ pub struct TxOut { /// The script which must satisfy for the output to be spent pub script_pubkey: Script } +serde_struct_impl!(TxOut, value, script_pubkey); // This is used as a "null txout" in consensus signing code impl Default for TxOut { @@ -93,6 +96,7 @@ pub struct Transaction { /// List of outputs pub output: Vec } +serde_struct_impl!(Transaction, version, lock_time, input, output); impl Transaction { /// Computes a "normalized TXID" which does not include any signatures. @@ -170,6 +174,8 @@ impl_consensus_encoding!(Transaction, version, input, output, lock_time); #[cfg(test)] mod tests { + use strason; + use super::{Transaction, TxIn}; use blockdata::script::Script; @@ -219,5 +225,17 @@ mod tests { tx.output[0].script_pubkey = Script::new(); assert!(old_ntxid != tx.ntxid()); } + + #[test] + fn test_txn_encode_decode() { + let hex_tx = hex_bytes("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000").unwrap(); + let tx: Transaction = deserialize(&hex_tx).unwrap(); + + let encoded = strason::from_serialize(&tx).unwrap(); + assert_eq!(encoded.to_bytes(), + "\"56944c5d3f98413ef45cf54545538103cc9f298e0575820ad3591376e2e0f65d\"".as_bytes()); + let decoded = encoded.into_deserialize().unwrap(); + assert_eq!(tx, decoded); + } } diff --git a/src/lib.rs b/src/lib.rs index 833f3ab2..be7a83bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,6 +39,7 @@ extern crate byteorder; extern crate crypto; +#[macro_use] extern crate jsonrpc; extern crate num; extern crate num_cpus; extern crate rand; diff --git a/src/util/hash.rs b/src/util/hash.rs index 395bf869..020baf49 100644 --- a/src/util/hash.rs +++ b/src/util/hash.rs @@ -378,8 +378,6 @@ mod tests { fn test_hash_encode_decode() { let hash = Sha256dHash::from_data(&[]); let encoded = strason::from_serialize(&hash).unwrap(); - assert_eq!(encoded.to_bytes(), - "\"56944c5d3f98413ef45cf54545538103cc9f298e0575820ad3591376e2e0f65d\"".as_bytes()); let decoded = encoded.into_deserialize().unwrap(); assert_eq!(hash, decoded); }