Contract-Design

還有哪些常量取決於目前呼叫,例如 msg.sender?

  • January 24, 2019

我最近注意到這msg.sender並不總是原始呼叫者的地址(請參見此處)。這是目前呼叫的地址。因此,如果foo()呼叫bar(),那麼msg.senderinbar()將是包含foo().

我的問題是:

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

  1. tx.origin幾乎從來沒有用過。這是最主觀的一點,但我還沒有遇到對我來說似乎合法的 tx.origin 使用。我歡迎反例,但我已經寫了幾十個或幾百個不需要它的智能合約,我也從未聽說過其他人需要它。

相反,將msg.sender與交易簽名者有關的 into 函式傳遞給。這意味著被呼叫的合約相信發送合約會說真話。被呼叫的合約不應該天真地聽任何東西,而應該只信任構成您系統一部分的白名單合約。

function somethingOnBehalfOfSomeoneElse(address user) public onlyTrustedContracts {...

希望能幫助到你。

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