github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/firo/firomsgtx.go (about) 1 package firo 2 3 import ( 4 "bytes" 5 "io" 6 7 "github.com/martinboehm/btcd/chaincfg/chainhash" 8 "github.com/martinboehm/btcd/wire" 9 ) 10 11 // FiroMsgTx encapsulate firo tx and extra 12 type FiroMsgTx struct { 13 wire.MsgTx 14 Extra []byte 15 } 16 17 // TxHash calculate hash of transaction 18 func (msg *FiroMsgTx) TxHash() chainhash.Hash { 19 extraSize := uint64(len(msg.Extra)) 20 sizeOfExtraSize := 0 21 if extraSize != 0 { 22 sizeOfExtraSize = wire.VarIntSerializeSize(extraSize) 23 } 24 25 // Original payload 26 buf := bytes.NewBuffer(make([]byte, 0, 27 msg.SerializeSizeStripped()+sizeOfExtraSize+len(msg.Extra))) 28 _ = msg.SerializeNoWitness(buf) 29 30 // Extra payload 31 if extraSize != 0 { 32 wire.WriteVarInt(buf, 0, extraSize) 33 buf.Write(msg.Extra) 34 } 35 36 return chainhash.DoubleHashH(buf.Bytes()) 37 } 38 39 // FiroDecode to decode bitcoin tx and extra 40 func (msg *FiroMsgTx) FiroDecode(r io.Reader, pver uint32, enc wire.MessageEncoding) error { 41 if err := msg.MsgTx.BtcDecode(r, pver, enc); err != nil { 42 return err 43 } 44 45 // extra 46 version := uint32(msg.Version) 47 txVersion := version & 0xffff 48 txType := (version >> 16) & 0xffff 49 if txVersion == 3 && txType != 0 { 50 51 extraSize, err := wire.ReadVarInt(r, 0) 52 if err != nil { 53 return err 54 } 55 56 msg.Extra = make([]byte, extraSize) 57 _, err = io.ReadFull(r, msg.Extra[:]) 58 if err != nil { 59 return err 60 } 61 } 62 63 return nil 64 }