Smallet – early, early alpha release

연식이 좀 되는지라 웹 개발에는 별 경험도 지식도 없다. 15년전에 닷넷으로 웹사이트 만들어 본것이 전부다. 그동안 세상은 변해서 웹 어플리케이션도 많은 진화를 했다. 수많은 개발 프레임웍이 있어서 어떤것을 써야 할지 알기도 어렵다. 프레임웍이라는 것이 다들 자기가 최고라고 하니 말이다.

Smallet은 가상화폐 지갑이 기반인데 모바일에 최적화 되도록 만드는 것이 목표다. 그래서 Small+Wallet=Smallet이다.

블록체인 세계는 C++과 javascript두가지가 주축이다. 블록체인 자체는 C++로 개발되고 인터페이스를 담당하는 프론트는 거의 javascript이다. 거의 모든 코드가 javascript기반으로 되어 있다. 간간히 JAVA 포팅이 보이기는 하지만 포팅이다. 즉 javascript로 먼저 작성되고 다른 플렛폼으로 옮겨 간다.

javascript는 내가 싫어하는 언어이다. 가독성이 떨어지고 지나치게 이벤트 중심이고 모든것이 async다. 네트웍 환경을 중요시하는 요즘의 개발 환경을 반영한 결과이겠지만 여전히 눈에 잘 안들어온다.

이글은 지난 한달간 Smallet 프로토타입을 개발하는 동안의 삽질 기록이다.

개발에 들어가기 전에 이번 만큼 많은 생각을 했던 경우는 없었다. 내 경우는 프로그램을 만들어 가면서 고민을 한다. 이번에는 그것이 불가능하였다. 환경이 달라도 너무 다르고 정리된 것이 거의 없다. 구글신 조차 엉뚱한 답변을 하는 경우가 허다하다. 스택 오버플로우에 검색해서 들어 갔는데 질문도 답변도 좋아요가 0인 경우가 허다하다.

통상 내실력으로 뭔가 몰라서 스택오버플로우를 찾아보면 좋아요 몇백개씩 있는것들이 나오기 마련이다. 그런데 블록체인 관련 프로그래밍 질문은 답도 거의 없지만 같은 질문을 하는 사람들 뿐이다.

있는 것은 정리된 설명이 아니라 소스코드다. 이게 맞는지 안 맞는지 알 수 없는 코드들. github에 버려진 수많은 프로젝트들.

만들고자 하는 것은 간단한데 시작을 할 수가 없다. 첫번째 고리를 끼우기가 어렵다.

결국 아무것도 없다는 것을 알았다. 수많은 코드들을 받아서 실행하고 분석하고 그것만이 방법이다. 그래도 리눅스 개발환경이 너무 좋아져서 그것이 많은 위로가 되었다. 뭐든 빨리 설치되고 충돌없이 잘된다. 예전에는 뭐든 설치가 안돼서 하지를 못했다. 설치 기술에 많은 진보가 있었고 이제는 정말 잘된다. 다행이다.

블록체인은 이제 시작단계이다. 너도나도 블록체인을 만든다. 소스코드가 다 있고 동작원리자체가 복잡하지도 않고 결과물도 소스크기도 그리 크지 않다. OS로 하자면 DOS정도 된다. 지금의 윈도우나 리눅스 같은걸 새로 만들겠다는 사람은 있기 어렵지만 DOS 수준이면 너도나도 하고 싶을 만 하다.

지갑을 만들려고 하는 사람에게는 이게 문제다. 수천개의 코인을 어떻게 관리하나. 저마다 일단 이름이 다르고 네트웍이 다르다. 그들의 지갑주소를 생성하는 것 조차 엄청난 노가다이다. 다 비슷한 알고리즘으로 생성하면서 같지는 않다. 표준화는 아직 멀고도 멀다.

그래도 인터넷에는 많은 훌륭한 개발자들이 있고 정리가 시작되었다. BIP39 마스터시드 알고리즘이 코딩을 시작할 수 있는 한줄기 빛을 보여 주었다. 모든 코인을 하나의 마스터시드로 관리한다. 수천 수만개의 주소를 단 12단어로 다 생성한다. 더 좋은 것은 항상 같이 생성된다. deterministic 하다는 이야기다. 핸드폰을 분실해도 이 12 단어만 있으면 모조리 복구할수 있다. 수백개의 코인과 수천개의 주소 모두를 말이다. 훌륭하다. 여기에 BIP32를 결합하면 hierarchical 하게 만들 수 있다. 즉 거의 모든 코인의 주소를 생성할 수 있게 된다.

기초가 세워졌으니 코딩을 해야 하는데 문제는 javascript다. 안드로이드는 javascript하고 안친하다. 기계마다 다른 시스템에서 제공하는 웹뷰가 거의 유일한 javascript엔진이다. 웹뷰는 기계마다 달라서 웹을 기반으로 뭔가를 만들면 늘 불안하다. 그래도 일단은 방법이 없다. 모든 코드 기반이 javascript인데 어찌하겠가? JAVA로 열심히 포팅해봐야 하루에도 몇번씩 commit되는 프로젝트들을 따라갈 방법이 없다.

좀 어글리 하지만 웹뷰로 가고 다음은 node든 뭐든 옮겨 가면 되겠다 판단한다.

