Contract-Design
還有哪些常量取決於目前呼叫,例如 msg.sender?
我最近注意到這
msg.sender
並不總是原始呼叫者的地址(請參見此處)。這是目前呼叫的地址。因此,如果foo()
呼叫bar()
,那麼msg.sender
inbar()
將是包含foo()
.我的問題是:
- 是否還有其他取決於目前呼叫的常量?完整列表:https ://solidity.readthedocs.io/en/latest/units-and-global-variables.html#special-variables-and-functions
- 獲取原始發件人地址的最佳方法是什麼?
msg.data
,msg.sender
,msg.sig
, 和msg.value
將取決於目前呼叫。
tx.origin
是交易的原始發送者(EOA = 外部擁有的帳戶)。請注意,
msg.*
只有在您有this.fn()
或者
someOtherContractRef.fn()
合約內的內部呼叫(不帶
this.
)不會改變msg.*
變數。
添加到@ivicaa 和@Lauri 的答案。
獲取原始發件人地址的最佳方法是什麼?
tx.origin
是一個安全問題,不推薦。依賴它還可以確保合約不能成為您合約的客戶,因為合約永遠不會是 tx.origin。這種限制嚴重限制了你的 dapp,因為它包含多重簽名錢包合約,並且通常存在“使用者”可能是另一個合約的理想案例。這不是一個簡單的問題。該執行緒可能會闡明一些注意事項:https ://github.com/ethereum/solidity/issues/683
tx.origin
幾乎從來沒有用過。這是最主觀的一點,但我還沒有遇到對我來說似乎合法的 tx.origin 使用。我歡迎反例,但我已經寫了幾十個或幾百個不需要它的智能合約,我也從未聽說過其他人需要它。相反,將
msg.sender
與交易簽名者有關的 into 函式傳遞給。這意味著被呼叫的合約相信發送合約會說真話。被呼叫的合約不應該天真地聽任何東西,而應該只信任構成您系統一部分的白名單合約。function somethingOnBehalfOfSomeoneElse(address user) public onlyTrustedContracts {...
希望能幫助到你。