Web3js

web3.js 無法與智能合約互動

  • February 14, 2021

web3.js 和一般的乙太坊新手在這裡。我有一個用一堆 getter 方法編寫的智能合約,例如:

contract mycontract {
   uint XYZ = 2;
...
...
...

   function getXYZ() public view returns (uint){
       return XYZ;
   }
}

我已經在一條私有鏈上部署了這個智能合約,並使用 geth 啟動了一個提供程序。

在 python 中使用 web3.py,以下程式碼有效:

w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545/"))
contract = w3.eth.contract(address=contract_address, abi=abi)
contract.functions.getXYZ().call()

但是,以下等效程式碼在使用 web3.js-1.3.4 的瀏覽器或 nodejs 中不起作用

let w3 = new Web3("http://127.0.0.1:8545");
contract = new w3.eth.Contract(abi, contract_address);
contract.methods.getXYZ().call();

我得到的錯誤Error: execution reverted都在沒有任何堆棧跟踪的瀏覽器控制台/節點 js 腳本中。 瀏覽器中的錯誤

我在做什麼明顯錯了?我還嘗試使用 web-socket 提供程序而不是 http-provider 來完成這項工作,因為 web3.js 文件表明 http 提供程序已被棄用。但是,我在那裡也遇到了同樣的問題。

編輯更多資訊:

  1. 我 在 Git Commit:使用 geth 版本的自定義 geth 執行檔:1.9.26-unstable https://github.com/ethereum/go-ethereum/blob/master/consensus/ethash/consensus.go2e5d14170846ae72adc47467a1129e41d6800349 :。唯一的改變是第 315 行中的函式 CalcDifficulty,它被更改為始終返回 1,而不是執行難度計算。
  2. 這是我用來啟動我的 geth 提供程序的 bash 腳本。
#!/bin/bash
nice -50 geth --datadir ~/.ethereum/myethereumnet --gasprice 0 --nodiscover --networkid 2020 console --maxpeers 0 --rpc --rpcport 8545 --rpcaddr "0.0.0.0" --rpccorsdomain "*" --rpcapi "eth,net,personal,debug,web3,miner" --preload "startmine.js" --allow-insecure-unlock --nousb console
  1. 這裡是startmine.js。之所以使用它,是因為測試/開發目的不需要連續探勘。
var mining_threads = 1
var txBlock = 0

function checkWork() {
if (eth.getBlock("pending").transactions.length > 0) {
   txBlock = eth.getBlock("pending").number
   if (eth.mining) return;
   console.log("  Transactions pending. Mining...");
   miner.start(mining_threads)
   while (eth.getBlock("latest").number < txBlock + 12) {
     if (eth.getBlock("pending").transactions.length > 0) txBlock = eth.getBlock("pending").number;
       }
   console.log("  12 confirmations achieved; mining stopped.");

   miner.stop()
}
else {
   miner.stop()
    }
}

eth.filter("latest", function(err, block) { checkWork(); });
eth.filter("pending", function(err, block) { checkWork(); });

checkWork();

之前沒有提到編輯 1、2 和 3,因為我認為它們不相關,因為 python 客戶端工作。之後,我跑去miner.start(1)開始挖礦。

任何調試此問題的建議將不勝感激。謝謝。

沒關係,我發現了問題。我發布的 javascript 程式碼有點不同。在原始程式碼中,我正在使用以下方式獲取 contractAddress

web3.getTransactionReceipt(..).then(function(receipt){  contract = .... (receipt.contractAddress)});

這段程式碼在我的合約的第一個版本中工作,但是當合約更新時,地址顯然改變了,但是 getTransactionReceipt 仍然指向最初遷移合約的舊交易。所以在那之後,contractAddress 總是不正確的。

我正式是個白痴。謝謝@Ismael。您的評論啟發我編寫了一個獨立的 test.js,這讓我意識到我的錯誤。

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