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  }