From 58d82ec7d396fefc9ce110adf9ba1a80b6f2f318 Mon Sep 17 00:00:00 2001 From: Mathieu <60658558+enitrat@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:10:59 +0200 Subject: [PATCH] feat: ensure sender nonce doesnt overflow u64 (#1444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ensure the sender nonce is not MAX_U64 otherwise reject tx. - - - This change is [Reviewable](https://reviewable.io/reviews/kkrt-labs/kakarot/1444) --- blockchain-tests-skip.yml | 6 ++++-- src/kakarot/errors.cairo | 28 ++++++++++++++++++++++++++++ src/kakarot/interpreter.cairo | 7 +++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/blockchain-tests-skip.yml b/blockchain-tests-skip.yml index 9aa645f03..a4b816e41 100644 --- a/blockchain-tests-skip.yml +++ b/blockchain-tests-skip.yml @@ -60,12 +60,12 @@ testname: stCreateTest: - CreateOOGafterMaxCodesize_d3g0v0_Cancun #RunResources error - CreateOOGafterMaxCodesize_d5g0v0_Cancun #RunResources error - - CreateTransactionHighNonce_d0g0v0_Cancun - - CreateTransactionHighNonce_d0g0v1_Cancun stCallCreateCallCodeTest: - Call1024PreCalls_d0g0v0_Cancun #RunResources error - Call1024PreCalls_d0g1v0_Cancun #RunResources error stExtCodeHash: + # fails because we don't support the behavior described in: https://github.com/ethereum/execution-specs/blob/07f5747a43d62ef7f203d41d77005cb15ca5e434/src/ethereum/cancun/vm/interpreter.py#L165-L177 + # At no point in Kakarot can there be an empty account with storage. - dynamicAccountOverwriteEmpty_Paris_d0g0v0_Cancun stDelegatecallTestHomestead: - Call1024PreCalls_d0g0v0_Cancun #RunResources error @@ -454,6 +454,8 @@ testname: - randomStatetest476_d0g0v0_Cancun #RunResources error - randomStatetest650_d0g0v0_Cancun #RunResources error stSStoreTest: + # Test family fails because we don't support the behavior described in: https://github.com/ethereum/execution-specs/blob/07f5747a43d62ef7f203d41d77005cb15ca5e434/src/ethereum/cancun/vm/interpreter.py#L165-L177 + # At no point in Kakarot can there be an empty account with storage. - InitCollisionParis_d0g0v0_Cancun - InitCollisionParis_d1g0v0_Cancun - InitCollisionParis_d2g0v0_Cancun diff --git a/src/kakarot/errors.cairo b/src/kakarot/errors.cairo index 04b6fdd8b..d05b90ec7 100644 --- a/src/kakarot/errors.cairo +++ b/src/kakarot/errors.cairo @@ -770,4 +770,32 @@ namespace Errors { dw 'c'; dw 'y'; } + + func nonceIsMax() -> (error_len: felt, error: felt*) { + let (error) = get_label_location(nonce_is_max_error_message); + return (21, error); + + nonce_is_max_error_message: + dw 'K'; + dw 'a'; + dw 'k'; + dw 'a'; + dw 'r'; + dw 'o'; + dw 't'; + dw ':'; + dw ' '; + dw 'n'; + dw 'o'; + dw 'n'; + dw 'c'; + dw 'e'; + dw ' '; + dw 'i'; + dw 's'; + dw ' '; + dw 'm'; + dw 'a'; + dw 'x'; + } } diff --git a/src/kakarot/interpreter.cairo b/src/kakarot/interpreter.cairo index 0c90821f3..c869dce59 100644 --- a/src/kakarot/interpreter.cairo +++ b/src/kakarot/interpreter.cairo @@ -949,6 +949,13 @@ namespace Interpreter { let sender = State.get_account(env.origin); let (local new_balance) = uint256_sub([sender.balance], max_fee_u256); let sender = Account.set_balance(sender, &new_balance); + // Check that the sender nonce cannot overflow MAX_64 + if (sender.nonce == 2 ** 64 - 1) { + let (revert_reason_len, revert_reason) = Errors.nonceIsMax(); + let evm = EVM.stop(evm, revert_reason_len, revert_reason, Errors.EXCEPTIONAL_HALT); + State.finalize(); + return (evm, stack, memory, state, 0, 0); + } let sender = Account.set_nonce(sender, sender.nonce + 1); State.update_account(sender);