Contract-Invocation

我看不到獲取非視圖函式的返回值的方法(ethers.js)

  • January 25, 2022

在 Buidler 測試中,我有:

const { expect } = require("chai");

describe("SumOfTokens", function() {
 it("Checks correct transfers", async function() {
   const SumOfTokens = await ethers.getContractFactory("SumOfTokens");
   const sumOfTokens = await SumOfTokens.deploy();

   await sumOfTokens.deployed();

   console.log(await sumOfTokens.newToken());
 });
});

1它列印了一些廢話,而不是外部非視圖函式的返回值(應該是) newToken

如何獲取newToken其呼叫後的返回值?

非常量(既不是pure也不是view)函式的返回值只有在函式被鏈上呼叫時才可用(即,從這個合約或從另一個合約)。

當您從鏈下(例如,從 ethers.js 腳本)呼叫此類函式時,您需要在交易中執行它,並且返回值是該交易的雜湊值。

這是因為不知道交易何時會被探勘並添加到區塊鏈中。

此外,即使將交易添加到區塊鏈中,也可以稍後將其從區塊鏈中刪除。

它在區塊鏈上停留的時間越長,它在未來被移除的可能性就越小。

在假設它將永遠保留在區塊鏈中之前,習慣於確認 12 個塊。

為了在從鏈下呼叫非常量函式時獲得它的返回值,您可以發出一個包含您將要返回的值的事件。

然後,您可以在交易收據中獲得此事件的內容,您可以通過交易雜湊獲得該收據。

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