Guten Nachmittag!
Ich habe eine Frage zum Testen von Integer-Überläufen mit Trüffel.
Die Vertragsmethode ist:
function sumNumbers(uint256 numberA, uint256 numberB) public view returns(uint256) {
return numberA.add(numberB);
}
Mein Testcode lautet wie folgt:
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);
}
})
Das Testergebnis lautet wie folgt:
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
Ich kann einfach nicht herausfinden, was falsch läuft, außer wenn ich den Wert 2e256 auf einen viel niedrigeren Wert ändere, sagen wir 5, erhalte ich diesen Fehler nicht.
Kann mir jemand bei diesem Fall helfen?
Das Argument numberA
einer Funktion sumNumbers
hat einen Datentyp uint256
. Der maximale Wert, numberA
der gespeichert werden kann, ist 2^256-1.
Da numberA
eine Zahl größer als 2^256-1 nicht gespeichert werden kann, erhalten Sie den Fehler.
Wie @smax richtig in Javascript gezeigt wird, 2e10
ist 20000000000. Sie sollten verwenden bignumber.js
, um einen Wert als Argument an eine Funktion zu übergeben.
Benutzer19510
2e256
wäre2 * 10**256
, oder? Der größte Wert, den Sie für a übergeben können,uint256
wäre2**256-1
. JavaScript ist nicht gut darin, solche Zahlen darzustellen, daher sollten Sie wahrscheinlich einBN
/ übergebenBigNumber
oder eine Zeichenfolge verwenden.