Web3js

無法從使用 web3js 和 Metamask 呼叫常量函式中獲取值

  • April 10, 2019

我在 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

希望能幫助到你。

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