니모닉(Mnemonic)은 지갑을 복구하기 위한 일반적인 단어들의 조합을 뜻한다.
니모닉 Wallet은 비밀 키 관리를 용이하게 해준다.
사실 암호화폐 지갑에는 코인이 들어있지 않고 정확하게는 비밀 키가 들어있다. 이 때 비밀키를 복구(리커버리) 할 수 있는게 니모닉이다.
eth-lightwallet
모듈을 사용해 개발을 해본다.router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
console.log(err);
}
});
lightwallet.keystore.generateRandomSeed()
를 담아, mnemonic을 응답으로 전송한다.http://localhost:3000/wallet/newMnemonic
send
하여 서버로 요청.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);
}
});
password
와 mnemoic
을 입력값으로 서버에 요청req.body
를 통해 할당lightwallet.keystore.createVault
를 사용하여 키스토어 생성keystore
와 address
의 응답 API테스트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);
}
});
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);
res.json({message: err});
}
});
router.post('/newWallet', async(req, res) => {
const password = req.body.password;
const mnemonic = req.body.mnemonic;
try {
lightwallet.keystore.createVault({
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"
}, (err, ks) => {
ks.keyFromPassword(password, (err, pwDerivedKey) => {
ks.generateNewAddress(pwDerivedKey);
const addresses = ks.getAddresses();
const keystore = ks.serialize();
fs.writeFile('wallet.json', keystore, (err) => {
if(err) {
res.json({message: 'Failed to create new wallet'});
} else {
res.json({address: addresses[0], message: 'Successfully created new wallet'});
}
});
});
});
} catch(err) {
console.log(err);
res.json({message: err});
}
});
module.exports = router;
공식문서를 참고하면 큰 어려움 없이 진행할 수 있다. 이해가 잘 되지 않는 부분은 stackoverflow를 참고하면 워낙 기초적인 내용이라 금방 찾을 수 있었다. 개념을 이해했으면 직접 개발해보는게 체화하는데 도움이 된다. package를 이용해 개발했지만 기회가 되면 바닥부터 직접 개발해보고 싶다.