资讯专栏INFORMATION COLUMN

solidity智能合约中tx.origin的正确使用场景

Arno / 3016人阅读

摘要:在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击。但针对的使用并不用谈虎色变,正确的使用还是有它的应用场景的。漏洞详解漏洞合约在如下合约中使用到了的判断。使用提醒不应该用于智能合约的授权。

简介

tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址。在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击。

但针对tx.origin的使用并不用谈虎色变,正确的使用还是有它的应用场景的。

漏洞详解 漏洞合约

在如下合约中使用到了tx.origin的判断。

pragma solidity ^0.4.11;

// 不要使用这个合约,其中包含一个 bug。
contract TxUserWallet {
    address owner;

    function TxUserWallet() public {
        owner = msg.sender;
    }

    function transferTo(address dest, uint amount) public {
        require(tx.origin == owner);
        dest.transfer(amount);
    }
}

上面的合约提供了构造函数(新版本中使用constructor)和转账方法。其中在转账方法transferTo中进行了owner的判断,这里用到了tx.origin。

攻击者合约

下面看一下攻击者的合约:

pragma solidity ^0.4.11;

interface TxUserWallet {
    function transferTo(address dest, uint amount) public;
}

contract TxAttackWallet {
    address owner;

    function TxAttackWallet() public {
        owner = msg.sender;
    }

    function () public {
        TxUserWallet(msg.sender).transferTo(owner, msg.sender.balance);
    }
}

攻击者创建一个上面的合约,然后通过各种骗术来欺骗你用正常合约(TxUserWallet)的拥有者的地址向该攻击合约(TxAttackWallet)转账。然后区块链会默认调用攻击合约的fallback方法,也就是最后没有方法名的方法,并执行转账操作。

而此时TxUserWallet合约里面的校验是可以正常通过的。因为tx.origin是最初发起交易的地址,也就是合约拥有者的地址。然后,地址里面的ether便被转到攻击者地址中。

使用提醒

tx.origin不应该用于智能合约的授权。更多的时候采用msg.sender == owner来进行判断。

但它也有自己使用的场景,比如想要拒绝外部合约调用当前合约则可使用require(tx.origin ==msg.sender)来进行实现。

原文链接:https://www.choupangxia.com/2...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75460.html

相关文章

  • Solidity 简易教程0x001

    摘要:函数和可用于检查条件并在条件不满足时抛出异常。函数只能用于测试内部错误,并检查非变量。函数和状态变量仅在当前定义它们的合约中使用,并且不能被派生合约使用。派生合约可以访问所有非私有成员,包括内部函数和状态变量,但无法通过来外部访问。 Solidity是以太坊的主要编程语言,它是一种静态类型的 JavaScript-esque 语言,是面向合约的、为实现智能合约而创建的高级编程语言,设计...

    FrozenMap 评论0 收藏0
  • 智能合约语言 Solidity 教程系列9 - 错误处理

    摘要:本文首发于深入浅出区块链社区原文链接智能合约语言教程系列错误处理原文已更新,请读者前往原文阅读这是教程系列文章第篇介绍错误处理。如果合约没有修饰符的的函数在接收以太币时包括构造函数,和回退函数。如果合约通过一个的函数接收以太币。 本文首发于深入浅出区块链社区原文链接:智能合约语言 Solidity 教程系列9 - 错误处理原文已更新,请读者前往原文阅读 这是Solidity教程系列文章...

    xialong 评论0 收藏0
  • 等风来!区块链熊市,技术人就要做技术投资

    摘要:年的区块链牛市已经过去了,目前看来,年会是一个大熊市,投资抄币估计也捞不着什么。熊市囤技术,其实是技术人员很好的选择。三期同学讨论积累资料的地址等风来区块链熊市,技术人就要做技术投资。 2017 年的区块链牛市已经过去了,目前看来,2018 年会是一个大熊市,投资抄币估计也捞不着什么。熊市只能囤囤币,囤囤技术,只能等下一轮风起了。熊市囤技术,其实是技术人员很好的选择。等区块链牛市来了,...

    番茄西红柿 评论0 收藏0
  • 以太坊智能合约学习笔记(一)

    摘要:舍去小数位在以太坊中账户有两种类型普通账户和智能合约账户。报酬是小额的以太币,想要运行智能合约的人的需要支付报酬来使合约工作。涉及到以太坊智能合约的攻击的问题。 智能合约可以简单的理解为一段可执行的程序片段,具体的代码经过 Solidity 编写之后,发布到区块链上。而以太坊的智能合约也可以理解为一个特殊的交易(包括可执行代码的),被发送出去后会被矿工打包记录在某一个区块中,当需要调用...

    dadong 评论0 收藏0
  • 详解Solidity事件Event - 完全搞懂事件使用

    摘要:什么是事件事件是以太坊虚拟机日志基础设施提供的一个便利接口。在的应用中,如果监听了某事件,当事件发生时,会进行回调。不过要注意日志和事件在合约内是无法被访问的,即使是创建日志的合约。使用监听事件,刷新现在需要使用监听事件,刷新。 本文首发于深入浅出区块链社区原文链接:搞懂 Solidity 事件 Event - 如何在 DApp 中使用原文已更新,请读者前往原文阅读 很多同学对Soli...

    dabai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<