Calldata
從不同的智能合約返回多個值
我有兩個契約。第一個合約有一個名為 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); } }
結構使用記憶體,因此它不會消耗堆棧槽,但氣體消耗可能會增加。