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
Aunque está devolviendo algo que se parece sospechosamente a lo 10
que 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.
Eilon Lotem
Rob Hitchens