메타마스크와 UX, 메타마스크의 역할, 프라이빗 키(개인키)
이 글은 다음의 목차로 구성되어 있습니다.
1. 메타마스크와 UX
2. 메타마스크가 뭐길래?
3. 결국 private key
4. 마치며
1. 메타마스크와 UX
아래에서 보는 그림은 크립토키티 DApp 에서의 '교배' 버튼이다. (이 버튼을 통해서 각 고양이들을 교배해줄 수 있다.)
나름 잘 만들었다. hover(버튼에 마우스를 올렸을 때), focused(버튼에 마우스를 클릭했을 때)에 대한 디자인도 괜찮고 크기도 큼직해서 정말 "누르면 무슨 일이 일어날 것 같은" 버튼이라는 생각이 든다.
보통의 버튼이 그렇다.
자 이제 교배 버튼(OK, give them some privacy')을 눌러보자.
웬 쌩뚱맞은 UI가 나온다. 그렇다. 우측에 보이는 화면은 메타마스크다.
아무리 내 서비스의 UI를 세련되게 만든다고 한들 DApp인 이상 쌩뚱맞은 메타마스크를 관문으로 거쳐야 한다.
그런데 그냥 단순한 관문이면 괜찮겠는데, gas price, gas limit에 대해서 설정하라고 한다.
여기까지오면 일반 사용자(DApp에 익숙하지 않은)들은 그냥 꺼버리고, 조금 열성적인 사용자들은 gas가 뭐지? 하고 구글링을 할 것이다.
굉장히 불친절하고 불편하다. 유저뿐만아니라 개발자에게도.
그러면 대체 메타마스크가 뭐길래 얘를 다운로드 받아서 설치하고, 황당하게 튀어나오는 안 예쁜 메타마스크 팝업을 봐야하는 걸까?
2. 메타마스크가 뭐길래?
메타마스크는 쉽게 말해서 지갑이다. 지갑의 핵심 기능은 Key management이다.
Key management란,
1)private key를 생성해준다.
2)1에서 생성된 private key를 보관해두었다가 사용자가 필요할 때 꺼내쓸 수 있게 한다.
3)(optional) 단순히 private key 그대로를 보관해 두었다가 바로 꺼내쓰는 것은 위험하기 때문에 사용자에게 따로 패스워드를 설정할 수 있게 해서 그 private key를 꺼낼 때 패스워드를 물어보게 해서 좀 더 보안을 신경써준다.
메타마스크를 직접 사용해보면서
1)2)3)을 확인해보자. (스크린샷과 함께)
"패스워드를 설정할 수 있게 한다." - 위에서 말한 3)의 기능에 해당한다.
"private key를 생성한다" - 위에서 말한 1)의 기능에 해당한다.
"private key를 보관해두었다가 필요할 때 꺼내쓸 수 있게 한다." - 위에서 말한 2)의 기능에 해당한다.
3. 결국 private key.
결국 메타마스크를 사용하는 이유는 1)Private key를 생성해주고 2)보관해주고 필요할 때 꺼내쓸 수 있게하기 때문이다.
여기서 Private key 생성에 대한 오해가 있는데, 사실 Private key 생성이 막 그렇게 대단하고 어려운 게 아니다.
1)private key 생성하기
Private key 생성에 대해서 말하기 전에 가벼운 게임을 따라해주시면 좋을 것 같은데,
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 중 하나씩 골라서 나름 의미를 가지는 64자리의 문자열을 만들어 보자.
뭐 당장 의미있는 64자리 문자열을 만들기가 당장 떠오르시진 않으실테니까 팁을 드리자면, 본인의 휴대폰번호가 되었든 지인의 휴대폰번호가 되었든 010XXXXYYYY 처럼 11자리로 된 전화번호를 5번 넣고 (11 * 5 = 55자리) 나머지 9자리를 따로 생각해내서 채우시면 나름 쉽다.
0104072403301022056712010501447970102173212501099321346BEEFCAFE0
예를 들어 나 같은 경우는 임의의 전화번호를 5개 입력하고, 오늘 강남역 한*돈까스에서 비프까스를 먹어서 BEEF 라는 단어를 만들고, 지금 이 글을 카페에서 쓰고 있기 때문에 CAFE라고도 써주었다. 끝에 한 자리 남아서 그냥 0이라는 숫자를 넣고 64자리를 만들었다. (아무 숫자를 이용해서 전화번호를 임의로 막 입력한 것입니다. 실제로 전화하진 말아주시길 부탁드려요 ㅎ.ㅎ;;)
눈치 빠르신 분들은 이미 짐작하셨을 수도 있겠지만, 사실 방금 우리가 한 행위는 private key를 만든 행위이다.
의심이 가실 수 있으니 확인을 시켜드리겠다.
https://www.myetherwallet.com/#view-wallet-info 로 들어가서 private key를 누르시고 방금 입력하신 64자리 문자열을 넣어보시고 Unlock을 눌러보시면 우리가 만든 private key로 만들어진 지갑주소와 지갑에 접근하실 수 있다. 당연히 여기에 코인이나 토큰을 전송하실 수 있는 진짜 지갑이다.
개발자 입장에서 "0~9, A~F 를 이용해서 64자리의 문자열을 만들어라.” 는 사실 그렇게 어려운 문제가 아니다. 프로그래밍을 모르시는 분들도 이해하기 쉽게 설명하기 위해 코드를 간단하게 보여드리자면 이렇다.
1 번째라인: candidate라고 하는 이름의 배열에 0~9, ‘A’ ~ ‘F’의 16자리 후보들을 넣어준다.
2 번째라인: privateKey 라고 빈 문자열을 선언해둔다.
3 ~ 5 번째라인: privateKey라는 문자열이 64자리가 될 때 까지 candidate에 있는 후보들을 랜덤하게 뽑아서 privateKey 문자열을 완성해준다.
그러면 스크린샷에 보이는 바와 같이 실제 private key("CE27...4543A")를 만들어 낼 수 있다.
정말 쉽게 private key를 만들었다.
2)private key 보관하기
이것은 뭐 종이에 64자리 문자열을 쓰셔도 되는 부분이고, 하드디스크에 안전하게 암호화해서 저장해두셔도 된다.
결국 위에서 한 일을 메타마스크가 대신 해주는 것이 전부이다. 물론 여기서 infura 노드를 써서 이더리움 블록체인에 transaction을 전송한다던지, transaction을 전송할 때에 gas price와 gas limit을 설정해줄 수 있다던지(굳이 읽으실 필요 없는 디테일한 얘기) private key를 좀 더 보관이 용이하게 해준다던지 한 ‘부수적인’ 부분이 있지만, 이것 때문에 굳이 (개발자 입장에서) 메타마스크를 사용할 의무는 없다.
위에서 봤듯이 private key만 잘 생성할 수 있고, 보관만 잘 해준다면(사실 메타마스크도 사용자의 하드디스크에 사용자가 입력한 패스워드를 통해 암호화해서 private key를 저장할 뿐이다. 이것에 대해서는 따로 구체적인 글을 쓸 예정이다.) 이더리움 블록체인에 transaction을 전송하는데에는 전혀 무리가 없다.
https://github.com/ethereumjs/ethereumjs-tx
위와 같은 코드에 드래그 한 부분에 private key만 넣어주면 결국 transaction을 전송할 수 있다.
...
4. 마치며
대부분의 Dapp 개발자들이 인터넷 블로그에 나와있는 개발 튜토리얼을 따라가다보면 메타마스크를 이용하게 되면서 이게 필수적인 것이라고 생각하는데, 사실 위에서 말한 ‘private key’ 생성과 보관을 용이하게 해줄 수 있다면 본인이 만들려고 하는 서비스에 따라 메타마스크를 굳이 사용하지 않아도 될 수 있다.
사실 이런 글을 쓴 이유는 Dapp을 개발하는 입장에서, "유저에게 내가 만든 서비스를 이용하게 만들기 위해서, 메타마스크를 설치하게 하고, 매번 버튼을 누를 때마다 메타마스크 팝업이 뜨게 하는 것을 계속 방관해야할까? 메타마스크 너가 대체 뭐길래?" 로 시작했다. 그러다가 결국 생각이 확장되어 "블록체인의 mass adoption이 어떤 방식으로 일어날까?” 에 대한 고민으로 이어졌다.
"블록체인의 mass adoption이 어떤 방식으로 일어날까?”
여러가지 방식이 있을 수 있지만 개인적으로는 1, 2번 중에 하나라고 생각한다.
1.
일반 사용자, 즉 대중이 private key, public key 개념에 대해서 학습하고 gas price, gas limit 개념과 transaction이 어떤 식으로 블록에 들어가게 되는지의 메커니즘을 학습하게 되어 프라이빗 키 생성이나 메타마스크를 사용하는 데에 있어 전혀 불편함 없이 사용할 수 있게 되면서 블록체인을 통한 DApp 사용이 늘어난다.
2.
일반 사용자는 블록체인 용어들, 키워드, 메커니즘 등을 알 필요없이 블록체인을 통해 만들어진 나름의 killer dapp이 나오면서 이전 앱을 사용하는 것처럼 DApp을 사용하기 시작한다.
개인적으로는 2번의 그림이 가능성이 있다고 생각한다.
어떤 서비스건 개발을 하는 입장에서, 유저가 뭔가를 ‘학습’하게 만드는게 얼마나 불친절하고 불편한 UX인가. 세상에 아무리 대단한 기술, 서비스들이 나온다고 한들 이용에 있어 사용자에게 불편을 끼쳐서는 안된다고 생각한다.
언론에서 블록체인이 모든 문제를 해결 할 수 있는 것 처럼 보도되고 있는데, 결국에 사용자가 이용할 ‘서비스’라는 관점에서, 블록체인이 과연 뭐가 대단하다고 ‘감히’ 사용자를 불편하게 할 수 있겠는가. : )