MetaMask Snap 기술 해석: 개발 경험, 능력 제한, 안전성 및 상업적 잠재력

LXDAO
2023-09-22 17:49:32
수집
Snap은 위챗 미니 프로그램과 유사하며, MetaMask의 더 큰 상상 공간을 열어주었습니다.

저자: LXDAO


본 문서는 LXDAO 전문가 그룹의 멤버인 리다마오와 브루스가 공동 집필하였으며, 우리는 MetaMask Snap 기술에 대해 깊이 탐구할 것입니다. MetaMask Snap이란 무엇인가요? 어떤 기술적 능력이 있나요? 보안은 어떻게 보장되나요? 개발 경험은 어떤가요? 이러한 질문들은 아마도 MetaMask Snap의 미래 잠재력을 결정할 것입니다.

MetaMask Snap이란 무엇인가요?

며칠 전 ConsenSys는 MetaMask Snaps의 공개 베타 출시를 발표했습니다. MetaMask Snaps는 지갑의 기능을 확장할 수 있으며, 제3자 개발자가 만든 앱(Snap)을 설치하여 새로운 기능을 얻을 수 있습니다.

ConsenSys가 MetaMask를 위챗으로 만든다면, Snap은 위챗 미니 프로그램과 같습니다. 따라서 MetaMask의 야망을 알 수 있으며, ConsenSys의 규모와 MetaMask의 사용자 수를 결합하면 지갑 분야의 구도가 변화할 것입니다.

현재 공식적으로 35개의 사용 가능한 Snap이 발표되었으며, Snap 애플리케이션 스토어가 개설되었습니다: https://snaps.metamask.io/.

일부 Snap 목록

그렇다면 MetaMask Snap은 기술적으로 어떤 모습일까요? 어떤 능력 제한이 있을까요? 안전한가요? 개발 경험은 어떤가요? 이러한 것들은 아마도 MetaMask Snap의 미래 잠재력을 결정할 것입니다.

작년부터 LXDAO는 Snap의 구현을 깊이 연구해왔으며, 현재 여러 멤버가 Snap 개발에 참여하고 관련 해커톤에 적극적으로 참여하고 있습니다. 오늘 우리는 기술적인 관점에서 위의 질문들을 깊이 탐구하고, 실제로 Snap을 개발하여 Snap의 개발자 경험을 느껴보도록 하겠습니다.

MetaMask Snap 첫 경험

MetaMask Snap 설치하기

보통 MetaMask Snap 공식 마켓을 통해 설치할 수 있으며, 프로젝트 측의 공식 웹사이트에서 직접 설치할 수도 있습니다. UniPass를 예로 들면, 애플리케이션 페이지에 접근하면 MetaMask와 연결할 수 있는 버튼이 제공됩니다.

클릭하면 Snap 설치가 진행됩니다:

MetaMask Snap 사용하기

설치가 완료되면 해당 제품과 기능을 사용할 수 있습니다. 이 애플리케이션에서 UniPass는 당신을 위해 스마트 계약 계정을 생성하여 MetaMask의 EOA 계정을 통해 조작할 수 있도록 합니다.

전송을 실행할 때 UniPass는 Snap을 통해 UniPass AA 지갑에서 해당 작업을 수행할 것인지 확인합니다.


MetaMask에서 확인한 후 관련 작업을 수행할 수 있습니다. 이 시나리오에서 MetaMask는 Snap을 통해 UniPass AA 지갑을 제어할 수 있는 능력을 가지며, UniPass는 사용자에게 지갑을 조작할 수 있게 하면서 별도의 지갑 플러그인을 개발할 필요가 없으며, MetaMask를 통해 매우 저렴한 비용으로 사용자를 유치할 수 있습니다!

이 설치 및 사용 과정에서 우리는 어떤 정보를 얻을 수 있을까요?

  1. Snap은 지갑 연결 권한, 네트워크 요청 등 매우 세밀한 권한 제어를 갖추고 있습니다. 전체적으로 최소 권한 접근(Principle of Least Privilege) 원칙에 따라 설계되어 있으며, 안전이 최우선입니다.
  2. npm:@unipasswallet/unipass-snap에서 Snap이 NPM을 기반으로 패키지 및 버전 관리를 하고 있음을 확인할 수 있습니다. 이후에 보안에 대해 자세히 설명하겠습니다.
  3. Snap은 매우 높은 유연성을 가지고 있으며, 프로젝트의 요구에 따라 자체적으로 개발하고 표시할 내용과 논리를 결정할 수 있습니다. 그러나 UI는 다소 단순하여 최적화의 여지가 있습니다.
  4. Snap의 경험은 매우 간단하고 신뢰할 수 있으며, 실제로 베타 버전과 생산 환경 수준에 도달했습니다.

