Ethereum에서 풀 노드 지갑 없이 쓸 수 있는 DApp만들기

Park Juhyung
GoCryptobot
Published in
4 min readFeb 1, 2018

Ethereum에서 동작하는 DApp을 쓰려면 지갑 소프트웨어가 있어야 합니다. 지갑 소프트웨어를 통하여, 자신의 계정을 관리하고 스마트 컨트랙트의 함수를 호출할 수 있죠. 이더리움과 비트코인 같은 퍼블릭 블록체인에서는 자신 이외의 다른 유저를 아무도 믿지 않습니다. 그렇기 때문에 DAPP을 쓰는 유저도 블록체인의 모든 히스토리를 가지고 있어서 스마트 컨트랙을 직접 검증할 수 있어야 합니다.

하지만 이러한 모델은 일반 사용자용 DApp에서는 유효하지 않습니다. DAPP의 서비스를 사용하기 위해서 100GB가 넘는 데이터를 받으라고 하는 건 무리한 요구사항입니다. 매우 매력적인 영화나 게임도 100기가 바이트를 넘지 않는데, 간단한 DAPP을 사용하기 위해 100GB를 받는 건 너무 비효율적이죠.

크립토 키티와 MetaMask

그래서 크립토 키티와 같은 DApp의 경우에는 MetaMask라는 지갑을 사용하기 권장합니다. 웹브라우저 플러그인으로 설치하는 가벼운 지갑이죠. 하지만 이 지갑은 제대로 된 Ethereum의 지갑이 아닙니다. MetaMask는 블록의 history를 직접 가지고 있지 않습니다. 외부에 있는 다른 Ethereum 노드를 믿고 맡기는 형식입니다. MetaMask에서 하는 일은 1) 비밀키를 로컬에서 관리, 2) 트랜잭션을 서명해서 믿을 수 있는 Ethereum 노드에 전달 이렇게 두가지입니다.

Metamask를 사용하는 크립토키티의 예시를 보듯이, 일반 사용자를 위한 DApp은 모든 히스토리를 가질 필요가 없습니다. 단지 비밀키의 관리와 자신이 호출할 트랜잭션을 직접 서명해서 보내는 기능만 있으면 됩니다.

개발 환경의 어려움

하지만 Ethereum에서 DAPP을 만드는 법을 찾아보면 대부분 유저의 지갑에 의존하는 방식을 소개합니다. web3 라이브러리의 기본 기능들(send transaction, 스마트 컨트랙 사용) 역시 지갑에서 비밀키를 관리하고 있는 상황에서만 쓸 수 있는 함수들입니다.

DApp 개발자는 자신이 풀 노드 지갑을 운영하고, 유저들은 자신의 비밀키만 가지고 있다가, 개발자의 지갑에 접속하는 상황을 원합니다. 하지만 이더리움의 지갑들 Geth나 Parity는 이러한 기능을 제공해주지 않습니다. Geth나 Parity는 이 프로그램들이 직접 비밀키를 관리하는 방식으로 동작합니다.

하지만 방법이 없지 않습니다. web3나 JSON RPC 표준에는 sendRawTransaction이라는 함수가 있습니다. 이 함수는 이미 서명된 트랜잭션을 받아서 처리해주는 API입니다. 이 함수를 쓰면 유저가 자신의 비밀키를 Geth나 Parity같은 지갑에 노출시키지 않고 트랜잭션을 보낼 수 있습니다.

Javascript라면

Consensys에서 만든 eth-lightwallet이라는 라이브러리가 있습니다. 이 라이브러리를 사용하면 웹브라우저에서 직접 비밀키를 관리할 수 있습니다. 또한 그 비밀키를이용하여 서명한 트랜잭션을 만들 수 있습니다.

이렇게 만든 트랜잭션을 web3.eth.sendRawTransaction를 사용하여 풀 노드에 보낼 수 있습니다. 이 방식을 쓰면 유저가 무거운 지갑 없이도 DAapp을 사용할 수 있습니다.

C#이라면

Nethereum은 C#버전의 web3라이브러리입니다. 특이한 점은 기본으로 sendRawTransaction을 사용한다는 점입니다. Account 클래스를 쓰면 sendTransaction이나 스마트 컨트랙함수를 부를 때 자동으로 sendRawTransaction을 사용합니다. ManagedAccount를 사용하면 web3 기본 동작 방식과 동일하게 접속한 지갑의 계정을 사용할 수 있습니다.

그렇다면 보안은?

이렇게 DApp 유저가 풀 노드를 운영하지 않는 방식은 당연히 유저가 풀 노드운영하는 것보다 보안이 약합니다. 유저가 접속한 풀 노드가 거짓된 정보를 주더라도 검증할 방법이 없기 때문입니다. 하지만 저는 이 부분이 큰 문제라고 생각하지 않습니다. 이미 가장 성공한 DApp인 크립토키티가 기본 지갑으로 MetaMask를 추천하고 있습니다. 편의를 위해서는 이 정도의 리스크는 감수할 수 있는 셈입니다.

정리

DApp 개발 입문서를 보면 모든 자료들이 DApp의 유저가 풀 노드 지갑를 보유하고 있다는 가정 하에 설명을 하고 있습니다. 하지만 sendRawTransaction을 사용하면 유저에게 무거운 지갑을 요구하지 않고도 동작하는 DApp을 만들 수 있습니다.

--

--