Knoten verliert die Verbindung zu testrpc

Nach diesem Tutorial zum Schreiben eines Abstimmungsvertrags und zum Bereitstellen auf testrpc habe ich den folgenden js-Code erstellt voting.jsund ausgeführt:

> node
> require('./voting.js');

Nach dem Drucken web3.isConnected()scheint es an einigen Stellen, dass nach dem Anfordern des Solc-Pakets die Verbindung abbricht. Irgendeine Idee warum? wie löst man?

vote.js:

Web3 = require('web3');
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.accounts);
console.log(web3.isConnected());

fs = require('fs');
console.log(web3.isConnected());
code = fs.readFileSync('Voting.sol').toString();
console.log(web3.isConnected());

solc = require('solc');
console.log(web3.isConnected());
compiledCode = solc.compile(code);

console.log(web3.isConnected());

abiDefinition = JSON.parse(compiledCode.contracts['Voting'].interface);
byteCode = compiledCode.contracts['Voting'].bytecode;

console.log(web3.isConnected());
VotingContract = web3.eth.contract(abiDefinition);
console.log(web3.isConnected());
deployedContract = VotingContract.new(['Rama','Nick','Jose'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000});
console.log(deployedContract.address);
contractInstance = VotingContract.at(deployedContract.address);

contractInstance.totalVotesFor.call('Rama');

Die Ausgabe:

> node
> require('./voting.js');
[ '0xabefa5873fe5c980a2b7ffe84a6726386a1c6c3a',
  '0xe4bf2c9df073808c187066adac463f2b2a4a3847',
  '0x49d61cad7ad214f968a4d5b402e936aa3eef1ef5',
  '0xbb3ae1453c1c843f28952611c3948691376003bc',
  '0xb57b5c0f2ec7869c2371831c11a4d1f8c54086bb',
  '0xb14fad57e7ab17d378499e8aa0f2bbefa9f70344',
  '0xc911f8c0f1d2e2e4a08d0c5eaf3390d54cb6ce93',
  '0x6ee5769268c665f0c9541ecd0216041af111dced',
  '0x79a88a34d78151d9d79b997b51f14ea4211faacd',
  '0x8a287c6e4407ed53723cc9cde6741125efdbc8ba' ]
true
true
true
false
false
false
false
Error: CONNECTION ERROR: Couldn't connect to node http://localhost:8545.
    at Object.InvalidConnection (/home/bush/hello_world_voting/node_modules/web3/lib/web3/errors.js:31:16)
    at HttpProvider.send (/home/bush/hello_world_voting/node_modules/web3/lib/web3/httpprovider.js:83:22)
    at RequestManager.send (/home/bush/hello_world_voting/node_modules/web3/lib/web3/requestmanager.js:58:32)
    at Eth.get [as accounts] (/home/bush/hello_world_voting/node_modules/web3/lib/web3/property.js:107:62)
    at Object.<anonymous> (/home/bush/hello_world_voting/voting.js:24:93)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
> 

Antworten (1)

Ich kann bestätigen, dass das Erfordernis von „solc“ dazu führt, dass die Verbindung zu TestRPC unterbrochen wird. Ich habe nicht untersucht, warum, aber eine Problemumgehung besteht darin, zu vermeiden, dass „solc“ in Ihrer aktuellen Knotenkonsolensitzung erforderlich ist, indem Sie den Vertrag kompilieren und in eine Datei schreiben, bevor Sie Ihre Konsolensitzung starten.

Führen Sie compile.jsin der Befehlszeile mit: ~$ node compile.jsvor der Anforderung voting.jsin Ihrer Knotenkonsole aus.

Dateiinhalt:

kompilieren.js


solc = require('solc');
fs = require('fs');

code = fs.readFileSync('Voting.sol').toString();
compiledCode = solc.compile(code);
fs.writeFileSync("./Voting.compiled", JSON.stringify(compiledCode), 'utf-8');


Abstimmung.js


Web3 = require('web3');
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.accounts);

compiledCode = JSON.parse(fs.readFileSync("./Voting.compiled").toString());

abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface);
VotingContract = web3.eth.contract(abiDefinition);
byteCode = compiledCode.contracts[':Voting'].bytecode;

deployedContract = VotingContract.new(['Rama', 'Nick', 'Jose'], 
        {   data: byteCode,
            from: web3.eth.accounts[0],
             gas: 4700000,
        });



setTimeout(
    function(){
        console.log(deployedContract.address);
        contractInstance = VotingContract.at(deployedContract.address);
        console.log(contractInstance.address);
        console.log(contractInstance.totalVotesFor.call('Rama'));
}, 3000);



Hinweis: Sie müssen warten, VotingContract.newbis Sie zurückkehren, bevor Sie festlegen können contractInstance, andernfalls ist es undefiniert. Ich verpacke es daher in einen setTimeout, der drei Sekunden wartet, viel Zeit für VotingContractdie Rückkehr, nachdem der Vertrag an Ihren TestRPC-Server gesendet wurde. Dies ist normalerweise nicht die beste Vorgehensweise für den Umgang mit asynchronen Funktionen, erfüllt jedoch die Anforderungen für die Demo mit dem minimalen Umfang an Umschreibung und zusätzlichen Paketen.

Warum haben Sie ':' vor die Abstimmung gesetzt compiledCode.contracts[':Voting'].interface? (Es löst eine Ausnahme aus, dass es ein solches Objekt nicht kennt. Außerdem - fehlt fs = require("fs");am Anfang von vote.js