지갑 제품에 있어 안전성은 항상 최우선입니다. 이제 Snap의 안전성 설계를 분석해 보겠습니다.

Snap은 안전한가요?

Snap 코드 실행 시 분석

위에서 언급했듯이 Snap은 NPM을 기반으로 패키지 및 버전 관리를 하고 있으며, 이는 Snap이 실제로 웹 및 JavaScript 애플리케이션임을 의미합니다. 잘 알려진 바와 같이, JS의 문법은 매우 유연하고 자유로워 XSS 및 피싱 공격을 초래하기 쉽습니다. MetaMask Snap은 이러한 도전에 어떻게 대응할까요?

일부 연구를 통해 MetaMask가 Agoric에 자금을 지원하고 Agoric 팀의 Hardened JavaScript(또는 Secure EcmaScript)를 깊이 통합하여 "완전 가상화" 샌드박스 솔루션으로 사용하고 있음을 알 수 있습니다. Agoric은 JavaScript 제한 API를 설계하고 TC-39(JS 표준화 협회)에 초안 제안을 제출했습니다. 주소는: https://github.com/tc39/proposal-ses입니다.

간단히 말해, Hardened JavaScript는 보다 안전한 표준 JavaScript의 하위 집합입니다. 일부 JS의 기능과 메커니즘을 활용하여 일부 JS API의 호출 권한과 방식을 줄여 위험을 감소시킵니다. 이는 해당 코드를 실행하기 위한 안전한 샌드박스를 생성하며, 최소 권한 접근 원칙을 따릅니다.


