OSDN Git Service

feat(proposal): move vapor block proposer (#1913)
[bytom/bytom.git] / protocol / bc / types / block_test.go
1 package types
2
3 import (
4         "bytes"
5         "encoding/hex"
6         "encoding/json"
7         "strings"
8         "testing"
9
10         "github.com/davecgh/go-spew/spew"
11
12         "github.com/bytom/bytom/consensus"
13         "github.com/bytom/bytom/encoding/blockchain"
14         "github.com/bytom/bytom/protocol/bc"
15         "github.com/bytom/bytom/testutil"
16 )
17
18 func TestBlock(t *testing.T) {
19         cases := []struct {
20                 block *Block
21                 hex   string
22                 hash  bc.Hash
23         }{
24                 {
25                         block: &Block{
26                                 BlockHeader: BlockHeader{
27                                         Version: 1,
28                                         Height:  1,
29                                 },
30                                 Transactions: []*Tx{},
31                         },
32                         hex: strings.Join([]string{
33                                 "03", // serialization flags
34                                 "01", // version
35                                 "01", // block height
36                                 "0000000000000000000000000000000000000000000000000000000000000000", // prev block hash
37                                 "00", // timestamp
38                                 "20", // commitment extensible field length
39                                 "0000000000000000000000000000000000000000000000000000000000000000", // transactions merkle root
40                                 "0100", // block witness
41                                 "00",   // num transactions
42                         }, ""),
43                         hash: testutil.MustDecodeHash("42e74d130e5ab27e8a71b90e7de8c8e00ecfa77456070202ab8509f7b0ab49ae"),
44                 },
45                 {
46                         block: &Block{
47                                 BlockHeader: BlockHeader{
48                                         Version:           1,
49                                         Height:            432234,
50                                         PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
51                                         Timestamp:         1522908275,
52                                         BlockCommitment: BlockCommitment{
53                                                 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
54                                         },
55                                 },
56                                 Transactions: []*Tx{
57                                         NewTx(TxData{
58                                                 Version:        1,
59                                                 SerializedSize: uint64(262),
60                                                 TimeRange:      654,
61                                                 Inputs: []*TxInput{
62                                                         NewIssuanceInput([]byte("nonce"), 254354, []byte("issuanceProgram"), [][]byte{[]byte("arguments1"), []byte("arguments2")}, []byte("assetDefinition")),
63                                                         NewSpendInput([][]byte{[]byte("arguments3"), []byte("arguments4")}, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), *consensus.BTMAssetID, 254354, 3, []byte("spendProgram")),
64                                                 },
65                                                 Outputs: []*TxOutput{
66                                                         NewOriginalTxOutput(testutil.MustDecodeAsset("a69849e11add96ac7053aad22ba2349a4abf5feb0475a0afcadff4e128be76cf"), 254354, []byte("true")),
67                                                 },
68                                         }),
69                                         NewTx(TxData{
70                                                 Version:        1,
71                                                 SerializedSize: uint64(110),
72                                                 Inputs: []*TxInput{
73                                                         NewCoinbaseInput([]byte("arbitrary")),
74                                                 },
75                                                 Outputs: []*TxOutput{
76                                                         NewOriginalTxOutput(*consensus.BTMAssetID, 254354, []byte("true")),
77                                                         NewOriginalTxOutput(*consensus.BTMAssetID, 254354, []byte("false")),
78                                                 },
79                                         }),
80                                 },
81                         },
82                         hex: strings.Join([]string{
83                                 "03",     // serialization flags
84                                 "01",     // version
85                                 "eab01a", // block height
86                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
87                                 "f3f896d605", // timestamp
88                                 "20",         // commitment extensible field length
89                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03", // transactions merkle root
90                                 "0100", // block witness
91                                 "02",   // num transactions
92                                 "07018e0502012a00056e6f6e6365a69849e11add96ac7053aad22ba2349a4abf5feb0475a0afcadff4e128be76cf92c30f380f6173736574446566696e6974696f6e010f69737375616e636550726f6772616d020a617267756d656e7473310a617267756d656e74733201540152fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92c30f03010c7370656e6450726f6772616d17020a617267756d656e7473330a617267756d656e74733401010029a69849e11add96ac7053aad22ba2349a4abf5feb0475a0afcadff4e128be76cf92c30f01047472756500",
93                                 "07010001010b02096172626974726172790002010029ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92c30f0104747275650001002affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92c30f010566616c736500",
94                         }, ""),
95                         hash: testutil.MustDecodeHash("6076fc8a96b08a4842f4bdc805606e9775ce6dbe4e371e88c70b75ea4283e942"),
96                 },
97         }
98
99         for i, test := range cases {
100                 got := testutil.Serialize(t, test.block)
101                 want, err := hex.DecodeString(test.hex)
102                 if err != nil {
103                         t.Fatal(err)
104                 }
105
106                 if !bytes.Equal(got, want) {
107                         t.Errorf("test %d: bytes = %x want %x", i, got, want)
108                 }
109
110                 blockHash := test.block.Hash()
111                 if blockHash != test.hash {
112                         t.Errorf("test %d: hash = %s want %s", i, blockHash.String(), test.hash.String())
113                 }
114
115                 blockJSON, err := json.Marshal(test.block)
116                 if err != nil {
117                         t.Errorf("test %d: error marshaling block to json: %s", i, err)
118                 }
119
120                 blockFromJSON := Block{}
121                 if err := json.Unmarshal(blockJSON, &blockFromJSON); err != nil {
122                         t.Errorf("test %d: error unmarshaling block from json: %s", i, err)
123                 }
124                 if !testutil.DeepEqual(*test.block, blockFromJSON) {
125                         t.Errorf("test %d: got:\n%s\nwant:\n%s", i, spew.Sdump(blockFromJSON), spew.Sdump(*test.block))
126                 }
127         }
128 }
129
130 func TestReadFrom(t *testing.T) {
131         btmAssetID := testutil.MustDecodeAsset("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
132
133         cases := []struct {
134                 rawBlock  string
135                 wantBlock Block
136         }{
137                 {
138                         rawBlock: "03018b5f3077f24528e94ecfc4491bb2e9ed6264a632a9a4b86b00c88093ca545d14a137d4f5e1e4052035a2d11158f47a5c5267630b2b6cf9e9a5f79a598085a2572a68defeb8013ad20100020701000101080206003132313731000101003effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809df3b49a010116001437e1aec83a4e6587ca9609e4e5aa728db700744900070100020160015e4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80c480c1240201160014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e6302405760b15cc09e543437c4e3aad05bf073e82ebdb214beccb5f4473653dfc0a9d5ae59fb149de19eb71c1c1399594757aeea4dd6327ca2790ef919bd20caa86104201381d35e235813ad1e62f9a602c82abee90565639cc4573568206b55bcd2aed90130000840142084606f20ca7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad1480d0dbc3f402b001467b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d0125ae2054a71277cc162eb3eb21b5bd9fe54402829a53b294deaed91692a2cd8a081f9c5151ad0140621c2c3554da50d2a492d9d78be7c6159359d8f5f0b93a054ce0133617a61d85c532aff449b97a3ec2804ca5fe12b4d54aa6e8c3215c33d04abee9c9abdfdb030201003dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80c0d1e123011600144b61da45324299e40dacc255e2ea07dfce3a56d20001003e7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad1480d0dbc3f4020116001437e1aec83a4e6587ca9609e4e5aa728db700744900",
139                         wantBlock: Block{
140                                 BlockHeader: BlockHeader{
141                                         Version:           1,
142                                         Height:            12171,
143                                         PreviousBlockHash: testutil.MustDecodeHash("3077f24528e94ecfc4491bb2e9ed6264a632a9a4b86b00c88093ca545d14a137"),
144                                         Timestamp:         1553496788,
145                                         BlockCommitment: BlockCommitment{
146                                                 TransactionsMerkleRoot: testutil.MustDecodeHash("35a2d11158f47a5c5267630b2b6cf9e9a5f79a598085a2572a68defeb8013ad2"),
147                                         },
148                                 },
149                                 Transactions: []*Tx{
150                                         {
151                                                 TxData: TxData{
152                                                         Version:        1,
153                                                         SerializedSize: 82,
154                                                         TimeRange:      0,
155                                                         Inputs: []*TxInput{
156                                                                 NewCoinbaseInput(testutil.MustDecodeHexString("003132313731")),
157                                                         },
158                                                         Outputs: []*TxOutput{
159                                                                 NewOriginalTxOutput(btmAssetID, 41450000000, testutil.MustDecodeHexString("001437e1aec83a4e6587ca9609e4e5aa728db7007449")),
160                                                         },
161                                                 },
162                                         },
163                                         {
164                                                 TxData: TxData{
165                                                         Version:        1,
166                                                         SerializedSize: 562,
167                                                         TimeRange:      0,
168                                                         Inputs: []*TxInput{
169                                                                 NewSpendInput(
170                                                                         [][]byte{
171                                                                                 testutil.MustDecodeHexString("5760b15cc09e543437c4e3aad05bf073e82ebdb214beccb5f4473653dfc0a9d5ae59fb149de19eb71c1c1399594757aeea4dd6327ca2790ef919bd20caa86104"),
172                                                                                 testutil.MustDecodeHexString("1381d35e235813ad1e62f9a602c82abee90565639cc4573568206b55bcd2aed9"),
173                                                                         },
174                                                                         testutil.MustDecodeHash("4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adea"),
175                                                                         btmAssetID,
176                                                                         9800000000,
177                                                                         2,
178                                                                         testutil.MustDecodeHexString("0014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e"),
179                                                                 ),
180                                                                 NewIssuanceInput(
181                                                                         testutil.MustDecodeHexString("40142084606f20ca"),
182                                                                         100000000000,
183                                                                         testutil.MustDecodeHexString("ae2054a71277cc162eb3eb21b5bd9fe54402829a53b294deaed91692a2cd8a081f9c5151ad"),
184                                                                         [][]byte{testutil.MustDecodeHexString("621c2c3554da50d2a492d9d78be7c6159359d8f5f0b93a054ce0133617a61d85c532aff449b97a3ec2804ca5fe12b4d54aa6e8c3215c33d04abee9c9abdfdb03")},
185                                                                         testutil.MustDecodeHexString("7b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d"),
186                                                                 ),
187                                                         },
188                                                         Outputs: []*TxOutput{
189                                                                 NewOriginalTxOutput(btmAssetID, 9600000000, testutil.MustDecodeHexString("00144b61da45324299e40dacc255e2ea07dfce3a56d2")),
190                                                                 NewOriginalTxOutput(testutil.MustDecodeAsset("7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14"), 100000000000, testutil.MustDecodeHexString("001437e1aec83a4e6587ca9609e4e5aa728db7007449")),
191                                                         },
192                                                 },
193                                         },
194                                 },
195                         },
196                 },
197         }
198
199         for _, c := range cases {
200                 blockBytes, err := hex.DecodeString(c.rawBlock)
201                 if err != nil {
202                         t.Fatal(err)
203                 }
204
205                 block := &Block{}
206                 if err := block.readFrom(blockchain.NewReader(blockBytes)); err != nil {
207                         t.Fatal(err)
208                 }
209
210                 for _, tx := range c.wantBlock.Transactions {
211                         tx.Tx = MapTx(&tx.TxData)
212                 }
213
214                 if !testutil.DeepEqual(*block, c.wantBlock) {
215                         t.Errorf("test block read from fail, got:%v, want:%v", *block, c.wantBlock)
216                 }
217         }
218 }