본문 바로가기
솔리디티

ERC-4337 , Account Abstraction

by gun_poo 2023. 4. 4.

ERC-4337 , Account Abstraction

주요 개념

  1. UserOperation 객체 도입 : 기존의 트랜잭션 구조와 다른 새로운 객체 유형, 사용자 작업 개체는 스마트 게약을 사용하여 처리되며 이를 통해 트랜잭션 처리 방식에 대한 유연성이 향상된다.
  2. 별도의 메모리 풀 : useroperation 객체는 일반 트랜잭션과 분리되어 별도의 메모리풀에 저장된다. 이를 통해 기존의 트랜잭션 처리에 영향을 주지 않으면서 사용자 작업 객체를 관리가능하다.
  3. 번들러 : 번들러는 사용자 작업 객체를 수집하고 이를 처리할수있는 번들로 만들어 주는 역할을 한다. 번들러가 번들을 처리하는 특수 계약을 호출하여 번들 내의 사용자 작업 객체들이 블록에 포함할수 있게 한다.

UserOperation

struct UserOperation {

        address sender;
        uint256 nonce;
        bytes initCode;
        bytes callData;
        uint256 callGasLimit;
        uint256 verificationGasLimit;
        uint256 preVerificationGas;
        uint256 maxFeePerGas;
        uint256 maxPriorityFeePerGas;
        bytes paymasterAndData;
        bytes signature;
    }

handleOps 함수 :

이 함수는 번들러가 호출하는 특수 계약 함수로, 번들에 포함된 UserOperation 객체들을 처리한다. 이 함수는 userOperation 객체를 순차적으로 처리하고 필요한 경우 사용자에게 가스비를 지불하도록 한다.

 

번들러 보상 :

번들러가 번들을 제출하고 처리하는데 필요한 리소스를 보상받기 위해 번들러에게 일정량의 이더가 지급된다. 이를 통해 번들러가 번들 제출에 적극 참여할수있도록 독려된다.

 

계정 추상화의 이점 :

다양한 서명 체계 지원, 프라이버시 강화, 비잔티움 결함 감소, 트랜잭션 방식 유연성 증가 등

 

계정 추상화 전체적인 구조와 순서 정리

  1. 사용자는 지갑이나 DApp(분산 애플리케이션)과 같은 소프트웨어를 사용하여 UserOperation 객체를 생성한다. 객체의 필드에는 사용자가 원하는 작업에 대한 정보와 서명이 포함된다
  2. UserOperation 객체를 올바르게 구분하기
    • 지갑 소프트웨어나 DApp은 사용자가 전송하려는 트랜잭션을 처리한다. 이때, 트랜잭션 객체의 구조와 필드를 확인하여 일반 트랜잭션 객체인지, UserOperation 객체인지 판별한다. 이를 위해, 일반 트랜잭션 객체와 UserOperation 객체는 서로 고유한 필드를 가지며, 이를 통해 서로 구분할 수 있다.
  3. UserOperaiton 객체를 p2p 네트워크 전송
    • 지갑 소프트웨어나 DApp은 판별된 UserOperation 객체를 P2P 네트워크에 전송한다. 블록체인 네트워크의 노드들은 서로 통신하며 데이터를 주고받는데, 이때 사용되는 프로토콜이 있다. 이 프로토콜은 일반 트랜잭션 객체와 UserOperation 객체를 구분하여 전송하도록 구현되어 있다. 따라서, 전송된 UserOperation 객체는 네트워크 상의 노드들이 이를 일반 트랜잭션과 구분하여 처리할 수 있다.
  4. UserOperation 객체를 전용 메모리 풀에 저장하기
    • 노드가 UserOperation 객체를 수신하면, 해당 객체를 전용 메모리 풀에 저장한다. 이 메모리 풀은 일반 트랜잭션 메모리 풀과 별개로 관리되며, 번들러라는 특별한 종류의 행위자가 이 메모리 풀에 있는 UserOperation 객체들을 수집한다. 번들러는 수집된 객체들을 일반 트랜잭션 형태로 패키지(번들)한 후,  해당 번들을 처리하는 특수 계약을 호출하며, 이를 통해 번들 내의 UserOperation 객체들이 블록에 포함된다.
  5.  마지막으로 블록이 채굴되고, 블록에 포함된 UserOperation 객체들이 처리된다. 이 과정에서 사용자의 원하는 동작이 수행되며, 계정 추상화와 관련된 새로운 기능이 구현된다.