Agoric은 MetaMask와 협력하여 Snap의 안전성을 강화하기 위해 LavoMoat(https://github.com/LavaMoat/lavamoat)라는 프로젝트를 개발했습니다. LavaMoat는 JS 프로젝트의 외부 의존성의 안전 위험을 해결하고 일부 API 및 논리에 대한 제한을 추가하는 도구입니다.

Agoric과 MetaMask는 블랙박스 및 화이트박스 보안 공격 방어 테스트를 공동으로 수행하였으며, 상세한 보안 보고서를 작성하였습니다. 따라서 코드 실행 시의 측면에서 우리는 Snap이 안전하다는 충분한 이유가 있습니다.

Snap 코드는 반드시 오픈 소스이며 감사받아야 함

명확한 사용자 승인 프로세스와 최소 권한 설계 외에도 공식적으로 인정받는 Snap은 반드시 오픈 소스 코드를 가져야 하며, 커뮤니티의 힘을 통해 Snap에 악성 코드가 포함될 가능성을 크게 줄입니다.

또한, 우리는 공식 웹사이트에 있는 Snap이 모두 제3자 보안 회사의 코드 감사를 거쳐야만 게시될 수 있다는 점도 발견했습니다. 이는 Snap의 안전성과 신뢰성을 크게 높이며, 감사 기관에는 모두가 잘 아는 SlowMist가 포함됩니다.

현재 발견된 Snap의 안전 위험

현재 Snap은 NPM 기반의 패키지 및 버전 관리로 인해 코드 측면에서 일정한 변경 가능성이 있으며, 비강제적 감사로 인해 일정한 안전 위험이 발생할 수 있습니다.

MetaMask는 NPM 플랫폼의 버전 배포를 제어할 수 없기 때문에 프로젝트 측은 언제든지 새로운 버전을 배포하여 사용자가 설치하도록 할 수 있습니다. 감사 비용 문제로 인해 감사 회사는 모든 버전에 대해 감사를 수행하지 않기 때문에, 최신 버전의 변경 사항이 오픈 소스가 아니거나 감사받지 않았을 가능성이 있습니다.

그러나 실행 환경이 샌드박스 환경이며 최소 권한 설계를 사용하기 때문에 사용자가 새로운 권한 변경을 수동으로 확인하지 않는 한, 새로운 버전의 Snap은 이전 버전의 권한만을 가지고 작업을 수행합니다. 그러나 특정 Snap의 권한 요구가 지나치게 크다면 여전히 위험이 발생할 수 있으므로 Snap을 설치하고 사용할 때는 여전히 경각심을 유지해야 합니다.

MetaMask Snap의 기술 능력과 제한

비록 최근에 MetaMask Snap이 공식 발표되었지만, 실제로 Snap은 이미 4년 동안 개발되어 왔습니다! 가장 처음 MetaMask Snap의 구상은 Dan Finlay가 2019년 10월 10일 Medium에 발표했습니다.

안전성, 유연성, 효율성을 균형 있게 유지하는 것은 매우 큰 도전이며, MetaMask가 이 날을 위해 많은 비용과 준비 작업을 했음을 알 수 있습니다.

현재 주로 세 가지 API가 개방되었습니다:

  1. Interoperability(상호 운용성): 개발자가 MetaMask를 기반으로 다른 체인 지갑을 개발할 수 있도록 허용합니다.
  2. Transaction Insights(거래 통찰): 개발자가 사용자 거래가 시작되기 전에 거래 데이터를 가져와 거래에 위험이 있는지 분석할 수 있도록 허용합니다.
  3. Notifications(알림): Snap을 통해 사용자에게 직접 메시지를 푸시할 수 있습니다(다만, 여기서는 웹사이트 지원이 필요할 것 같습니다).

아래는 MetaMask Snap이 구체적으로 개방한 능력과 효과를 간단히 소개하여 여러분이 보다 구체적으로 이해할 수 있도록 하겠습니다.

Notification 알림 능력

Snap_notify 인터페이스는 MetaMask 또는 브라우저에서 알림을 표시할 수 있습니다. Snap은 이 인터페이스를 통해 사용자에게 직접 메시지를 보낼 수 있습니다. 구체적인 내용은 아래 그림과 같습니다.

Transaction Insights 능력

사용자가 스마트 계약과 상호작용할 때 MetaMask는 Snap의 onTransaction 이벤트를 트리거합니다. MetaMask는 서명되지 않은 원시 거래를 onTransaction 처리기 메서드에 전달하며, Snap은 거래의 이차 확인 페이지에서 인터페이스를 반환하고 표시할 내용을 사용자 정의할 수 있습니다.



이러한 능력을 통해 거래 정보의 안전 감사, 확장 정보 표시 등의 기능을 구현할 수 있습니다.

Dialog 인터페이스 및 사용자 정의 인터페이스 능력

Dialog 능력은 Snap이 독립 창을 직접 팝업하여 전통적인 Alert/Confirm/Prompt 팝업 능력을 구현할 수 있도록 합니다(아래 그림 참조). 이는 알림, 확인, 정보 제출 등에 사용됩니다.

Dialog를 통해 간단한 상호작용 인터페이스 및 작업을 사용자 정의하여 DApp과 연결할 수 있습니다.

MetaMask Snap이 현재 구현할 수 없는 기능은 무엇인가요?

안전성 등의 이유로 Snap은 현재 제3자 프론트엔드 프레임워크를 지원하지 않으며, 비교적 적은 수의 UIKit만 제공합니다. 아래는 insight를 사용하여 모든 개발자가 호출할 수 있는 UI 구성 요소 라이브러리를 보여주는 예시입니다.

위 그림에서 볼 수 있듯이 현재 제공되는 것은 Heading(큰 글자), Text(작은 글자), Panel(카드로 한 번만 사용 가능), Divider(구분선), Copyable(클릭하여 복사) 및 일부 Markdown 하위 집합(bold 및 italic)뿐입니다. 따라서 상호작용을 구축하는 것은 현재로서는 불가능하며, 내장 HTML을 사용하여 상호작용 작업을 구현할 수 없습니다. 그러나 공식 Discord에서 질문한 결과, 공식 측은 이러한 제한이 안전성 때문이며, 향후 버전에서 이를 해제할 것이라고 밝혔습니다.

또한, 안전성 문제로 인해 외부 요청은 Fetch 방법만 지원하며, WebSocket과 같은 더 많은 요청 프로토콜은 지원하지 않습니다. 안전성, 능력 및 개인 정보 제한으로 인해 클라이언트 정보를 얻을 수 없으며, 현재 Snap을 호출한 웹사이트가 무엇인지 알 수 없어 더 풍부하고 다양한 기능을 구현할 수 없습니다.

이러한 문제와 제한은 대부분 안전성을 고려한 것이며, 향후 안전성이 검증되면 더 많은 권한을 개방할 것으로 기대됩니다.

이러한 API를 제공하는 MetaMask는 사실상 개방 플랫폼과 같은 제품이 되었습니다. 이는 마치 위챗이 공공 계정과 미니 프로그램을 출시했을 때처럼, 즉시 단순한 채팅 도구가 아닌 느낌을 줍니다.

MetaMask는 2019년에 오늘날의 시장 구도를 예측했으며, 많은 공공 체인과 프로젝트, 다양한 맞춤형 지갑 수요가 존재합니다. 각 프로젝트 측이 자신의 플러그인을 개발하고 사용자가 여러 개의 플러그인을 동시에 설치해야 하는 것보다, MetaMask Snap을 기반으로 개발하는 것이 더 효율적입니다. 첫 번째로 공개된 Snaps 중에서도 Sui Wallet, Solana Wallet, Arweave Wallet 등 EVM 생태계가 아닌 다른 지갑들이 발견되었습니다. 이미 있는 사용자 수를 바탕으로 MetaMask Snap은 지갑의 구도에 중대한 영향을 미칠 것입니다.

실제로 MetaMask Snap의 상상 공간은 우리가 예상한 것보다 더 클 수 있으며, 심지어 지갑의 범위를 넘어설 수도 있습니다. 우리는 EthSign 팀의 작품을 볼 수 있으며, MetaMask Snaps를 기반으로 한 범용 비밀번호 관리자인 KeyChain을 개발했습니다. 모든 브라우저의 비밀번호는 지갑 키로 암호화되어 저장될 수 있습니다. 이렇게 지갑을 잘 관리하면 모든 비밀번호를 함께 관리할 수 있습니다.

Snap은 개발자와 매우 관련이 깊습니다. 개방 API가 생긴 후, 구체적인 개발자 경험은 어떨까요? 우리는 직접 Snap을 개발하여 경험해 보도록 하겠습니다.

Snap 테스트 직접 개발하기

생각 정리하기

잘 알려진 바와 같이, 대부분의 사용자는 대다수의 경우 상호작용하는 스마트 계약이 무엇인지 전혀 알지 못합니다. 주요 질문은 다음과 같습니다:

  • 거래 계약이 피싱 웹사이트에 의해 대체된 계약인지 여부
  • 거래 계약이 업그레이드 가능한 계약인지 여부
  • 스마트 계약이 방금 배포되어 검증된 사람이 거의 없는 계약인지 여부
  • 거래 계약이 오픈 소스인지 여부

일반 사용자에게는 작업 전에 계약의 Solidity 코드를 읽는 것이 불가능한 일입니다. 이때 Transaction Insight 기능을 통해 스마트 계약 분석을 구현하는 것이 매우 적합합니다. 예를 들어 AI를 사용하여 스마트 계약에 대한 간단한 안전 감사 작업을 수행하면 80%의 저급 피싱 공격을 필터링할 수 있을 것입니다.

개발 환경 준비하기

지갑 다운로드

먼저 MetaMask Flask를 설치해야 합니다.

MetaMask Flask는 개발자를 중심으로 한 MetaMask 확장판으로, 새로운 기능 미리보기 및 실험적 기능 개발에 주로 사용됩니다. 이는 MetaMask의 개발자 버전이므로 일상적인 사용을 하지 말고, 일상적으로 사용하는 개인 키를 가져오지 마십시오. Flask를 사용하는 주된 이유는 우리가 개발하는 Snap을 로컬에서 즉시 미리 볼 수 있도록 하기 위함입니다.

설치 후에는 작은 여우 지갑과 다른 브라우저 지갑을 잠시 꺼두거나 새로운 Chrome 프로필을 생성하여 사용하는 것이 좋습니다. 그렇지 않으면 충돌이 발생할 수 있습니다.

계정 생성하기

지갑을 설치한 후, 정상적으로 MetaMask 지갑을 생성하듯이 새 지갑을 생성합니다. 이는 테스트 전용 지갑이므로 자신의 일상 지갑을 가져오지 마십시오.

다음으로 새로 생성한 지갑에 테스트 코인을 충전해야 합니다. 테스트 코인은 수조를 통해 얻을 수 있으며, 본 문서에서 다루는 Snap은 Goerli를 사용하므로 아래 내용은 Goerli를 중심으로 설명하겠습니다.

템플릿 기반으로 Snap 초기화하기

공식 문서에 따라, 먼저 @metamask/create-snap CLI를 사용하여 새로운 Snap 프로젝트를 생성하고, 공식 템플릿을 사용하여 초기화합니다:

Snap 파일 구조

Snap의 주요 파일은 ./packages/snap에 있으며, 파일 디렉토리 구조는 다음과 같습니다.

Snap의 구성 파일은 snap.mainfest.json에 있으며, Snap의 주요 파일은 ./src/index.ts로 매우 간단합니다.

권한 활성화하기

먼저 권한을 활성화해야 하며, snap.mainfest.json에 다음 세 가지를 추가합니다.

Mainfest 파일에서 description과 proposedName을 수정하여 프로젝트의 설명과 이름을 변경할 수 있습니다.

거래 가져오기

다음으로 이 사례에서는 index.ts 파일만 수정하면 모든 기능을 완료할 수 있습니다. 간단한 코드 예시는 아래와 같으며, 완전한 실행 코드는 다음 링크를 참조하십시오: https://github.com/LidamaoHub/insights.

더 많은 내용은 MetaMask Snap 개발자 문서를 참조하여 더 복잡한 Snap 제품을 완성하십시오.

설치 후, 각 거래에서 유사한 위험 경고 정보를 확인할 수 있습니다:


현재 Snap의 개발 경험은 매우 원활하며, 거의 문제가 발생하지 않았습니다. 공식 템플릿도 매우 다양합니다. 풍부한 경험을 가진 개발자는 보통 몇 시간 내에 익숙해지고 필요한 Snap 개발을 시작할 수 있습니다. 그러나 정식으로 출시되어 주류 사용자가 사용할 수 있게 하려면, 가장 큰 장애물은 보안 감사가 될 것입니다. 모든 독립 개발자와 소규모 팀이 자신의 Snap에 대한 감사를 위한 자원을 가지고 있는 것은 아니기 때문입니다. 따라서 Snap의 수와 다양성은 앞으로 오랜 시간 동안 큰 폭발적 증가를 기대하기 어려울 것입니다.

개발자 지원

위의 예제를 성공적으로 실행할 수 있다면, 축하합니다! 당신은 이미 자격을 갖춘 Snap 입문 개발자가 되었습니다!

MetaMask 공식은 작년에도 MetaMask Grants DAO를 설립하여, 기부 프로그램을 통해 MetaMask 생태계의 고부가가치 프로젝트를 지원하고 있습니다. MetaMask Grants DAO는 직원 주도의 실험적 프로그램으로, 전 세계 외부 개발자에게 기부금을 지급하여 MetaMask 생태계에서 영향력 있는 경험을 구축하도록 지원합니다. MetaMask는 매 분기마다 일부 이익을 이 DAO에 투입하며, 현재 MetaMask Grants DAO의 연간 예산은 240만 달러입니다.

현재 MetaMask 생태계를 풍부하게 만드는 프로젝트는 모두 공식 MetaMask Grants DAO(메타마스크 기부)를 신청할 수 있습니다. 더 많은 정보는 https://metamaskgrants.org/를 참조하십시오.

특히 LXDAO는 올해 MetaMask의 Grants를 신청하여 관련 프로젝트 개발에 참여하게 되어 매우 영광입니다. LXDAO의 회원이라면 관련 아이디어를 보다 효율적으로 제출할 수 있습니다.



결론

우리는 위에서 기술적 측면에서 Snap이 무엇인지, 안전한지, 능력 제한 및 개발자 경험에 대해 분석했습니다. 간단히 요약하자면 다음과 같습니다:

  • Snap은 위챗 미니 프로그램과 유사하며, MetaMask의 더 큰 상상 공간을 열었습니다.
  • 안전성은 전반적으로 양호하지만, 여전히 일정한 위험이 존재하므로 고위험 권한에 대해 경각심을 가져야 합니다.
  • 안전성 문제로 인해 현재 개방된 능력은 많지 않지만, 여전히 충분한 상상 공간을 생성할 수 있는 Snap입니다.
  • 4년간의 다듬기와 테스트를 거쳐 개발자 경험이 우수하지만, 안전성 문제로 인해 화이트리스트 메커니즘과 감사 요구가 설계되어 있으므로, 향후 일정 기간 동안 대량의 Snap이 등장하지 않을 것으로 예상됩니다.

현재 MetaMask Snap은 여전히 빠르게 발전하고 있으며, 앞으로 더 많은 권한과 능력이 개방될 것이라고 믿습니다. 보다 개방적이면서도 안전한 메커니즘이 도입되기를 희망합니다. 예를 들어, 애플의 공식 감사 메커니즘 및 공식 코드 저장소 버전 관리와 같은 방식이 필요합니다. 이러한 문제가 개선된다면, 향후 대량의 수요가 발생할 것으로 예상됩니다. 심지어 전문 Snap 개발자 직무가 생길 수도 있습니다.

막대한 MetaMask 사용자 기반을 바탕으로 독립 개발자에게도 기회가 있을 것입니다. Snap이 가져올 다음 혁신을 기대해 봅시다.

마지막으로, 귀하의 글에 감사드리며, 이는 더 많은 사람들이 MetaMask Snap의 발전 현황을 이해하는 데 도움이 될 것이라고 믿습니다.

체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
체인캐처 혁신가들과 함께하는 Web3 세상 구축