eth-lightwallet 모듈을 이용하여 간단한 Mnemonic Wallet을 개발해보고, Postman을 이용하여 API 테스트를 해보고자 한다.
먼저 사용할 Lightwallet에 알아보자.
깃허브링크 : https://github.com/ConsenSys/eth-lightwallet
LightWallet은 이더리움 노드를 실행하지 않는 경우에도 이더리움 Dapp을 실행할 수 있도록 암호화된 키를 저장할 수 있는 HD wallet이다.
1. 설치
npm install eth-lightwallet
2. eth-lightwallet 의 내장되어있는 keystore 함수를 사용하여 개발
keystore.generateRandomSeed()
먼저, 임의의 12개의 단어 시드로 구성된 문자열을 생성하고 반환
mnemonic 변수 생성 후,
mnemonic 변수에 lightwallet.keystore.generateRandomSeed() 를 담아, mnemoic을 응답으로 전송
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
console.log(err);
}
});
3.mnemonic 코드와 password를 이용해 newWallet API 만들기
password와 mnemonic을 입력값으로, 서버에 요청을 보내기
- password 와 mnemonic 변수를 생성
- 요청에 포함되어 있는 password와 mnemonic을 각 변수에 할당
keystore.createVault(options, callback)
새로운 월렛 키스토어를 생성하기 위한 인터페이스 함수를 사용하여 키스토어 생성
Options
- password (필수)
- seedPhrase (필수)
- salt (선택사항)
- hdPathString (필수) 사용자는 BIP39에 호환되는 HD 경로 문자열을 제공해야함
기본값은 m/0'/0'/0' BIP44 에서는 m/44'/60'/0'/0 이다.
- 첫번째인자 (options)에는 password, seedPhrase, hdPathString
- 두번째인자 (callback)에는 키스토어를 인자로 사용하는 함수를 생성
- 콜백함수에는 eth-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장 함수를 사용
- 첫번째인자에는 (password), 두번째인자 (callback) 에는 pwDerivedKey를 인자로 사용하는 함수를 만듬
- 두번째 콜백 함수가 실행되면 eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, [num])을 사용하여 새로운 주소 생성 함수를 실행
- address 변수를 만들고, keystore.getAddresses() 를 문자열로 할당
- keystore 변수를 만들고, keystore.serialize() 를 할당
- 위에서 만든 변수를 응답으로 전송 및 테스트
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);
}
});
4. 생성된 keystore를 json 파일로 만들어 로컬 서버에 저장하기
Node.js에 내장 모듈인 fs 모듈을 이용하여 응답 대신 fs.writeFile을 사용하여 로컬 서버에 json 파일을 저장
res.json({ keystore: keystore, address: address });
대신
fs.writeFile('wallet.json',keystore,function(err,data){
if(err) {
res.json({code:999,message:"failed"});
} else {
res.json({code:1,message:"sucsess"});
}
});
으로 바꿔준다.
fs.writeFile의 첫번째 인자는 .json 형식의 파일이름, 두번째 인자에는 keystore, 세번째 인자에는 응답에 대한 콜백함수를 입력 해준다. 로컬 서버에 json파일을 저장하기 때문에 응답으로는 성공 또는 실패 메세지만 전송한다.
이전과 같은 방법으로 니모닉 코드와 패스워드를 newWallet으로 전송해본다
기존에 응답받던 키스토어 내용들이 들어가있는 것도 확인
wallet.json
{"encSeed":{"encStr":"YjPbk2KSrAczo+diulmvoDCtD61i/nuoD89pkNvGU1IYdOHTGM2jAjfKUSUu+m0exdpUWP7V68WMYVAmt5M2XLTjaK+arbTdEMFDDHQPsTMnf3EYFn84VPvgzvvcfvFKr9kqGJWbRNwtVBRsTcT/KnhGvydSdanYyMdRHxKp0NGuUdwjfi8zvw==","nonce":"YWc7Jv5b0e95aST75zGR9S9I0mW81kXC"},"encHdRootPriv":{"encStr":"07Jv67Pr+DhATrf7KH0dRdcjSfl+iPmb+WH/A2nQ8+2/4xe28Sj2YN8k3z9g6RoVnlLgZdKbS9LTj/Np86hgpmwFHzehV8s2nYYdcMJG7MUO7jOaTaqrWuw08PQCN1uh7jMBzw/Iku5ZaxKuOyoyR2YdwPF+87f1Pfj3QkD9zQ==","nonce":"tHcLtW9CbrzYws1pjv1XjZ/8bi51+WyV"},"addresses":["ccf1821ee305daa3dccf91f40c3e9b158594e6e9"],"encPrivKeys":{"ccf1821ee305daa3dccf91f40c3e9b158594e6e9":{"key":"HmngIj3BWza9K+LMuvtjG13fbD2sAaFBlPwg+cVaneyvzwLBq5S5GM3oZpvY6+ml","nonce":"Lswp3lToebhrh8XGpNF6tmxB1doI4sdO"}},"hdPathString":"m/0'/0'/0'","salt":"KLl9IFtFkQJn+IXF/WOr+S5Tg6EHwQxsw+d3mEDAt2A=","hdIndex":1,"version":3}
깃허브 링크 : https://github.com/BABOAIO/MnemonicWallet
GitHub - BABOAIO/MnemonicWallet
Contribute to BABOAIO/MnemonicWallet development by creating an account on GitHub.
github.com
개발 회고
지갑을 만들면서 eth-lightwallet 모듈을 사용, 내장함수들이 어떻게 구동되는지 알수 있었다.
이후엔 메타마스크 혹은 카이카스 클론코딩을 통하여 실제로 적용까지해보는 실습을 해봐야겠다.
'[BLOCKCHAIN]' 카테고리의 다른 글
solidity 패턴 분석 - Guard Check (0) | 2022.06.04 |
---|---|
Opensea 클론코딩 (0) | 2022.02.19 |
Truffle을 이용한 ERC-721 개발 (0) | 2022.02.09 |
Mnemonic Wallet - 개발이론 (0) | 2022.02.08 |
블록체인과 암호화폐 (1) | 2021.12.30 |