// 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 }
// 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 }