No se pueden cambiar los datos del contrato con nodejs (web3)

Creé un contrato y lo implementé en mi cadena de bloques privada, como puede ver, uso el mapeo y la matriz asignada dinámicamente. Cuando intento agregar un dominio mediante el método 'addDomain' con remix web ide, funciona bien, cuando intento usar el método 'addDomain' con nodejs, devuelve una dirección (Número grande) como valor de retorno, pero en realidad, cuando Uso 'getDoamin', parece que la transacción no está aprobada o algo así.

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

reputación.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}));

Salida de Nodejs

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

Registro de Geth

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

Respuestas (1)

Aunque está devolviendo algo que se parece sospechosamente a lo 10que esperábamos, esto podría ayudarlo a esperar a que se extraiga la transacción: https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Cuando esté seguro de que está minado, continúe como:

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

Espero eso ayude.

En realidad, getDomain funciona bien. El problema es que addDomain no escribe en la cadena de bloques.
Asegúrese de que sea la misma dirección que implementó el contrato porque agregar Dominio está diseñado para rechazar txns de todos los demás. Luego, asegúrese de esperar a que se extraiga el txn. La primera devolución de llamada le dará un recibo de txn que indica que el txn se envió, no se extrajo. Usas ese recibo para esperarlo.