간단하게 니모닉은 일반적인 단어들의 조합이고, 니모닉 지갑은 니모닉을 사용해 비밀 키 관리를 용이하게 해주는 암호화폐 지갑이다.
개념을 알아보았으니 개발을 해보도록 하자.
개발 과정에서 eth-lightwallet 모듈에 내장된 함수를 사용한다.
1.post 요청을 받으면 eth-lightwallet 모듈의 generateRandomSeed() 함수를 이용해 니모닉 코드를 생성한다.
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try{
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err){
console.log(err);
}
});
2.니모닉 코드와 패스워드를 이용해 newWallet API 만들기
post요청을 보낼 때 이전에 생성한 니모닉 코드와 설정할 패스워드를 파라미터로 보내 새로운 지갑을 생성한다.
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 });
});
keyFromPassword 함수를 통해 키값을 얻고 이 값을 매개변수로 콜백 함수인 generateNewAddress 함수를 실행하여 keystore와 address를 얻는다.
생성된 keystore를 json 파일로 만들어 로컬 서버에 저장하기
fs 모듈의 writeFile 함수를 이용해 wallet.json이라는 이름의 파일을 생성하고 안에 keystore 값을 담아준다.
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:"성공"});
}
});
});
wallet.json 파일이 생성되었고 안에 keystore 데이터가 담긴것을 확인할 수 있다.
{"encSeed":{"encStr":"4/zTTIo704NVS03yNgpL/Kbu7kXUd9XJZdbdubEM3ZUxsKem/dbFOp4kwoxpyI6J0OwGZP2UoeJ+9J2tp9T+pU2mKPugzZDvM/yy62bCU0A+NQHG27P5V11bH56N4Psib6V2fhP25sMN+jcPWvBx3hIMJE+gD9khZyaNiPcvzw2xG4/vYo4Tsw==","nonce":"0fnltxV638tlcfE482fgr5riXZJWYGst"},"encHdRootPriv":{"encStr":"Vt2gpuT/N2s93F+BeFIrnah4BTmtRG3AxoNxMs5OtVawZxBQOFXZjXpobZoDMuMu6H2hIXUKIIu9gGGhEMAMzvgjMw+j39m9u77QTfiPSxy7Q1eHcYVbmhAKuDZVAPzGgGB30tKonS1m3Er0VEkA024VIWNZni9T5Hr8PKNIGg==","nonce":"MhqVwmbmi8uBJSwBtmd7HP2htT1bhIel"},"addresses":["c872a24898b6f2e11510688133a14b27c105a78a"],"encPrivKeys":{"c872a24898b6f2e11510688133a14b27c105a78a":{"key":"DWP8i3mgcC1fVH+tnJzhybAD0V2EkjI37D4anbV03FIw3KP7rLsuxBGzZZg5iXMi","nonce":"lO2o77THF/RApRoHkQf7VIiX/VaQG73v"}},"hdPathString":"m/0'/0'/0'","salt":"pJd02s7DhxHBBLfHM8vBSbTwdkAYLfuqWgMTahob4aI=","hdIndex":1,"version":3}
니모닉 코드와 키 그리고 니모닉 지갑이 서로 어떻게 연관되어 있는지 알아볼 수 있었다. 모듈을 사용하니 꽤나 간단하게 느껴지는 반면 앞으로의 블록체인 개발에서 모듈을 잘 활용하지 못한다면 작업이 많이 어려워질것이라는 생각이 들었다.
GUI 보단 역시 이렇게 코드로 직접 개발해보는게 이해가 잘 된다.