니모닉 지갑 개발이전에 니모닉(Mnemonic)에 대해 먼저 알아보자
암호화폐 지갑은 비대칭키 암호 방식을 사용한다.
때문에 공개키와 개인키가 사용되는데, 이 개인키를 쓰기 편하게 만들어진 것이 니모닉이다.
니모닉은 12개의 단어를 순서대로 맞추는 것으로 니모닉 문자를 초기 설정 순서대로 맞추지 못하면 지갑을 열 수 없다.
eth-lightwallet
을 이용하여 간단한 니모닉 지갑을 개발해 보았다.
사용한 모듈에 대해 더 알고 싶다면 공식문서를 참고하자.
실제로 eth-lightwallet
모듈을 사용한 코드에 대해서만 정리해보자.
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 });
}
});
/newMnemonic
으로 post요청을 보내면 json 형태로 Mnemonic pharse를 응답한다.
generateRandomSeed()
함수를 이용하여 니모닉 코드(Seed)를 랜덤하게 발행하고, 좀 더 보기 편하게 Mnemonic pharse로 변환했다.
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);
}
});
응답받은 Mnemonic pharse를 이용하여 지갑을 개설한다.
/newWallet
으로 post 요청을 보내면 key store
파일을 로컬에 저장하고 address를 응답받게 된다.
key store
로 만들기 위해 body에 password 와 mnemonic을 요청해야 하므로 password
와 mnemonic
변수를 만들어 값을 할당하고, createVault
함수를 사용하여 key store를 만든다.
두번째 인자(callback)에는 key store를 인자로 사용하는 함수를 만든다. 만든 함수에는 첫번째 인자로 error를, 두번째 인자로는 createVault 함수에서 만든 key store를 받는다.
받은 key store를 이용하여 keyFromPassword
함수를 이용, 새로운 주소를 받는다.
Postman을 이용하여 key store와 address의 응답테스트를 진행해보자.
서버를 실행시키고 Postman에서 POST를 선택하고 http://localhost:3000/wallet/newMnemonic
를 입력 후 SEND를 눌러 서버로 요청을 보내면 니모닉 코드를 응답받을 수 있다.
응답받은 니모닉코드를 mnemonic
이라는 키값으로, password
에는 원하는 임의의 값으로 입력 후 http://localhost:3000/wallet/newWallet
엔드포인트로 SEND를 눌러 요청을 보낸다.
eth-lightwallet 모듈을 사용하여 지갑을 직접 개발해 보았다.
공식문서를 참고하여 함수의 사용법과 동작원리를 이해하고 개발을 하니 큰 어려움없이 진행할 수 있었던거 같다.
공식문서가 영어로 되어있어 보기 힘들고, 때론 보기 싫어 자주 참고하는 편은 아니었다.
이번 개발을 진행하면서 공식문서의 중요성을 알게 되었고, 앞으로도 공식문서를 참고하면서 개발 능력을 키워나가야겠다.
썸네일 이미지 출처