У меня есть метод solidity
, который получает список строк из моего контракта, хеширует каждую строку и возвращает массив хешей. Я тестировал это на Remix
, и он хорошо работает.
В разработке я вызываю эту функцию из nodejs
, но по какой-то причине возвращаю [object Object]
, который не содержит массива хэшей.
Я должен добавить, что мой провайдер web3
не Ethereum
, а Quorum
7nodes example.
Это функция solidity
:
function getHashs(string id) public view returns (bytes32[]) {
bytes32[] memory stringsToHash = getStrings(id);
bytes32[] memory hashes = new bytes32[](5);
for(uint i=0; i<=stringsToHash.length-1; i++) {
bytes32 str = seeds[i];
bytes32 hash = sha256(abi.encodePacked(seed));
hashes[i] = hash;
}
return hashes;
}
Это код w3
:
function getHashes(id, contract, fromAccount, privateForNode) {
return new Promise(function(resolve, reject) {
contract.methods.getHashs(id).send({from: fromAccount, gas: 150000000, privateFor: [privateForNode]})
.then(hashes => {
console.info("got hashes from node === ");
console.info(hashes[0]); // this is 'undefined'
resolve(hashes);
},
(error) => {
reject(error);
}).catch((err) => {
reject(err);
});
})
.catch((err) => {
reject(err);
});
}
Вместо .send(...)
вам нужен .call(...)
. Первый транслирует транзакцию в сеть, и результатом является хэш транзакции и, в конечном итоге (после того, как транзакция была добыта), квитанция транзакции. Транзакции не имеют значения, возвращаемого смарт-контрактом.
.call(...)
используется для функций view
. Он вычисляет результат вызова функции локально (только на узле, к которому вы подключены), не отправляя транзакцию, и возвращает результат вам. В блокчейне не происходит никаких изменений состояния, потому что транзакция не транслировалась. call
не требуют газа.