Web3js
無法從使用 web3js 和 Metamask 呼叫常量函式中獲取值
我在 Ropsten 上部署了一個非常基本的合約:
pragma solidity ^0.4.16; contract hypergrowth { uint256 public someNumber = 5; function hypergrowth() public {} function changeNumber(uint256 number) public { someNumber = number; } function getNumber() public constant returns (uint256 someNumber) { return someNumber; } }
我使用 web3js 和 Metamask 與部署的合約進行互動。
我可以初始化 web3。我可以從 Metamask 獲得主帳戶。但是當我呼叫 getNumber() 時,我總是得到 0。以下是我在 web3 中使用的函式:
function getNumberFromContract(contract) { contract.getNumber( (err, res) => { console.log(res.toNumber()); }); } function setNumberFromContract(contract) { contract.changeNumber(10, function(err,res){ console.log("done"); }); }
我不明白為什麼我收到 0…我什至看不到 setNumber() 是否有效。
我做錯了什麼?
更新:
我使用此程式碼等待 getNumber 函式執行:
var deferred = new $.Deferred(); setTimeout(function () { deferred.resolve(getNumberFromContract(hyperContract)); }, 5000);
仍然得到0。
更新 2:
這就是我獲得契約的方式:
var address = '0xbabd1c95906d4ebec8977a7d0f32410ecba1103f'; var abi = [ { "constant": true, "inputs": [], "name": "getNumber", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "number", "type": "uint256" } ], "name": "changeNumber", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" } ]; var hyperContract = getContract(abi, web3.eth.accounts[0], web3);
getContract
功能是這樣的:function getContract(ABI, address, web3) { return web3.eth.contract(ABI).at(address); }
在我看來,您使用 EOA 地址而不是合約地址呼叫函式“getContract”!
改變 :
var hyperContract = getContract(abi, web3.eth.accounts[0], web3);
經過 :
var hyperContract = getContract(abi, address, web3); // (As address var is defined above)
您需要等待交易被探勘。
這一行:
console.log("done");
應該更準確地閱讀:
console.log("sent");
您可以輸出交易收據以發出咯咯笑聲 (
res
)。下一步是定期檢查交易是否被探勘。一旦它被探勘/確認,您就可以繼續使用您的 getter,並且僅基於觀察程式碼,它看起來會起作用。這是一個要點,它顯示了在繼續下一步之前等待確認的方法。
https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
希望能幫助到你。