У меня есть простая функция в смарт-контракте
function getBalance() external view returns (uint) {
requireMembership(msg.sender);
return coins[msg.sender];
}
Когда я вызываю его из объекта каски Contract
, он возвращает число. С другой стороны, когда я называю это
function vote(bytes32 merkleHash, bytes32 randomHash) external votePeriod returns (uint) {
votes.push(Vote (msg.sender, merkleHash, randomHash));
return votes.length - 1;
}
он возвращает больше данных
{
hash: '0x80edd9baca248c121bdd026343c842f9b608ac1827c63998dde48d2c3a87b2c6',
type: 2,
accessList: [],
blockHash: '0xcc1a5d8ac8d92f98e4f1247c4d76e83e27b167cdc29d2fe962f10ee773eaa509',
blockNumber: 4,
transactionIndex: 0,
confirmations: 1,
from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
gasPrice: BigNumber { value: "1590942713" },
maxPriorityFeePerGas: BigNumber { value: "1000000000" },
maxFeePerGas: BigNumber { value: "2181885426" },
gasLimit: BigNumber { value: "29025624" },
to: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
value: BigNumber { value: "0" },
nonce: 2,
data: '0xeeaaf19ded2380097cd5db2b14288f4081b387c78bb556bba20557ee9580b19c4c77aa01e57feaac04642d236597ea01c4f788ded7c59047121e4d1a42fa2daaaa22350a',
r: '0xdddc05db4d271a1a4c7e1d31bf56fc7e052a5e0d0f15a9309e8ce492a3e46da1',
s: '0x2968ea8648e0102437efa9c710ecc2188d72e0bb9afab5343b2062a4d5a5ee5b',
v: 0,
creates: null,
chainId: 31337,
wait: [Function (anonymous)]
}
Это потому, что getBalance
— это просто view
?
Is this because
getBalance
is just aview
?
Да, с комбинацией, которую вы используете Hardhat (и, как я предполагаю из контекста, Ethers.js).
Ethers.js и некоторые другие библиотеки используют контрактный ABI (в частности, свойство stateMutability
каждой функции), чтобы определить поведение по умолчанию при вызове функции. Следует ли вызывать его с помощью вызов только для чтения или сделка для чтения и записи.
EVM по своему дизайну предоставляет возвращаемые значения для вызовов, но не предоставляет их для транзакций.
Поскольку ваш скрипт работает вне EVM, он не имеет доступа к возвращаемым значениям из функции, вызванной транзакцией. И авторы Ethers.js решили в таком случае возвращать данные транзакции вместо ничего.