Problem beim Testen von Integer Overflow

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?

2e256wäre 2 * 10**256, oder? Der größte Wert, den Sie für a übergeben können, uint256wäre 2**256-1. JavaScript ist nicht gut darin, solche Zahlen darzustellen, daher sollten Sie wahrscheinlich ein BN/ übergeben BigNumberoder eine Zeichenfolge verwenden.

Antworten (1)

Das Argument numberAeiner Funktion sumNumbershat einen Datentyp uint256. Der maximale Wert, numberAder gespeichert werden kann, ist 2^256-1.

Da numberAeine Zahl größer als 2^256-1 nicht gespeichert werden kann, erhalten Sie den Fehler.

Wie @smax richtig in Javascript gezeigt wird, 2e10ist 20000000000. Sie sollten verwenden bignumber.js, um einen Wert als Argument an eine Funktion zu übergeben.

Danke für deine Antwort. Ich habe folgendes versucht: const sumResult = await _erc20.sumNumbers('2e255', 5); Aber es gibt mir den gleichen Fehler ... was mache ich falsch?
'2e255' ist eine zu große Zahl als 2^255
oh Junge ... jetzt verstehe ich ... ich vermassele die Mathematik :) Können Sie mir ein Beispiel geben, wie man 2 ^ 256-1 als Zeichenfolge übergibt?
Sie müssen ein Argument wie dieses neue BigNumber(2).toExponential(255) übergeben.