Vertragsdaten können mit nodejs (web3) nicht geändert werden

Ich habe einen Vertrag erstellt und ihn in meiner privaten Blockchain bereitgestellt, wie Sie sehen können, verwende ich Mapping und dynamisch zugewiesenes Array. Wenn ich versuche, eine Domäne mit der 'addDomain'-Methode mit remix web ide hinzuzufügen, funktioniert es gut, wenn ich versuche, die 'addDomain'-Methode mit nodejs zu verwenden, gibt es eine Adresse (Big Number) als Rückgabewert zurück, aber eigentlich wann Ich benutze 'getDoamin', es scheint, dass die Transaktion nicht genehmigt ist oder so ähnlich.

Ruf.sol

pragma solidity ^0.4.0;


contract addressRecord {
    struct  Record {
        address owner;
        uint score;
    }

    mapping (string => Record) records;
    string[] records_arr;

    function addDomain(string _domain, uint _score) {
        if (records[_domain].owner != address(0x0)
        && records[_domain].owner != msg.sender) { return; }

        records[_domain] = Record(msg.sender, _score);
        records_arr.length += 1;
        records_arr[records_arr.length-1] = _domain;
    }

    function getDomain(string _domain) constant returns(uint) {
        return records[_domain].score;
    }

    function changeScore(string _domain, address _to) {
        require(records[_domain].owner == msg.sender);
        records[_domain].owner = _to;
    }    

    function domainsCount() constant returns (uint) {
        return records_arr.length;
    }
}

Ruf.js

const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

const abi = require('./abi.json');
const contractAbi = web3.eth.contract(abi);

const contractAddr = "0x0014b44b785769e28b5cb097c1329784c96333f6"; // replace this
const walletAddr = "0xca1c9203f10f9b918d8630a540d85456dfb8b760";   // replace this

const myContract = contractAbi.at(contractAddr);

web3.personal.unlockAccount(walletAddr, "12345678");
var myArgs = process.argv.slice(2);
console.log(myArgs[0]);
console.log(parseInt(myArgs[1], 10));
console.log(myContract.addDomain(myArgs[0], parseInt(myArgs[1], 10), { from: walletAddr, to: contractAddr }));
console.log(myContract.getDomain(myArgs[0], {from: walletAddr, to: contractAddr}));

Nodejs-Ausgabe

testdomain.com
50
0x11229d6545a7002cbda9f102d91e010f9d990a149072382fe86dc63b1f6b639d
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }

Geth-Protokoll

INFO [09-03|00:50:32] Submitted transaction                    fullhash=0x73b720ccfb3811db2339a060655341bf07ad778e7dd9a6e160b868c647b0120a recipient=0x0014b44b785769e28b5cb097c1329784c96333f6
INFO [09-03|00:50:36] Successfully sealed new block            number=4851 hash=3bbc5a…d972af
INFO [09-03|00:50:36] 🔗 block reached canonical chain          number=4846 hash=4d78df…ca4938
INFO [09-03|00:50:36] 🔨 mined potential block                  number=4851 hash=3bbc5a…d972af
INFO [09-03|00:50:36] Commit new mining work                   number=4852 txs=1 uncles=0 elapsed=486.898µs

Antworten (1)

Obwohl es etwas zurückgibt, das verdächtig dem entspricht, 10was wir erwarten, könnte dies helfen, auf das Mining der Transaktion zu warten: https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Wenn Sie sicher sind, dass es abgebaut ist, fahren Sie fort wie:

  return myContract.getDomain(myArgs[....); // return a promise
})
.then(function(score) { // your function returns the score
  console.log(score.toString(10); // make it human-readable
});

Ich hoffe es hilft.

Eigentlich funktioniert getDomain gut. Das Problem ist, dass addDomain nicht in die Blockchain schreibt.
Stellen Sie sicher, dass es dieselbe Adresse ist, die den Vertrag bereitgestellt hat, da add Domain so konzipiert ist, dass txns von allen anderen abgelehnt werden. Warten Sie dann unbedingt, bis der txn abgebaut ist. Der erste Rückruf gibt Ihnen eine txn-Quittung, die angibt, dass die txn gesendet und nicht abgebaut wurde. Sie verwenden diese Quittung, um darauf zu warten.