MetaMask Snaps는 MetaMask를 세계에서 가장 확장 가능한 지갑으로 만들기 위한 로드맵입니다. 개발자로서 여러분은 완전히 새로운 방식으로 MetaMask에 기능과 API를 추가할 수 있습니다. Web3 개발자들은 이러한 성장의 핵심이며, 이 시리즈는 현재 개발 중인 혁신적인 MetaMask Snaps를 소개하는 것을 목표로 합니다.
Swix Jedi, Adrian과 함께하는 Revoke Snap
ETHWarsaw 해커톤에서 Revoke Snap을 개발한 Web3 개발자 Swix Jedi와 Adrian과 이야기를 나눴습니다.
Snap 저장소: https://github.com/SwixJedi/revokesnap
왜 만들었나요?
외부 주체의 토큰 사용 보안을 보장하기 위해, ERC20 토큰 표준은 허용량(allowance) 개념을 구현합니다. 이는 토큰 소유자가 특정 주체(예: DEX 스마트 컨트랙트)가 선택한 한도까지 토큰을 사용할 수 있도록 승인해야 하는 방식입니다.
다소 불편한 DeFi 사용자 경험을 개선하기 위해, 많은 DeFi 프로토콜은 사용자가 컨트랙트와 상호작용할 때마다 토큰을 승인하고 불필요한 가스비를 지출하지 않아도 되도록 승인 시 최대 unit 256 값을 사용합니다.
특히 활발하게 DeFi를 이용하는 사용자들은 해당 프로토콜 사용 후 잔여 승인(leftover approval)이 남는 상황을 쉽게 만들 수 있으며, 이는 잠재적인 보안 위협이 됩니다.
잔여 허용량 문제를 해결하는 기존 솔루션들이 있지만, 사용자 인터페이스에서 직접 승인을 처리하는 것은 일부에 불과합니다. 각 승인을 개별적으로 처리하고 수동으로 확인해야 하기 때문에 시간이 많이 소요됩니다. 이 방식은 보안적이지만 지속적이고 수동적인 사용자 개입이 많이 필요합니다.
이것이 저희를 아직 해결되지 않은 틈새 영역으로 이끌었고, MetaMask Snaps의 기능을 활용해 상황을 개선할 수 있다고 판단했습니다.
기술적 구현 과정을 설명해 주시겠어요?
저희는 MetaMask Snaps의 다음과 같은 이점을 활용하기로 했습니다:
MetaMask의 모든 계정에 대한 접근
사용자의 단일 승인으로 복잡한 작업 수행 가능
이 문제에 대한 솔루션을 제안하기 위해, 향후 다음과 같은 기능을 구현하는 것을 목표로 했습니다:
현재 및 미래의 모든 계정에 접근하기 위한 단 한 번의 사용자 프롬프트 제공 (하드웨어 지갑은 예외)
별도의 확인 및 계정 전환 없이 모든 현재 계정의 승인을 일괄 취소
모든 사용자 계정(하드웨어 지갑 포함)을 적극적으로 모니터링하여 새로운 승인 감지 시 사용자에게 알림 표시
웹 UI를 통해 Revoke Snap을 설치하면 MetaMask가 필요한 권한을 요청합니다.
모든 권한은 snap.manifest.json 파일에 명시되어 있습니다:
"initialPermissions": {
"snap_confirm": {},
"snap_getBip44Entropy_60": {},
"snap_notify": {},
"endowment:long-running": {}
},
여기서 주목할 만한 두 가지 권한은 다음과 같습니다:
1. "Ethereum" 계정 및 자산 제어. 이는 Snap이 작동하기 위해 사용자를 대신하여 계정을 생성하고 트랜잭션에 서명할 수 있도록 MetaMask의 상위 키(비밀 키)가 필요하다는 것을 의미합니다.
2. 무기한 실행. Revoke Snap은 백그라운드에서 지속적으로 실행되도록 설계된 구현은 아니지만, 블록체인에서 트랜잭션을 처리하는 데 시간이 걸리며 MetaMask Snaps에는 60초 후 자동 종료 기능이 내장되어 있어 트랜잭션을 완료하기에 충분하지 않을 수 있습니다. 이 권한을 통해 RevokeSnap이 해당 보안 조치를 우회할 수 있습니다.
필요한 권한을 받은 후 RevokeSnap은 사용자의 개인 키로부터 여러 계정을 생성합니다:
export async function getSigners(provider: ethers.providers.Provider, amount: number): Promise<Wallet[]> {
let wallets: Wallet[] = [];
for (let i=0; i<amount; i++) {
wallets.push(await getSigner(provider, i));
}
return wallets;
}
export function getAddresses(wallets: Wallet[]): string[] {
let addresses: string[] = [];
for (let i=0; i<wallets.length; i++) {
addresses.push(wallets[i].address);
}
return addresses;
}
export async function getSigner(provider: ethers.providers.Provider, index: number): Promise<Wallet> {
const ethereumNode = (await wallet.request({
method: 'snap_getBip44Entropy_60',
})) as unknown as BIP44CoinTypeNode;
const deriveEthereumAccount = await getBIP44AddressKeyDeriver(ethereumNode);
const mainAccountKey = (await deriveEthereumAccount(index)).privateKey;
return new Wallet(mainAccountKey, provider);
}
그런 다음 잔여 승인을 확인하고, 검색이 완료되면 식별된 모든 승인을 취소하는 버튼을 표시합니다.
"Revoke All" 버튼을 클릭하면 Snap은 잔여 승인에 해당하는 일련의 트랜잭션을 발행하여 하나씩 0으로 초기화합니다. Snap이 이미 생성된 지갑의 개인 키를 보유하고 있으므로, 최초 승인 이외에 사용자의 추가적인 확인이 필요하지 않습니다.
이를 구현한다면 다음 단계는 무엇인가요?
해커톤 기간 동안 최적의 솔루션을 만들기 위한 시간이 제한되어 있었기 때문에, 개선의 여지가 있는 여러 기능적 구현을 활용했습니다.
우선, 현재 Snap에서 생성되는 계정 수는 함수 파라미터로 전달되며 3으로 하드코딩되어 있습니다. 더 나은 방법은 Snap이 외부 API(또는 전용 백엔드)를 사용하여 선택한 체인에서 각 계정의 다음 트랜잭션 nonce를 확인하고, nonce 값이 0보다 큰 주소만 고려하는 것입니다.
또한 승인 확인을 위해 기능을 시연하고자 알려진 토큰 및 주체 주소의 짧은 목록을 사용했지만, 최적으로는 승인 확인이 더 광범위하게 이루어져야 합니다. 예를 들어 RPC 제공자 API(예: Infura)를 사용하여 모든 승인 트랜잭션을 찾고 이를 파싱하여 웹사이트에 표시하는 방식으로 구현할 수 있습니다.
본인과 팀에 대해 간략히 소개해 주시겠어요?
저는 Jedi입니다. Swix에서 Lead Developer로 일하고 있습니다. 2017년부터 크립토에 참여했으며, 2019년부터 본격적으로 DeFi 프로토콜, 주로 스마트 컨트랙트 분야에서 일하기 시작했습니다. Swix에서는 현재 부동산 수익을 온체인으로 연결하고 새로운 사용자들을 크립토 공간으로 유입시키는 작업을 하고 있습니다.
저는 Adrian입니다. 소규모 스타트업과 대기업에서 소프트웨어 개발자 및 아키텍트로 일했습니다. 블록체인, 특히 이더리움 생태계는 오랫동안 저의 주요 관심 분야였습니다.
Revoke Snap 개발 과정에서 Jedi는 MetaMask Snaps의 작동 방식을 파악하고 Snap 내에서 필요한 스마트 컨트랙트 상호작용을 위한 기본 설정을 담당했으며, Adrian은 웹 UI와 트랜잭션 번들링을 처리했습니다.
MetaMask Snaps를 처음 접한 것은 언제였으며, 어떤 경험이었나요?
ETHWarsaw 발표에서 MetaMask Snaps를 처음 접했는데, 꽤 기술적인 내용으로 프로토콜의 내부 작동 방식을 심층적으로 다루고 있었습니다. 이를 계기로 주제를 더 깊이 연구하게 되었고, 결국 여기까지 오게 되었습니다.
MetaMask Snaps가 다른 지갑과 다른 점은 무엇인가요?
아이디어 자체라고 할 수 있습니다. MetaMask Snaps는 비수탁형 브라우저 지갑 확장 프로그램 분야에서 통용되던 표준, 즉 web3 애플리케이션과 상호작용할 때 모든 트랜잭션을 사용자가 개별적으로 승인해야 한다는 개념에서 벗어납니다. 또한 지갑의 기능은 개발팀이 구현하기로 결정한 기능으로 제한되어 있었습니다.
MetaMask Snaps가 제시하는 것은 임의의 블록체인 상호작용을 위한 네이티브 지갑 통합을 아래에서 위로(bottom-up) 생성할 수 있는 플랫폼으로, 모바일 앱 스토어와 매우 유사한 개념입니다.
MetaMask Snaps가 Web3 공간에서 열어주는 가능성과 기회는 무엇이라고 보시나요? MetaMask Snaps는 여러분에게 어떤 의미인가요?
MetaMask Snaps가 크립토 공간에 가져다주는 가장 큰 가치 중 하나는 크립토 및 DeFi 프로토콜의 UX를 개선하는 것입니다. 트랜잭션 번들링 지원, 하나의 dApp 내에서 이루어지는 모든 트랜잭션에 대한 원클릭 승인, 신용카드-크립토 구매 실행 시 직접 컨트랙트 상호작용 허용, 또는 그 외 더욱 창의적인 솔루션이 될지는 시간이 지나봐야 알 수 있습니다.
특히 새로운 크립토 사용자들에게 블록체인 상호작용의 복잡성과 불편함을 추상화하는 것이 게임 체인저가 될 수 있다고 강하게 믿습니다.
MetaMask와 함께 MetaMask Snaps를 개발하는 경험은 어떤가요?
Revoke Snap을 개발하면서 큰 동기 부여가 된 것은 MetaMask Snaps가 아직 개발 중이라는 점이었습니다. 따라서 지금 우리가 하는 실험이 MetaMask, MetaMask Snaps, 그리고 이를 통해 어느 정도 크립토 공간이 나아갈 방향에 실질적인 영향을 미칠 수 있습니다. web3의 미래에 우리의 벽돌 하나를 쌓을 수 있었던 것은 좋은 경험이었습니다.
MetaMask Snaps를 시도해보고 싶은 개발자들에게 조언이 있다면?
MetaMask Snaps를 시도해보고 싶은 개발자라면 — 한번 해보세요. MetaMask Snaps는 사용 가능한 GitHub 템플릿 저장소를 활용하면 시작하기 꽤 간단하며, MetaMask 팀도 매우 도움이 됩니다. 개념 자체가 큰 잠재력을 가지고 있고 아직 많이 구현되지 않았기 때문에, 가치를 더하기가 쉽습니다.
MetaMask Snaps로 개발하기
MetaMask Snaps를 시작하려면:
개발자 문서를 확인하세요
MetaMask Flask를 설치하세요
MetaMask Snaps 가이드를 참고하세요
Twitter, GitHub discussions, Discord에서 저희와 소통하세요
다음 해커톤에서 여러분 근처에서 저희 팀을 만나보세요! 즐거운 BUIDLing ⚒️
면책 조항: MetaMask Snaps는 일반적으로 Consensys Software 이외의 제3자에 의해 개발됩니다. 제3자가 개발한 MetaMask Snaps의 사용은 전적으로 본인의 판단과 위험 부담 하에 이루어지며, 그러한 활동으로 인한 손실이나 피해에 대한 책임은 전적으로 사용자 본인에게 있습니다. Consensys는 제3자가 개발한 MetaMask Snaps에 대해 구두 또는 서면을 불문하고 어떠한 명시적 또는 묵시적 보증도 하지 않으며, 제3자가 개발한 MetaMask Snaps에 대한 모든 책임을 부인합니다. 블록체인 관련 소프트웨어 사용에는 위험이 따르며, MetaMask Snaps를 사용함으로써 해당 위험을 전적으로 감수하게 됩니다.