Solidity
msg.sender == 地址(這個)怎麼辦?
我知道 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 個)。
希望能幫助到你。