최근 안드로이드 버전들은 웹뷰도 따로 구글이 열심히 업데이트 해주니 웹뷰도 장차는 쓸만할 것이다. 물론 실제 릴리스를 해보기전에는 장담하기 어렵다. 과감히 옛날 안드로이드 버전은 다 버린다. API 23정도 부터 가는 것으로 정한다. 이 버전 아랫쪽은 javascript는 안하는 것이 좋다는 판단이다.

지갑의 핵심이자 털리면 절대 안되는 키 저장소를 분리해야 한다. 키를 생성하는 코드는 사용자의 키를 훔칠수 있는 곳이다. 훔치는 주체는 개발자 자신과 외부의 공격이다. 두가지를 다 막아야 한다.

개발자 자신으로 부터 막는 방법은 오픈소스로 하고 코드를 최대한 단순화 하여 누구나 검사 할 수 있도록 한다. 외부로부터의 공격을 막으려면 네트웍을 사용하면 안된다. 안드로이드에서 no permission 모듈을 만들어서 해결한다.

일견 당연해 보이는 이러한 구조로된 지갑은 아무리 찾아 봐도 없다. 본시 뭘 새로 만들기 보다 베끼기를 좋아하는 터라 열심히 찾았다 그런데 정말 없다….???? 이상하다. 모든 지갑들이 하나의 앱으로 되어있고 당연히 인터넷에 연결한다. 도대체 어떻게 해킹을 막는거지? 다들 참 머리가 좋다. 나는 그렇게 못한다. 그냥 다 틀어막고 본다.

키 저장소를 만들었는데 지갑모듈과 통신이 문제다. 이건 좀 경험이 있는데 안드로이드가 이것도 제대로 지원이 안된다. 더 정확히는 이런 기능을 쓰는 사람이 없어서 좋은 예제가 없다. startActivityForResult로 부터 broadcastReceiver 다 해봤다. 예전에도 해봤었는데 잘 안됐는데 역시 잘안된다. activity는 UI에 맞춰진 요소라 통신에 당연히 안좋다. breadcastReceiver는 모듈간 통신이라기 보다 시스템 와이드 방송용이다. 그래서 느리다. 예전에 안해봤던 startService를 사용했다. 오! 생각보다 잘된다.

앱간 통신에 대한 보안은 android custom permission으로 해결한다. 같은 사인으로 배포된 앱 끼리만 통신할 수 있게 할 수 있다.

키저장소는 지갑으로 부터 오는 단 두가지 요청만 전달하면 된다. public key를 전해주는 것과 전문에 사인을 해주는 것이다. public key 그냥 퍼블릭 한것이니 대충 주면된다. 문제는 사인이다. 즉 사인이 안된 전문을 받아서 private key로 사인해서 돌려주면 된다. 키 저장소와 지갑 둘다 서비스를 만들고 서비스 끼리 startService로 통신한다.

지갑은 결제를 담당하는 곳이다. 외부로 부터 결제요청을 받아서 처리해주는 것이 핵심이다. 현재의 모든 모바일 지갑들은 QR코드를 읽은 것이 유일한 편리성이다. 그게 아니면 지갑주소를 복사해서 붙이기를 한다. 참 불편하다. 주소까지는 뭐 이렇게 가져오는데 보내야 하는 금액은 직접 입력해야 한다. 정말 불편하다.

데스크탑에는 Metamask라는 지갑이 있다. 크롬이나 파이어폭스 플러그인이라 웹사이트에서 결제요청을 하면 받아서 바로 결제 버튼만 누르면 끝이다. 당연히 이렇게 되어야 한다. 모바일에서는 앱간 통신이니 표준이 있어야 하지만 뭐… 아직 DOS 시절인데 이런게 있을리가 없다. Metamask를 시뮬레이션 하는 것이 유일한 방법이다.

javascript 해킹이 필요하다. 웹사이트들이 Metamask와 어떻게 통신하는지 보면 될 것이다. 들여다 보니 통신을 하는 것이 아니라 아예 웹사이트에다 코드를 삽입해 주고 그걸 call하는 방식이다. 음… 뭔가 많이 무식하다. 많은 개선이 되어야 하겠다. 무척 위험해 보인다. 다른 플러그인을 슬쩍 끼워넣고 금액과 받는 주소를 간단히 바꿀수 있겠다. 물론 귀찮아서 안해봤지만 하나도 안 어려워 보인다. 물론 사용자가 똑똑해서 주소가 바뀐것을 눈치채면 모르겠지만 그 복잡한 주소를 어떻게 구분하겠는가?

아무튼 웹뷰에 Metamask를 지원하는 웹사이트를 뛰우고 같은 방식으로 코드를 밀어넣고 해보니 잘된다. 웹에서 요청하면 지갑 앱이 받아서 처리해주면 끝이다. 웹뷰이니 다른 공격자가 뭘 끼워 넣기도 많이 어렵다. 이게 더 보안에 효과적이다.

마지막으로 One-click payment. 웹사이트에 링크를 넣어두고 클릭하면 앱이 받아서 처리해주는 것이다. 뭐 이건 모바일에서는 표준이나 다름없다. 그냥 껌으로 되는 것이다. 다른 앱들도 하는지 모르겠는데 수십개 앱을 봤으나 이부분에 대한 설명이 있는 것을 보지 못했다.

이제 모든 지갑을 통솔하는 ICMP(Integrated Cryptocurrenty Management Platform)를 만들어야 한다. 이건 단순노가다 이므로 그냥 열심히 하면 되겠다. 노가다 꾼들이 많이 필요하겠다.

Leave a Reply

Your email address will not be published. Required fields are marked *