플랫폼 개발자의 입장에서의 순서를 정리해보자면

  1. 유저가 필요한 트랜잭션을 보내기 위해 함수를 호출한다
  2. 플랫폼 eoa 지갑은 userOperation 내부 값들을 받아 기존 tx 방식으로 전송한다.
    1. 흠 이부분이 정확하지않다. eth_sendUserOperation 확인 필요
  3. useroperation 객체가 담긴 트랜잭션은 따로 분류가 되어 other mempool에 모이고
  4. 번들러는 이를 수집하여 처리하는 특수 계약을 호출하고, 이를 통해 번들 내의 useroperation 객체들이 블록에 포함된다.

여기서 userOperation의 sender는 추상지갑 주소, 마지막 값인 sign 부분은 컨트랙트 지갑에서 구현하는 아무 검증 방식을 사용해서 서명을 하면된다. 

기존 거래 흐름도

기존의 흐름도에서는 서명된 트랜잭션은 공용 멤풀로 전송되고 빌더가 이를 뽑아내 검증후 체인에 올라간다.

ERC-4337을 사용한 새로운 모델

조금 더 자세하게 살펴보자

전체 프로세스 요약도

유저는 userOperation에 서명을 하고 other mempool에 send req를 날린다.

번들러는 멤풀의 userOp를 수집하고 번들로 패키지를 해서 번들 트랜잭션을 생성하고 트랜잭션을 제출한다.

 

진입

EntryPoint contract는 UserOperation에서 호출되는 검증의 통합 진입점이다. 번들러는 체인에 제출된 트랜잭션을 검증하고 실행하기 위해 EntryPoint 내의 handleOps 함수를 호출한다. 

체인 상의 트랜잭션 성공률을 높이기 위해 번들러는 묶인 번들 트랜잭션을 처리 한 후, EntryPoint의 simulateValidation() 함수를 로컬에서 RPC 호출로 먼저 호출한다. 이렇게 하면 UserOperation의 서명이 정확하고 가스비를 정상적으로 지불 할 수 있는지 확인 할 수 있다.

 

PayMaster

마지막으로 번들러가 EntryPoint handleOps 함수를 호출 후 실행되는 작업에 대해 자세하게 설명하겠다.

또한 Paymaster라는 매우 중요한 역할도 있다. paymaster는 사용자가 가스비를 지불하는데 도움을 주고 사용자가 어떤 토큰을 사용하여 가스비를 지불 할 수 있도록 한다.

  1. 번들러가 EntryPoint handleOps 함수를 호출한다.
  2. EntryPoint는 UserOperation을 walletContract의 validateUserOp 함수의 매개변수로 전달하여 검증이 필요한 모든 트랜잭션을 검증한다. 검증이 성공적으로 이뤄질때만 후속 작업이 진행된다.
  3. 이 시점에서 EntryPoint는 먼저 UserOperation에 지정된 paymaster의 상태를 확인한다. 예를 들어 paymaster가 거래 수수료를 지불할 충분한 이더를 가지고있는지 체크한다.
  4. 그 다음 EtryPoint는 paymasterContract의 validatePaymasterUserOp 함수를 호출해 paymaster가 거래 수수료를 지불할       "의사" 가 있는지 확인하고 있다면 진행, 없다면 실패한다.
  5. 그 다음 EntryPoint는 walletContract를 호출하고 userOperation 자체에 지정된 내용을 실행한다.
  6. 다음으로 EntryPoint는 paymasterContract, Post-Op를 호출하여 사용자를 대신하여 직접 후원 또는 erc-20토큰 차감과 같은 사용자 지정 로직을 처리한다.
  7. EntryPoint는 Paymaster가 담보한 eth 잔액에서 거래에 필요한 가스비 차감한다.
  8. 마지막으로 EntryPoint는 모든 거래에 필요한 총 가스비를 수집하고 번들러에게 환불한다. 그리고 거래가 완료된다.

이방법을 개선했다는건 상당히 큰 의미가 있으며 유저친화적으로 다가가는 한발짝을 내딛었다고 볼수 있겠다.

나는 거의 모든 개발에서 중앙화 시스템을 고집해왔다. 블록체인이 탈중앙화가 원천이고 뭐고 간에 가장 중요한것은 

쓰는사람이 편해야한다라는 생각때문이었다. 불편한 시스템은 사용되지 않을것이기에

상당히 흥미롭고 진지하고 무거우며 획기적인 발판이라 생각된다. 

 

 

정리한 부분을 코드를 참고하면서 다시 상세하게 알아보자 

어렵다 어려워 

그리고 추후에는 bundler에 관해서 알아봐야겠다.

댓글