@@ -31,7 +31,7 @@ use bitcoin::secp256k1::schnorr;
31
31
use bitcoin:: blockdata:: constants:: ChainHash ;
32
32
use bitcoin:: blockdata:: script:: Script ;
33
33
use bitcoin:: blockdata:: transaction:: { OutPoint , Transaction , TxOut } ;
34
- use bitcoin:: consensus;
34
+ use bitcoin:: { consensus, Witness } ;
35
35
use bitcoin:: consensus:: Encodable ;
36
36
use bitcoin:: hashes:: sha256d:: Hash as Sha256dHash ;
37
37
use bitcoin:: hash_types:: { Txid , BlockHash } ;
@@ -772,6 +772,39 @@ impl Readable for Vec<u8> {
772
772
impl_for_vec ! ( ecdsa:: Signature ) ;
773
773
impl_for_vec ! ( ( A , B ) , A , B ) ;
774
774
775
+ impl Writeable for Vec < Witness > {
776
+ fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
777
+ ( self . len ( ) as u16 ) . write ( w) ?;
778
+ for witness in self {
779
+ ( witness. len ( ) as u16 ) . write ( w) ?;
780
+ for element in witness. iter ( ) {
781
+ ( element. len ( ) as u16 ) . write ( w) ?;
782
+ w. write_all ( element) ?;
783
+ }
784
+ }
785
+ Ok ( ( ) )
786
+ }
787
+ }
788
+
789
+ impl Readable for Vec < Witness > {
790
+ fn read < R : Read > ( r : & mut R ) -> Result < Self , DecodeError > {
791
+ let num_witnesses = <u16 as Readable >:: read ( r) ? as usize ;
792
+ let mut witnesses = Vec :: with_capacity ( num_witnesses) ;
793
+ for _ in 0 ..num_witnesses {
794
+ let num_elements = <u16 as Readable >:: read ( r) ? as usize ;
795
+ let mut witness_stack = Vec :: with_capacity ( num_elements) ;
796
+ for _ in 0 ..num_elements {
797
+ let len = <u16 as Readable >:: read ( r) ? as usize ;
798
+ let mut buf = vec ! [ 0 ; len] ;
799
+ r. read_exact ( & mut buf) ?;
800
+ witness_stack. push ( buf) ;
801
+ }
802
+ witnesses. push ( Witness :: from_vec ( witness_stack) ) ;
803
+ }
804
+ Ok ( witnesses)
805
+ }
806
+ }
807
+
775
808
impl Writeable for Script {
776
809
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
777
810
( self . len ( ) as u16 ) . write ( w) ?;
0 commit comments