2017-10-21 10 views
0

Ich versuche, einen Vertrag mit meinem privaten RPC-Server zu verbinden. Ich möchte in der Lage sein, einen Zähler Parameter auf meiner HTML-Seite zu aktualisieren, die wiederum auf meine Solidität Vertragsdatei und Updates in meinem Browser verweist. Allerdings laufe ich weiter unten in den folgenden Fehler für meine HTML-Datei. index.html und contract.sol enthält auch unten. TY!Web3 Rückruf Problem für Funktion - Solidität

enter image description here index.html

<!doctype html> 
     <html> 
<head> 
    <title>myDapp</title> 
    <script src="web3.js/dist/web3.min.js"></script> 

    <script type="text/javascript"> 



     var contract_address = "0x68FDbd58D28BeD866E07906f6129bAC86161e243"; 
     var contract_abi = [ { "constant": true, "inputs": [], "name": "getCreator", "outputs": [ { "name": "", "type": "address", "value": "0xc0f0fb70a63e7b345932da8eb427463f586be95d" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "kill", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "myNewNumber", "type": "uint256" } ], "name": "setMyNumber", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "getMyNumber", "outputs": [ { "name": "", "type": "uint256", "value": "3" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" } ]; 

     if (typeof web3 !== 'undefined') { 
      web3 = new Web3(web3.currentProvider); 
     } else { 
      // set the provider you want from Web3.providers 
      web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 
     } 

     var contract_instance = web3.eth.contract(contract_abi).at(contract_address); 
     console.log(contract_instance); 


     function getCounter() { 
      document.getElementById("myCounter").innerText = contract_instance.getMyNumber().toNumber().call; 

} 


    </script> 
</head> 
<body> 
<h1>Interact with a contract</h1> 

<button onclick="getCounter()">Update Counter</button> 
<button onclick="increaseCounter()">Increase Counter</button> 

<span id="myCounter"></span> Counter 

</body> 
</html> 

contract.sol

pragma solidity ^0.4.15; 
contract MyContract { 
    address creator; 
    uint256 myNumber; 

    function MyContract() public { 
     creator = msg.sender; 
     myNumber = 3; 
    } 

    function getCreator() public constant returns(address) { 
     return creator; 
    } 

    function getMyNumber() public constant returns(uint256) { 
     return myNumber; 
    } 

    function setMyNumber(uint256 myNewNumber) public { 
     myNumber = myNewNumber; 
    } 

    function kill() public { 
     if(msg.sender == creator) { 
      selfdestruct(creator); 
     } 
    } 
} 
+1

[** Veröffentlichen Sie keine Bilder von Code oder Fehlern! **] (https://meta.stackoverflow.com/q/303812/995714) Bilder und Screenshots können eine nette Ergänzung zu einem Beitrag sein, aber bitte machen Sie sicher, dass die Post immer noch klar und nützlich ohne sie ist. Wenn Sie Bilder von Code oder Fehlermeldungen veröffentlichen, stellen Sie sicher, dass Sie auch den tatsächlichen Code/die Nachricht kopieren und einfügen oder direkt in den Beitrag eingeben. – Rob

Antwort

0

Das Problem wird Ihr versucht Metamask direkt mit web3.js zu verbinden, die nicht ist, wie Sie es tun sollten. Metamask basiert auf provider Engine und Anbieter eninge nicht synchrone Funktionen oder Operationen zum Beispiel unterstützen:

Sie nicht tun können web3.eth.accounts

aber Sie können web3.eth.getAcounts() tun.

Um am besten zu arbeiten am besten Provider-Engine zu verwenden, um Ihre Web3 zu injizieren und es von dort zu nehmen, werden Sie feststellen, wie Sie alles in ein asynchrones Format schalten, um Dinge laufen zu lassen.

aber in allen Fällen verwenden Sie web3.js asynchrone Funktionen und Sie bekommen, was Sie wollen.