니모닉 지갑 개발 🧑🏻‍💻

김기대·2021년 12월 10일
1

블록체인 개발

목록 보기
1/12
post-thumbnail

니모닉 지갑 개발에 앞서!!

블록체인에서 지갑이란? 🤔

개인 키(비밀 키)를 관리하는 것. 즉, 키를 관리하는 키 매니지먼트 시스템

그냥 이론 공부할 때는 단순히 암호화폐를 관리하는 것으로 이해를 했었는데 AMA 시간에 민철님께서 알려주시길 암호화폐 지갑은 키를 관리하는 키 매니지먼트 시스템으로 자세히 설명을 해주셨습니다.

암호화폐 지갑은 비대칭 키 암호 방식을 사용하는데, 지갑 생성하는 실습을 하면서 더 이해가 잘 되었다.

지갑의 종류? 🤔

하드월렛, 모바일월렛, 데스크탑 월렛, 웹 월렛, 스마트컨트렉트 월렛 등 여러가지가 있다.

각각의 장단점이 있다.
예) 하드월렛의 경우 보안이 매우 뛰어남
예) 웹, 모바일 월렛의 경우 접근성, 사용성이 편이
...

니모닉이란? 🤔

블록체인에서 니모닉은 지갑을 복구하기 위해서 단어들을 조합하는 것을 의미.

특징) 니모닉은 비밀번호를 까먹어도 떠올리기 쉽다. 왜냐하면 단어들의 조합이라서..

암호화폐지갑은 비대칭 키 암호방식을 사용.
그래서 공개키와 비밀키(개인키)가 사용되는데, 이 비밀키를 사람이 쓰기 편하게 만들어진 것이 니모닉(mnemonic).

실습1. 지갑 생성 🧐

지갑에는 많은 종류들이 있다. MetaMask, 마이이더월렛, Geth 월렛, 클레이튼에 Kaikas 월렛 등..

여기서는 MetaMask 월렛을 해보겠다.

  1. 먼저 메타마스크를 사용하려면 Chrome 웹 스토어에서 Chrome에 추가. (이미 받아서 삭제로 뜸)

  2. 그리고 나서 'MetaMask'을 추가하시겠습니까? 가 뜨는데 확장프로그램 추가함.

  3. 그리고 나서 MetaMask 방문 환영 페이지에서 시작하기 눌러서 시작.

  1. 메타마스크가 처음이면 지갑 생성 버튼을 눌러 지갑을 생성한다.

  2. 그 다음 MetaMask 개선에 참여에 동의 클릭.

  3. 비밀번호 입력하고, 생성 클릭.

  1. 비밀 백업 구문을 클릭하고, 다른 곳에다가 복붙을 해놓자.

  2. 보안 설명 페이지에서 다음 누르고나서, 비밀 단어를 표시하려면 여기를 클릭하세요. 가 뜸
    클릭하여 백업 구문을 확인 후 다음을 클릭

  3. 여기서 이제 앞서 설명한 니모닉이 나옴!!
    아까 복붙했던 비밀 백업 구문 순서에 맞게 클릭하여 입력

  1. 정상적으로 지갑이 생성되었다는 축하 페이지가 뜸.
  2. 다시 로그인 하려면 확장 프로그램에 메타마스크를 눌러 비밀번호를 입력하고 로그인!

이제 지갑을 만들었으니 다른 실습도 하고 프로젝트도 하자

실습2. 니모닉 지갑 개발 🧐

이번 핵심 목표인 eth-lightwallet 모듈을 이용한 간단한 니모닉 지갑을 개발할 것.
웹 router post/get 으로 확인을 한다.
간략하게 postman으로 간략하게 넘어가는 값들을 살펴볼 것.
소스코드는 깃 링크 참고.

  1. 먼저 npm install 로 모듈 받기.

package.json 내용

{
  "name": "beb-sprint-hdwallet",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "eth-lightwallet": "^4.0.0",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "2.0.0-beta11"
  }
}

핵심은 eth-lightwallet

  1. wallet/index.js 에서 작업 할 것.

  1. newMnemonic API 만들기
    간략하게 설명을 하면 /newMnemonic 으로 post 요청을 보내고 eth-lightwallet 모듈을 사용해 keystore.generateRandomSeed() 로 랜덤한 니모닉 값을 받음.

  2. postman으로 테스트 - 니모닉 코드를 얻음

  1. 앞에서 얻은 니모닉 코드와 패스워드를 이용해 newWallet API 만들기
    니모닉 코드와 패스워드 변수를 할당하고 keystore.createVault()으로 키스토어 생성.
