ERC-4337에서는 이더리움의 합의 레이어에서 일어나는 프로토콜 처리 과정을 닮은 새로운 레이어를 통해 계정 추상화를 제공한다.
합의 레이어에서 각 노드들이 Mempool에 수집된 여러 트랜잭션 중 높은 수수료의 트랜잭션들을 골라 하나의 블록으로 제안하는 과정을 본따 이를 애플리케이션 레이어에 구현하고, 이 과정에서 계정의 개념을 통합하여 지원하는 것이다.
추상화된 레이어에서는 노드 대신 ‘Bundler’라는 새로운 Actor가 등장한다.
노드와 마찬가지로 이더리움 네트워크에서는 누구나 Bundler로 참여할 수 있으며 이는 분산화된 트랜잭션 처리를 지향하는 이더리움의 철학을 반영한다.
새로운 레이어에서 사용자들은 트랜잭션 대신 유효한 서명을 포함하는 ‘UserOperation’을 생성하고 Bundler의 RPC-Endpoint들을 통해 이를 전달한다.
이 때 User Operation은 다음과 같은 데이터 구조로 구성되어 있는데, 트랜잭션과 동일하게 sender, to, calldata, maxFeePerGas, masPriorityFee, signature ,nonce 등의 필드를 포함한다.
| Field | Type | Description |
|---|---|---|
| sender | address | 작업을 수행하는 계정 |
| nonce | uint256 | anti-replay 파라미터; 최초 계정 생성을 위한 salt로도 사용 |
| initCode | bytes | 계정이 아직 on-chain에 없을 때 필요 |
| callData | bytes | main execution call 중에 sender에게 보낼 데이터 |
| callGasLimit | uint256 | main execution call에 할당할 가스의 양 |
| verificationGasLimit | uint256 | verification 단계에서 할당할 가스의 양 |
| preVerificationGas | uint256 | pre-verification execution과 callData를 처리한 |
| bundler에게 보상으로 지불할 가스의 양 | ||
| maxFeePerGas | uint256 | EIP-1559 max_fee_per_gas |
| maxPriorityFeePerGas | uint256 | EIP-1559 max_priority_fee_per_gas |
| paymaster | Address | 트랜잭션 수수료를 대납하는 paymaster 주소 |
| (주소가 0일 경우 수수료는 직접 지불) | ||
| paymasterData | bytes | paymaster에게 보낼 추가 데이터 |
| signature | bytes | verification step에서 nonce와 함께 계정으로 전달된 데이터 |
Bundler는 수신한 UserOperation들을 전용 Mempool에 수집한 뒤 높은 수수료를 지불하는 User Operation들을 모아 Bundling하여 Bundle Transaction으로 만든 뒤, 이를 검증하고 처리하기 위해 ‘EntryPoint 컨트랙트’를 호출한다.

UserOperation 을 검증하고 실행하기 위한 룰이 필요하다.
EntryPoint 컨트랙트는 User Operation을 검증하고 처리하기 위한 공통 로직이 구현된 스마트 컨트랙트로서, 전체 이더리움 네트워크에서 표준으로 정의된 싱글톤 컨트랙트로 존재한다.
AA를 지원하기 위한 공통 로직을 포함하고 있어 그 신뢰성이 매우 중요하기 때문이다.
합의 레이어에서 트랜잭션의 검증 및 블록 생성 등의 로직이 프로토콜 레벨에서 지원되었다면, AA에서는 이런 로직을 EntryPoint 컨트랙트로 구현 해 온체인 로직 처리가 가능하도록 만든 것이다.
EntryPoint 컨트랙트에서 지원하는 다양한 인터페이스 중 simulateValidation(UserOperation userOp) 과 handleOps(UserOperation[] ops, address beneficiary) 함수가 기본적인 User Operation 처리에 사용된다.
simulateValidation 함수는 노드가 프로토콜에 따라 트랜잭션의 nonce와 내용, 서명을 검증하는 것과 같이 Bundler가 Mempool로 수집된 UserOperation의 서명 및 수수료 지불 가능성을 검증하고자 할 때 호출된다.
⇒ 번들러가 자신의 ethereum client 를 이용해서 가상 검증을 하는 것이며, 가스 테이블에 따라 연산 비용이 가스 비용으로 발생하지는 않는다.
이러한 검증을 통해 Bundler는 잘못된 UserOperation을 요청하여 발생하는 처리 실패로 인한 불필요한 가스 소모를 최소화 할 수 있다.
검증이 완료된 UserOperation들은 Bundle Transaction으로 가공된 뒤 handleOps함수를 통해 전달된다.
이후 EntryPoint 내의 검증 루프(Verficiation loop)와 실행 루프(Execution Loop)를 통해 최종 검증 및 실행이 완료된다.
