Transaction VS UserOperation

한나리·2023년 9월 21일
0

blockchain

목록 보기
5/6
post-custom-banner

Legacy Transaction

const txObject = {
            nonce: txnCount,
            gasPrice: price,
            gasLimit: limit,
            to: addressTo,
            value: valueInEther,
  			chainId: 1,
  			type: 0x0
        }

EIP-1559 즉, 새로운 트랜잭션 타입이 추가되기 전에 사용되었던 트랜잭션 구조이며, Legacy 트랜잭션이라고 부르고 트랜잭션 타입은 0x0이다.

EIP-1559와 가장 큰 차이점은 수수료 정책인데, 레거시 트랜잭션은 블록 채굴자들이 블록 채굴 보상으로 블록에 포함되는 모든 거래들의 수수료를 가져가는 구조였기 때문에, 가스비 경쟁이 심화되는 구조였다.

채굴자들은 가스비를 더 많이 가져가기 위해서 가스비가 높은 트랜잭션 위주로 블록에 담게되고, 사용자들은 자신의 거래가 빨리 수행되도록 하기 위해서 점점 더 높은 수수료를 내게 되고 블록에 채택되길 기다려야 했다.

또한 기술적인 차이는 블록의 크기이다. EIP-1559로 업그레이드 하기 전, 모든 블록은 동일한 크기를 가졌다고, 그에 따라 처리할 수 있는 트랜잭션의 수량 또한 일정했다. 따라서 거래가 몰리는 시간이면 블록을 생성하는 시간보다 처리해야할 트랜잭션의 수가 더 많은데, 블록에 담을 수 있는 트랜잭션의 수량은 일정하기 때문에 트랜잭션이 블록에 담겨서 거래가 확정되는 시간이 늦어질 수 밖에 없었다. 거래 확정이 늦어지면 사용자는 수수료를 더 높여서 지불했고 이 또한 수수료가 상승하는 원인이 되었다.
Legacy

1559 Transaction

EIP-1559는 레거시 트랜잭션의 수수료 정책에 대한 개선책으로 나온 제안이다.
일단,
1. 블록 채굴자들의 채굴 보상에 대한 정책이 바뀌었고,
2. 혼잡도에 따라 블록의 크기를 조절하도록 개선했다.

레거시 트랜잭션에서 블록 채굴자들은 블록 채굴 보상으로 블록에 포함되는 모든 거래들의 수수료를 가졌다. 근데 EIP-1559에서는 수수료 구조를 달리하여, 채굴자들이 받는 보상을 줄이고, 일부(BaseFee)를 소각하는 것으로 바꾸었다.
사용자가 수수료를 직접 설정할 수 있다는 점은 같지만, 대신 수수료 지불의 제한선을 두었고, 사용자는 GasPrice대신 maxFeePerGas, maxPriorityFeePerGas를 직접 설정하게 된다.

maxFeePerGas : 사용자가 최대로 허용할 수 있는 가스의 최대 가격 ( maxFeePerGas > BaseFee)
maxPriorityFeePerGas : 채굴자에게 줄 수 있는 팁의 최대값
BaseFee : 블록에 트랜잭션을 포함시키기 위해 필요한 최소 가스 가격 -> 소각
PriorityFee : 채굴자에게 직접 지불하는 가스 가격(TIP이라고도 함)
** 여기서 BaseFee는 네트워크 혼잡도에 따라 프로토콜에 의해 알고리즘적으로 설정

레거시 트랜잭션에서 트랜잭션 수수료를 구하는 방법은 :

Transaction Fee = gasPrice * gasLimit

이고, EIP-1559에서 트랜잭션 수수료를 구하는 방법은 :

Trasaction Fee = (BaseFee + PriorityFee) * gasUsed

이다. BaseFee는 프로토콜에서 자동적으로 산출되기때문에 러거시때보다 수수료 급등 현상을 막을 수 있었고, 수수료가 어느 정도인지 예측할 수 있게 되어 사용자에게 편의를 제공한다.

  const txObject = {
            nonce: txnCount,
            gasLimit: limit,
            to: addressTo,
            value: valueInEther,
            maxFeePerGas: "0x2E90EDD000", // 200000000000 Wei
            maxPriorityFeePerGas: "0x77359400", // 2000000000 Wei
            chainId: 1,
            type: 0x2
  		}

UserOperation

UserOperation은 Transaction과는 비슷하면서도 다른 개념이지만, 사용자가 이더리움 기반의 서비스를 사용하기 위한 트리거 라는 점에서 비교를 해보았다.

이더리움에서 맨 처음 유저가 트랜잭션을 전송하는 것 처럼, ERC-4337을 사용하는 경우 유저는 User Operation을 번들러에게 전송한다. 이후 번들러가 User Operation을 Bundle Transaction으로 만들어 이더리움 네트워크로 전송하는 순간부터 일반적인 트랜잭션과 같은 프로세스를 거치게 된다.

지금은 기본적으로 1559 트랜잭션 타입을 사용하기 때문에, User Operation에서도 maxFeePerGasmaxPriorityFeePerGas 필드를 포함하는 것 같다.

const userOp: UserOperation = {
          sender: AccountContract.address,
          nonce: await entryPoint.getNonce(AccountContract.address, 0),
          signature: defaultAbiCoder.encode(['uint256'], [block.baseFeePerGas]),
          initCode: '0x',
          callData: '0x',
          callGasLimit: '0x' + 1e5.toString(16),
          verificationGasLimit: '0x' + 1e5.toString(16),
          preVerificationGas: '0x' + 1e5.toString(16),
          // we need maxFeeperGas > block.basefee + maxPriorityFeePerGas so requiredPrefund onchain is basefee + maxPriorityFeePerGas
          maxFeePerGas: block.baseFeePerGas.mul(3),
          maxPriorityFeePerGas: block.baseFeePerGas,
          paymasterAndData: '0x'
      }

결론

EIP-1559에서 사용자가 지불한 수수료 중 일부가 소각된다고 했다. 이 뜻은 채굴자에게만 집중되어 있던 보상이 넓은 의미에서 이더리움 네트워트 사용자 전체에게 돌아간다는 뜻이기도 하다. 이더리움의 일부가 가스비로 소각된다는 것은 이더리움의 희소성이 증가하여 가격이 상승하는 효과가 있기 때문이다. 결국 사용자 전체가 적지만 균등하게 이득을 보는 구조인 것이다.

지금 eth-infinitism의 account-abstraction 코드 분석을 하고있는데 User Operation 구조를 보다가 갑자기 트랜잭션 구조가 떠올라서 한번 비교해서 정리를 해봤다.
이제는 UserOperation이 transaction처럼 동작할 수 있는 원리를 알기위해 번들러 부분을 좀 더 구체적으로 파봐야겠다는 생각뿐..

profile
내가 떠나기 전까지는 망하지 마라, 블록체인 개발자
post-custom-banner

0개의 댓글