首页 > 其他分享 >理解Solidity 中的 tx.origin 和 msg.sender

理解Solidity 中的 tx.origin 和 msg.sender

时间:2024-05-24 19:00:09浏览次数:11  
标签:origin sender tx 地址 msg 合约

开发者需要了解在Solidity中tx.origin和msg.sender的区别。这两个全局变量经常被混淆,尽管它们之间有着根本的不同。虽然乍一看它们可能相似,但在交易的上下文中,tx.origin和msg.sender代表不同的地址。在这篇博客文章中,我们将深入探讨这些变量的含义。

什么是tx.origin?

在Solidity中,tx.origin标识交易的原始发送者。它指向发起交易的外部账户,并在后续的智能合约交互中保持不变(整个调用链中)。

当通过MetaMask钱包发起交易时,用户MetaMask钱包的地址会被存储在tx.origin中。即使交易经过多个合约,这个地址也会保持不变。这个地址的一致性对于追踪交易的初始发送者非常重要。

什么是msg.sender?

在智能合约开发中,msg.sender标识当前调用的发送者。这个变量是动态的,在交易过程中可以发生变化。

当交易通过多个智能合约时,msg.sender的值会更改,以指示调用链中最近的合约地址。例如,如果合约A调用合约B,那么在合约B中msg.sender的值将被识别为合约A。

代码示例
为了演示tx.origin和msg.sender在智能合约调用之间的变化,我们将创建一个EntryContract智能合约,该合约调用UnderlyingContract合约。

我们添加一个printTxOriginAndMsgSender函数来打印每个地址。

下面是EntryContract智能合约:

contract EntryContract {
  IUnderlyingContract private underlyingContract;
  constructor(IUnderlyingContract _underlyingContract) {
    underlyingContract = _underlyingContract;
  }
  function printTxOriginAndMsgSender() public view {
    console.log("tx.origin", tx.origin);
    console.log("msg.sender", msg.sender);
  }
  function callUnderlyingContract() external {
    underlyingContract.printTxOriginAndMsgSender();
  }
}

现在定义UnderlyingContract及其接口:

interface IUnderlyingContract {
  function printTxOriginAndMsgSender() external;
}
contract UnderlyingContract is IUnderlyingContract {
  function printTxOriginAndMsgSender() external view {
    console.log("tx.origin", tx.origin);
    console.log("msg.sender", msg.sender);
  }
}

要执行测试,我们必须先部署UnderlyingContract,并在部署EntryContract时使用其地址。

当我们调用EntryContract合约的printTxOriginAndMsgSender函数时,我们会看到两个地址是相同的。

当我们调用EntryContract合约的callUnderlyingContract函数时,我们可以看到tx.origin和msg.sender现在不同了。tx.origin是原始调用者地址,而msg.sender是EntryContract智能合约地址。

总结
在Solidity中,tx.origin和msg.sender是两个具有不同但重要用途的变量。tx.origin总是指最初发起交易的地址,并在整个交易链中保持不变。而msg.sender代表当前消息或合约交互的发送者,并随着每次调用而变化。使用msg.sender时需要谨慎,因为它不一定总是代表交易的初始调用者。

标签:origin,sender,tx,地址,msg,合约
From: https://blog.csdn.net/Spade_sec/article/details/139182044

相关文章

  • vscode使用colcon build编译ros2工程时报错:The current CMakeCache.txt directory...i
    之前已经编译好了一个文件夹A下的工程然后复制出一个文件夹B,再次编译时出现了问题,报错ThecurrentCMakeCache.txtdirectory...isdifferentfrom...其实也能猜到就是当路径从A变到B,不匹配导致报错,但是不知道应该在哪里改CSDN上有个文章给出回答:删除build文件夹,当然把log和ins......
  • Python 将PowerPoint (PPT/PPTX) 转为HTML
    1.Python 将PowerPoint文档转为HTML格式要实现该转换,仅需加一个.ppt或.pptx文档,然后使用 Presentation.SaveToFile() 方法将其另存为HTML格式。fromspire.presentation.commonimport*fromspire.presentationimport*#加载PPT文档ppt=Presentation()ppt.L......
  • $ git push -u origin "master"
    $gitpush-uorigin"master"Tohttps://gitee.com/ee/0523.git ![rejected]       master->master(non-fast-forward)error:failedtopushsomerefsto'https://gitee.com/ee/0523.git'hint:Updateswererejectedbecauseapushedbra......
  • 满足 5G 通信的带宽需求,1ST040EH2F35I2LG,1ST085ES3F50I3VG,1ST085ES3F50E3VG,1ST110E
    说明Stratix®10FPGA和SoCFPGA大幅提高了性能、功效、密度和系统集成度。Stratix10采用创新HyperflexFPGA架构,将嵌入式多芯片互连桥接器(EMIB)、高级接口总线(AIB)和芯片组等技术结合在一起。™因此,与上一代高性能FPGA相比,Stratix10器件的性能提高了2倍。Stratix®10......
  • git remote add origin <http地址>
     使用“gitremoteaddorigin”指令,可以轻松地将本地项目连接到远程Git仓库.gitremoteaddorigin<远程Git仓库地址>1.更改默认的远程仓库在项目中可能存在多个远程仓库,如果你想更改默认仓库,可以使用如下指令:   gitremoteset-urlorigin<新的远程Git仓库地址>2.查......
  • Origin2022安装出现“试用期已结束”的解决方法
    有小伙伴反馈,在安装Origin2022中文版出现弹窗:试用期已结束。……无法继续安装,这个问题该如何解决呢?  origin2022中文版解决方法:1、返回电脑桌面,点击左下角【Win标】按钮,在弹出列表中点击【设置】选项 2、点击【时间与语言】3、将【自动设置时间】点选关闭......
  • Python 将PowerPoint (PPT/PPTX) 转为HTML
    PPT是传递信息、进行汇报和推广产品的重要工具。然而,有时我们需要将这些精心设计的PPT演示文稿发布到网络上,以便于更广泛的访问和分享。本文将介绍如何使用Python将PowerPoint文档转换为网页友好的HTML格式。包含两个简单示例:Python将PowerPoint文档转为HTML格式Python将指定......
  • 在CMakeLists.txt中添加源文件的几种方法
    单个.cpp源文件的情况用这段代码进行测试,CMake中添加一个可执行文件作为构建目标:#include<cstdio>intmain(){printf("Hello,world!\n");}指定源文件的时候可以有两种方式。在创建目标的时候直接指定源文件add_executable(mainmain.cpp)先创建目标,再添加源......
  • [20240515]vim bccalc_XXX.vim使用插件简介.txt
    [20240515]vimbccalc_XXX.vim使用插件简介.txt--//这是我改写vim.org网站的一个调用bc做计算的一个插件bccalc.vim,感觉自己越写越复杂.做一个介绍,便于自己查阅.--//另外注意如果选择多行,结尾要像C语言一样使用分号(;).--//我已经统一在selectvisualnormal模式都是<leader>作......
  • [20240515]建立完善t2sh.sql脚本.txt
    [20240515]建立完善t2sh.sql脚本.txt--//建立一个简单输入简单文本计算sql_id,hash_values的sql脚本,主要用于简单sql语句以及对象的full_hash_value,sql_id,hash_value计算.--Copyright2023lfree.Allrightsreserved.--LicensedundertheApacheLicense,Version2.0.Se......