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
Obwohl es etwas zurückgibt, das verdächtig dem entspricht, 10
was 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.
Eilon Lotem
Rob Hitchens