TIL
TIL) 니모닉 생성과정, eth-lightwallet 모듈로 지갑생성 실습
Whatisblockchain
2022. 6. 21. 14:20
본 컨텐츠는 유튜버 리플리님과 코드스테이츠의 강의를 바탕으로 작성하였습니다.
니모닉(Mnemonic)이란?
니모닉이란, 지갑을 생성할 때 같이 생성되는 복잡한 난수형태의 '시드'를 기억하기 쉬운 12개의 단어로 만들어주는 코드(알고리즘)이다. 암호화폐 지갑을 생성하고 복구하는 데 주로 니모닉으로 생성된 시드문구가 사용된다.
니모닉 과정
1. 128bit or 256bit 길이의 난수 생성
2. 생성된 난수를 SHA-256 알고리즘으로 해시화
- 해시값에서 (시드 키의 길이) / 32 만큼 떼어네서 체크섬으로 저장
3. 해시값을 바이너리 코드로 변환하고 맨 뒤에 체크섬 붙이기
4. 바이너리 코드를 11bit로 나눔
5. 각각의 11bit 묶음을 10진수로 변환
6. 10진수의 숫자를 니모닉 사전에서 인덱싱하여 각각의 단어(니모닉 코드)로 변환
7. 생성된 니모닉 코드와 솔트(mnemonic + 사용자 지정 암호문)값을 해시화하는 key Stretching Function에 넣어 솔팅
니모닉으로 지갑 만들기 실습(eth-lightwallet 모듈 사용)
const express = require('express');
const router = express.Router();
const lightwallet = require("eth-lightwallet");
const fs = require('fs');
// TODO : lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
mnemonic = lightwallet.keystore.generateRandomSeed();
res.send({ mnemonic })
} catch(err) {
console.log(err);
}
});
// TODO : 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
router.post('/newWallet', async(req, res) => {
let password = req.body.password;
let mnemonic = req.body.mnemonic;
try {
lightwallet.keystore.createVault(
{
password: password,
// 아래는 optional한 부분들. 추가 옵션으로 유니크한 salt 값을 넣을 수도 있다.
seedPhrase: mnemonic,
// hd wallet path 설정
hdPathString: "m/0'/0'/0'"
},
(err, ks) => {
ks.keyFromPassword(password, (err, pwDerivedKey) => {
ks.generateNewAddress(pwDerivedKey, 1);
let address = (ks.getAddresses()).toString();
let keystore = ks.serialize();
let file = {address: address,
keystore: keystore
};
fs.writeFile('wallet.json', JSON.stringify(file), (err, data) => {
if(err) {
res.send({ code: 999, message: 'fail' });
} else {
res.send({ code: 1, message: 'success' })
}
})
})
}
)
} catch (exception) {
console.log("New wallet ==>>> " + exception);
}
});
module.exports = router;
헤맨 부분
address 내용도 같이 저장해주고 싶은데, 자꾸 에러가 남.
알고보니 keystore는 이미 JSON 형태라 JSON.stringify 함수가 필요치 않았지만, address는 그렇지 않아서 해당 함수 필요했음. 함수 안에 객체로 내용 같이 담아서 전달하니 문제 없이 출력됨.