首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tx.origin的安全问题

tx.origin的安全问题
EN

Ethereum用户
提问于 2020-12-09 12:20:34
回答 1查看 1.4K关注 0票数 3

这本书指出,在智能合同中使用tx.origin是不安全的。我想知道不安全的原因是什么?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2020-12-09 17:45:48

主要是为了防止网络钓鱼合同。

tx.origin是启动事务的原始用户。

因此,如果合同有这样的方法(在Vyper中):

代码语言:javascript
复制
def burnBalance():
    assert tx.origin == owner, "You are not the owner"
    balance[tx.origin] = 0

然后,另一个聪明的合同可以用代理函数“欺骗”你--如果你不小心与这个邪恶的契约发生交互,那么你将失去你的资金:

代码语言:javascript
复制
# The attacking contract calling the original contract
OriginalContract(originalContractAddress).burnBalance()

如果burnBalance使用的是msg.sender,那么此攻击将失败:

代码语言:javascript
复制
# This is the correct way of checking permissions
def burnBalance():
    assert msg.sender == owner, "You are not the owner"
    balance[msg.sender] = 0

msg.sender是中间调用方;在本例中,网络钓鱼合同是msg.sender

Sidenote:实际上在ethereum社区中有一些关于一起删除tx.origin的讨论。就我个人而言,我不同意这一点,因为它有一些利基用例。其中之一是检查与智能契约交互的调用方是否是另一个智能契约或正常用户。例如:

代码语言:javascript
复制
assert tx.origin == msg.sender, "Only users can interact with this contract"
票数 4
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/90964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档