这本书指出,在智能合同中使用tx.origin是不安全的。我想知道不安全的原因是什么?
发布于 2020-12-09 17:45:48
主要是为了防止网络钓鱼合同。
tx.origin是启动事务的原始用户。
因此,如果合同有这样的方法(在Vyper中):
def burnBalance():
assert tx.origin == owner, "You are not the owner"
balance[tx.origin] = 0然后,另一个聪明的合同可以用代理函数“欺骗”你--如果你不小心与这个邪恶的契约发生交互,那么你将失去你的资金:
# The attacking contract calling the original contract
OriginalContract(originalContractAddress).burnBalance()如果burnBalance使用的是msg.sender,那么此攻击将失败:
# This is the correct way of checking permissions
def burnBalance():
assert msg.sender == owner, "You are not the owner"
balance[msg.sender] = 0msg.sender是中间调用方;在本例中,网络钓鱼合同是msg.sender。
Sidenote:实际上在ethereum社区中有一些关于一起删除tx.origin的讨论。就我个人而言,我不同意这一点,因为它有一些利基用例。其中之一是检查与智能契约交互的调用方是否是另一个智能契约或正常用户。例如:
assert tx.origin == msg.sender, "Only users can interact with this contract"https://ethereum.stackexchange.com/questions/90964
复制相似问题