以太坊合约调用关系,谁才是msg.sender

本文通过具体代码示例,深入解析以太坊智能合约中Token转移的调用机制,揭示调用者与实际执行者的区别,纠正常见误解。

今天在技术群里跟大家做技术交流,发现还是有很多人还是对以太坊的智能合约调用关系不是很清楚。所以我打算专门写一篇博文来说一下这个问题。

直接上代码:

contract Wallet{
    ERC20Token public token;

    constructor(address _token) public{
        token = ERC20Token(_token);
    }

    event Event_TransferToken(address _addr,uint256 _value);
    function TransferToken(address _addr,uint256 _value) external
    {
        token.transfer(_addr ,_value);
        emit Event_TransferToken(_addr ,_value);
    }
}

如代码上所示,这个合约内有一个Token对象,合约初始化的时候传入一个ERC20 Token的地址来实例化这个token对象,还有一个TransferToken方法,传入你要转出的的token数量和地址,然后TransferToken方法会调用token.transfer方法转出token。

很多人认为当我们自己去调用Wallet合约的TransferToken方法,这个时候msg.sender是我们自己,所以当执行token.transfer语句的时候很多人也会觉得相对于token对象而言msg.sender还是我们自己,这个时候转出的token是我们自己账户上的token。

但是这个想法大错特错。

调用TransferToken方法的时候,msg.sender却是是我们自己,但是在这个方法体内又执行了token.transfer,但是这个语句并不是我们自己去调用的,而是这个Wallet合约调用的,我们只是跟Wallet合约交互,跟token合约交互的是Wallet,所以在执行token.transfer语句的时候,token合约接收到的msg.sender是Wallet,所以转出的token是从Wallet的账户地址转出来的。

评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值