Я создал контракт и развернул его в своем частном блокчейне, как вы можете видеть, я использую сопоставление и динамически выделяемый массив. Когда я пытаюсь добавить домен с помощью метода «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
Хотя он возвращает что-то подозрительно похожее на то, 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
});
Надеюсь, поможет.
Эйлон Лотем
Роб Хитченс