목표
니모닉 코드를 활용하여 지갑을 개발해보고 니모닉 지갑에 대해 이해해보고자 한다.
니모닉이란??
간단하게 니모닉에 대해 말하자면 블록체인에서 니모닉(Mnemonic)은 지갑을 복구하기 위한 일반적인 단어들의 조합을 말한다. 직관적인 관계도 없이 외우기 어려운 정보에 다른 정보를 연결하여 외우기 쉽도록 하는 데 쓰인다.
대표적으로 쓰이는 지갑에는 Metamask와 Kaikas가 있다.


개 발 해 보 자
▲ 개발하기에 앞서 먼저 필요한 것들이 있다.
- Postman
- VSCode
▲ 수도코드
- eth-lightwallet 모듈에 내장되어 있는 함수로 개발(eth-lightwallet 모듈)
- Postman로 결과를 확인한다.
- fs 모듈을 이용하여 로컬에 키 스토어를 저장한다.
▲ 코드 작성
위에 첨부한 eth-lightwallet 모듈 링크를 따라가 보면 내장되어 있는 함수와 모듈들을 볼 수 있다.
eth-lightwallet과 express를 주로 사용하였다.
전체적인 코드 : https://github.com/ssongGD/mnemonicWallet.git
! 랜덤한 니모닉 코드를 얻기
var express = require('express');
var router = express.Router();
const lightwallet = require("eth-lightwallet");
const fs = require('fs');
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
console.log(err);
}
});
eth-lightwallet의 모듈을 불러와서 try-catch문을 활용.
postman으로 요청 후 결과 확인

짜잔 - ! 12개의 단어가 생성된 것을 확인할 수 있다.
!! keystore와 address가 잘 응답을 받는지 확인하기
router.post('/newWallet', async(req, res) => {
let password = req.body.password
let mnemonic = req.body.mnemonic;
try {
lightwallet.keystore.createVault(
{
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"
},
function (err, ks) {
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
let address = (ks.getAddresses()).toString();
let keystore = ks.serialize();
res.json({ keystore: keystore, address: address });
});
}
);
} catch (exception) {
console.log("NewWallet ==>>>> " + exception);
}
});
니모닉 코드를 얻기 위한 코드에 이어 작성했다.

keystore와 address가 잘 받아져 온 걸 확인할 수 있다.
!!! 만들어진 keystore를 json파일로 만들어 로컬에 저장
응답 확인을 위한 코드를 조금 수정했다.
router.post('/newWallet', async(req, res) => {
let password = req.body.password
let mnemonic = req.body.mnemonic;
try {
lightwallet.keystore.createVault({
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"
},
function (err, ks) {
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
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:"성공"});
}
});
});
}
);
} catch (exception) {
console.log("NewWallet ==>>>> " + exception);
}
});
fs 모듈을 사용해서 로컬 서버에 저장했다.

응답 확인을 위해 한 과정과 똑같이 해봤을 때 성공이 뜨면 성공이다.
혹시 모르니 vscode에서도 확인을 해보면...

짜잔! wallet.json이 만들어진 것을 확인할 수 있다.
파일 안에는 아래와 같은 코드 한 줄 뿐이다.
{"encSeed":{"encStr":"TC444KIfvDGLFjdqqIfKjiepCWqV3LDtbOKUM0wwWJX9QjJbmQ8AJKWdKjlZ4gOPPquInDNznWanttRRu0yHAxY1bwl4SxK4EiRmBqmtrvlrRMK8aKaAenqc9u1WO3JeDSVS/TfKW4W18uTcPwJPBgnLEvy4GyPbo58K7CZKk71LJPnpNCsmdg==","nonce":"5nzTBlJxoXoFNDwAHfIASuVpBBZRG40V"},"encHdRootPriv":{"encStr":"LLfrV9XOBYyEikQObjDPDQt1reHc8tr+xYCRajMOb0/Mf+6oxmTyXVWGKorjl94STssrbvzF3NPmV2V+NlbYRIYlAd+p3dIniQ7rU+UrjnUgxedMjLRp8SgAD5Nd9OeXluLak2glkt+8Mev3NpFwxbeXKqB+4xq5Y8zwR1h97A==","nonce":"tOy+50G8GWqzSKmG75TnWY+bEQhz9IOA"},"addresses":["e6f8d721200f99645f9e8e7e3479549fb7dcfcf3"],"encPrivKeys":{"e6f8d721200f99645f9e8e7e3479549fb7dcfcf3":{"key":"aLr9TUpdd0uyEARBp9e+G/LmOmhY6jxH0SlTd9yVm20hC+2ueM9qJ5e3qC2ftONE","nonce":"TjSpJBNKNFcLctEkLmZilQ/OPRWGCnvm"}},"hdPathString":"m/0'/0'/0'","salt":"sgM8Rdw1XxaPsOLHCBe1WS04U8hy49XD1BqP3cWcbvI=","hdIndex":1,"version":3}
끝으로
이번 니모닉 지갑 만들기는 eth-lightwallet을 활용하고, 기본적인 서버와 라우터 부분이 구현이 되어있어 머리 아프게 코딩할 것이 없어 코딩적인 부분에서는 크게 문제가 없었다.
'알고 보면' 이해할 수 있는데 막상 백지상태에서 코딩해 보라 하면 매번 뇌정지부터 오는 나였다. 다행히 오늘은 무에서 유를 창조할 거 없이 지갑이 만들어지는 원리? 방법? 에 대해 알아보고 연구하는 시간이었다. 저렇게 구현해 놓으신 분들을 참 존경스럽고 대단하다고 생각한다.
앞으로 잘 따라하며 코딩에 대해 좀 더 자신감을 갖고 다른 지갑 만드는 방법이나 필요한 기술을 더 찾아봐야겠다.
'Hi !' 카테고리의 다른 글
| [P1] OpenSea CloneCoding (0) | 2021.12.22 |
|---|---|
| 클레이튼 개발 환경에서 NFT를 개발해 보자! (0) | 2021.12.13 |