Web3js
web3.js 無法與智能合約互動
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 提供程序已被棄用。但是,我在那裡也遇到了同樣的問題。
編輯更多資訊:
- 我 在 Git Commit:使用 geth 版本的自定義 geth 執行檔:1.9.26-unstable https://github.com/ethereum/go-ethereum/blob/master/consensus/ethash/consensus.go
2e5d14170846ae72adc47467a1129e41d6800349
:。唯一的改變是第 315 行中的函式 CalcDifficulty,它被更改為始終返回 1,而不是執行難度計算。- 這是我用來啟動我的 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
- 這裡是
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,這讓我意識到我的錯誤。