Fee Delegation

블록체인에 트랜잭션을 발생시키기 위해서는 수수료를 지불해야 합니다. 하지만, 서비스를 이용하는 사용자가 수수료를 지불하기 위해서는 Meta를 보유하고 있어야 하고, 서비스 정책에 의해 서비스를 운영하는 플랫폼이 수수료를 지불해야 하는 경우도 발생합니다.

Fee delegation은 사용자가 직접 수수료를 지불하지 않더라도 대신 지불할 수 있도록 지원합니다. 이는 사용자가 서명한 트랜잭션을 받아서 FeePayer의 서명을 추가하여 전송함으로써 수수료 대납이 가능해집니다.

Sender가 생성한 수수료에 의해 대납이 이루어지기 때문에 FeePayer는 Fee delegation Transaction의 수수료가 적정한지 검증하는 절차가 필요하며, 반대로 Sender가 생성한 Fee delegation Transaction을 FeePayer가 서명하지 않고 전송하는경우 오로지 Sender가 수수료를 지불해야 하기 때문에 주의해야 할 필요가 있습니다.

메타디움은 Fee delegation Transaction 중 DynamicFeeTxType만 지원합니다.

DynamicFeeTxType Transaction(with signature of Sender) + FeePayer address + signature of FeePayer

Fee delegation Transaction 구현 소스 참고

Fee Delegation Transaction Type (transaction.go)

const (
  LegacyTxType = iota
  AccessListTxType
  DynamicFeeTxType
  FeeDelegateDynamicFeeTxType = 22 //fee delegation
)

Fee Delegation Transaction Structure (transaction.go)

type FeeDelegateDynamicFeeTx struct {
  SenderTx DynamicFeeTx
  FeePayer *common.Address rlp:"nil"

  // Signature values
  FV *big.Int json:"fv" gencodec:"required" // feePayer V
  FR *big.Int json:"fr" gencodec:"required" // feePayer R
  FS *big.Int json:"fs" gencodec:"required" // feePayer S
}

Fee Delegation Transaction Hash Function for Signature (transaction_signing.go)

func (s feeDelegateSigner) Hash(tx *Transaction) common.Hash {
  senderV, senderR, senderS := tx.RawSignatureValues()
  return prefixedRlpHash(
    tx.Type(),
    []interface{}{
      []interface{}{
        s.chainId,
        tx.Nonce(),
        tx.GasTipCap(),
        tx.GasFeeCap(),
        tx.Gas(),
        tx.To(),
        tx.Value(),
        tx.Data(),
        tx.AccessList(),
        senderV,
        senderR,
        senderS,
      },
      tx.FeePayer(),
    })
}

Last updated