github.com/klaytn/klaytn@v1.12.1/blockchain/types/block_test.go (about)

     1  // Modifications Copyright 2018 The klaytn Authors
     2  // Copyright 2014 The go-ethereum Authors
     3  // This file is part of the go-ethereum library.
     4  //
     5  // The go-ethereum library is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU Lesser General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // The go-ethereum library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  // GNU Lesser General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public License
    16  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  // This file is derived from core/types/block_test.go (2018/06/04).
    19  // Modified and improved for the klaytn development.
    20  
    21  package types
    22  
    23  import (
    24  	"encoding/json"
    25  	"math/big"
    26  	"os"
    27  	"reflect"
    28  	"testing"
    29  
    30  	"github.com/stretchr/testify/assert"
    31  
    32  	"github.com/klaytn/klaytn/common"
    33  	"github.com/klaytn/klaytn/common/hexutil"
    34  	"github.com/klaytn/klaytn/rlp"
    35  )
    36  
    37  type testBlockEncodingTC struct {
    38  	encoded    string      // RLP encoded block; debug.getBlockRlp(num)
    39  	hash       common.Hash // block hash; klay.getBlock(num).hash
    40  	header     *Header     // expected header fields
    41  	encodedTxs [][]byte    // expected transactions, RLP encoded; klay.getRawTransaction(txhash)
    42  }
    43  
    44  var blockEncodingTCs map[string]testBlockEncodingTC
    45  
    46  func init() {
    47  	blockEncodingTCs = map[string]testBlockEncodingTC{
    48  		"pre-magma": { // Baobab 83863326
    49  			encoded: "0xf903faf90368a0c2adf89ac1218bca784fb6b456a4d6d992efd726208edac9a268f72e8daa52a794b2bd3178affccd9f9f5189457f1cad7d17a01c9da0ce26cd14bfe586c11f9ebae0186a3e4744dfb6233e603d477cdebc69d9dc7953a05b8713ac41d655e85124c14d558b67dbb5d0417da4096c2ea00c93d78a12daa7a0e38e5532717f12f769b07ea016014bd39b74fb72def4de8442114cc2728609f2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018404ffa71e8252088462134f3a80b90187d883010703846b6c617988676f312e31352e37856c696e757800000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b841acb7fcc5152506250d1ea49745e7d0d5930157724b410e6e62e0885e7978c81863647d90700dcf3e5d0727cb886f2cc2c63f8f6f3910b4341b302a0aa06eae4500f8c9b841d79c07fbee8861585a71af08a867546320ba804c49c7a3c8641b4d235fd50d5a29bf72d20f3ff1ddfb945ff193d7938967be694f3e602a1cffdea686acf2b0ea01b841dfcf5b5608ca86bc92e7fa3d88a8b25840a629234614ecb312621234ed665ae562ee64ea09fcc88080aaab1ee095acf705d7cc495732682ffee23023ed41feb200b841fefc3b618b2384ea5c7c519ddecc666c19e8a600a6e30c5d9831941c0d5af78d28250bab36ce29202e667c9c1681fd9930aab002988c7228b64caab003bd99810080b1f09499fb17d324fa0e07f23b49d09028ac0919414db694676f7665726e616e63652e756e6974707269636585ae9f7bcc00f88d08f88a830258128505d21dba0083419ce094ce123cb96a04c5a21728830bbc1d589ba30887db884563918244f4000094f90675a56a03f836204d66c0f923e00500ddc90af847f8458207f6a0fefbca6cf2db5bc7fd495d8baa5332d564a466c74a1264b10330a8b2aea7a5c9a07a45e8a2ddf1bbb740f7301169c56cbccc441597827cb483bf3d0300c92c314c",
    50  			hash:    common.HexToHash("0x87fe52e244702e4c4c540cdab29f52f03ced4a961e3f0ebd33217867b7da3a56"),
    51  			header: &Header{
    52  				ParentHash:  common.HexToHash("0xc2adf89ac1218bca784fb6b456a4d6d992efd726208edac9a268f72e8daa52a7"),
    53  				Rewardbase:  common.HexToAddress("0xb2bd3178affccd9f9f5189457f1cad7d17a01c9d"),
    54  				Root:        common.HexToHash("0xce26cd14bfe586c11f9ebae0186a3e4744dfb6233e603d477cdebc69d9dc7953"),
    55  				TxHash:      common.HexToHash("0x5b8713ac41d655e85124c14d558b67dbb5d0417da4096c2ea00c93d78a12daa7"),
    56  				ReceiptHash: common.HexToHash("0xe38e5532717f12f769b07ea016014bd39b74fb72def4de8442114cc2728609f2"),
    57  				Bloom:       BytesToBloom(hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")),
    58  				BlockScore:  common.Big1,
    59  				Number:      big.NewInt(83863326),
    60  				GasUsed:     21000,
    61  				Time:        big.NewInt(1645432634),
    62  				TimeFoS:     0,
    63  				Extra:       hexutil.MustDecode("0xd883010703846b6c617988676f312e31352e37856c696e757800000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b841acb7fcc5152506250d1ea49745e7d0d5930157724b410e6e62e0885e7978c81863647d90700dcf3e5d0727cb886f2cc2c63f8f6f3910b4341b302a0aa06eae4500f8c9b841d79c07fbee8861585a71af08a867546320ba804c49c7a3c8641b4d235fd50d5a29bf72d20f3ff1ddfb945ff193d7938967be694f3e602a1cffdea686acf2b0ea01b841dfcf5b5608ca86bc92e7fa3d88a8b25840a629234614ecb312621234ed665ae562ee64ea09fcc88080aaab1ee095acf705d7cc495732682ffee23023ed41feb200b841fefc3b618b2384ea5c7c519ddecc666c19e8a600a6e30c5d9831941c0d5af78d28250bab36ce29202e667c9c1681fd9930aab002988c7228b64caab003bd998100"),
    64  				Governance:  hexutil.MustDecode("0x"),
    65  				Vote:        hexutil.MustDecode("0xf09499fb17d324fa0e07f23b49d09028ac0919414db694676f7665726e616e63652e756e6974707269636585ae9f7bcc00"),
    66  			},
    67  			encodedTxs: [][]byte{
    68  				hexutil.MustDecode("0x08f88a830258128505d21dba0083419ce094ce123cb96a04c5a21728830bbc1d589ba30887db884563918244f4000094f90675a56a03f836204d66c0f923e00500ddc90af847f8458207f6a0fefbca6cf2db5bc7fd495d8baa5332d564a466c74a1264b10330a8b2aea7a5c9a07a45e8a2ddf1bbb740f7301169c56cbccc441597827cb483bf3d0300c92c314c"),
    69  			},
    70  		},
    71  		"post-magma": { // Baobab 118540800
    72  			encoded: "0xf905b8f9035aa095100a280334e152160d4da2eb00c0fdd56678680508948b413233f2c1f295379482829a60c6eac4e3e9d6ed00891c69e88537fd4da057b5f7dc6e57eec3c21185f294bebcd473ed5748849207df8a483ed9ea74f8b2a0fe1b805505566cb2956aa8eca255f507a3a7448ed5bb8f76c2f48080cb22e2c5a017b373884b82084fa234d7692744c5df9b7ecc91d12458be6bb484f71cf45107b901000002000000000000000000000000000000000000000000000000000000800000000000000000000000000010000000000100000000020000000008000000000010000000000000000000000000280000000000000100000000000000000000000000000002000000000000000000080040001000040000000000000010000000000004010040000080000000000008020000049018000000000000000000000000000000100000000000000000000200000000000000000000000008100000000000000000000000000000000000000800000000008000000001080000002000000000000000000000100010000000000000000000000000004000000000000001840710ca0083051e7c846424904006b90187d683010a02846b6c617986676f312e3138856c696e7578000000000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b8417ed05287d26e919e4afe6f51b87f33b0259b3609acd81730647c4e9dbc0b37ab1c110cdd3bb1567f0627bfcc5cdb141f15b903e95ee660b2a76c8b90986d64fc01f8c9b84175bbc18140902be2e0edc9a8f37357ade36f8585780bbdb0cb950b5b8d8e9ab52321369843024b69202a6971f446dabc86af1d8c83d3e06cb0815003f733645501b841df7cddf99ede3be0c0c35b59d9bb73317435f03c6909924018658b386b63641a2c6bba6813b41416f2a89ddb3340ab4faedc08c9b91a242721e0bdcba114a3c900b84127b87c563bdc2966cba9ed16b8db5ee67ab8a15e18ac53fa2944146c7552b87627137c80ab2b3780d4cedb6f18bc4c343cbf3407c39fa6dcc189b63bbab1c0ae009c9b7b227265776172642e726174696f223a2235302f32302f3330227d808505d21dba00f9025831f8e380850ba43b74008405f5e10094fdeedbb2fe5b48d5b49e435ba00e0358740d0cf58094243a439bd4a1cc6edf6ed13e7589cdd0af42425884552984b3f847f8458207f6a0f79acd8519590419fb8efdbbda09f083beac54f03d6a8f8800538ad977ccb762a03034e435ca7011c6020674bdaa4043c3b7b743e18d6828b775dd681308fed9e39449f16029074d13890ac9fe589cc913ffd58d39a8f847f8458207f6a040793721d9f1ac9e77b6245b1b2ed1e20637d3022fb37cd64094f50c39c0a270a058e445a6ad2dc020bece69ccd1b2d28673502f9524b40114a6cc810acb5b775b7802f8b58203e9824c4f8459682f00850bfda3a300830493e094640ed61e261c545d7439bdbb27e1674a6f589e9680b844202ee0ed0000000000000000000000000000000000000000000000000000000000004c5000000000000000000000000000000000000000000000000000000294cace8233c080a06283a5276fd248f4186a5ccb8187e92b42afe00d938b83391148e7ff3e1a358ca0319c3345643f4415f3a3632338a9430c694cf3bb8de3c4d6621b0563c02a69ad7802f8b58203e982467d8459682f00850bfda3a300830493e09450365c346bad261a29add3be7ba18b6c49e4f4cf80b844202ee0ed000000000000000000000000000000000000000000000000000000000000467b000000000000000000000000000000000000000000000000000000000062230bc001a088a760b2c930b0826f8cf14667bf9d62d68ce5d4ecf7aca4f9d872113c229e82a02f52cb66b7154411e4d36f5d126bb5e2e21a3d0f7885a0d097cf05ac2518af08",
    73  			hash:    common.HexToHash("0x43c42ebbd5f57dfeefe01c67974c8d79ac569d8fa5b2f74f12cdc5734c88d58a"),
    74  			header: &Header{
    75  				ParentHash:  common.HexToHash("0x95100a280334e152160d4da2eb00c0fdd56678680508948b413233f2c1f29537"),
    76  				Rewardbase:  common.HexToAddress("0x82829a60c6eac4e3e9d6ed00891c69e88537fd4d"),
    77  				Root:        common.HexToHash("0x57b5f7dc6e57eec3c21185f294bebcd473ed5748849207df8a483ed9ea74f8b2"),
    78  				TxHash:      common.HexToHash("0xfe1b805505566cb2956aa8eca255f507a3a7448ed5bb8f76c2f48080cb22e2c5"),
    79  				ReceiptHash: common.HexToHash("0x17b373884b82084fa234d7692744c5df9b7ecc91d12458be6bb484f71cf45107"),
    80  				Bloom:       BytesToBloom(hexutil.MustDecode("0x00020000000000000000000000000000000000000000000000000000008000000000000000000000000000100000000001000000000200000000080000000000100000000000000000000000002800000000000001000000000000000000000000000000020000000000000000000800400010000400000000000000100000000000040100400000800000000000080200000490180000000000000000000000000000001000000000000000000002000000000000000000000000081000000000000000000000000000000000000008000000000080000000010800000020000000000000000000001000100000000000000000000000000040000000000000")),
    81  				BlockScore:  common.Big1,
    82  				Number:      big.NewInt(118540800),
    83  				GasUsed:     335484,
    84  				Time:        big.NewInt(1680117824),
    85  				TimeFoS:     6,
    86  				Extra:       hexutil.MustDecode("0xd683010a02846b6c617986676f312e3138856c696e7578000000000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b8417ed05287d26e919e4afe6f51b87f33b0259b3609acd81730647c4e9dbc0b37ab1c110cdd3bb1567f0627bfcc5cdb141f15b903e95ee660b2a76c8b90986d64fc01f8c9b84175bbc18140902be2e0edc9a8f37357ade36f8585780bbdb0cb950b5b8d8e9ab52321369843024b69202a6971f446dabc86af1d8c83d3e06cb0815003f733645501b841df7cddf99ede3be0c0c35b59d9bb73317435f03c6909924018658b386b63641a2c6bba6813b41416f2a89ddb3340ab4faedc08c9b91a242721e0bdcba114a3c900b84127b87c563bdc2966cba9ed16b8db5ee67ab8a15e18ac53fa2944146c7552b87627137c80ab2b3780d4cedb6f18bc4c343cbf3407c39fa6dcc189b63bbab1c0ae00"),
    87  				Governance:  hexutil.MustDecode("0x9b7b227265776172642e726174696f223a2235302f32302f3330227d"),
    88  				Vote:        hexutil.MustDecode("0x"),
    89  				BaseFee:     big.NewInt(0x5d21dba00),
    90  			},
    91  			encodedTxs: [][]byte{
    92  				hexutil.MustDecode("0x31f8e380850ba43b74008405f5e10094fdeedbb2fe5b48d5b49e435ba00e0358740d0cf58094243a439bd4a1cc6edf6ed13e7589cdd0af42425884552984b3f847f8458207f6a0f79acd8519590419fb8efdbbda09f083beac54f03d6a8f8800538ad977ccb762a03034e435ca7011c6020674bdaa4043c3b7b743e18d6828b775dd681308fed9e39449f16029074d13890ac9fe589cc913ffd58d39a8f847f8458207f6a040793721d9f1ac9e77b6245b1b2ed1e20637d3022fb37cd64094f50c39c0a270a058e445a6ad2dc020bece69ccd1b2d28673502f9524b40114a6cc810acb5b775b"),
    93  				hexutil.MustDecode("0x7802f8b58203e9824c4f8459682f00850bfda3a300830493e094640ed61e261c545d7439bdbb27e1674a6f589e9680b844202ee0ed0000000000000000000000000000000000000000000000000000000000004c5000000000000000000000000000000000000000000000000000000294cace8233c080a06283a5276fd248f4186a5ccb8187e92b42afe00d938b83391148e7ff3e1a358ca0319c3345643f4415f3a3632338a9430c694cf3bb8de3c4d6621b0563c02a69ad"),
    94  				hexutil.MustDecode("0x7802f8b58203e982467d8459682f00850bfda3a300830493e09450365c346bad261a29add3be7ba18b6c49e4f4cf80b844202ee0ed000000000000000000000000000000000000000000000000000000000000467b000000000000000000000000000000000000000000000000000000000062230bc001a088a760b2c930b0826f8cf14667bf9d62d68ce5d4ecf7aca4f9d872113c229e82a02f52cb66b7154411e4d36f5d126bb5e2e21a3d0f7885a0d097cf05ac2518af08"),
    95  			},
    96  		},
    97  		"post-randao": { // manually crafted. TODO: use real block after Baobab hardfork
    98  			encoded: "0xf90661f904bba06e3826cd2407f01ceaad3cebc1235102001c0bb9a0f8c915ab2958303bc0972c945a0043070275d9f6054307ee7348bd660849d90fa0f412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fb97a0f412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fb99a0f412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fba9b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006634313261313563623634373762643162306534386538666332643130313239326135633162623963306237386637613131323966656134663836356662613966343132613135636236343737626431623065343865386663326431303132393261356331626239633062373866376131313239666561346638363566626139663431326131356362363437376264316230653438653866633264313031323932613563316262396330623738663761313132396665613466383635666261390a0964845c5d1e9314b90187d7820404846b6c617988676f312e31302e33856c696e75780000000000000000f90164f854942525dbdbb7ed59b8e02a6c4d3fb2a75b8b07e25094718aabda0f016e6127db6575cf0a803da7d4087b94c9ead9f875f4adc261a4b5dc264ee58039f281a794d8408db804ab30691e984e8623e2edb4cba853dfb8419da17c0fe3fdecbc32f3a2fbedf8300693067d0f944014cf575076df888709b2057869f36edc299542be1372d2b582bd8dc8e2c220059270fa37b2a2fe287ffb00f8c9b841e8765ffc1bfda438115f9bfa912f39bcc2a286fdb67c71229c9fe4084db5dd942d2076e244a4faf915aeb51a5ea097706e5421e2a7985425d0f9d6fa446c378d00b8411511d9bbd78f6a8b2151406c3c5071bcbe7a452a2ad4eebe1f9a15494ef8ff3b63b41e033de9a02c48e640d51944d7d20a462f7785525c6b26c401177521808101b841c7abdfa3ef691e8a306c8fedc32ee6af44b2fc82b921358466db9948ffce42f221a6870e01eda5ab4f54b6ee68798631e2d46a090c76c8a5d507453acaec48c401b8deb8dc7b22676f7665726e696e676e6f6465223a22307865373333636234643237396461363936663330643437306638633034646563623534666362306432222c22676f7665726e616e63656d6f6465223a2273696e676c65222c22726577617264223a7b226d696e74696e67616d6f756e74223a393630303030303030303030303030303030302c22726174696f223a2233342f33332f3333227d2c22626674223a7b2265706f6368223a33303030302c22706f6c696379223a302c22737562223a32317d2c22756e69745072696365223a32353030303030303030307da2e194e733cb4d279da696f30d470f8c04decb54fcb0d28565706f63688533303030308505d21dba00b86094516a8bc695b5bf43aa077cd682d9475a3a6bed39a633395b78ed8f276e7c5bb00bb26a77825013c6718579f1b3ee2275b158801705ea77989e3acc849ee9c524bd1822bde3cba7be2aae04347f0d91508b7b7ce2f11ec36cbf763173421ae7a0df117d1245dceaae0a47f05371b23cd0d0db963ff9d5c8ba768dc989f4c31883f901a0f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a8025a09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b17801f89b01800a8301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000001a03dbacc8d0259f2508625e97fdfc57cd85fdd16e5821bc2c10bdd1a52649e8335a0476e10695b183a87b0aa292a7f4b78ef0c3fbe62aa2c42c84e1d9c3da159ef147802f89c01800a0a8301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000002e1a0000000000000000000000000000000000000000000000000000000000000000001a03dbacc8d0259f2508625e97fdfc57cd85fdd16e5821bc2c10bdd1a52649e8335a0476e10695b183a87b0aa292a7f4b78ef0c3fbe62aa2c42c84e1d9c3da159ef14",
    99  			hash:    common.HexToHash("0x1abe87cd2771471f63e6f9daa4254e5a260e9991ad44a3f3951a9bcf4d590f58"),
   100  			header: &Header{
   101  				ParentHash:   common.HexToHash("0x6e3826cd2407f01ceaad3cebc1235102001c0bb9a0f8c915ab2958303bc0972c"),
   102  				Rewardbase:   common.HexToAddress("0x5a0043070275d9f6054307ee7348bd660849d90f"),
   103  				Root:         common.HexToHash("0xf412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fb97"),
   104  				TxHash:       common.HexToHash("0xf412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fb99"),
   105  				ReceiptHash:  common.HexToHash("0xf412a15cb6477bd1b0e48e8fc2d101292a5c1bb9c0b78f7a1129fea4f865fba9"),
   106  				Bloom:        BytesToBloom(hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663431326131356362363437376264316230653438653866633264313031323932613563316262396330623738663761313132396665613466383635666261396634313261313563623634373762643162306534386538666332643130313239326135633162623963306237386637613131323966656134663836356662613966343132613135636236343737626431623065343865386663326431303132393261356331626239633062373866376131313239666561346638363566626139")),
   107  				BlockScore:   big.NewInt(10),
   108  				Number:       big.NewInt(9),
   109  				GasUsed:      100,
   110  				Time:         big.NewInt(0x5c5d1e93),
   111  				TimeFoS:      20,
   112  				Extra:        hexutil.MustDecode("0xd7820404846b6c617988676f312e31302e33856c696e75780000000000000000f90164f854942525dbdbb7ed59b8e02a6c4d3fb2a75b8b07e25094718aabda0f016e6127db6575cf0a803da7d4087b94c9ead9f875f4adc261a4b5dc264ee58039f281a794d8408db804ab30691e984e8623e2edb4cba853dfb8419da17c0fe3fdecbc32f3a2fbedf8300693067d0f944014cf575076df888709b2057869f36edc299542be1372d2b582bd8dc8e2c220059270fa37b2a2fe287ffb00f8c9b841e8765ffc1bfda438115f9bfa912f39bcc2a286fdb67c71229c9fe4084db5dd942d2076e244a4faf915aeb51a5ea097706e5421e2a7985425d0f9d6fa446c378d00b8411511d9bbd78f6a8b2151406c3c5071bcbe7a452a2ad4eebe1f9a15494ef8ff3b63b41e033de9a02c48e640d51944d7d20a462f7785525c6b26c401177521808101b841c7abdfa3ef691e8a306c8fedc32ee6af44b2fc82b921358466db9948ffce42f221a6870e01eda5ab4f54b6ee68798631e2d46a090c76c8a5d507453acaec48c401"),
   113  				Governance:   hexutil.MustDecode("0xb8dc7b22676f7665726e696e676e6f6465223a22307865373333636234643237396461363936663330643437306638633034646563623534666362306432222c22676f7665726e616e63656d6f6465223a2273696e676c65222c22726577617264223a7b226d696e74696e67616d6f756e74223a393630303030303030303030303030303030302c22726174696f223a2233342f33332f3333227d2c22626674223a7b2265706f6368223a33303030302c22706f6c696379223a302c22737562223a32317d2c22756e69745072696365223a32353030303030303030307d"),
   114  				Vote:         hexutil.MustDecode("0xe194e733cb4d279da696f30d470f8c04decb54fcb0d28565706f6368853330303030"),
   115  				BaseFee:      big.NewInt(0x5d21dba00),
   116  				RandomReveal: hexutil.MustDecode("0x94516a8bc695b5bf43aa077cd682d9475a3a6bed39a633395b78ed8f276e7c5bb00bb26a77825013c6718579f1b3ee2275b158801705ea77989e3acc849ee9c524bd1822bde3cba7be2aae04347f0d91508b7b7ce2f11ec36cbf763173421ae7"),
   117  				MixHash:      hexutil.MustDecode("0xdf117d1245dceaae0a47f05371b23cd0d0db963ff9d5c8ba768dc989f4c31883"),
   118  			},
   119  			encodedTxs: [][]byte{
   120  				hexutil.MustDecode("0xf85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a8025a09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b1"),
   121  				hexutil.MustDecode("0x7801f89b01800a8301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000001a03dbacc8d0259f2508625e97fdfc57cd85fdd16e5821bc2c10bdd1a52649e8335a0476e10695b183a87b0aa292a7f4b78ef0c3fbe62aa2c42c84e1d9c3da159ef14"),
   122  				hexutil.MustDecode("0x7802f89c01800a0a8301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000002e1a0000000000000000000000000000000000000000000000000000000000000000001a03dbacc8d0259f2508625e97fdfc57cd85fdd16e5821bc2c10bdd1a52649e8335a0476e10695b183a87b0aa292a7f4b78ef0c3fbe62aa2c42c84e1d9c3da159ef14"),
   123  			},
   124  		},
   125  	}
   126  }
   127  
   128  func TestBlockEncoding(t *testing.T) {
   129  	for name, tc := range blockEncodingTCs {
   130  		// RLP -> Block
   131  		block := &Block{}
   132  		err := rlp.DecodeBytes(common.FromHex(tc.encoded), block)
   133  		assert.Nil(t, err, name)
   134  		assert.Equal(t, tc.header, block.Header(), name)
   135  		assert.Equal(t, len(tc.encodedTxs), len(block.Transactions()), name)
   136  		for i, encodedTx := range tc.encodedTxs {
   137  			assert.Equal(t, encodedTx, block.Transactions().GetRlp(i), name)
   138  		}
   139  
   140  		// Calculated block hash
   141  		assert.Equal(t, tc.hash, block.Hash(), name)
   142  
   143  		// Block -> RLP
   144  		encoded, err := rlp.EncodeToBytes(block)
   145  		assert.Nil(t, err, name)
   146  		assert.Equal(t, tc.encoded, hexutil.Encode(encoded), name)
   147  
   148  		// Copy header
   149  		header := CopyHeader(block.Header())
   150  		assert.Equal(t, tc.header, header, name)
   151  	}
   152  }
   153  
   154  func genHeader() *Header {
   155  	return CopyHeader(blockEncodingTCs["pre-magma"].header)
   156  }
   157  
   158  func genBlock() *Block {
   159  	return &Block{
   160  		header:       genHeader(),
   161  		transactions: Transactions{},
   162  	}
   163  }
   164  
   165  func TestHeaderSizeCalc(t *testing.T) {
   166  	// constantSize
   167  	// = required fields (520)
   168  	// + BaseFee pointer (8)
   169  	// + RandomReveal slice (24)
   170  	// + MixHash slice (24)
   171  	constantSize := int(reflect.TypeOf(Header{}).Size())
   172  	assert.Equal(t, 520+8+24+24, constantSize)
   173  
   174  	// Test header.Size() while adding fields one by one
   175  	// Start from a header without any variable length fields.
   176  	h := genHeader()
   177  	h.Extra = nil
   178  	h.Governance = nil
   179  	h.Vote = nil
   180  	h.BaseFee = nil
   181  
   182  	// bigIntSize = (
   183  	//     BlockScore bits (1)
   184  	//   + Number bits (~26)
   185  	//   + Time bits (~31)
   186  	// ) / 8 = 7
   187  	expectSize := constantSize + 7
   188  	assert.Equal(t, expectSize, int(h.Size()))
   189  
   190  	// Byte lengths are added as-is
   191  	h.Extra = hexutil.MustDecode("0xd883010703846b6c617988676f312e31352e37856c696e757800000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b841acb7fcc5152506250d1ea49745e7d0d5930157724b410e6e62e0885e7978c81863647d90700dcf3e5d0727cb886f2cc2c63f8f6f3910b4341b302a0aa06eae4500f8c9b841d79c07fbee8861585a71af08a867546320ba804c49c7a3c8641b4d235fd50d5a29bf72d20f3ff1ddfb945ff193d7938967be694f3e602a1cffdea686acf2b0ea01b841dfcf5b5608ca86bc92e7fa3d88a8b25840a629234614ecb312621234ed665ae562ee64ea09fcc88080aaab1ee095acf705d7cc495732682ffee23023ed41feb200b841fefc3b618b2384ea5c7c519ddecc666c19e8a600a6e30c5d9831941c0d5af78d28250bab36ce29202e667c9c1681fd9930aab002988c7228b64caab003bd998100")
   192  	expectSize += len(h.Extra)
   193  	assert.Equal(t, expectSize, int(h.Size()))
   194  
   195  	h.Governance = hexutil.MustDecode("0x9b7b227265776172642e726174696f223a2235302f32302f3330227d")
   196  	expectSize += len(h.Governance)
   197  	assert.Equal(t, expectSize, int(h.Size()))
   198  
   199  	h.Vote = hexutil.MustDecode("0xf09499fb17d324fa0e07f23b49d09028ac0919414db694676f7665726e616e63652e756e6974707269636585ae9f7bcc00")
   200  	expectSize += len(h.Vote)
   201  	assert.Equal(t, expectSize, int(h.Size()))
   202  
   203  	h.RandomReveal = hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
   204  	expectSize += len(h.RandomReveal)
   205  	assert.Equal(t, expectSize, int(h.Size()))
   206  
   207  	h.MixHash = hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000000")
   208  	expectSize += len(h.MixHash)
   209  	assert.Equal(t, expectSize, int(h.Size()))
   210  
   211  	// BaseFee added for its bits
   212  	h.BaseFee = big.NewInt(0x5d21dba00) // 35 bits ~= 4 bytes
   213  	expectSize += 4
   214  	assert.Equal(t, expectSize, int(h.Size()))
   215  }
   216  
   217  func TestHeaderJSON(t *testing.T) {
   218  	h := blockEncodingTCs["post-magma"].header
   219  	j, _ := json.Marshal(h)
   220  	assert.Contains(t, string(j), "baseFeePerGas")
   221  
   222  	h = blockEncodingTCs["post-randao"].header
   223  	j, _ = json.Marshal(h)
   224  	assert.Contains(t, string(j), "randomReveal")
   225  	assert.Contains(t, string(j), "mixHash")
   226  }
   227  
   228  func BenchmarkBlockEncodingHashWithInterface(b *testing.B) {
   229  	data, err := os.ReadFile("../../tests/b1.rlp")
   230  	if err != nil {
   231  		b.Fatal("Failed to read a block file: ", err)
   232  	}
   233  
   234  	blockEnc := common.FromHex(string(data))
   235  	var block Block
   236  	if err := rlp.DecodeBytes(blockEnc, &block); err != nil {
   237  		b.Fatal("decode error: ", err)
   238  	}
   239  
   240  	b.ResetTimer()
   241  	for i := 0; i < b.N; i++ {
   242  		block.header.HashNoNonce()
   243  	}
   244  }
   245  
   246  func BenchmarkBlockEncodingRlpHash(b *testing.B) {
   247  	data, err := os.ReadFile("../../tests/b1.rlp")
   248  	if err != nil {
   249  		b.Fatal("Failed to read a block file: ", err)
   250  	}
   251  
   252  	blockEnc := common.FromHex(string(data))
   253  	var block Block
   254  	if err := rlp.DecodeBytes(blockEnc, &block); err != nil {
   255  		b.Fatal("decode error: ", err)
   256  	}
   257  
   258  	b.ResetTimer()
   259  	for i := 0; i < b.N; i++ {
   260  		rlpHash(block.header)
   261  	}
   262  }
   263  
   264  func BenchmarkBlockEncodingCopiedBlockHeader(b *testing.B) {
   265  	data, err := os.ReadFile("../../tests/b1.rlp")
   266  	if err != nil {
   267  		b.Fatal("Failed to read a block file: ", err)
   268  	}
   269  
   270  	blockEnc := common.FromHex(string(data))
   271  	var block Block
   272  	if err := rlp.DecodeBytes(blockEnc, &block); err != nil {
   273  		b.Fatal("decode error: ", err)
   274  	}
   275  
   276  	b.ResetTimer()
   277  	for i := 0; i < b.N; i++ {
   278  		rlpHash(block.header)
   279  	}
   280  }