10 "github.com/davecgh/go-spew/spew"
12 "github.com/bytom/bytom/encoding/blockchain"
13 "github.com/bytom/bytom/errors"
14 "github.com/bytom/bytom/testutil"
17 func TestBlockHeader(t *testing.T) {
18 blockHeader := &BlockHeader{
21 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
22 Timestamp: 1522908275,
23 BlockCommitment: BlockCommitment{
24 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
26 BlockWitness: testutil.MustDecodeHexString("3b71527c26bff856a0f247df4fce1b48780f1bd9fd55ba79fb637b0f2e897bb019c5449febf593032dd25b9027cea712c752104700e67d8813326b06d052bf00"),
29 wantHex := strings.Join([]string{
30 "01", // serialization flags
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
41 gotHex := testutil.Serialize(t, blockHeader)
42 want, err := hex.DecodeString(wantHex)
47 if !bytes.Equal(gotHex, want) {
48 t.Errorf("empty block header bytes = %x want %x", gotHex, want)
51 gotBlockHeader := BlockHeader{}
52 if _, err := gotBlockHeader.readFrom(blockchain.NewReader(want)); err != nil {
56 if !testutil.DeepEqual(gotBlockHeader, *blockHeader) {
57 t.Errorf("got:\n%s\nwant:\n%s", spew.Sdump(gotBlockHeader), spew.Sdump(*blockHeader))
61 func TestMarshalBlockHeader(t *testing.T) {
63 blockHeader *BlockHeader
68 blockHeader: &BlockHeader{
71 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
72 Timestamp: 1528945000,
73 BlockCommitment: BlockCommitment{
74 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
76 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
78 wantHex: strings.Join([]string{
79 "01", // serialization flags
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
91 blockHeader: &BlockHeader{
93 Height: 9223372036854775808, // Height > MaxInt64(9223372036854775807)
94 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
95 Timestamp: 1528945000,
96 BlockCommitment: BlockCommitment{
97 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
99 BlockWitness: testutil.MustDecodeHexString("2c27ea6e848a1191f25a7f4a04deae1c5a191587e5ee61f92e408ab97dbd35c3ce613b08475f0baa300606c38695d1eb0c4b409939acaa28b82fbb87e7de3c0f"),
101 wantError: blockchain.ErrRange,
104 blockHeader: &BlockHeader{
107 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
108 Timestamp: 9223372036854775808, // Timestamp > MaxInt64(9223372036854775807)
109 BlockCommitment: BlockCommitment{
110 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
112 BlockWitness: testutil.MustDecodeHexString("3dc3cc903772033972b9f3e48df330649c8e6beb3a4376e694b83dedb91da8692a32da3817edf1606cd5800a411f91316c96b2700a275d22c52d5fdc28e0fa03"),
114 wantError: blockchain.ErrRange,
117 blockHeader: &BlockHeader{
119 Height: 9223372036854775807, // MaxInt64(9223372036854775807)
120 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
121 Timestamp: 1528945000,
122 BlockWitness: testutil.MustDecodeHexString("ac6380a17685c48af4b0a0877d9d61e83b50bd95daa61083dd90031ae66d12d7a371c41cce24887d4d422202b747494bb0e7ca78567d6663be82b27714357407"),
124 wantHex: strings.Join([]string{
125 "01", // serialization flags
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
137 blockHeader: &BlockHeader{
139 Height: 9223372036854775807, // MaxInt64(9223372036854775807)
140 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
141 Timestamp: 1528945000,
142 BlockWitness: BlockWitness{},
144 wantHex: strings.Join([]string{
145 "01", // serialization flags
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
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 {
166 if string(got) != test.wantHex {
167 t.Errorf("test %d: got strbytes = %s, want %s", i, string(got), test.wantHex)
170 resultBlockHeader := &BlockHeader{}
171 if err := resultBlockHeader.UnmarshalText(got); err != nil {
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))
181 func TestUnmarshalBlockHeader(t *testing.T) {
183 hexBlockHeader string
184 wantBlockHeader *BlockHeader
188 hexBlockHeader: strings.Join([]string{
189 "01", // serialization flags (SerBlockHeader = 01)
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
199 wantBlockHeader: &BlockHeader{
202 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
203 Timestamp: 1528945000,
204 BlockCommitment: BlockCommitment{
205 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
207 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
211 hexBlockHeader: strings.Join([]string{
212 "03", // serialization flags (SerBlockFull = 03)
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
222 wantBlockHeader: &BlockHeader{
225 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
226 Timestamp: 1528945000,
227 BlockCommitment: BlockCommitment{
228 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
230 BlockWitness: testutil.MustDecodeHexString("9dc8892df991e1d1110a5cb1bbfd57f2f5e3aa89464de50f9555c7575d9c2b21cf8f05b77b880d8ae4dd218efb15b775c32c9d77f9a2955d69dca9020c127709"),
234 hexBlockHeader: strings.Join([]string{
235 "02", // serialization flags (SerBlockTransactions = 02)
237 "904e", // block height
238 "c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0", // prev block hash
239 "e8b287d905", // timestamp
240 "20", // commitment extensible field length
241 "ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03", // transactions merkle root
243 wantError: fmt.Errorf("unsupported serialization flags 0x02"),
246 hexBlockHeader: strings.Join([]string{
247 "01", // serialization flags
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
255 wantError: hex.ErrLength,
258 hexBlockHeader: strings.Join([]string{
259 "01", // serialization flags
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
269 wantError: errors.New("binary: varint overflows a 64-bit integer"),
272 hexBlockHeader: strings.Join([]string{
273 "01", // serialization flags
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
283 wantBlockHeader: &BlockHeader{
285 Height: 9223372036854775807, // MaxInt64(9223372036854775807)
286 PreviousBlockHash: testutil.MustDecodeHash("c34048bd60c4c13144fd34f408627d1be68f6cb4fdd34e879d6d791060ea73a0"),
287 Timestamp: 1528945000,
288 BlockCommitment: BlockCommitment{
289 TransactionsMerkleRoot: testutil.MustDecodeHash("ad9ac003d08ff305181a345d64fe0b02311cc1a6ec04ab73f3318d90139bfe03"),
291 BlockWitness: testutil.MustDecodeHexString("e0776a3cf17b3e0f8340caeee32a75d02ecc25cf20bee9e5c7503bca3b2703c3c61fdcb4211ed59b58eb025ac81e06b138d54b5d01ea4614dd0f65e641836900"),
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() {
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))