Evm

使用程序集創建具有返回值的備份函式?

  • February 11, 2020

是否可以使用 Solidity 程序集創建一個備份函式來生成DELEGATECALL另一個合約,然後使用程序集將返回值正確儲存DELEGATECALL在適當的寄存器中,以便備份函式有效地返回該值?

這很有用,因此我可以創建一個行為與另一個合約完全相同的合約,同時保持複製與可靠特性的互操作性。

  • 編輯 -

好的,我做了更多的研究,似乎應該可以使用程序集來推送到returndataEVM 堆棧,但我找不到任何特別好的關於乙太坊 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
  • 如果實現想要還原(返回失敗),則還原。這複製了被呼叫函式的預期行為。

希望能幫助到你。

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