ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메타마스크 내부구조(Metamask Internal
    Cryptography 2022. 6. 9. 23:38
    반응형

    크립토 지갑(Crypto Wallet) 중 가장 널리 사용되고 있는 것이, 브라우저 기반의 앱 메타마스크(Metamask)입니다. MAU도 아래와 같이 빠르게 성장하였는데요:

    Metamask MAU - Consensys [1]

     

    이번 글에서는 메타마스크 내부구조를 살펴보며, 이더리움 기반의 월렛에 대해 알아보도록 하겠습니다:

     

    • 메타마스크 모바일 앱 아키텍쳐
    • 메타마스크 Controllers
    • Ethereum과의 연동

     

     


    메타마스크 모바일 앱 아키텍쳐 [2]

    메타마스크는 Front 단에서 보면 크게 2가지 기능을 제공합니다. 이 부분을 살펴보기 위해서 먼저 metamask-mobile에 해당되는 repo를 살펴보겠습니다 [3].

     

    첫 번째는 일반 유저가 사용할 수 있는 Wallet UI 인터페이스입니다. 유저는 ETH, ERC20, ERC721 등에 해당되는 자산을 관리할 수 있습니다. 

     

    두 번째는 dApp이 사용할 수 있는 Web3.0 UI 인터페이스입니다. 

    Metamask architectuer - Imge from Author inspired by [2]

     

     

    위의 이미지에서 보시는 Wallet과 Browser가 2가지에 해당됩니다. Browser는 Bridge라고 표시된 미들웨어 성격의 Json RPC Engine을 거쳐서 Core의 Engine을 연동하게 되고, Wallet은 직접 연동됩니다. 그렇기에 다양한 앞단의 인터페이스의 호출이 Core의 Engine 속 Controller에 의해 처리되고 있는 것을 알 수 있습니다.

     

     

    메타마스크 Controllers

    Engine의 Controller는 위 metamask-mobile repo가 아니라 다른 repo에서 개발되고 패키지로 import되어 사용되고 있습니다. 그것들은 controllers[5]라는 repo에서 관리되고 있는데요. 이 repo에는 데이터모델을 생성하기 위한 platform-agnostic한 모듈들을 모아두고 있습니다. 

     

    여러가지 Controller가 있으며, 각각의 주요기능은 아래와 같은데요:

     

    • AccountTrackerController: 특정 이더리움 계정과 관련있는 정보를 트래킹 함
    • AddressBookController: 수신자 주소와 별칭 리스트를 관리하기 위한 기능 제공
    • ComposableController: 여러 개의 컨트롤러를 하나로 합칠 때 사용
    • CurrencyRateController: 선택된 통화에 기반해 ETH-to-fiat 환율을 수동적으로 폴링함
    • KeyringController: 이더리움 기반의 identities를 관리하고 생성하기 위한 컨트롤러
    • NetworkController: 기반 provider를 생성하고 provider 설정을 리프레시 함
    • PhishingController: 커뮤니티를 통해 유지 운영되는 승인되거나 승인되지 않은 웹사이트 origin 리스트는 수동적으로 폴링함
    • PreferenceController: agnotic한 글로벌 설정을 관리하고 설정 업데이트를 위한 편의기능을 제공함
    • TokenRatesController: token-to-fiat 환율을 설정된 주기에 따라 수동적으로 폴링함
    • TransactionController: 트랜잭션을 제출하고 관리하는 기능을 함

     

    컨트롤러들은 초기화, 설정, 상태관리, 구독(subcription), Composition의 공통된 개념과 API를 제공합니다. 이렇게 일관된 인터페이스를 제공하여 컨트롤러 사용 시에 편리하게 월렛 데이터 모델 빌딩을 가능하게 합니다. 

     

     

    Ethereum과의 연동

    메타마스크 내부적으로 이더리움 연동을 위해서 Ethereum Foundation이 제공하는 ethereumjs 라이브러리를 사용합니다 [7, 8]. etherumjs 프로젝트의 목적은 아래와 같은데요:

     

    Main focus of EthereumJS is to provide high-quality and robust implementations of core Ethereum infrastructure technologies (virtual machine), protocols (devp2p) and data structures (merkle tree)

     

    NetworkController 일부를 살펴보면 아래와 같이 트랜잭션에 사인을 위해 EthQuery를 사용하는데, 이는 ethereumjs의 eth-query에서 온 것을 알 수 있습니다.

     

    ...
    
    const signedTx = await this.sign(unsignedEthTx, from);
    transactionMeta.status = TransactionStatus.signed;
    this.updateTransaction(transactionMeta);
    const rawTransaction = bufferToHex(signedTx.serialize());
    
    transactionMeta.rawTransaction = rawTransaction;
    this.updateTransaction(transactionMeta);
    const transactionHash = await query(this.ethQuery, 'sendRawTransaction', [
      rawTransaction,
    ]);
    transactionMeta.transactionHash = transactionHash;
    transactionMeta.status = TransactionStatus.submitted;
          
    ...

     

     

    References

    [1] https://consensys.net/blog/press-release/metamask-surpasses-10-million-maus-making-it-the-worlds-leading-non-custodial-crypto-wallet/

    [2] https://raw.githubusercontent.com/MetaMask/metamask-mobile/main/architecture.svg

    [3] https://github.com/MetaMask/metamask-mobile

    [4] https://github.com/MetaMask/metamask-extension/blob/master/docs/architecture.png

    [5] https://github.com/MetaMask/controllers

    [6] https://web3js.readthedocs.io/en/v1.2.9/

    [7] https://github.com/ethereumjs/ethereumjs-monorepo

    [8] https://ethereumjs.readthedocs.io/en/latest/introduction.html

     

    반응형
Kaden Sungbin Cho