1- use crate :: { AsyncBlockSourceResult , BlockHeaderData , BlockSource , BlockSourceError , UnboundedCache } ;
1+ use crate :: { AsyncBlockSourceResult , BlockData , BlockHeaderData , BlockSource , BlockSourceError , UnboundedCache } ;
22use crate :: poll:: { Validate , ValidatedBlockHeader } ;
33
44use bitcoin:: blockdata:: block:: { Block , BlockHeader } ;
@@ -20,6 +20,7 @@ pub struct Blockchain {
2020 without_blocks : Option < std:: ops:: RangeFrom < usize > > ,
2121 without_headers : bool ,
2222 malformed_headers : bool ,
23+ filtered_blocks : bool ,
2324}
2425
2526impl Blockchain {
@@ -77,6 +78,10 @@ impl Blockchain {
7778 Self { malformed_headers : true , ..self }
7879 }
7980
81+ pub fn filtered_blocks ( self ) -> Self {
82+ Self { filtered_blocks : true , ..self }
83+ }
84+
8085 pub fn fork_at_height ( & self , height : usize ) -> Self {
8186 assert ! ( height + 1 < self . blocks. len( ) ) ;
8287 let mut blocks = self . blocks . clone ( ) ;
@@ -146,7 +151,7 @@ impl BlockSource for Blockchain {
146151 } )
147152 }
148153
149- fn get_block < ' a > ( & ' a self , header_hash : & ' a BlockHash ) -> AsyncBlockSourceResult < ' a , Block > {
154+ fn get_block < ' a > ( & ' a self , header_hash : & ' a BlockHash ) -> AsyncBlockSourceResult < ' a , BlockData > {
150155 Box :: pin ( async move {
151156 for ( height, block) in self . blocks . iter ( ) . enumerate ( ) {
152157 if block. header . block_hash ( ) == * header_hash {
@@ -156,7 +161,13 @@ impl BlockSource for Blockchain {
156161 }
157162 }
158163
159- return Ok ( block. clone ( ) ) ;
164+ if self . filtered_blocks {
165+ let header = block. header . clone ( ) ;
166+ let txdata = block. txdata . clone ( ) . into_iter ( ) . enumerate ( ) . collect ( ) ;
167+ return Ok ( BlockData :: FilteredBlock ( header, txdata) ) ;
168+ } else {
169+ return Ok ( BlockData :: FullBlock ( block. clone ( ) ) ) ;
170+ }
160171 }
161172 }
162173 Err ( BlockSourceError :: transient ( "block not found" ) )
@@ -185,13 +196,15 @@ impl chain::Listen for NullChainListener {
185196
186197pub struct MockChainListener {
187198 expected_blocks_connected : RefCell < VecDeque < BlockHeaderData > > ,
199+ expected_filtered_blocks_connected : RefCell < VecDeque < BlockHeaderData > > ,
188200 expected_blocks_disconnected : RefCell < VecDeque < BlockHeaderData > > ,
189201}
190202
191203impl MockChainListener {
192204 pub fn new ( ) -> Self {
193205 Self {
194206 expected_blocks_connected : RefCell :: new ( VecDeque :: new ( ) ) ,
207+ expected_filtered_blocks_connected : RefCell :: new ( VecDeque :: new ( ) ) ,
195208 expected_blocks_disconnected : RefCell :: new ( VecDeque :: new ( ) ) ,
196209 }
197210 }
@@ -201,17 +214,34 @@ impl MockChainListener {
201214 self
202215 }
203216
217+ pub fn expect_filtered_block_connected ( self , block : BlockHeaderData ) -> Self {
218+ self . expected_filtered_blocks_connected . borrow_mut ( ) . push_back ( block) ;
219+ self
220+ }
221+
204222 pub fn expect_block_disconnected ( self , block : BlockHeaderData ) -> Self {
205223 self . expected_blocks_disconnected . borrow_mut ( ) . push_back ( block) ;
206224 self
207225 }
208226}
209227
210228impl chain:: Listen for MockChainListener {
211- fn filtered_block_connected ( & self , header : & BlockHeader , _txdata : & chain :: transaction :: TransactionData , height : u32 ) {
229+ fn block_connected ( & self , block : & Block , height : u32 ) {
212230 match self . expected_blocks_connected . borrow_mut ( ) . pop_front ( ) {
213231 None => {
214- panic ! ( "Unexpected block connected: {:?}" , header. block_hash( ) ) ;
232+ panic ! ( "Unexpected block connected: {:?}" , block. block_hash( ) ) ;
233+ } ,
234+ Some ( expected_block) => {
235+ assert_eq ! ( block. block_hash( ) , expected_block. header. block_hash( ) ) ;
236+ assert_eq ! ( height, expected_block. height) ;
237+ } ,
238+ }
239+ }
240+
241+ fn filtered_block_connected ( & self , header : & BlockHeader , _txdata : & chain:: transaction:: TransactionData , height : u32 ) {
242+ match self . expected_filtered_blocks_connected . borrow_mut ( ) . pop_front ( ) {
243+ None => {
244+ panic ! ( "Unexpected filtered block connected: {:?}" , header. block_hash( ) ) ;
215245 } ,
216246 Some ( expected_block) => {
217247 assert_eq ! ( header. block_hash( ) , expected_block. header. block_hash( ) ) ;
@@ -244,6 +274,11 @@ impl Drop for MockChainListener {
244274 panic ! ( "Expected blocks connected: {:?}" , expected_blocks_connected) ;
245275 }
246276
277+ let expected_filtered_blocks_connected = self . expected_filtered_blocks_connected . borrow ( ) ;
278+ if !expected_filtered_blocks_connected. is_empty ( ) {
279+ panic ! ( "Expected filtered_blocks connected: {:?}" , expected_filtered_blocks_connected) ;
280+ }
281+
247282 let expected_blocks_disconnected = self . expected_blocks_disconnected . borrow ( ) ;
248283 if !expected_blocks_disconnected. is_empty ( ) {
249284 panic ! ( "Expected blocks disconnected: {:?}" , expected_blocks_disconnected) ;
0 commit comments