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 }