以太坊合約調用關係,誰纔是msg.sender

今天在技術羣裏跟大家做技術交流,發現還是有很多人還是對以太坊的智能合約調用關係不是很清楚。所以我打算專門寫一篇博文來說一下這個問題。

直接上代碼:

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的賬戶地址轉出來的。

發佈了18 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章