Calldata

從不同的智能合約返回多個值

  • June 20, 2020

我有兩個契約。第一個合約有一個名為 get() 的函式,它返回以下值:

uint _value1
address _value2
address _value3
string memory _value4
string memory _value5
uint _value6
string memory _value7
address _value8

我想要的是從第二個合約中呼叫函式 get() (Smartcontract 1)。這是第二個 SmartContract 的功能。

function getValues() public view
       returns(uint _value1,
               address _value2,
               address _value3,
               string memory _value4,
               string memory _value5,
               uint _value6,
               string memory _value7,
               address _value8,
               address _value9
               )
   {
       return (contract1.get(), address(contract1)); 
   }

問題是我收到一條錯誤消息:“TypeError:return 語句中的參數數量與返迴聲明中的參數數量不同。”

我也試過這個:

{
       (_value1,_value2,_value3,_value4,_value5,_value6,_value7,_value8) = contract1.get();
       return (_value1,_value2,_value3,_value4,_value5,_value6,_value7,_value8, address(contract1)); 
}

但在這種情況下,我得到了經典錯誤:“CompilerError:堆棧太深,嘗試刪除局部變數。”

有沒有辦法解決這個問題??我知道我可以呼叫不同的函式來使其工作。

{
      return (contract1.getValue1(),
              contract1.getValue2(),
              contract1.getValue3(),
              contract1.getValue4(),
              contract1.getValue5(),
              contract1.getValue6(),
              contract1.getValue7(),
              contract1.getValue8(),
              address(contract1)); 
}

這將起作用,但我只想呼叫一次contract1。有什麼辦法嗎?我正在使用編譯器版本 0.6.10 提前謝謝你

另一種方法是返回一個結構。

如果該功能是公共的或外部的,您將不得不使用實驗性 abi 編碼器。

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

contract Structs {
 struct Param {
   uint _value1;
   address _value2;
   address _value3;
   string _value4;
   string _value5;
   uint _value6;
   string _value7;
   address _value8;
 }

 function get() public view returns (Param memory) {
   return Param(1, address(0x2), address(0x3), "Hi", "Mom", 3141, "Spagueti", address(0x42));
 }

 function get2() public view returns (Param memory, uint, bool) {
   return (get(), 454545, false);
 }
}

結構使用記憶體,因此它不會消耗堆棧槽,但氣體消耗可能會增加。

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