- 니모닉은 지갑을 복구할 때 사용되는 12개 혹은 24개의 랜덤한 영어 단어의 조합으로 이루어져 있다.
- 니모닉은 디지털 서명에 사용되는 방식 중 비대칭 암호 방식에서 사용되는 공개 키(Public key), 비밀 키(Private key)에서 비밀 키를 사람이 쓰기 편하게 만든 것이다.
- 랜덤한 Mnemonic code를 생성
- Mnemonic을 시드로 키스토어를 생성
- Postman을 사용하여 결과 확인
- fs모듈을 이용한 키스토어 로컬 저장
npm init를 이용해 기존 파일의 라이브러리를 다운 후 개발을 진행한다.
router.post('/newMnemonic', async(req,res) => {
// mnemonic 변수 생성
let mnemonic;
try {
//eth-lightwallet 모듈의 내장 함수를 이용해 RandomSeed를 생성하여 변수에 저장한다.
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
//에러를 응답한다.
console.log(err);
}
});
npm start를 이용해 로컬서버를 실행시킨다.
"scripts": {
"start": "node ./app.js"
},
위 코드에서 Post방식을 이용해 /newMnemonic으로 전송하므로,
엔드포인트를 http://localhost:3000/wallet/newMnemonic 로 설정하고 서버로 요청을 보낸다.
12개의 영단어로 이루어진 mnemonic코드가 잘 생성된 걸 볼 수 있다.
router.post('/newWallet', async(req, res) => {
//password 와 mnemonic을 입력값으로 서버에 요청을 보낸다.
let password = req.body.password
let mnemonic = req.body.mnemonic;
try {
//새로운 키스토어를 생성한다.
/*
keystore.createVault(options, callback)
options
암호: (필수) 직렬화 시 볼트를 암호화하는 데 사용되는 문자열입니다.
seedPhrase: (필수) 모든 계정을 생성하는 데 사용되는 12단어 니모닉.
salt: (선택 사항) 사용자는 볼트를 암호화 및 해독하는 데 사용되는 솔트를 제공할 수 있
다.그렇지 않으면 임의의 솔트가 생성됩니다.
hdPathString(필수): 사용자는 BIP39호환되는 HD 경로 문자열을 제공해야 합니다. 이전
에 기본값은 m/0'/0'/0'BIP44 경로 문자열 m/44'/60'/0'/0입니다.
*/
lightwallet.keystore.createVault(
{//첫번째 인자(options)에는 password, seedPhrase, hdPathString을 담는다.
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"
},
//두번째 인자(callback)에는 키스토어를 인자로 사용하는 함수를 만든다.
function (err, ks) {
/*
keystore.keyFromPassword(password, callback)
이 인스턴스 메소드는 내부적으로 구성된 솔트를 사용하여 적절한 pwDerivedKey.\
사용자의 암호를 입력으로 Uint8Array사용하고 키 저장소를 암호화/복호화하는 데 사
용되는 유형의 대칭 키를 생성합니다.
*/
//첫번째 인자는 password, 두번째 인자는 callback함수로 pwDerivedKey를 인자로 사용하는 함수를 만든다.
ks.keyFromPassword(password, function (err, pwDerivedKey) {
//새로운 주소 생성함수
ks.generateNewAddress(pwDerivedKey, 1);
//변수생성 및 할당
let address = (ks.getAddresses()).toString();
let keystore = ks.serialize();
// json형식의 응답으로 전송
res.json({ keystore: keystore, address: address });
});
}
);
//예외처리(에러)
} catch (exception) {
console.log("NewWallet ==>>>> " + exception);
}
});
엔드포인트는 http://localhost:3000/wallet/newWallet가 되고 password와 기존에 응답받은 mnemonic을 post방식으로 전송한다.
keyFromPassword의 콜백 함수에서 json 형식으로 응답 받았던 것을 응답 대신 fs.writefile을 사용하여 파일을 생성한다.
fs모듈은 Node.js 내장모듈로 사용하기 전 import 한다.
function (err, ks) {
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
let address = (ks.getAddresses()).toString();
let keystore = ks.serialize();
//fs 내장모듈 이용 첫번째 인자는 json형태의 파일 생성 두번째 인자 data에 들어갈 값으로 keystore를 넣어준다. 세번째 인자는 에러처리 함수를 넣어준다.
fs.writeFile('wallet.json',keystore,function(err,data){
if(err) {
res.json({code:999,message:"실패"});
} else {
res.json({code:1,message:"성공"});
}
});
});
}
라우터 형식은 같기에 같은 엔드포인트로 전송 후 json파일이 생성되는지 확인한다.
wallet.json형식의 파일이 새로 생성된 것을 볼 수 있다.
json형식의 파일은 한줄로 표기되는데 가독성을 위해 정렬해 주었다.
git address : git@github.com:Yoonchae92/HA4_Test.git