Невозможно изменить данные контракта с помощью nodejs (web3)

Я создал контракт и развернул его в своем частном блокчейне, как вы можете видеть, я использую сопоставление и динамически выделяемый массив. Когда я пытаюсь добавить домен с помощью метода «addDomain» с помощью remix web ide, он работает нормально, когда я пытаюсь использовать метод «addDomain» с nodejs, он возвращает адрес (большое число) в качестве возвращаемого значения, но на самом деле, когда Я использую «getDoamin», кажется, что транзакция не одобрена или что-то в этом роде.

Репутация.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;
    }
}

репутация.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}));

Выход Node.js

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

Журнал гетов

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

Ответы (1)

Хотя он возвращает что-то подозрительно похожее на то, 10что мы ожидаем, это может помочь ему дождаться завершения транзакции: https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6 .

Когда вы уверены, что он заминирован, продолжайте, например:

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

Надеюсь, поможет.

На самом деле, getDomain работает хорошо. Проблема в том, что addDomain не записывает в блокчейн.
Убедитесь, что это тот же адрес, на котором развернут контракт, потому что добавление домена предназначено для отклонения txns от всех остальных. Затем обязательно дождитесь майнинга txn. Первый обратный вызов даст вам квитанцию ​​txn, указывающую, что txn был отправлен, а не добыт. Вы используете эту квитанцию, чтобы дождаться ее.