eth-lightwallet 모듈의 내장함수 이용해서 Mnemonic Wallet 개발하기
💡 Mnemonic Wallet 개발하기
eth-lightwallet 모듈을 이용해서 니모닉 지갑을 개발해보려 한다. Light wallet의 소개만 간단하게 적어두었다. 자세한 내용은 아래 첨부해둔 링크를 읽어보면 좋을 것 같다.
✓ Light Wallet (Github)
About
LightWallet is a HD wallet that can store your private keys encrypted in the browser to allow you to run Ethereum dapps even if you're not running a local Ethereum node. It uses BIP32 and BIP39 to generate an HD tree of addresses from a randomly generated 12-word seed.
LightWallet is primarily intended to be a signing provider for the Hooked Web3 provider through the keystore module. This allows you to have full control over your private keys while still connecting to a remote node to relay signed transactions. Moreover, the txutils functions can be used to construct transactions when offline, for use in e.g. air-gapped coldwallet implementations.
The default BIP32 HD derivation path has been m/0'/0'/0'/i, but any HD path can be chosen.
Security
Please note that LightWallet has not been through a comprehensive security review at this point. It is still experimental software, intended for small amounts of Ether to be used for interacting with smart contracts on the Ethereum blockchain. Do not rely on it to store larger amounts of Ether yet.
소개
LightWallet은 로컬 이더리움 노드를 실행하지 않아도 이더리움 디앱을 실행할 수 있도록 암호화된 개인 키를 브라우저에 저장할 수 있는 HD 지갑이다. BIP32와 BIP39를 사용하여 무작위로 생성된 12단어 시드로부터 주소의 HD 트리를 생성한다. Ligthwallet은 주로 키스토어 모듈을 통해 Hooked WEB3 Provider를 위한 서명 제공자가 되도록 고안되었다. 이를 통해 서명된 트랜잭션을 이어가기 위해 원격 노드에 연결하는 동안 개인 키를 완전히 제어할 수 있다. 더구나, txutils 함수는 오프라인일 때 트랜잭션을 구성하는데 사용될 수 있다. 예를 들어, 예를 들어 air-gapped coldwallet 구현과 같은 곳에 사용할 수 있다. 기본 BIP32 HD 파생 경로는 m/0'/0'/0'/i이지만 HD 경로를 선택할 수 있다.
Security
현재 Lightwallet은 전체적인 검토를 거치지 않았다.. 이더리움 블록체인의 스마트 계약과 상호 작용하기 위해 소량의 이더리움을 사용하기 위한 아직은 실험적인 소프트웨어이다. 아직은 많은 양의 이더리움을 보관하지 말아라.
✓ newMnemonic API 만들기
* menomic 변수를 만든다.
* (응답) menomic 변수에 lightwallet.keystore.generateRandomSeed()를 담아, mnemonic 을 응답으로 전송한다.
* (에러) 에러를 응답한다.
router.post("/newMnemonic", async (req, res) => {
// mneominic 변수를 만든다.
let mnemonic;
try {
// mneomic 변수에 lightwallet.keystore.generateReandomSeed()을 담아, mneomic을 응답으로 전송한다.
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({ mnemonic });
} catch (err) {
//에러를 응답
console.log(err);
}
});
* 로컬 서버를 실행시켜 서버가 응답하는 니모닉 코드를 확인할 수 있다.
✓ mnemonic code와 password를 이용해 newWallet API 만들기
* password와 mnemonic 을 입력값으로, 서버에 요청을 보낸다.
1) password와 mnemonic 변수를 만든다.
2) 요청에 포함되어 있는 password와 mnemonic을 각 변수에 할당한다.
(응답)
* 첫 번째 인자(options)에는 password, seedPhrase, hdPathString을 담는다.
* 두 번째 인자(callback)에는 키스토어를 인자로 사용하는 함수를 만든다.
* et-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장함수를 사용한다.
* 첫 번째 인자에는 password, 두 번째 인자(callback)에는 pwDerivedKey를 인자로 사용하는 함수를 만든다.
* 두 번째 콜백함수가 실행되면, eth-lightwallet 모듈의 keystore.generateNewAddrss(pwDerivedKey, [num])을 이용해 새로운 주소 생성 함수를 실행한다.
* address 변수를 만들고, keystore.getAddresses()을 문자열로 할당한다.
* keystore 변수를 만들고, keystore.serialize()를 할당한다.
* 위에서 만들어준 변수를 응답으로 전송한다.
(오류) 에러를 응답한다.
router.post("/newWallet", async (req, res) => {
// password, mnemonic 변수를 만든다.
let password = req.body.password;
let mnemonic = req.body.mnemonic;
try {
lightwallet.keystore.createVault(
// 첫번째 인자: options
{
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'",
},
// 두번쨰 인자: callback
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("NEW WALLET === >>>>" + exception);
}
});
Postman을 이용해 keystore와 address의 응답 API를 테스트해볼 수 있다. 위에서 얻은 니모닉코드를 mnemonic이라는 키의 값으로 password에는 원하는 값을 넣은후 요청을 보내면 아래와 같이 응답하는 것을 확인할 수 있다.
생성된 keystore를 출력하는 대신 로컬 서버의 경로에 파일을 저장할 수도 있다.
fs.writeFile("wallet.json", keystore, function (err, data) {
if (err) {
res.json({ code: 999, message: "실패" });
} else {
res.json({ code: 1, message: "성공" });
}
}
Postman 으로 성공 여부도 확인할 수 있다.