안녕하세요? 트리입니다.
이제 정말 EOS의 카운트다운이 시작되고, 4일만 지나면 마지막 EOS의 ICO가 종료됩니다.
메인넷 런칭을 앞두고 BP 후보들도 분주하게 움직이고 있고, 투자자 분들도 기대반 걱정반으로 기다리고 계실 겁니다.
이제 eos.io 사이트에서도 마지막 8백만개의 토큰 판매만을 남겨두고 있습니다.
저기 표시된 992000000 EOS 라는 숫자를 보니 이제 정말 거의 다 온 것 같습니다.
EOS의 메인넷 런칭을 앞두고 우리가 준비해야 할 것은 EOS의 Public Key - Private Key의 안전한 생성과 확인이죠.
오늘 오전에 님이 올려주신 EOS 프라이빗키 검증하기를 보고 저도 한 번 확인해 보았습니다.
런던을 기반으로한 웹 개발 에이전시인 Webdigi의 github 공개 소스를 바탕으로 말이죠.
Private Key 검증 방법은 간단합니다.
- 소스를 다운로드 받고
- 압축을 풀고
- 인터넷을 끊고
- 다운받은 소스 중에서 index.html을 웹 브라우저에서 실행시키고
- Private Key를 입력하고
- Map to EOS public key 버튼을 클릭합니다.
그런데 이게 과연 믿을 수 있는 소스일까요?
그러면 소스를 뒤져 봐야죠.
의심해서 미안하지만 우리의 Private Key는 소중하니까요.
압축파일을 해제하면 html 파일 하나, js 파일 3개, css 파일 하나, 그리고 md 파일 하나만 있습니다.(오! 소스가 몇 개 없어!!)
오프라인에서도 돌아갈 수 있게.. 깔끔하네요.
모든 소스를 열어봅니다.
index.html 파일에서 시작하는데, 화면에서 입력받은 Private Key가 전송되거나 저장되는 부분이 있는지만 살펴보면 될 것 같습니다.
index.js 소스를 통해 generate() 함수가 실행되고요.
function generate() {
showPane('generate')
setTimeout(() => {
var privKey = byId('privKey').value;
privateKeyPair = webdigiKeyPair(privKey)
...생략...
}, 1000)
}
webdigiKeyPair 라는 이름의 함수를 호출하는데, webdigi는 이 프로그램 만든 에이전시이고..
같은 파일 내의 다음 함수를 호출하는데, 입력받은 Private Key를 이용해 Public Key를 가져옵니다.
function webdigiKeyPair(privKeyInput) {
var {PrivateKey, PublicKey} = eos_ecc
var privkeyError = ''
var pubkeyError = ''
try{
var abc = PrivateKey.fromWif(privKeyInput);
var privkey = abc.toWif()
var pubkey = abc.toPublic().toString()
} catch(error){
privkeyError = 'Private key in invalid, please try again.'
}
이하 생략...
여기서 Wif은 Wallet import format의 약자로 인코딩된 지갑 주소 포맷을 말합니다.
Wif에 대해서는 비트코인 위키 링크를 참고해 보시면 됩니다.
아무튼 여기 소스에서 보면 fromWif(), toWif() 등의 함수를 통해 가져오는데 이 함수들은 ecc.js 에 있는 함수들이네요.
static fromWif(_private_wif) {
var private_wif = new Buffer(base58.decode(_private_wif));
var version = private_wif.readUInt8(0);
assert.equal(0x80, version,Expected version ${0x80}, instead got ${version});
// checksum includes the version
var private_key = private_wif.slice(0, -4);
var checksum = private_wif.slice(-4);
var new_checksum = hash.sha256(private_key);
new_checksum = hash.sha256(new_checksum);
new_checksum = new_checksum.slice(0, 4);
if (checksum.toString() !== new_checksum.toString())
throw new Error('Invalid WIF key (checksum miss-match)')
private_key = private_key.slice(1);
return PrivateKey.fromBuffer(private_key);
}
이런 식으로 되어 있어서 내부적으로 포맷을 변형하고 검증합니다.
처음부터 ecc.js를 보면 워낙 다양한 라이브러리를 사용한 1만 7천라인짜르 소스인지라..
하나하나 변환하는 단계까지 알아볼 필요까지는 없을 거구요.(어차피 역량도..;;)
이걸 외부로 보내거나 저장하는 부분이 있는지를 확인하면 되는 거니..
file이나 http, buffer 등의 키워드로 검색해서 수상한 부분이 있는지를 한번 더 찾아 보았습니다.
여기까지 보고 제가 내린 결론은 이 프로그램을 사용해도 특별한 문제는 없는 것 같다.. 인데요.
혹시 이상한 부분이 있는지 발견하신 분이 계시면 알려주시면 좋을 것 같습니다.
(이럴 때 집단 지성을 이용해야죠!!)
참고로 EOS cafe에서도 EOS 키 검증 도구를 github로 제공하고 있습니다.
이쪽은 소스를 간단히 보니 Vue.js를 이용하고, yarn을 이용해 패키지들을 갖다쓰는군요. 얼핏보니 비슷비슷한 모듈들이네요.
여기까지 확인하고 절차에 따라 오프라인에서 Private Key - Public Key 매핑 확인을 해 보았습니다.
다행히 제가 보관하고 있는 키가 맞네요.
두 번, 세 번씩 확인하고 있으니.. 스스로도 왜 이러나 싶기도 하지만 마지막까지 긴장을 놓을 수 없네요. ㅎㅎ
