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,11 @@ impl BlockSource for Blockchain {
156161 }
157162 }
158163
159- return Ok ( block. clone ( ) ) ;
164+ if self . filtered_blocks {
165+ return Ok ( BlockData :: HeaderOnly ( block. header . clone ( ) ) ) ;
166+ } else {
167+ return Ok ( BlockData :: FullBlock ( block. clone ( ) ) ) ;
168+ }
160169 }
161170 }
162171 Err ( BlockSourceError :: transient ( "block not found" ) )
@@ -185,13 +194,15 @@ impl chain::Listen for NullChainListener {
185194
186195pub struct MockChainListener {
187196 expected_blocks_connected : RefCell < VecDeque < BlockHeaderData > > ,
197+ expected_filtered_blocks_connected : RefCell < VecDeque < BlockHeaderData > > ,
188198 expected_blocks_disconnected : RefCell < VecDeque < BlockHeaderData > > ,
189199}
190200
191201impl MockChainListener {
192202 pub fn new ( ) -> Self {
193203 Self {
194204 expected_blocks_connected : RefCell :: new ( VecDeque :: new ( ) ) ,
205+ expected_filtered_blocks_connected : RefCell :: new ( VecDeque :: new ( ) ) ,
195206 expected_blocks_disconnected : RefCell :: new ( VecDeque :: new ( ) ) ,
196207 }
197208 }
@@ -201,17 +212,34 @@ impl MockChainListener {
201212 self
202213 }
203214
215+ pub fn expect_filtered_block_connected ( self , block : BlockHeaderData ) -> Self {
216+ self . expected_filtered_blocks_connected . borrow_mut ( ) . push_back ( block) ;
217+ self
218+ }
219+
204220 pub fn expect_block_disconnected ( self , block : BlockHeaderData ) -> Self {
205221 self . expected_blocks_disconnected . borrow_mut ( ) . push_back ( block) ;
206222 self
207223 }
208224}
209225
210226impl chain:: Listen for MockChainListener {
211- fn filtered_block_connected ( & self , header : & BlockHeader , _txdata : & chain :: transaction :: TransactionData , height : u32 ) {
227+ fn block_connected ( & self , block : & Block , height : u32 ) {
212228 match self . expected_blocks_connected . borrow_mut ( ) . pop_front ( ) {
213229 None => {
214- panic ! ( "Unexpected block connected: {:?}" , header. block_hash( ) ) ;
230+ panic ! ( "Unexpected block connected: {:?}" , block. block_hash( ) ) ;
231+ } ,
232+ Some ( expected_block) => {
233+ assert_eq ! ( block. block_hash( ) , expected_block. header. block_hash( ) ) ;
234+ assert_eq ! ( height, expected_block. height) ;
235+ } ,
236+ }
237+ }
238+
239+ fn filtered_block_connected ( & self , header : & BlockHeader , _txdata : & chain:: transaction:: TransactionData , height : u32 ) {
240+ match self . expected_filtered_blocks_connected . borrow_mut ( ) . pop_front ( ) {
241+ None => {
242+ panic ! ( "Unexpected filtered block connected: {:?}" , header. block_hash( ) ) ;
215243 } ,
216244 Some ( expected_block) => {
217245 assert_eq ! ( header. block_hash( ) , expected_block. header. block_hash( ) ) ;
@@ -244,6 +272,11 @@ impl Drop for MockChainListener {
244272 panic ! ( "Expected blocks connected: {:?}" , expected_blocks_connected) ;
245273 }
246274
275+ let expected_filtered_blocks_connected = self . expected_filtered_blocks_connected . borrow ( ) ;
276+ if !expected_filtered_blocks_connected. is_empty ( ) {
277+ panic ! ( "Expected filtered_blocks connected: {:?}" , expected_filtered_blocks_connected) ;
278+ }
279+
247280 let expected_blocks_disconnected = self . expected_blocks_disconnected . borrow ( ) ;
248281 if !expected_blocks_disconnected. is_empty ( ) {
249282 panic ! ( "Expected blocks disconnected: {:?}" , expected_blocks_disconnected) ;
0 commit comments