// NewBlockDeepCopyCoinbase returns a new instance of a block given an underlying // wire.MsgBlock, but makes a deep copy of the coinbase transaction since it's // sometimes mutable. func NewBlockDeepCopyCoinbase(msgBlock *wire.MsgBlock) *Block { // Copy the msgBlock and the pointers to all the transactions. msgBlockCopy := new(wire.MsgBlock) lenTxs := len(msgBlock.Transactions) mtxsCopy := make([]*wire.MsgTx, lenTxs) for i, mtx := range msgBlock.Transactions { mtxsCopy[i] = mtx } msgBlockCopy.Transactions = mtxsCopy lenStxs := len(msgBlock.STransactions) smtxsCopy := make([]*wire.MsgTx, lenStxs) for i, smtx := range msgBlock.STransactions { smtxsCopy[i] = smtx } msgBlockCopy.STransactions = smtxsCopy msgBlockCopy.Header = msgBlock.Header // Deep copy the first transaction. Also change the coinbase pointer. msgBlockCopy.Transactions[0] = NewTxDeep(msgBlockCopy.Transactions[0]).MsgTx() bl := &Block{ blockHeight: int64(msgBlockCopy.Header.Height), msgBlock: msgBlockCopy, } bl.hash = msgBlock.BlockHash() return bl }
// NewBlockDeepCopy deep copies an entire block down to the wire components and // returns the new block based off of this copy. func NewBlockDeepCopy(msgBlock *wire.MsgBlock) *Block { // Deep copy the header and all the transactions. msgBlockCopy := new(wire.MsgBlock) lenTxs := len(msgBlock.Transactions) mtxsCopy := make([]*wire.MsgTx, lenTxs) for i, mtx := range msgBlock.Transactions { txd := NewTxDeep(mtx) mtxsCopy[i] = txd.MsgTx() } msgBlockCopy.Transactions = mtxsCopy lenStxs := len(msgBlock.STransactions) smtxsCopy := make([]*wire.MsgTx, lenStxs) for i, smtx := range msgBlock.STransactions { stxd := NewTxDeep(smtx) smtxsCopy[i] = stxd.MsgTx() } msgBlockCopy.STransactions = smtxsCopy msgBlockCopy.Header = msgBlock.Header bl := &Block{ blockHeight: int64(msgBlockCopy.Header.Height), msgBlock: msgBlockCopy, } bl.hash = msgBlock.BlockHash() return bl }
// NewBlock returns a new instance of a block given an underlying // wire.MsgBlock. See Block. func NewBlock(msgBlock *wire.MsgBlock) *Block { return &Block{ hash: msgBlock.BlockHash(), msgBlock: msgBlock, blockHeight: int64(msgBlock.Header.Height), } }
// NewBlockFromBlockAndBytes returns a new instance of a block given // an underlying wire.MsgBlock and the serialized bytes for it. See Block. func NewBlockFromBlockAndBytes(msgBlock *wire.MsgBlock, serializedBlock []byte) *Block { return &Block{ hash: msgBlock.BlockHash(), msgBlock: msgBlock, serializedBlock: serializedBlock, blockHeight: int64(msgBlock.Header.Height), } }
// NewBlockFromReader returns a new instance of a block given a // Reader to deserialize the block. See Block. func NewBlockFromReader(r io.Reader) (*Block, error) { // Deserialize the bytes into a MsgBlock. var msgBlock wire.MsgBlock err := msgBlock.Deserialize(r) if err != nil { return nil, err } b := Block{ hash: msgBlock.BlockHash(), msgBlock: &msgBlock, blockHeight: int64(msgBlock.Header.Height), } return &b, nil }