Fix genesis block number in prove_block (#1382)

* Fix genesis block number target

* Add consistency check

* Fix genesis block number

* Revert pruning

* Cleanup

* Update error message with hashes

* Fix and add comment

* Make comment more explicit
This commit is contained in:
Robin Salen 2023-11-27 10:24:11 -05:00 committed by GitHub
parent acd3b1ad54
commit 2039e18f29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 12 deletions

View File

@ -663,14 +663,14 @@ where
builder.connect(pvs.txn_number_before, lhs.txn_number_before);
builder.connect(pvs.txn_number_after, rhs.txn_number_after);
// Connect lhs `txn_number_after`with rhs `txn_number_before`.
// Connect lhs `txn_number_after` with rhs `txn_number_before`.
builder.connect(lhs.txn_number_after, rhs.txn_number_before);
// Connect the gas used in public values to the lhs and rhs values correctly.
builder.connect(pvs.gas_used_before, lhs.gas_used_before);
builder.connect(pvs.gas_used_after, rhs.gas_used_after);
// Connect lhs `gas_used_after`with rhs `gas_used_before`.
// Connect lhs `gas_used_after` with rhs `gas_used_before`.
builder.connect(lhs.gas_used_after, rhs.gas_used_before);
// Connect the `block_bloom` in public values to the lhs and rhs values correctly.
@ -680,7 +680,8 @@ where
for (&limb0, &limb1) in pvs.block_bloom_before.iter().zip(&lhs.block_bloom_before) {
builder.connect(limb0, limb1);
}
// Connect lhs `block_bloom_after`with rhs `block_bloom_before`.
// Connect lhs `block_bloom_after` with rhs `block_bloom_before`.
for (&limb0, &limb1) in lhs.block_bloom_after.iter().zip(&rhs.block_bloom_before) {
builder.connect(limb0, limb1);
}
@ -819,7 +820,7 @@ where
let has_not_parent_block = builder.sub(one, has_parent_block.target);
// Check that the genesis block number is 0.
let gen_block_constr = builder.mul(has_not_parent_block, rhs.block_metadata.block_number);
let gen_block_constr = builder.mul(has_not_parent_block, lhs.block_metadata.block_number);
builder.assert_zero(gen_block_constr);
// Check that the genesis block has the predetermined state trie root in `ExtraBlockData`.
@ -1033,7 +1034,18 @@ where
block_inputs
.set_proof_with_pis_target(&self.block.parent_block_proof, parent_block_proof);
} else {
// Initialize genesis_state_trie, state_root_after, block hashes and the block number for correct connection between blocks.
// Initialize genesis_state_trie, state_root_after, and the previous block hashes for correct connection between blocks.
// Block number does not need to be initialized as genesis block is constrained to have number 0.
if public_values.trie_roots_before.state_root
!= public_values.extra_block_data.genesis_state_trie_root
{
return Err(anyhow::Error::msg(format!(
"Inconsistent pre-state for first block {:?} with genesis state {:?}.",
public_values.trie_roots_before.state_root,
public_values.extra_block_data.genesis_state_trie_root,
)));
}
// Initialize `state_root_after`.
let state_trie_root_after_keys =
TrieRootsTarget::SIZE..TrieRootsTarget::SIZE + TrieRootsTarget::HASH_SIZE;
@ -1071,15 +1083,15 @@ where
nonzero_pis.insert(block_hashes_keys.start + 8 * (i + 1) + j, targets[j]);
}
}
let block_hashes_current_start = TrieRootsTarget::SIZE * 2
+ BlockMetadataTarget::SIZE
+ BlockHashesTarget::BLOCK_HASHES_SIZE
- 8;
let cur_targets = h256_limbs::<F>(public_values.block_hashes.prev_hashes[255]);
for i in 0..8 {
nonzero_pis.insert(block_hashes_keys.end + i, cur_targets[i]);
nonzero_pis.insert(block_hashes_current_start + i, cur_targets[i]);
}
// Initialize the block number.
let block_number_key = TrieRootsTarget::SIZE * 2 + 6;
nonzero_pis.insert(block_number_key, F::NEG_ONE);
block_inputs.set_proof_with_pis_target(
&self.block.parent_block_proof,
&cyclic_base_proof(

View File

@ -31,7 +31,10 @@ fn test_empty_txn_list() -> anyhow::Result<()> {
let all_stark = AllStark::<F, D>::default();
let config = StarkConfig::standard_fast_config();
let block_metadata = BlockMetadata::default();
let block_metadata = BlockMetadata {
block_number: 1.into(),
..Default::default()
};
let state_trie = HashedPartialTrie::from(Node::Empty);
let transactions_trie = HashedPartialTrie::from(Node::Empty);

View File

@ -354,7 +354,7 @@ fn test_log_with_aggreg() -> anyhow::Result<()> {
let block_metadata = BlockMetadata {
block_beneficiary: Address::from(beneficiary),
block_timestamp: 0x03e8.into(),
block_number: 0.into(),
block_number: 1.into(),
block_difficulty: 0x020000.into(),
block_gaslimit: 0x445566u32.into(),
block_chain_id: 1.into(),