1+ use std:: io;
12use hashes:: sha256:: Hash ;
23
34use crate :: bls_sig_utils:: BLSSignature ;
@@ -6,6 +7,7 @@ use crate::internal_macros::impl_consensus_encoding;
67use crate :: sml:: masternode_list_entry:: MasternodeListEntry ;
78use crate :: transaction:: special_transaction:: quorum_commitment:: QuorumEntry ;
89use crate :: { BlockHash , ProTxHash , QuorumHash , Transaction } ;
10+ use crate :: consensus:: { encode, Decodable , Encodable } ;
911use crate :: sml:: llmq_type:: LLMQType ;
1012
1113/// The `getmnlistd` message requests a `mnlistdiff` message that provides either:
@@ -54,24 +56,68 @@ pub struct MnListDiff {
5456 /// The list of LLMQ commitments for the LLMQs which were added since `base_block_hash`
5557 pub new_quorums : Vec < QuorumEntry > ,
5658 /// ChainLock signature used to calculate members per quorum indexes (in `new_quorums`)
57- pub quorums_chainlock_signatures : Vec < BLSSignature > ,
59+ pub quorums_chainlock_signatures : Vec < QuorumCLSigObject > ,
5860}
5961
60- impl_consensus_encoding ! (
61- MnListDiff ,
62- version,
63- base_block_hash,
64- block_hash,
65- total_transactions,
66- merkle_hashes,
67- merkle_flags,
68- coinbase_tx,
69- deleted_masternodes,
70- new_masternodes,
71- deleted_quorums,
72- new_quorums,
73- quorums_chainlock_signatures
74- ) ;
62+ impl Encodable for MnListDiff {
63+ fn consensus_encode < W : io:: Write + ?Sized > ( & self , w : & mut W ) -> Result < usize , io:: Error > {
64+ let mut len = 0 ;
65+ len += self . version . consensus_encode ( w) ?;
66+ len += self . base_block_hash . consensus_encode ( w) ?;
67+ len += self . block_hash . consensus_encode ( w) ?;
68+ len += self . total_transactions . consensus_encode ( w) ?;
69+ len += self . merkle_hashes . consensus_encode ( w) ?;
70+ len += self . merkle_flags . consensus_encode ( w) ?;
71+ len += self . coinbase_tx . consensus_encode ( w) ?;
72+ len += self . deleted_masternodes . consensus_encode ( w) ?;
73+ len += self . new_masternodes . consensus_encode ( w) ?;
74+ len += self . deleted_quorums . consensus_encode ( w) ?;
75+ len += self . new_quorums . consensus_encode ( w) ?;
76+ len += self . quorums_chainlock_signatures . consensus_encode ( w) ?;
77+ Ok ( len)
78+ }
79+ }
80+
81+ impl Decodable for MnListDiff {
82+ fn consensus_decode < R : io:: Read + ?Sized > ( r : & mut R ) -> Result < Self , encode:: Error > {
83+ let version = u16:: consensus_decode ( r) ?;
84+ let base_block_hash = BlockHash :: consensus_decode ( r) ?;
85+ let block_hash = BlockHash :: consensus_decode ( r) ?;
86+ let total_transactions = u32:: consensus_decode ( r) ?;
87+ let merkle_hashes = Vec :: < MerkleRootMasternodeList > :: consensus_decode ( r) ?;
88+ let merkle_flags = Vec :: < u8 > :: consensus_decode ( r) ?;
89+ let coinbase_tx = Transaction :: consensus_decode ( r) ?;
90+ let deleted_masternodes = Vec :: < ProTxHash > :: consensus_decode ( r) ?;
91+ let new_masternodes = Vec :: < MasternodeListEntry > :: consensus_decode ( r) ?;
92+ let deleted_quorums = Vec :: < DeletedQuorum > :: consensus_decode ( r) ?;
93+ let new_quorums = Vec :: < QuorumEntry > :: consensus_decode ( r) ?;
94+ let quorums_chainlock_signatures = Vec :: < QuorumCLSigObject > :: consensus_decode ( r) ?;
95+ // println!("{}", quorums_chainlock_signatures.iter().map(hex::encode).collect::<Vec<_>>().join("\n"));
96+
97+ Ok ( MnListDiff {
98+ version,
99+ base_block_hash,
100+ block_hash,
101+ total_transactions,
102+ merkle_hashes,
103+ merkle_flags,
104+ coinbase_tx,
105+ deleted_masternodes,
106+ new_masternodes,
107+ deleted_quorums,
108+ new_quorums,
109+ quorums_chainlock_signatures,
110+ } )
111+ }
112+ }
113+
114+ #[ derive( PartialEq , Eq , Clone , Debug ) ]
115+ pub struct QuorumCLSigObject {
116+ signature : BLSSignature ,
117+ index_set : Vec < u16 > ,
118+ }
119+
120+ impl_consensus_encoding ! ( QuorumCLSigObject , signature, index_set) ;
75121
76122#[ derive( PartialEq , Eq , Clone , Debug ) ]
77123pub struct DeletedQuorum {
0 commit comments