
이 블로그에서는 Permissionless.js와 ERC-4337 커스텀 페이마스터 스마트 컨트랙트를 사용하여 가스비 없는 dapp을 만드는 방법을 살펴봅니다.

블록체인에서 거래를 실행할 때, 많은 프로세스가 뒤에서 진행됩니다. 이러한 각 프로세스에는 비용이 발생하며, 이를 "가스 비용(Gas Cost)"이라고 합니다. 그렇다면 가스(Gas)란 무엇일까요?
가스는 이더리움과 같은 블록체인 네트워크에서 트랜잭션을 실행하거나 스마트 컨트랙트를 처리하는 데 필요한 연산 작업량을 측정하는 단위입니다. 가스는 네트워크 내 트랜잭션을 조율하고 우선순위를 정하는 데 핵심적인 역할을 합니다. 블록체인 네트워크는 처리 용량이 제한되어 있기 때문에, 가스 수수료는 두 가지 중요한 목적을 수행합니다:
검증자 또는 채굴자에 대한 인센티브 제공: 가스 수수료는 트랜잭션을 처리하고 확인하는 검증자 또는 채굴자에게 보상을 제공하여, 네트워크가 안전하고 원활하게 운영될 수 있도록 합니다.
시스템 남용 방지: 모든 작업에 비용을 부과함으로써 스팸 공격과 연산 자원의 악의적인 사용을 억제하고, 잠재적인 남용으로부터 네트워크를 보호합니다.
가스가 블록체인 작동에 필요한 "연료"라는 점을 고려하면, 가스리스(gasless) dapp이라는 개념은 마치 연료 없이 자동차를 운행하려는 것처럼 모순처럼 느껴질 수 있습니다. 그렇다면 블록체인은 어떻게 가스 없이 작동할 수 있을까요?
실제로 가스가 사라지는 것은 아닙니다. 대신, 가스 수수료를 지불하는 책임이 사용자에서 다른 주체—서비스 제공자 또는 dapp 자체—로 이전됩니다. 이 방식을 통해 사용자는 가스 비용을 직접 부담하지 않고도 dapp과 상호작용할 수 있으며, 사용자 경험과 접근성이 향상됩니다.
일반적으로 사용자는 가스 수수료를 직접 지불해야 하며, 이는 가스 가격에 따라 트랜잭션 비용을 증가시킬 수 있습니다. 그러나 가스리스 dapp에서는 제3자가 사용자를 대신하여 트랜잭션에 서명하고 가스 수수료를 부담합니다. 이 제3자는 주로 릴레이어(relayer)이지만, 경우에 따라 계정 추상화(account abstraction) 메커니즘이 사용되기도 합니다.
가스리스 dapp을 구현하는 데 사용되는 표준에는 ERC-4337과 ERC-2771 두 가지가 있습니다. 각각을 자세히 살펴보겠습니다:
ERC-4337: 이 표준은 계정 추상화를 도입하여 이더리움 계정이 스마트 컨트랙트처럼 동작할 수 있게 합니다. 특히 기존의 외부 소유 계정(EOA)에서 트랜잭션 시작을 분리함으로써, 트랜잭션을 시작하고 승인하는 방식에 더 큰 유연성을 제공합니다. 이를 통해 여러 작업을 하나의 트랜잭션으로 묶거나 프로그래밍 가능한 지갑을 활성화하는 등 더 복잡한 트랜잭션 워크플로우가 가능해집니다.
ERC-2771: 이 표준은 메타 트랜잭션 프레임워크를 도입하여 사용자가 가스 수수료를 직접 지불하기 위한 ETH 없이도 dapp과 상호작용할 수 있게 합니다. 신뢰할 수 있는 포워더(trusted forwarder)가 사용자를 대신하여 트랜잭션을 처리하고, dapp이 포워더에게 가스 비용을 상환합니다. 이는 지갑에 ETH가 없지만 dapp과 상호작용하고 싶은 신규 사용자의 온보딩을 간소화합니다.
이 경우, permissionless.js와 ERC-4337을 사용하여 클라이언트 생성(공개 클라이언트 및 Pimlico paymaster 클라이언트), 스마트 계정 설정, paymaster의 커스텀 로직 정의를 포함하는 커스텀 paymaster를 만들겠습니다. 하지만 먼저 paymaster가 무엇인지 이해해 보겠습니다.
Paymaster는 이더리움의 계정 추상화 시스템(ERC-4337 등)에서 사용되는 특수 스마트 컨트랙트입니다. 트랜잭션 가스 수수료의 스폰서 역할을 하며, 사용자가 ETH 이외의 토큰으로 수수료를 지불하거나 수수료를 전액 면제받을 수 있게 합니다. Paymaster는 커스텀 로직을 기반으로 가스 비용 후원 여부를 결정하며, dapp에 더 큰 유연성을 제공합니다. 제3자가 트랜잭션 비용을 처리할 수 있어 사용자가 ETH를 보유하지 않아도 되므로 프로세스가 더욱 간편해집니다.
먼저, 코드를 저장할 utils/index.ts 파일을 생성합니다.
공개 클라이언트 생성(선택 사항): SimpleSmartAccount와 상호작용하는 데 사용될 Pimlico paymaster 클라이언트입니다:
계정 생성: permissionless.js에서 지원하는 계정 또는 인터페이스를 준수하는 커스텀 계정을 사용할 수 있습니다. 이 예제에서는 SimpleSmartAccount를 사용합니다.
커스텀 paymaster 로직으로 스마트 계정 클라이언트 생성: smartAccountClient를 생성할 때, 사용자 작업이 서명되고 전송되기 전에 호출될 sponsorUserOperation 함수를 전달할 수 있습니다. 이 함수는 paymasterAndData, preVerificationGas, verificationGasLimit, callGasLimit 필드를 반환해야 합니다.
트랜잭션 전송: 이제 일반적인 방식으로 트랜잭션을 전송할 수 있습니다. 각 트랜잭션이 서명되고 전송되기 전에 sponsorUserOperation 함수가 호출되어 설정한 커스텀 paymaster 로직이 적용됩니다.
permissionless.js와 Pimlico 클라이언트를 사용하여 커스텀 paymaster 로직이 통합된 스마트 계정을 설정했습니다. 이 설정을 통해 paymaster가 가스 수수료와 트랜잭션 관리를 자동화하면서 블록체인과 원활하게 상호작용할 수 있습니다. 이제 직접 시도해 볼 차례입니다.
1. 신뢰할 수 있는 릴레이어 및 paymaster: 가스리스 dapp은 제3자 릴레이어 또는 paymaster에 의존하여 사용자를 대신해 트랜잭션을 처리하므로, 이러한 주체가 신뢰할 수 있고 안전한지 확인하는 것이 중요합니다. 악의적이거나 손상된 릴레이어는 트랜잭션을 변조하거나 차단할 수 있습니다. 평판 있는 서비스를 사용하고, 릴레이어 장애에 대비한 폴백 메커니즘을 구현하세요.
2. 트랜잭션 무결성: 릴레이어를 사용할 때, 트랜잭션은 릴레이어가 사용자를 대신하여 서명할 수 있습니다. 릴레이어가 블록체인에 제출하기 전에 트랜잭션을 악의적으로 변조하지 않도록 확인하세요. 스마트 컨트랙트 또는 로직이 트랜잭션 세부 정보(예: 목적지 주소, 금액)가 사용자의 의도와 일치하는지 검증하도록 보장하세요.
3. Paymaster 로직 보안: Paymaster는 커스텀 로직을 기반으로 가스 수수료 후원 여부를 결정하므로, 이 로직이 안전하고 의도하지 않은 당사자가 paymaster를 악용하여 무료 트랜잭션을 실행하지 못하도록 해야 합니다. 남용 또는 의도하지 않은 트랜잭션 후원을 방지하기 위한 강력한 규칙과 검사를 구현하세요.
4. 스마트 컨트랙트 감사: 가스리스 dapp은 계정 추상화 또는 메타 트랜잭션을 위한 복잡한 스마트 컨트랙트를 포함하는 경우가 많습니다. 이러한 컨트랙트는 트랜잭션 흐름과 수수료를 관리하므로, 보안 취약점에 대해 정기적으로 감사를 실시하세요. 컨트랙트 취약점은 공격자가 트랜잭션 흐름을 조작하는 잠재적인 익스플로잇으로 이어질 수 있습니다.
5. 가스 가격 조작: 가스리스 dapp에서 paymaster가 가스 수수료를 부담하는 경우, 공격자는 paymaster가 부담하는 비용을 증가시키기 위해 가스 가격을 조작하려 할 수 있습니다. Paymaster 로직에 가스 수수료 상한선을 설정하고 과도하게 비용이 많이 드는 작업을 거부하는 안전장치를 포함하세요.
6. 개인 키의 안전한 보관: permissionless.js 또는 Pimlico와 같은 솔루션을 사용할 때, 트랜잭션 서명에 사용되는 개인 키가 안전하게 보관되도록 하세요. 애플리케이션에 개인 키를 하드코딩하지 말고, 키 관리를 위해 하드웨어 지갑이나 보안 엔클레이브(secure enclave)와 같은 안전한 환경의 사용을 고려하세요.
가스리스 dapp은 가스 수수료를 제3자에게 이전함으로써 dapp의 사용자 경험을 향상시키는 혁신적인 방법입니다. ERC-4337과 같은 표준을 활용하여 개발자는 신규 사용자의 진입 장벽을 낮추는 더 유연하고 사용자 친화적인 애플리케이션을 만들 수 있습니다.
제공된 코드 스니펫은 permissionless.js, Pimlico 클라이언트, 커스텀 paymaster 로직을 사용하여 가스리스 트랜잭션을 구현하는 방법을 보여줍니다. 이 단계를 따라 블록체인 상호작용을 간소화하고 더 많은 사용자가 접근할 수 있는 dapp을 구축할 수 있습니다. 이제 가스리스 dapp의 잠재력을 직접 구축하고 탐색해 볼 차례입니다!
AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.