存款合同将所有存款插入到梅克尔树中。根据信标链规范,当在信标链上处理沉积时,必须验证该沉积确实是默克尔树中的有效叶。这是在流程_押金()中指定的:
def process_deposit(state: BeaconState, deposit: Deposit) -> None:
# Verify the Merkle branch
assert is_valid_merkle_branch(
leaf=hash_tree_root(deposit.data),
branch=deposit.proof,
depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1, # Add 1 for the List length mix-in
index=state.eth1_deposit_index,
root=state.eth1_data.deposit_root,
)
# Deposits must be processed in order
state.eth1_deposit_index += 1
...我不明白这有什么意义。如果Eth1数据是可信的,那么验证数据似乎是不必要的。另一方面,如果Eth1数据是不可信的,那么上述检查似乎没有帮助,因为我们也不能信任state.eth1_data.deposit_root,也就是说,梅克尔根可能与实际存款契约的状态完全无关。检查某些不受信任的数据在某个不受信任的Merkle树中似乎没有以任何方式增加安全性。
我觉得我有点误会了。
发布于 2022-09-25 20:30:59
is_valid_merkle_branch()检查以确保不可能在process_deposit()函数中伪造存款。定金合同中的eth1data.deposit_root已由信标链同意,并包括所有待决存款,对信标链可见。存款本身包含一个梅克尔证明,它包括在该根。state.eth1_deposit_index计数器确保按顺序处理存款。简而言之,提议者提供leaf和branch,但既不提供index,也不提供root。
https://ethereum.stackexchange.com/questions/136346
复制相似问题