Solidity

是否可以從維護原始呼叫者的 msg.sender 的合約中呼叫另一個合約?

  • May 19, 2016

想像一下,Alice 呼叫了一個合約方法 C1,而該方法呼叫了合約 C2 中的另一個方法。

定期msg.sender等於C1方法中的Alice Account。並且 msg.sender等於 C2 方法中的 C1 合約地址。

我想知道是否可以以msg.sender仍然是 Alice 地址而不是 C1 地址的方式呼叫 C2。並且 C2 可以訪問 C2 的狀態變數。

我曾嘗試使用delegatecalland callcode,但這些功能似乎 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.

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