В чем разница между звонком с контракта и web3. Я рассматривал пример, и в комментариях было упомянуто, что нельзя звонить из контракта. Разве звонки с контракта и веб3 не должны быть одинаково дорогими?
This method MUST NEVER be called by smart contract code. First, it's
fairly
/// expensive (it walks the entire Persons array looking for persons
belonging to owner),
/// but it also returns a dynamic array, which is only supported
for web3 calls, and
/// not contract-to-contract calls.
function tokensOfOwner(address _owner) public view returns(uint256[]
ownerTokens) {
uint256 tokenCount = balanceOf(_owner);
if (tokenCount == 0) {
// Return an empty array
return new uint256[](0);
} else {
uint256[] memory result = new uint256[](tokenCount);
uint256 totalPersons = totalSupply();
uint256 resultIndex = 0;
uint256 personId;
for (personId = 0; personId <= totalPersons; personId++) {
if (personIndexToOwner[personId] == _owner) {
result[resultIndex] = personId;
resultIndex++;
}
}
return result;
}
}
Когда вы вызываете функцию только для чтения из web3js, этот вызов не потребляет газа.
Когда та же самая функция только для чтения вызывается методом смарт-контракта, выполняемым ethereum vm, это стоит газа.