¡Buenas tardes!
Tengo una pregunta sobre la prueba de desbordamientos de enteros con trufa.
El método de contrato es:
function sumNumbers(uint256 numberA, uint256 numberB) public view returns(uint256) {
return numberA.add(numberB);
}
Mi código de prueba es el siguiente:
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);
}
})
El resultado de la prueba es el siguiente:
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
Simplemente no puedo entender qué es lo que va mal, excepto cuando cambio el valor 2e256 a un valor mucho más bajo, digamos 5, no obtengo este error.
¿Alguien puede ayudarme con este caso?
El argumento numberA
de una función sumNumbers
tiene un tipo de datos uint256
. El valor máximo que numberA
puede almacenar es 2^256-1.
Como numberA
no puede almacenar un número mayor que 2^256-1, está recibiendo el error.
Como @smax señaló correctamente en javascript 2e10
es 20000000000. Debe usar bignumber.js
para pasar un valor como argumento a una función.
usuario19510
2e256
sería2 * 10**256
, ¿verdad? El valor más grande que puede pasar por auint256
sería2**256-1
. JavaScript no es bueno para representar tales números, por lo que probablemente desee pasar unBN
/BigNumber
o usar una cadena.