OSDN Git Service

add_signature_for_block_header (#1914)
[bytom/bytom.git] / protocol / bc / types / block_header_test.go
1 package types
2
3 import (
4         "bytes"
5         "encoding/hex"
6         "fmt"
7         "strings"
8         "testing"
9
10         "github.com/davecgh/go-spew/spew"
11
12         "github.com/bytom/bytom/encoding/blockchain"
13         "github.com/bytom/bytom/errors"
14         "github.com/bytom/bytom/testutil"
15 )
16
17 func TestBlockHeader(t *testing.T) {
18         blockHeader := &BlockHeader{
19                 Version:           1,
20                 Height:            432234,
21                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
22                 Timestamp:         1522908275,
23                 BlockCommitment: BlockCommitment{
24                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
25                 },
26                 BlockWitness: testutil.MustDecodeHexString("3b71527c26bff856a0f247df4fce1b48780f1bd9fd55ba79fb637b0f2e897bb019c5449febf593032dd25b9027cea712c752104700e67d8813326b06d052bf00"),
27         }
28
29         wantHex := strings.Join([]string{
30                 "01",     // serialization flags
31                 "01",     // version
32                 "eab01a", // block height
33                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
34                 "f3f896d605", // timestamp
35                 "20",         // commitment extensible field length
36                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03",                                                                     // transactions merkle root
37                 "41403b71527c26bff856a0f247df4fce1b48780f1bd9fd55ba79fb637b0f2e897bb019c5449febf593032dd25b9027cea712c752104700e67d8813326b06d052bf00", // block witness
38                 "0100", // supLinks
39         }, "")
40
41         gotHex := testutil.Serialize(t, blockHeader)
42         want, err := hex.DecodeString(wantHex)
43         if err != nil {
44                 t.Fatal(err)
45         }
46
47         if !bytes.Equal(gotHex, want) {
48                 t.Errorf("empty block header bytes = %x want %x", gotHex, want)
49         }
50
51         gotBlockHeader := BlockHeader{}
52         if _, err := gotBlockHeader.readFrom(blockchain.NewReader(want)); err != nil {
53                 t.Fatal(err)
54         }
55
56         if !testutil.DeepEqual(gotBlockHeader, *blockHeader) {
57                 t.Errorf("got:\n%s\nwant:\n%s", spew.Sdump(gotBlockHeader), spew.Sdump(*blockHeader))
58         }
59 }
60
61 func TestMarshalBlockHeader(t *testing.T) {
62         cases := []struct {
63                 blockHeader *BlockHeader
64                 wantHex     string
65                 wantError   error
66         }{
67                 {
68                         blockHeader: &BlockHeader{
69                                 Version:           1,
70                                 Height:            10000,
71                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
72                                 Timestamp:         1528945000,
73                                 BlockCommitment: BlockCommitment{
74                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
75                                 },
76                                 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
77                         },
78                         wantHex: strings.Join([]string{
79                                 "01",   // serialization flags
80                                 "01",   // version
81                                 "904e", // block height
82                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
83                                 "e8b287d905", // timestamp
84                                 "20",         // commitment extensible field length
85                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03",                                                                     // transactions merkle root
86                                 "41409dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709", // block witness
87                                 "0100", // supLinks
88                         }, ""),
89                 },
90                 {
91                         blockHeader: &BlockHeader{
92                                 Version:           1,
93                                 Height:            9223372036854775808, // Height > MaxInt64(9223372036854775807)
94                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
95                                 Timestamp:         1528945000,
96                                 BlockCommitment: BlockCommitment{
97                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
98                                 },
99                                 BlockWitness: testutil.MustDecodeHexString("2c27ea6e848a1191f25a7f4a04deae1c5a191587e5ee61f92e408ab97dbd35c3ce613b08475f0baa300606c38695d1eb0c4b409939acaa28b82fbb87e7de3c0f"),
100                         },
101                         wantError: blockchain.ErrRange,
102                 },
103                 {
104                         blockHeader: &BlockHeader{
105                                 Version:           1,
106                                 Height:            10000,
107                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
108                                 Timestamp:         9223372036854775808, // Timestamp > MaxInt64(9223372036854775807)
109                                 BlockCommitment: BlockCommitment{
110                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
111                                 },
112                                 BlockWitness: testutil.MustDecodeHexString("3dc3cc903772033972b9f3e48df330649c8e6beb3a4376e694b83dedb91da8692a32da3817edf1606cd5800a411f91316c96b2700a275d22c52d5fdc28e0fa03"),
113                         },
114                         wantError: blockchain.ErrRange,
115                 },
116                 {
117                         blockHeader: &BlockHeader{
118                                 Version:           1,
119                                 Height:            9223372036854775807, // MaxInt64(9223372036854775807)
120                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
121                                 Timestamp:         1528945000,
122                                 BlockWitness:      testutil.MustDecodeHexString("ac6380a17685c48af4b0a0877d9d61e83b50bd95daa61083dd90031ae66d12d7a371c41cce24887d4d422202b747494bb0e7ca78567d6663be82b27714357407"),
123                         },
124                         wantHex: strings.Join([]string{
125                                 "01",                 // serialization flags
126                                 "01",                 // version
127                                 "ffffffffffffffff7f", // block height
128                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
129                                 "e8b287d905", // timestamp
130                                 "20",         // commitment extensible field length
131                                 "0000000000000000000000000000000000000000000000000000000000000000",                                                                     // transactions merkle root
132                                 "4140ac6380a17685c48af4b0a0877d9d61e83b50bd95daa61083dd90031ae66d12d7a371c41cce24887d4d422202b747494bb0e7ca78567d6663be82b27714357407", // block witness
133                                 "0100", // supLinks
134                         }, ""),
135                 },
136                 {
137                         blockHeader: &BlockHeader{
138                                 Version:           1,
139                                 Height:            9223372036854775807, // MaxInt64(9223372036854775807)
140                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
141                                 Timestamp:         1528945000,
142                                 BlockWitness:      BlockWitness{},
143                         },
144                         wantHex: strings.Join([]string{
145                                 "01",                 // serialization flags
146                                 "01",                 // version
147                                 "ffffffffffffffff7f", // block height
148                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
149                                 "e8b287d905", // timestamp
150                                 "20",         // commitment extensible field length
151                                 "0000000000000000000000000000000000000000000000000000000000000000", // transactions merkle root
152                                 "0100", // block witness
153                                 "0100", // supLinks
154                         }, ""),
155                 },
156         }
157
158         for i, test := range cases {
159                 got, err := test.blockHeader.MarshalText()
160                 if err != nil && err != test.wantError {
161                         t.Errorf("test %d: got error = %x, want = %x", i, err, test.wantError)
162                 } else if err != nil && err == test.wantError {
163                         continue
164                 }
165
166                 if string(got) != test.wantHex {
167                         t.Errorf("test %d: got strbytes = %s, want %s", i, string(got), test.wantHex)
168                 }
169
170                 resultBlockHeader := &BlockHeader{}
171                 if err := resultBlockHeader.UnmarshalText(got); err != nil {
172                         t.Fatal(err)
173                 }
174
175                 if !testutil.DeepEqual(*resultBlockHeader, *test.blockHeader) {
176                         t.Errorf("test %d: got:\n%s\nwant:\n%s", i, spew.Sdump(*resultBlockHeader), spew.Sdump(*test.blockHeader))
177                 }
178         }
179 }
180
181 func TestUnmarshalBlockHeader(t *testing.T) {
182         cases := []struct {
183                 hexBlockHeader  string
184                 wantBlockHeader *BlockHeader
185                 wantError       error
186         }{
187                 {
188                         hexBlockHeader: strings.Join([]string{
189                                 "01",   // serialization flags (SerBlockHeader = 01)
190                                 "01",   // version
191                                 "904e", // block height
192                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
193                                 "e8b287d905", // timestamp
194                                 "20",         // commitment extensible field length
195                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03",                                                                     // transactions merkle root
196                                 "41409dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709", // block witness
197                                 "0100", // supLinks
198                         }, ""),
199                         wantBlockHeader: &BlockHeader{
200                                 Version:           1,
201                                 Height:            10000,
202                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
203                                 Timestamp:         1528945000,
204                                 BlockCommitment: BlockCommitment{
205                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
206                                 },
207                                 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
208                         },
209                 },
210                 {
211                         hexBlockHeader: strings.Join([]string{
212                                 "03",   // serialization flags (SerBlockFull = 03)
213                                 "01",   // version
214                                 "904e", // block height
215                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
216                                 "e8b287d905", // timestamp
217                                 "20",         // commitment extensible field length
218                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03",                                                                     // transactions merkle root
219                                 "41409dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709", // block witness
220                                 "0100", // supLinks
221                         }, ""),
222                         wantBlockHeader: &BlockHeader{
223                                 Version:           1,
224                                 Height:            10000,
225                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
226                                 Timestamp:         1528945000,
227                                 BlockCommitment: BlockCommitment{
228                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
229                                 },
230                                 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
231                         },
232                 },
233                 {
234                         hexBlockHeader: strings.Join([]string{
235                                 "02",   // serialization flags (SerBlockTransactions = 02)
236                                 "01",   // version
237                                 "904e", // block height
238                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
239                                 "e8b287d905", // timestamp
240                                 "20",         // commitment extensible field length
241                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03", // transactions merkle root
242                         }, ""),
243                         wantError: fmt.Errorf("unsupported serialization flags 0x02"),
244                 },
245                 {
246                         hexBlockHeader: strings.Join([]string{
247                                 "01",  // serialization flags
248                                 "01",  // version
249                                 "908", // block height (error with odd length)
250                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
251                                 "e8b287d905", // timestamp
252                                 "20",         // commitment extensible field length
253                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03", // transactions merkle root
254                         }, ""),
255                         wantError: hex.ErrLength,
256                 },
257                 {
258                         hexBlockHeader: strings.Join([]string{
259                                 "01",                 // serialization flags
260                                 "01",                 // version
261                                 "ffffffffffffffffff", // block height
262                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
263                                 "e8b287d905", // timestamp
264                                 "20",         // commitment extensible field length
265                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03", // transactions merkle root
266                                 "0100", // block witness
267                                 "0100", // supLinks
268                         }, ""),
269                         wantError: errors.New("binary: varint overflows a 64-bit integer"),
270                 },
271                 {
272                         hexBlockHeader: strings.Join([]string{
273                                 "01",                 // serialization flags
274                                 "01",                 // version
275                                 "ffffffffffffffff7f", // block height
276                                 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
277                                 "e8b287d905", // timestamp
278                                 "20",         // commitment extensible field length
279                                 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03",                                                                     // transactions merkle root
280                                 "4140e0776a3cf17b3e0f8340caeee32a75d02ecc25cf20bee9e5c7503bca3b2703c3c61fdcb4211ed59b58eb025ac81e06b138d54b5d01ea4614dd0f65e641836900", // block witness
281                                 "0100", // supLinks
282                         }, ""),
283                         wantBlockHeader: &BlockHeader{
284                                 Version:           1,
285                                 Height:            9223372036854775807, // MaxInt64(9223372036854775807)
286                                 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
287                                 Timestamp:         1528945000,
288                                 BlockCommitment: BlockCommitment{
289                                         TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
290                                 },
291                                 BlockWitness: testutil.MustDecodeHexString("e0776a3cf17b3e0f8340caeee32a75d02ecc25cf20bee9e5c7503bca3b2703c3c61fdcb4211ed59b58eb025ac81e06b138d54b5d01ea4614dd0f65e641836900"),
292                         },
293                 },
294         }
295
296         for i, test := range cases {
297                 resultBlockHeader := &BlockHeader{}
298                 err := resultBlockHeader.UnmarshalText([]byte(test.hexBlockHeader))
299                 if err != nil && err.Error() != test.wantError.Error() {
300                         t.Errorf("test %d: got error = %s, want = %s", i, err.Error(), test.wantError.Error())
301                 } else if err != nil && err.Error() == test.wantError.Error() {
302                         continue
303                 }
304
305                 if !testutil.DeepEqual(*resultBlockHeader, *test.wantBlockHeader) {
306                         t.Errorf("test %d: got:\n%s\nwant:\n%s", i, spew.Sdump(*resultBlockHeader), spew.Sdump(*test.wantBlockHeader))
307                 }
308         }
309 }