password: password, 
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"

그리고 나서 keystore.keyFromPassword(password, callback) 내장 함수를 사용.
콜백함수 에서는 pwDerivedKey를 인자로 사용하는 함수를 만듬.
keystore.generatedNewAddress(pwDerivedKey, [num]) 을 사용해 새로운 주소 생성 함수 실행.
address, keystore 각 변수를 만들어 주소와 키스토어를 할당.

  1. postman으로 테스트 - keystore와 address 가 잘 응답 받는지 테스트

전송하면

keystore, address 잘 응답합니다.

  1. 이제 생성된 keystore를 json 형태의 파일로 만들어서 로컬 서버에 저장을 할 것.
    이번에는 fs 모듈을 이용해 콜백함수에서 응답대신 fs.writeFile로 로컬에 json파일로 저장을 해볼것.
let address = (ks.getAddresses()).toString();
let keystore = ks.serialize();

fs.writeFile('wallet.json',keystore,function(err,data){
	if(err) {
		res.json({code:999,message:"실패"});
	} else {
		res.json({code:1,message:"성공"});
	}
});

이전과 같은 방법으로 니모닉 코드를 받고 니모닉 코드와 비밀번호를 임의로 넣어서 /newWallet으로 postman으로 확인을 해보았다.

post보내기 전에 미리 로컬에 파일들을 확인.

post 요청!


post 잘 간거같다.

그리고 나서 로컬을 확인해보니..

맨 끝에 wallet.json 파일이 생긴것을 볼 수 있다.

{"encSeed":{"encStr":"6tm+x0PJWkrjx/YkxAVYL6NJPohevDa4a8C9aT3jvtOpppOpP1Cw/9ah4oTN10GF0H/QaCbNxbdypc7BomfrJr4FRWT8KnKBxrYP+apzbI3mu+gd8+/7MMtdwXr14SFVs99QzgVRbFLZQ92Ys80Vv7KQZ+KHs5/9MT9cadl7BwQkLrgDhSz3Nw==","nonce":"V0s5uqi3ZWr6sS8Ozj5EdmM5aGXKWUDS"},"encHdRootPriv":{"encStr":"9Rju4zOUfTHGPZCEBaM/Z2zwI839c1bXfq/KfI29GjweXgwBeidKCrQhpILy9a5n93WQj0G8+cXe+Kem5ku2zVJmiQPA0csOaIbsaL/rl59o/cxR1Z2RRLbYTi9QmC0ZV+z2M0snj2nNFYe8VP0wfITJ6VjpZMxRjhRi1ksD7w==","nonce":"s4AOOLyCH1ZN3OGpU5Y1ouS8jp/A8+qS"},"addresses":["5642d6076ea9709fd1a2cac3e5eaa475c9c169f8"],"encPrivKeys":{"5642d6076ea9709fd1a2cac3e5eaa475c9c169f8":{"key":"BcP0lFQKun6En8BDltKXVsx9KlmJZljhrj4EPKEJDX6Gyzcxg+r3B2V9ZkRVTheE","nonce":"d3mNzy9yJlvlfm2/JP5w2pjroe0uE7Mv"}},"hdPathString":"m/0'/1'/0'","salt":"gQ5Lx3Qr8rB/d7UollqLa/gVE2t4c1Qif+gWuyDTuvk=","hdIndex":1,"version":3}

이렇게 간단한 니모닉 지갑을 개발해 보았다.🧐

깃허브 주소 : 니모닉 월렛 링크

개발 회고

목적

초기에 설정한 과제 목표의 90%는 달성한거 같다. 간단한 지갑을 만들어보면서 니모닉 코드의 사용, 키 만드는 방법, 지갑의 구성 등 이해할 수 있었다.

Keep(장점, 유지할 점)

이번 작업을 하면서 eth-lightwallet 모듈을 써보며 내장함수를 조금이나마 다루어 보면서 흐름을 좀더 알 수 있었고, postman으로 post 요청을 해서 보다 눈에 보기 쉽게 알 수 있었다.

Problem(단점, 변경 또는 버릴 점)

아직 더 많은 내장함수가 있을 거고, 좀더 활용을 제대로 하지 못 한거 같다.

Try(시도할 점, 앞으로의 행동)

모듈에 있는 내장함수와 레퍼런스 docs를 검색해보면서 보다 다양한 내장함수를 응용해서 실습해볼 것.

profile
블록체인 백엔드 개발자

0개의 댓글