Solidity 函数不会 return 哈希数组到 W3
Solidity function does not return array of hashes to W3
我有一个 solidity
方法,它从我的合约中获取字符串列表,对每个字符串进行哈希处理,然后 returns 一个哈希数组。我在 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.log("got hashes from node === ");
console.log(hashes[0]); // this is 'undefined'
resolve(hashes);
},
(error) => {
reject(error);
}).catch((err) => {
reject(err);
});
})
.catch((err) => {
reject(err);
});
}
而不是 .send(...)
,您需要 .call(...)
。前者向网络广播交易,结果是交易哈希和最终(一旦交易被挖掘)交易收据。交易没有来自智能合约的 return 价值。
.call(...)
用于 view
函数。它在不发送交易的情况下在本地(仅在您连接的节点上)计算函数调用的结果,并将结果 return 发送给您。区块链中不会发生状态变化,因为没有交易被广播。 call
s 不需要汽油。
我有一个 solidity
方法,它从我的合约中获取字符串列表,对每个字符串进行哈希处理,然后 returns 一个哈希数组。我在 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.log("got hashes from node === ");
console.log(hashes[0]); // this is 'undefined'
resolve(hashes);
},
(error) => {
reject(error);
}).catch((err) => {
reject(err);
});
})
.catch((err) => {
reject(err);
});
}
而不是 .send(...)
,您需要 .call(...)
。前者向网络广播交易,结果是交易哈希和最终(一旦交易被挖掘)交易收据。交易没有来自智能合约的 return 价值。
.call(...)
用于 view
函数。它在不发送交易的情况下在本地(仅在您连接的节点上)计算函数调用的结果,并将结果 return 发送给您。区块链中不会发生状态变化,因为没有交易被广播。 call
s 不需要汽油。