Solidity
當使用者 A 呼叫合約 B 呼叫合約 C 呼叫合約庫 D 時,如何保留 msg.sender==B?
我有使用者 A 呼叫合約 B 呼叫合約 C 呼叫合約 D。
如何在保存的同時從合約 C 呼叫外部庫 D
msg.sender==B
?當然,我不能使用,tx.origin
因為tx.origin
是 A。使用者 A 創建了 C 的地址和 D 的地址,但沒有創建 B。
DELEGATECALL
不是解決方案,不是嗎?
從合約 C 你可以將 a
delegatecall
變成 D,這將保留發件人 (B)但它不會改變儲存,它會繼續訪問合約 C 的儲存。
這僅適用於合約 D 不需要儲存,或者它是為了從 C 訪問儲存而編寫的(例如,如果 D 是庫合約)。
這完全取決於您是否是所有這些契約的作者。您可以通過 的組合來實現此目的
DELEGATECALL
,請參閱此 答案。但請始終注意,如果您不是唯一負責契約關鍵方面的人(例如,當它們具有代理功能時,有人可能會將呼叫重定向到意外程式碼),我不建議您依賴委託呼叫。另一種解決方案是msg.sender
作為另一個合約的函式參數,並將該地址傳遞給下一個合約,依此類推。