Проблема с тестированием Integer Overflow

Добрый день!

У меня есть вопрос относительно тестирования целочисленных переполнений с помощью трюфеля.

Метод контракта:

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, я не получаю эту ошибку.

Может ли кто-нибудь помочь мне с этим делом?

2e256будет 2 * 10**256, да? Наибольшее значение, которое вы можете передать для a uint256, будет 2**256-1. JavaScript не очень хорошо представляет такие числа, поэтому вы, вероятно, захотите передать BN/ BigNumberили использовать строку.

Ответы (1)

Аргумент numberAфункции sumNumbersимеет тип данных uint256. Максимальное значение, которое numberAможет храниться, составляет 2^256-1.

Поскольку numberAвы не можете сохранить число больше 2 ^ 256-1, вы получаете сообщение об ошибке.

Как правильно указал @smax в javascript 2e10, это 20000000000. Вы должны использовать bignumber.jsдля передачи значения в качестве аргумента функции.

Спасибо за ответ. Я попробовал следующее: const sumResult = await _erc20.sumNumbers('2e255', 5); Но выдает ту же ошибку... что я делаю не так?
«2e255» слишком большое число, чем 2 ^ 255
о боже... теперь понятно... я запутался в математике :) Можете ли вы привести пример, как передать 2^256-1 в виде строки?
Вам нужно передать аргумент, подобный этому новому BigNumber(2).toExponential(255)