Solidity

有沒有辦法從備份函式返回數據?

  • April 11, 2022

我正在嘗試編寫一個包含回退函式的契約,該函式將通過呼叫傳遞給另一個目標契約。這將允許通過更新包含傳遞回退功能的契約中的目標契約地址來對目標契約進行未來升級/錯誤修復。

呼叫者呼叫 Do() -> Pass-Through function () -> Destination 實現 Do()

問題是回退函式不能返回任何東西。更糟糕的是,如果帶有備份函式的合約的呼叫者期望返回值,他們將收到我認為是 msg.data 而不是預期值。

  1. 有沒有辦法從備份函式返回數據(組裝好)?
  2. 目前的行為是否危險(例如破壞呼叫者的堆棧)?

這是範常式式碼:

pragma solidity ^0.4.10;

contract Real
{
   function Do() public constant returns (uint256) { return 12345; }
}

contract Blank
{
   function () public { }
}

// Client contract address: 0x7C2F875a9D5Ba712A6cdF35E537651ea89779802
contract Client
{
   function Run() public constant returns (uint256 result1, uint256 result2)
   {
       Real real = Real(0xd64dE830995C7407b09CF96EC59f76701D4DBcF9); // This is the address of Real
       result1 = real.Do();

       Real blank = Real(0x068c8D804Fab87B3d2cF3f02914eF2bE6b199436); // This is the address of Blank
       result2 = blank.Do();
   }
}

// result1 = 12345
// result2 = 0xDDFAE52900000000000000000000000000000000000000000000000000000000
// bytes4(sha3("Do()")) = 0xDDFAE529. This is why I think result2 is msg.data

正如chriseth(誰創建了 Solidity)在此概述的:

回退函式不能有返回值。

看起來你的result2價值就是msg.data價值。也就是說,您還沒有概述如何呼叫客戶端函式 - 返回 msg.data 可能是您正在使用的庫/工具的備份。

您可以使用內聯彙編編寫返回。鑽石圖案完全涵蓋了這一點以及一般的可升級性。

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