Solidity
是否可以從維護原始呼叫者的 msg.sender 的合約中呼叫另一個合約?
想像一下,Alice 呼叫了一個合約方法 C1,而該方法呼叫了合約 C2 中的另一個方法。
定期
msg.sender
等於C1方法中的Alice Account。並且msg.sender
等於 C2 方法中的 C1 合約地址。我想知道是否可以以
msg.sender
仍然是 Alice 地址而不是 C1 地址的方式呼叫 C2。並且 C2 可以訪問 C2 的狀態變數。我曾嘗試使用
delegatecall
andcallcode
,但這些功能似乎 C2 只能訪問 C1 狀態而不能訪問 C2 狀態。我猜這些呼叫是為圖書館準備的。最好有一個這個呼叫的例子。
我曾嘗試使用委託呼叫和呼叫程式碼,但這些函式似乎 C2 只能訪問 C1 狀態而不能訪問 C2 狀態。
正確的。
如果您想要 C2 的狀態,您可以使用
tx.origin
或使 C2 的方法採用 C1 傳遞 Alice 的地址的額外address _caller
(範例)。C2 然後使用_caller
而不是msg.sender
.使用
tx.origin
意味著 Alice不能成為合約,我如何讓我的 DAPP “Serenity-Proof”?建議避免使用tx.origin
.
如果您只想知道原始交易的發起者(而不是目前呼叫),您可以簡單地參考
tx.origin
而不是msg.caller
.