Skip to content

Commit a89018d

Browse files
fix: the default (or empty) values of genesis fields should be same as normal blocks
1 parent 412e52a commit a89018d

3 files changed

Lines changed: 82 additions & 36 deletions

File tree

common/config-parser/src/types/spec.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use strum_macros::EnumIter;
1010
use common_crypto::Secp256k1RecoverablePrivateKey;
1111
use protocol::{
1212
codec::{decode_256bits_key, deserialize_address, ProtocolCodec},
13-
types::{ExtraData, HardforkInfoInner, Header, Key256Bits, Metadata, H160, H256, U256},
13+
types::{
14+
ExtraData, HardforkInfoInner, Header, Key256Bits, Metadata, H160, H256, RLP_EMPTY_LIST,
15+
RLP_NULL, U256,
16+
},
1417
};
1518

1619
use crate::parse_file;
@@ -203,6 +206,8 @@ impl Genesis {
203206
/// Build a `Header` of the genesis block from the user provided parameters.
204207
pub fn build_header(&self) -> Header {
205208
Header {
209+
transactions_root: RLP_NULL,
210+
signed_txs_hash: RLP_EMPTY_LIST,
206211
timestamp: self.timestamp,
207212
// todo: if Hardforkinput is empty, it must change to latest hardfork info to init
208213
// genesis

core/run/src/lib.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use protocol::traits::{
1515
Context, Executor, Gossip, MemPool, Network, NodeInfo, PeerTrust, ReadOnlyStorage, Rpc, Storage,
1616
};
1717
use protocol::types::{
18-
Block, ExecResp, HardforkInfoInner, Header, Metadata, Proposal, RichBlock, SignedTransaction,
19-
Validator, ValidatorExtend, H256,
18+
Block, Bloom, BloomInput, ExecResp, HardforkInfoInner, Header, Metadata, Proposal, RichBlock,
19+
SignedTransaction, Validator, ValidatorExtend, H256,
2020
};
2121
use protocol::{lazy::CHAIN_ID, trie::DB as TrieDB, ProtocolResult};
2222

@@ -463,6 +463,15 @@ async fn execute_genesis(
463463
partial_genesis.block.header.state_root = resp.state_root;
464464
partial_genesis.block.header.receipts_root = resp.receipt_root;
465465

466+
let logs = resp
467+
.tx_resp
468+
.iter()
469+
.map(|r| Bloom::from(BloomInput::Raw(rlp::encode_list(&r.logs).as_ref())))
470+
.collect::<Vec<_>>();
471+
let log_bloom = Bloom::from(BloomInput::Raw(rlp::encode_list(&logs).as_ref()));
472+
473+
partial_genesis.block.header.log_bloom = log_bloom;
474+
466475
log::info!("The genesis block is executed {:?}", partial_genesis.block);
467476
log::info!("Response for genesis is {:?}", resp);
468477

core/run/src/tests.rs

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,48 @@ use protocol::{
2424
codec::{hex_decode, ProtocolCodec as _},
2525
tokio,
2626
trie::{MemoryDB, PatriciaTrie, Trie as _},
27-
types::{Header, Metadata, Proposal, RichBlock, H256},
27+
types::{
28+
Bloom, BloomInput, Header, Metadata, Proposal, RichBlock, H256, RLP_EMPTY_LIST, RLP_NULL,
29+
},
2830
};
2931

3032
use crate::{components::chain_spec::ChainSpecExt as _, execute_genesis, DatabaseGroup};
3133

3234
const DEV_CONFIG_DIR: &str = "../../devtools/chain";
3335

3436
struct TestCase<'a> {
35-
chain_name: &'a str,
36-
config_file: &'a str,
37-
chain_spec_file: &'a str,
38-
key_file: &'a str,
39-
input_genesis_hash: &'a str,
40-
genesis_state_root: &'a str,
41-
genesis_receipts_root: &'a str,
37+
chain_name: &'a str,
38+
config_file: &'a str,
39+
chain_spec_file: &'a str,
40+
key_file: &'a str,
41+
input_genesis_hash: &'a str,
42+
genesis_state_root: &'a str,
4243
}
4344

4445
const TESTCASES: &[TestCase] = &[
4546
TestCase {
46-
chain_name: "single_node",
47-
config_file: "config.toml",
48-
chain_spec_file: "specs/single_node/chain-spec.toml",
49-
key_file: "debug.key",
50-
input_genesis_hash: "0x57db5b4b5c7dd1246c97b0c28aa4d10664035b2ee367df2ae1916c86b6fdffa9",
51-
genesis_state_root: "0x2f1e8e50d5ab97af96fdb5d6de8e691e5bb80f46f2c98c4133d265bd8b60de61",
52-
genesis_receipts_root: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
47+
chain_name: "single_node",
48+
config_file: "config.toml",
49+
chain_spec_file: "specs/single_node/chain-spec.toml",
50+
key_file: "debug.key",
51+
input_genesis_hash: "0xe3a40f0115fbf101520ceea1ce7103a73cb46554187ac7ed67f3522103e06d99",
52+
genesis_state_root: "0x2f1e8e50d5ab97af96fdb5d6de8e691e5bb80f46f2c98c4133d265bd8b60de61",
5353
},
5454
TestCase {
55-
chain_name: "multi_nodes",
56-
config_file: "nodes/node_1.toml",
57-
chain_spec_file: "specs/multi_nodes/chain-spec.toml",
58-
key_file: "debug.key",
59-
input_genesis_hash: "0x9dc9e22c984214a8a82f24045079e2c4dc7aa3c8510343b9c40a6e50986f3c9f",
60-
genesis_state_root: "0xf684cbec490eb5b8a07b80f369f3bf87f05ec73494b869111010a6ad6fa89894",
61-
genesis_receipts_root: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
55+
chain_name: "multi_nodes",
56+
config_file: "nodes/node_1.toml",
57+
chain_spec_file: "specs/multi_nodes/chain-spec.toml",
58+
key_file: "debug.key",
59+
input_genesis_hash: "0x1b4cf78373961dabcba5d4a9402c924fc4fecdd9ce367239f02c8971a052f3b5",
60+
genesis_state_root: "0xf684cbec490eb5b8a07b80f369f3bf87f05ec73494b869111010a6ad6fa89894",
6261
},
6362
TestCase {
64-
chain_name: "multi_nodes_short_epoch_len",
65-
config_file: "nodes/node_1.toml",
66-
chain_spec_file: "specs/multi_nodes_short_epoch_len/chain-spec.toml",
67-
key_file: "debug.key",
68-
input_genesis_hash: "0x02c6715381ee05c5e6b2a432c9da4843108c573aca6369a85ca06d26b88c1fb7",
69-
genesis_state_root: "0xa5e1e7ac3e03f7dc26cc93ab69c0ec49e591cbdaa7694c75682745c40bfca468",
70-
genesis_receipts_root: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
63+
chain_name: "multi_nodes_short_epoch_len",
64+
config_file: "nodes/node_1.toml",
65+
chain_spec_file: "specs/multi_nodes_short_epoch_len/chain-spec.toml",
66+
key_file: "debug.key",
67+
input_genesis_hash: "0xd930632a7565acfc149c1d896d79910608768de5b936fdb34cc47c9b2296dd2a",
68+
genesis_state_root: "0xa5e1e7ac3e03f7dc26cc93ab69c0ec49e591cbdaa7694c75682745c40bfca468",
7169
},
7270
];
7371

@@ -141,27 +139,57 @@ async fn check_genesis_data<'a>(case: &TestCase<'a>) {
141139
assert!(genesis.block.tx_hashes.is_empty());
142140

143141
println!("checking genesis hash");
144-
check_hashes(
142+
check_hashes_via_str(
145143
case.chain_name,
146144
"input genesis hash",
147145
case.input_genesis_hash,
148146
genesis.block.header.hash(),
149147
);
150148

151149
println!("checking state root");
152-
check_hashes(
150+
check_hashes_via_str(
153151
case.chain_name,
154152
"genesis state root",
155153
case.genesis_state_root,
156154
genesis.block.header.state_root,
157155
);
158156

157+
check_hashes(
158+
case.chain_name,
159+
"genesis transactions root",
160+
genesis.block.header.transactions_root,
161+
RLP_NULL,
162+
);
163+
164+
check_hashes(
165+
case.chain_name,
166+
"genesis signed transactions hash",
167+
genesis.block.header.signed_txs_hash,
168+
RLP_EMPTY_LIST,
169+
);
170+
159171
println!("checking receipts hash");
160172
check_hashes(
161173
case.chain_name,
162174
"genesis receipts root",
163-
case.genesis_receipts_root,
164175
genesis.block.header.receipts_root,
176+
RLP_NULL,
177+
);
178+
179+
let logs: Vec<Bloom> = Default::default();
180+
let expected_log_bloom = Bloom::from(BloomInput::Raw(rlp::encode_list(&logs).as_ref()));
181+
assert_eq!(
182+
genesis.block.header.log_bloom, expected_log_bloom,
183+
"log bloom in genesis of chain {} should be empty since no transactions, \
184+
expect {expected_log_bloom:#x}, actual {:#x}",
185+
case.chain_name, genesis.block.header.log_bloom,
186+
);
187+
188+
assert!(
189+
genesis.block.header.gas_used.is_zero(),
190+
"gas used in genesis of chain {} should be zero since no transactions, actual {}",
191+
case.chain_name,
192+
genesis.block.header.gas_used,
165193
);
166194

167195
println!("checking state");
@@ -198,9 +226,13 @@ fn check_state(spec: &ChainSpec, genesis_header: &Header, db_group: &DatabaseGro
198226
assert_metadata(metadata_1, handle.get_metadata_by_epoch(1).unwrap());
199227
}
200228

201-
fn check_hashes(chain: &str, name: &str, expected_str: &str, actual: H256) {
229+
fn check_hashes_via_str(chain: &str, name: &str, expected_str: &str, actual: H256) {
202230
let expected = H256::from_str(expected_str)
203231
.unwrap_or_else(|err| panic!("failed to parse hash {name} of chain {chain} since {err}"));
232+
check_hashes(chain, name, expected, actual);
233+
}
234+
235+
fn check_hashes(chain: &str, name: &str, expected: H256, actual: H256) {
204236
assert_eq!(
205237
expected, actual,
206238
"hash {name} of chain {chain} is changed, expect {expected:#x}, but got {actual:#x}",

0 commit comments

Comments
 (0)