Der Aufruf einer konstanten Funktion mit web3js und Metamask kann keinen Wert erzielen

Ich habe einen extrem einfachen Vertrag, der auf Ropsten eingesetzt wird:

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;
  }
}

Ich verwende web3js und Metamask, um mit dem bereitgestellten Vertrag zu interagieren.

Ich kann web3 initialisieren. Ich kann das primäre Konto von Metamask erhalten. Aber ich bekomme immer 0, wenn ich getNumber() aufrufe. Hier sind die Funktionen, die ich mit web3 verwende:

function getNumberFromContract(contract) {
  contract.getNumber( (err, res) => {
    console.log(res.toNumber());
  });
}

function setNumberFromContract(contract) {
  contract.changeNumber(10, function(err,res){
    console.log("done");
  });
}

Ich verstehe nicht, warum ich 0 erhalte ... Ich kann nicht einmal sehen, ob setNumber() funktioniert.

Was mache ich falsch?

AKTUALISIEREN:

Ich verwende diesen Code, um auf die Ausführung der getNumber-Funktion zu warten:

var deferred = new $.Deferred();
  setTimeout(function () {
    deferred.resolve(getNumberFromContract(hyperContract));
  }, 5000);

Und bekomme trotzdem 0.

UPDATE 2:

So komme ich zum Vertrag:

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);

Die getContractFunktion ist diese:

function getContract(ABI, address, web3) {
  return web3.eth.contract(ABI).at(address);
}

Antworten (3)

Es scheint mir, dass Sie Ihre Funktion "getContract" mit einer EOA-Adresse und nicht mit der Vertragsadresse aufrufen!

ändern :

var hyperContract = getContract(abi, web3.eth.accounts[0], web3);

von :

var hyperContract = getContract(abi, address, web3); // (As address var is defined above)

Sie müssen warten, bis die Transaktion abgebaut ist.

Diese Linie:

console.log("done");

sollte genauer heißen:

console.log("sent");

Sie könnten die Transaktionsquittung für Kichern ( res) ausgeben. Der nächste Schritt besteht darin, regelmäßig zu überprüfen, ob die Transaktion geschürft wurde. Sobald es abgebaut/bestätigt ist, können Sie mit Ihrem Getter fortfahren, und basierend auf dem bloßen Anstarren des Codes sieht es so aus, als würde es funktionieren.

Hier ist eine Zusammenfassung, die zeigt, wie Sie auf die Bestätigung warten können, bevor Sie mit dem nächsten Schritt fortfahren.

https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Ich hoffe es hilft.

Ich habe es mit einem zurückgestellten Objekt versucht und 5 Sekunden gewartet. Funktioniert immer noch nicht. Ich habe meine Frage mit dem Code aktualisiert

Ein weiteres Problem mit Ihrer Funktion ist, dass die Rückgabevariable someNumberdie globale Variable mit demselben Namen überschattet someNumber.

uint256 public someNumber = 5;

// ..

function getNumber() public constant returns (uint256 someNumber) {
    return someNumber;    //   <---  Here someNumber is 0
}