DCIPs/assets/eip-6404/tests/normalized/verify_proofs.py

183 lines
5.5 KiB
Python

from create_proofs import *
def verify_transaction_proof(
proof: TransactionProof,
cfg: ExecutionConfig,
transactions_root: Root,
expected_tx_hash: Root,
):
assert proof.tx_hash == expected_tx_hash
tx_gindex = GeneralizedIndex(MAX_TRANSACTIONS_PER_PAYLOAD * 2 + uint64(proof.tx_index))
assert calculate_multi_merkle_root(
[
proof.payload_root.hash_tree_root(),
proof.tx_hash.hash_tree_root(),
],
proof.tx_branch,
[
tx_gindex * 2 + 0,
tx_gindex * 2 + 1,
],
get_helper_indices([tx_gindex]),
) == transactions_root
def verify_amount_proof(
proof: AmountProof,
cfg: ExecutionConfig,
transactions_root: Root,
expected_tx_to: ExecutionAddress,
expected_tx_value_min: uint256,
):
assert proof.tx_to.destination_type == DESTINATION_TYPE_REGULAR
assert proof.tx_to.address == expected_tx_to
assert proof.tx_value >= expected_tx_value_min
payload_root = calculate_multi_merkle_root(
[
proof.tx_from.hash_tree_root(),
proof.nonce.hash_tree_root(),
proof.tx_to.hash_tree_root(),
proof.tx_value.hash_tree_root(),
],
proof.multi_branch,
AMOUNT_PROOF_INDICES,
AMOUNT_PROOF_HELPER_INDICES,
)
tx_gindex = GeneralizedIndex(MAX_TRANSACTIONS_PER_PAYLOAD * 2 + uint64(proof.tx_index))
assert calculate_multi_merkle_root(
[
payload_root,
proof.tx_hash.hash_tree_root(),
],
proof.tx_branch,
[
tx_gindex * 2 + 0,
tx_gindex * 2 + 1,
],
get_helper_indices([tx_gindex]),
) == transactions_root
def verify_sender_proof(
proof: SenderProof,
cfg: ExecutionConfig,
transactions_root: Root,
expected_tx_to: ExecutionAddress,
expected_tx_value_min: uint256,
) -> ExecutionAddress:
assert proof.tx_to.destination_type == DESTINATION_TYPE_REGULAR
assert proof.tx_to.address == expected_tx_to
assert proof.tx_value >= expected_tx_value_min
payload_root = calculate_multi_merkle_root(
[
proof.tx_from.hash_tree_root(),
proof.nonce.hash_tree_root(),
proof.tx_to.hash_tree_root(),
proof.tx_value.hash_tree_root(),
],
proof.multi_branch,
SENDER_PROOF_INDICES,
SENDER_PROOF_HELPER_INDICES,
)
tx_gindex = GeneralizedIndex(MAX_TRANSACTIONS_PER_PAYLOAD * 2 + uint64(proof.tx_index))
assert calculate_multi_merkle_root(
[
payload_root,
proof.tx_hash.hash_tree_root(),
],
proof.tx_branch,
[
tx_gindex * 2 + 0,
tx_gindex * 2 + 1,
],
get_helper_indices([tx_gindex]),
) == transactions_root
return proof.tx_from
def verify_info_proof(
proof: InfoProof,
cfg: ExecutionConfig,
transactions_root: Root,
) -> TransactionInfo:
payload_root = calculate_multi_merkle_root(
[
proof.tx_from.hash_tree_root(),
proof.nonce.hash_tree_root(),
proof.tx_to.hash_tree_root(),
proof.tx_value.hash_tree_root(),
proof.limits.hash_tree_root(),
],
proof.multi_branch,
INFO_PROOF_INDICES,
INFO_PROOF_HELPER_INDICES,
)
tx_gindex = GeneralizedIndex(MAX_TRANSACTIONS_PER_PAYLOAD * 2 + uint64(proof.tx_index))
assert calculate_multi_merkle_root(
[
payload_root,
proof.tx_hash.hash_tree_root(),
],
proof.tx_branch,
[
tx_gindex * 2 + 0,
tx_gindex * 2 + 1,
],
get_helper_indices([tx_gindex]),
) == transactions_root
return TransactionInfo(
tx_index=proof.tx_index,
tx_hash=proof.tx_hash,
tx_from=proof.tx_from,
nonce=proof.nonce,
tx_to=proof.tx_to,
tx_value=proof.tx_value,
limits=proof.limits,
)
if __name__ == '__main__':
print('transactions_root')
print(f'0x{transactions_root.hex()}')
print()
for tx_index in range(len(transaction_proofs)):
print(f'{tx_index} - TransactionProof')
expected_tx_hash = transaction_proofs[tx_index].tx_hash
verify_transaction_proof(
transaction_proofs[tx_index], cfg, transactions_root,
expected_tx_hash)
print(f'tx_index = {transaction_proofs[tx_index].tx_index}')
print()
for tx_index in range(len(amount_proofs)):
print(f'{tx_index} - AmountProof')
expected_tx_to = ExecutionAddress(bytes.fromhex('d8dA6BF26964aF9D7eEd9e03E53415D37aA96045'))
expected_tx_value_min = 1_000_000_000
verify_amount_proof(
amount_proofs[tx_index], cfg, transactions_root,
expected_tx_to, expected_tx_value_min,
)
print(f'OK')
print()
for tx_index in range(len(sender_proofs)):
print(f'{tx_index} - SenderProof')
expected_tx_to = ExecutionAddress(bytes.fromhex('d8dA6BF26964aF9D7eEd9e03E53415D37aA96045'))
expected_tx_value_min = 1_000_000_000
tx_from = verify_sender_proof(
sender_proofs[tx_index], cfg, transactions_root,
expected_tx_to, expected_tx_value_min,
)
print(f'tx_from = 0x{tx_from.hex()}')
print()
for tx_index in range(len(info_proofs)):
print(f'{tx_index} - InfoProof')
info = verify_info_proof(
info_proofs[tx_index], cfg, transactions_root,
)
print(f'info = {info}')