292 lines
11 KiB
Python
292 lines
11 KiB
Python
|
from os import mkdir
|
||
|
from shutil import rmtree
|
||
|
from ssz_proof_types import *
|
||
|
from convert_transactions import *
|
||
|
|
||
|
def create_transaction_proof(transactions: Transactions, tx_index: uint64) -> TransactionProof:
|
||
|
tx = transactions[tx_index]
|
||
|
return TransactionProof(
|
||
|
tx_root=Root(tx.value().hash_tree_root()),
|
||
|
tx_selector=tx.selector(),
|
||
|
tx_index=tx_index,
|
||
|
tx_branch=build_proof(
|
||
|
transactions.get_backing(),
|
||
|
MAX_TRANSACTIONS_PER_PAYLOAD * 2 + tx_index,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
def create_amount_proof(transactions: Transactions, tx_index: uint64) -> AmountProof:
|
||
|
tx = transactions[tx_index]
|
||
|
match tx.selector():
|
||
|
case 3:
|
||
|
tx_proof = UnionAmountProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP4844AmountProof(
|
||
|
gas=tx.value().message.gas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP4844_AMOUNT_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature_root=tx.value().signature.hash_tree_root(),
|
||
|
),
|
||
|
)
|
||
|
case 2:
|
||
|
tx_proof = UnionAmountProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP1559AmountProof(
|
||
|
gas_limit=tx.value().message.gas_limit,
|
||
|
destination=tx.value().message.destination,
|
||
|
amount=tx.value().message.amount,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP1559_AMOUNT_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature_root=tx.value().signature.hash_tree_root(),
|
||
|
),
|
||
|
)
|
||
|
case 1:
|
||
|
tx_proof = UnionAmountProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP2930AmountProof(
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP2930_AMOUNT_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature_root=tx.value().signature.hash_tree_root(),
|
||
|
),
|
||
|
)
|
||
|
case 0:
|
||
|
tx_proof = UnionAmountProof(
|
||
|
selector=tx.selector(),
|
||
|
value=LegacyAmountProof(
|
||
|
startgas=tx.value().message.startgas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in LEGACY_AMOUNT_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature_root=tx.value().signature.hash_tree_root(),
|
||
|
),
|
||
|
)
|
||
|
return AmountProof(
|
||
|
tx_proof=tx_proof,
|
||
|
tx_index=tx_index,
|
||
|
tx_branch=build_proof(
|
||
|
transactions.get_backing(),
|
||
|
MAX_TRANSACTIONS_PER_PAYLOAD * 2 + tx_index,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
def create_sender_proof(transactions: Transactions, tx_index: uint64) -> SenderProof:
|
||
|
tx = transactions[tx_index]
|
||
|
match tx.selector():
|
||
|
case 3:
|
||
|
tx_proof = UnionSenderProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP4844SenderProof(
|
||
|
gas=tx.value().message.gas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP4844_SENDER_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 2:
|
||
|
tx_proof = UnionSenderProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP1559SenderProof(
|
||
|
gas_limit=tx.value().message.gas_limit,
|
||
|
destination=tx.value().message.destination,
|
||
|
amount=tx.value().message.amount,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP1559_SENDER_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 1:
|
||
|
tx_proof = UnionSenderProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP2930SenderProof(
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP2930_SENDER_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 0:
|
||
|
tx_proof = UnionSenderProof(
|
||
|
selector=tx.selector(),
|
||
|
value=LegacySenderProof(
|
||
|
startgas=tx.value().message.startgas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in LEGACY_SENDER_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
return SenderProof(
|
||
|
tx_proof=tx_proof,
|
||
|
tx_index=tx_index,
|
||
|
tx_branch=build_proof(
|
||
|
transactions.get_backing(),
|
||
|
MAX_TRANSACTIONS_PER_PAYLOAD * 2 + tx_index,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
def create_info_proof(transactions: Transactions, tx_index: uint64) -> InfoProof:
|
||
|
tx = transactions[tx_index]
|
||
|
match tx.selector():
|
||
|
case 3:
|
||
|
tx_proof = UnionInfoProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP4844InfoProof(
|
||
|
nonce=tx.value().message.nonce,
|
||
|
max_priority_fee_per_gas=tx.value().message.max_priority_fee_per_gas,
|
||
|
max_fee_per_gas=tx.value().message.max_fee_per_gas,
|
||
|
gas=tx.value().message.gas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP4844_INFO_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 2:
|
||
|
tx_proof = UnionInfoProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP1559InfoProof(
|
||
|
nonce=tx.value().message.nonce,
|
||
|
max_priority_fee_per_gas=tx.value().message.max_priority_fee_per_gas,
|
||
|
max_fee_per_gas=tx.value().message.max_fee_per_gas,
|
||
|
gas_limit=tx.value().message.gas_limit,
|
||
|
destination=tx.value().message.destination,
|
||
|
amount=tx.value().message.amount,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP1559_INFO_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 1:
|
||
|
tx_proof = UnionInfoProof(
|
||
|
selector=tx.selector(),
|
||
|
value=EIP2930InfoProof(
|
||
|
nonce=tx.value().message.nonce,
|
||
|
gas_price=tx.value().message.gas_price,
|
||
|
gas_limit=tx.value().message.gas_limit,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in EIP2930_INFO_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
case 0:
|
||
|
tx_proof = UnionInfoProof(
|
||
|
selector=tx.selector(),
|
||
|
value=LegacyInfoProof(
|
||
|
nonce=tx.value().message.nonce,
|
||
|
gasprice=tx.value().message.gasprice,
|
||
|
startgas=tx.value().message.startgas,
|
||
|
to=tx.value().message.to,
|
||
|
value=tx.value().message.value,
|
||
|
multi_branch=[
|
||
|
tx.value().message.get_backing().getter(gindex).merkle_root()
|
||
|
for gindex in LEGACY_INFO_PROOF_HELPER_INDICES
|
||
|
],
|
||
|
signature=tx.value().signature,
|
||
|
),
|
||
|
)
|
||
|
return InfoProof(
|
||
|
tx_proof=tx_proof,
|
||
|
tx_index=tx_index,
|
||
|
tx_branch=build_proof(
|
||
|
transactions.get_backing(),
|
||
|
MAX_TRANSACTIONS_PER_PAYLOAD * 2 + tx_index,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
transaction_proofs = [
|
||
|
create_transaction_proof(transactions, tx_index)
|
||
|
for tx_index in range(len(transactions))
|
||
|
]
|
||
|
amount_proofs = [
|
||
|
create_amount_proof(transactions, tx_index)
|
||
|
for tx_index in range(len(transactions))
|
||
|
]
|
||
|
sender_proofs = [
|
||
|
create_sender_proof(transactions, tx_index)
|
||
|
for tx_index in range(len(transactions))
|
||
|
]
|
||
|
info_proofs = [
|
||
|
create_info_proof(transactions, tx_index)
|
||
|
for tx_index in range(len(transactions))
|
||
|
]
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
dir = os_path.join(os_path.dirname(os_path.realpath(__file__)), 'proofs')
|
||
|
if os_path.exists(dir) and os_path.isdir(dir):
|
||
|
rmtree(dir)
|
||
|
mkdir(dir)
|
||
|
|
||
|
print('transactions_root')
|
||
|
print(f'0x{transactions_root.hex()}')
|
||
|
file = open(os_path.join(dir, f'transactions_root.ssz'), 'wb')
|
||
|
file.write(transactions_root)
|
||
|
file.close()
|
||
|
|
||
|
file = open(os_path.join(dir, f'nil_0.ssz'), 'wb')
|
||
|
file.close()
|
||
|
|
||
|
for tx_index in range(len(transactions)):
|
||
|
print()
|
||
|
|
||
|
encoded = transaction_proofs[tx_index].encode_bytes()
|
||
|
print(f'{tx_index} - TransactionProof - {len(encoded)} bytes (Snappy: {len(compress(encoded))})')
|
||
|
print(encoded.hex())
|
||
|
file = open(os_path.join(dir, f'transaction_{tx_index}.ssz'), 'wb')
|
||
|
file.write(encoded)
|
||
|
file.close()
|
||
|
|
||
|
encoded = amount_proofs[tx_index].encode_bytes()
|
||
|
print(f'{tx_index} - AmountProof - {len(encoded)} bytes (Snappy: {len(compress(encoded))})')
|
||
|
print(encoded.hex())
|
||
|
file = open(os_path.join(dir, f'amount_{tx_index}.ssz'), 'wb')
|
||
|
file.write(encoded)
|
||
|
file.close()
|
||
|
|
||
|
encoded = sender_proofs[tx_index].encode_bytes()
|
||
|
print(f'{tx_index} - SenderProof - {len(encoded)} bytes (Snappy: {len(compress(encoded))})')
|
||
|
print(encoded.hex())
|
||
|
file = open(os_path.join(dir, f'sender_{tx_index}.ssz'), 'wb')
|
||
|
file.write(encoded)
|
||
|
file.close()
|
||
|
|
||
|
encoded = info_proofs[tx_index].encode_bytes()
|
||
|
print(f'{tx_index} - InfoProof - {len(encoded)} bytes (Snappy: {len(compress(encoded))})')
|
||
|
print(encoded.hex())
|
||
|
file = open(os_path.join(dir, f'info_{tx_index}.ssz'), 'wb')
|
||
|
file.write(encoded)
|
||
|
file.close()
|