Solidity

msg.sender == 地址(這個)怎麼辦?

  • April 20, 2022

我知道 msg.sender 將是連接到合約的地址。

Address(this) 是目前合約地址

然後 == 表示它連接到自身。在require中使用這個條件時,函式內部只接受合約呼叫本身?這是正確的理解嗎?有意義嗎?

合約必須呼叫它自己的函式之一,並且消息必須來自外部。在那種情況下,msg.sender意志確實是它自己。

pragma solidity 0.7.6;

interface IRecursive {
   function isMe() external view returns(bool);
}

contract Recursive is IRecursive {
   
   function isMe() external view override returns(bool) {
       if(msg.sender == address(this)) return true;
       return false;
   }
   
   function tryThis() external view returns(bool) {
       return IRecursive(address(this)).isMe(); // we (this) are msg.sender to the receiver
   }
}

tryThis()使用介面呼叫實例在它自己的地址時,呼叫是從外部到達的,並且msg.sender是被呼叫的地址,isMe() 恰好是同一個合約。

在某些案例中,將合約本身提升到與其他使用者平等的地位會很方便。但是,請記住使用合約中對 self 的外部呼叫時的 gas 權衡,因為它會在呼叫成本中增加近 1000 個 gas 單位(在本例中為 980 個)。

希望能幫助到你。

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