Solidity

如何在 JavaScript 中訪問從solidity 函式返回的多個返回值

  • July 26, 2021

我的合約函式返回兩個值。如何從 mocha 測試案例訪問 JavaScript 中的多個返回值?

contract X {
  function a() pure public returns(uint,uint) {
      uint p=10;
      uint q=20;

      uint add = p+q;
      uint sub = q-p;

      return(add,sub);
  }
}

我不確定 ivicaa 在上一個答案中使用的web3 版本。在 web3 “v1.0.0-beta.37” 上,多個值實際上是在一個對像中返回的,而不是一個數組。但是,由於返回的對象具有以 numbers 命名的屬性{0: 'value1', 1:'value2'},因此原始答案是完全有效的,因此仍然可以使用 syntax 訪問返回的值result[0]

如果您使用的是 ES6,則可以使用帶命名變數的解構賦值來獲得單行。

例子:

Solidity 函式

// This function will return 03 values
function getData() external view returns (string, bool, uint256) {
   return ("data", true, 15);
}

JS測試

const result = await deployedContract.getData({from: accountAddress});
const {0: strValue, 1: boolValue, 2: intValue} = result;

console.log(strValue); // "data"
console.log(boolValue); // true
console.log(intValue); // 15

我建議你學習如何使用松露。它有助於編譯、測試、部署智能合約。它也是基於摩卡咖啡。有關使用 JavaScript 在 truffle 中編寫單元測試的範例,您可以查看https://truffleframework.com/docs/truffle/testing/writing-tests-in-javascript

此外,在簡單的情況下,您也可以在 Solidity 中編寫單元測試。請參閱https://truffleframework.com/docs/truffle/testing/writing-tests-in-solidity

編輯:回答您的評論:

在 Solidity 中,您可以像這樣讀取多個返回:

(uint add, uint sub) = x.a();

在通過 web3 的 truffle 中,它作為數組返回:

x.a().then(function(res){ var add = res[0]; var sub = res[1]; })

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