/
anchoring_data.go
112 lines (98 loc) · 3.61 KB
/
anchoring_data.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright 2019 The klaytn Authors
// This file is part of the klaytn library.
//
// The klaytn library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The klaytn library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the klaytn library. If not, see <http://www.gnu.org/licenses/>.
package types
import (
"errors"
"github.com/klaytn/klaytn/common"
"github.com/klaytn/klaytn/ser/rlp"
"math/big"
)
const (
AnchoringDataType0 uint8 = 0
)
var (
errUnknownAnchoringTxType = errors.New("unknown anchoring tx type")
)
type AnchoringDataInternal interface {
GetBlockHash() common.Hash
GetBlockNumber() *big.Int
}
type AnchoringData struct {
Type uint8
Data []byte
}
// AnchoringDataLegacy is an old anchoring type that does not support an data type.
type AnchoringDataLegacy struct {
BlockHash common.Hash
TxHash common.Hash
ParentHash common.Hash
ReceiptHash common.Hash
StateRootHash common.Hash
BlockNumber *big.Int
}
func (data *AnchoringDataLegacy) GetBlockHash() common.Hash {
return data.BlockHash
}
func (data *AnchoringDataLegacy) GetBlockNumber() *big.Int {
return data.BlockNumber
}
type AnchoringDataInternalType0 struct {
BlockHash common.Hash
TxHash common.Hash
ParentHash common.Hash
ReceiptHash common.Hash
StateRootHash common.Hash
BlockNumber *big.Int
BlockCount *big.Int
TxCount *big.Int
}
func (data *AnchoringDataInternalType0) GetBlockHash() common.Hash {
return data.BlockHash
}
func (data *AnchoringDataInternalType0) GetBlockNumber() *big.Int {
return data.BlockNumber
}
func NewAnchoringDataType0(block *Block, blockCount *big.Int, txCount *big.Int) (*AnchoringData, error) {
data := &AnchoringDataInternalType0{block.Hash(), block.Header().TxHash,
block.Header().ParentHash, block.Header().ReceiptHash,
block.Header().Root, block.Header().Number, blockCount, txCount}
encodedCCTxData, err := rlp.EncodeToBytes(data)
if err != nil {
return nil, err
}
return &AnchoringData{AnchoringDataType0, encodedCCTxData}, nil
}
// DecodeAnchoringData decodes an anchoring data used by main and sub bridges.
func DecodeAnchoringData(data []byte) (AnchoringDataInternal, error) {
anchoringData := new(AnchoringData)
if err := rlp.DecodeBytes(data, anchoringData); err != nil {
anchoringDataLegacy := new(AnchoringDataLegacy)
if err := rlp.DecodeBytes(data, anchoringDataLegacy); err != nil {
return nil, err
}
logger.Trace("decoded legacy anchoring tx", "blockNum", anchoringDataLegacy.GetBlockNumber().String(), "blockHash", anchoringDataLegacy.GetBlockHash().String(), "txHash", anchoringDataLegacy.TxHash.String())
return anchoringDataLegacy, nil
}
if anchoringData.Type == AnchoringDataType0 {
anchoringDataInternal := new(AnchoringDataInternalType0)
if err := rlp.DecodeBytes(anchoringData.Data, anchoringDataInternal); err != nil {
return nil, err
}
logger.Trace("decoded type0 anchoring tx", "blockNum", anchoringDataInternal.BlockNumber.String(), "blockHash", anchoringDataInternal.BlockHash.String(), "txHash", anchoringDataInternal.TxHash.String(), "txCount", anchoringDataInternal.TxCount)
return anchoringDataInternal, nil
}
return nil, errUnknownAnchoringTxType
}