Evm
使用程序集創建具有返回值的備份函式?
是否可以使用 Solidity 程序集創建一個備份函式來生成
DELEGATECALL
另一個合約,然後使用程序集將返回值正確儲存DELEGATECALL
在適當的寄存器中,以便備份函式有效地返回該值?這很有用,因此我可以創建一個行為與另一個合約完全相同的合約,同時保持複製與可靠特性的互操作性。
- 編輯 -
好的,我做了更多的研究,似乎應該可以使用程序集來推送到
returndata
EVM 堆棧,但我找不到任何特別好的關於乙太坊 VM 的文件,其中包含我需要的資訊。returndata
記憶體在哪裡?寫它的最佳方式是什麼?等等。
查看備份功能。
https://github.com/rob-Hitchens/TrustlessUpgrades/blob/master/contracts/Proxy.sol
function () external payable { address implementationAddress = userImplementation(msg.sender); //solium-disable-next-line security/no-inline-assembly assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, implementationAddress, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } }
免責聲明:
這段程式碼的靈感來自其他人,毫無疑問,他們也受到其他人的啟發。沒有任何形式的測試,也沒有任何形式的保證。
這是可升級合約的代理模式。它:
- 使用備份作為實現契約功能的全部 - 獲取所有功能。
- 使用 delgatecall 將 calldata 轉發到實現合約
- 將響應複製到 returndata
- 如果實現想要還原(返回失敗),則還原。這複製了被呼叫函式的預期行為。
希望能幫助到你。