diff --git a/core/src/blockstream.rs b/core/src/blockstream.rs index bcaa875f7..1a7eaf0d9 100644 --- a/core/src/blockstream.rs +++ b/core/src/blockstream.rs @@ -93,11 +93,7 @@ where leader_id: &Pubkey, entry: &Entry, ) -> Result<()> { - let transactions: Vec> = entry - .transactions - .iter() - .map(|tx| serialize(&tx).unwrap()) - .collect(); + let transactions: Vec> = serialize_transactions(entry); let stream_entry = json!({ "num_hashes": entry.num_hashes, "hash": entry.hash, @@ -160,6 +156,14 @@ impl MockBlockstream { } } +fn serialize_transactions(entry: &Entry) -> Vec> { + entry + .transactions + .iter() + .map(|tx| serialize(&tx).unwrap()) + .collect() +} + #[cfg(test)] mod test { use super::*; @@ -168,8 +172,28 @@ mod test { use serde_json::Value; use solana_sdk::hash::Hash; use solana_sdk::signature::{Keypair, KeypairUtil}; + use solana_sdk::system_transaction::SystemTransaction; use std::collections::HashSet; + #[test] + fn test_serialize_transactions() { + let entry = Entry::new(&Hash::default(), 1, vec![]); + let empty_vec: Vec> = vec![]; + assert_eq!(serialize_transactions(&entry), empty_vec); + + let keypair0 = Keypair::new(); + let keypair1 = Keypair::new(); + let tx0 = SystemTransaction::new_move(&keypair0, &keypair1.pubkey(), 1, Hash::default(), 0); + let tx1 = SystemTransaction::new_move(&keypair1, &keypair0.pubkey(), 2, Hash::default(), 0); + let serialized_tx0 = serialize(&tx0).unwrap(); + let serialized_tx1 = serialize(&tx1).unwrap(); + let entry = Entry::new(&Hash::default(), 1, vec![tx0, tx1]); + assert_eq!( + serialize_transactions(&entry), + vec![serialized_tx0, serialized_tx1] + ); + } + #[test] fn test_blockstream() -> () { let blockstream = MockBlockstream::new("test_stream".to_string()); diff --git a/core/src/blockstream_service.rs b/core/src/blockstream_service.rs index 0cedd2d1c..a3991567a 100644 --- a/core/src/blockstream_service.rs +++ b/core/src/blockstream_service.rs @@ -109,7 +109,7 @@ mod test { use super::*; use crate::blocktree::create_new_tmp_ledger; use crate::entry::{create_ticks, Entry}; - use bincode::deserialize; + use bincode::{deserialize, serialize}; use chrono::{DateTime, FixedOffset}; use serde_json::Value; use solana_sdk::genesis_block::GenesisBlock; @@ -197,8 +197,14 @@ mod test { .as_array() .unwrap() .into_iter() - .map(|tx| { + .enumerate() + .map(|(j, tx)| { let tx_vec: Vec = serde_json::from_value(tx.clone()).unwrap(); + // Check explicitly that transaction matches bincode-serialized format + assert_eq!( + tx_vec, + serialize(&expected_entries[i].transactions[j]).unwrap() + ); deserialize(&tx_vec).unwrap() }) .collect(),