Добрый день!
У меня есть вопрос относительно тестирования целочисленных переполнений с помощью трюфеля.
Метод контракта:
function sumNumbers(uint256 numberA, uint256 numberB) public view returns(uint256) {
return numberA.add(numberB);
}
Мой тестовый код выглядит следующим образом:
it('the sum should not overflow', async () => {
try {
// Trying to sum 2^256 + 5, which should overflow and throw an exception in the best case
const sumResult = await _erc20.sumNumbers(2e256, 5);
assert.ok(false, 'The contract should throw an exception to avoid overflowing and thus making bad calculations')
} catch(error) {
assert.ok(true, 'The contract is throwing which is the expected behaviour when you try to overflow')
console.log(error);
}
})
Результат теста следующий:
RangeError: Invalid array length
at Object.padLeft (/app/node_modules/truffle/build/webpack:/~/web3/lib/utils/utils.js:81:1)
at SolidityTypeUInt.formatInputInt [as _inputFormatter] (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/formatters.js:40:1)
at SolidityTypeUInt.SolidityType.encode (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/type.js:188:1)
at /app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/coder.js:91:1
at Array.map (<anonymous>)
at SolidityCoder.encodeParams (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/coder.js:90:1)
at SolidityFunction.toPayload (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:92:1)
at SolidityFunction.call (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:131:1)
at SolidityFunction.execute (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:260:1)
at /app/node_modules/truffle/build/webpack:/packages/truffle-contract/contract.js:135:1
at new Promise (<anonymous>)
at /app/node_modules/truffle/build/webpack:/packages/truffle-contract/contract.js:126:1
Я просто не могу понять, что происходит не так, за исключением случаев, когда я изменяю значение 2e256 на гораздо более низкое значение, скажем, 5, я не получаю эту ошибку.
Может ли кто-нибудь помочь мне с этим делом?
Аргумент numberA
функции sumNumbers
имеет тип данных uint256
. Максимальное значение, которое numberA
может храниться, составляет 2^256-1.
Поскольку numberA
вы не можете сохранить число больше 2 ^ 256-1, вы получаете сообщение об ошибке.
Как правильно указал @smax в javascript 2e10
, это 20000000000. Вы должны использовать bignumber.js
для передачи значения в качестве аргумента функции.
пользователь19510
2e256
будет2 * 10**256
, да? Наибольшее значение, которое вы можете передать для auint256
, будет2**256-1
. JavaScript не очень хорошо представляет такие числа, поэтому вы, вероятно, захотите передатьBN
/BigNumber
или использовать строку.