Solidity
誰是嵌套呼叫鏈中的 msg.sender?
我讀到了從合約呼叫合約時誰是 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 始終是最後一個合約的地址。