diff --git a/core/types/cx_receipt.go b/core/types/cx_receipt.go index 2359c6f20..574705f75 100644 --- a/core/types/cx_receipt.go +++ b/core/types/cx_receipt.go @@ -20,12 +20,34 @@ type CXReceipt struct { Amount *big.Int } +// Copy makes a deep copy of the receiver. +func (r *CXReceipt) Copy() *CXReceipt { + if r == nil { + return nil + } + cpy := *r + if cpy.To != nil { + to := *cpy.To + cpy.To = &to + } + cpy.Amount = new(big.Int).Set(cpy.Amount) + return &cpy +} + // CXReceipts is a list of CXReceipt type CXReceipts []*CXReceipt // Len returns the length of s. func (cs CXReceipts) Len() int { return len(cs) } +// Copy makes a deep copy of the receiver. +func (cs CXReceipts) Copy() (cpy CXReceipts) { + for _, r := range cs { + cpy = append(cpy, r.Copy()) + } + return cpy +} + // Swap swaps the i'th and the j'th element in s. func (cs CXReceipts) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] } @@ -70,6 +92,18 @@ type CXMerkleProof struct { CXShardHashes []common.Hash // ordered hash list, each hash corresponds to one destination shard's receipts root hash } +// Copy makes a deep copy of the receiver. +func (cxmp *CXMerkleProof) Copy() *CXMerkleProof { + if cxmp == nil { + return nil + } + cpy := *cxmp + cpy.BlockNum = new(big.Int).Set(cpy.BlockNum) + cpy.ShardIDs = append(cxmp.ShardIDs[:0:0], cpy.ShardIDs...) + cpy.CXShardHashes = append(cpy.CXShardHashes[:0:0], cpy.CXShardHashes...) + return &cpy +} + // CXReceiptsProof carrys the cross shard receipts and merkle proof type CXReceiptsProof struct { Receipts CXReceipts @@ -79,12 +113,31 @@ type CXReceiptsProof struct { CommitBitmap []byte } +// Copy makes a deep copy of the receiver. +func (cxp *CXReceiptsProof) Copy() *CXReceiptsProof { + return &CXReceiptsProof{ + Receipts: cxp.Receipts.Copy(), + MerkleProof: cxp.MerkleProof.Copy(), + Header: CopyHeader(cxp.Header), + CommitSig: append(cxp.CommitSig[:0:0], cxp.CommitSig...), + CommitBitmap: append(cxp.CommitBitmap[:0:0], cxp.CommitSig...), + } +} + // CXReceiptsProofs is a list of CXReceiptsProof type CXReceiptsProofs []*CXReceiptsProof // Len returns the length of s. func (cs CXReceiptsProofs) Len() int { return len(cs) } +// Copy makes a deep copy of the receiver. +func (cs CXReceiptsProofs) Copy() (cpy CXReceiptsProofs) { + for _, cxrp := range cs { + cpy = append(cpy, cxrp.Copy()) + } + return cpy +} + // Swap swaps the i'th and the j'th element in s. func (cs CXReceiptsProofs) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] }