forked from DecentralizedClimateFoundation/DCIPs
183 lines
5.5 KiB
Python
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}')
|