Solidity

誰是嵌套呼叫鏈中的 msg.sender?

  • July 19, 2019

我讀到了從合約呼叫合約時誰是 msg.sender ,但是從呼叫另一個合約的合約呼叫合約時誰是 msg.sender 等等?

讓我們看一下這個片段,您可以在Remix上自己部署它:

pragma solidity 0.5.10;

contract A {

   event LogMsgSender(address who);

   function callMe() public {
       emit LogMsgSender(msg.sender);
   }
}

contract B {

   function callMe(address a) public {
       A(a).callMe();
   }
}

contract C {

   function callMe(address a, address b) public {
       B(b).callMe(a);
   }
}

contract D {

   function callMe(address a, address b, address c) public {
       C(c).callMe(a, b);
   }
}

呼叫每個方法,我們得到以下結果:

  • A.callMe() 記錄實際的交易發送者。
  • B.callMe(a) 記錄 B 的地址。
  • C.callMe(a, b) 也記錄了 B 的地址。
  • D.callMe(a, b, c) 也記錄了 B 的地址。

因此,無論嵌套呼叫鏈有多深, msg.sender 始終是最後一個合約的地址。

引用自:https://ethereum.stackexchange.com/questions/73103