Mnemonic Wallet 코드 공부 - eth-light-wallet
기능구현 목표
1. newMnemonic API 만들기
수도코드
- mnemonic 변수를 만들기
- 응답 mnemonic 변수에 lightwallet.keystore.generateRandomSeed()의 결과값을 담아서 mnemonic를 응답으로 전송하기
에러가 생기면 에러로 응답하기
자바스크립트 코드
router.post("/newMnemonic", async (req, res) => {
let mneMonic;
try {
let mneMonic = lightwallet.keystore.generateRandomSeed();
return res.json({ mneMonic });
} catch (err) {
console.log(err);
}
});
응답 mnemonic
{"mneMonic":"army join sport pistol inflict mention blade scare what goat cousin pony"}
2. mnemonic code와 password를 이용해 newWallet API 만들기
수도코드
password와 mnemonic 변수를 만들기
요청에 포함되어 있는 password와 mnemonic를 각 변수에 할당하기
(응답)
- lightwallet.keystore.createVault를 사용하여 keystore를 생성하기
- 첫번째 인자에는(options) "password", "seedPhrase", "salt", "hdPathString"을 담기
- 두번째 인자에는(callback)에는 keystore를 인자로 사용하는 함수를 만들기
- eth-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장함수를 사용하기
- 첫번째 인자에는 password, 두번째 인자(callback)에는 pwDerivedKey를 인자로 사용하는 함수 만들기
- 두번째 콜백함수가 실행되면 eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, [num])을 이용해 새로운 주소 생성 함수를 실행합니다.
- address 변수를 만들고, keystore.getAddresses()를 문자열로 할당
- keystore 변수를 만들고, keystore.serialize()를 할당하기
- wallet 파일에 fs 모듈을 import하기
- keyFromPassword의 콜백 함수에서, 응답 대신 fs.writeFile 또는 fs.writeFileSync를 사용하기
- 첫번째 인자에는 저장할 .json 파일형식의 파일 이름을 입력하고 두번째 인자에는 keystore를 입력하기
- 세번째 인자에는 응답에 대한 콜백 함수를 입력하기
- 로컬 서버에 파일을 저장하기 때문에 응답으로는 성공 또는 실패메시지만 전송하기
router.post("/newWallet", async (req, res) => {
let randomNum = Math.random().toString();
let password = req.body.password;
let mnemonic = req.body.mnemonic;
console.log("password", password);
console.log("mnemonic", mnemonic);
try {
lightwallet.keystore.createVault(
{
password: password,
seedPhrase: mnemonic,
salt: randomNum, //랜덤 난수를 대입,
hdPathString: "m/0'/0'/0'",
},
function (err, ks) {
console.log("err", err);
console.log("ks", ks);
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
let randomNum = Math.random().toString();
let address = ks.getAddresses().toString();
let keystore = ks.serialize();
console.log("address", address);
console.log("keystore", keystore);
fs.writeFile("wallet.json", keystore, function (err, data) {
if (err) {
res.json({ code: 999, message: "실패" });
} else {
res.json({ code: 1, message: "성공" });
}
});
});
}
);
} catch (exception) {
console.log("NewWallet", exception);
}
});
module.exports = router;
eth-lightwallet의 기능
keystore.createVault(options, callback)
이것은 새로운 lightwallet 키스토어를 생성하기 위한 인터페이스입니다.
옵션
- password: (필수) 일련화 시 볼트를 암호화하는 데 사용되는 문자열입니다.
- seedPhrase: (필수) 모든 계정을 생성하는 데 사용되는 12단어 니모닉입니다.
- salt: (선택 사항) 사용자는 볼트를 암호화 및 해독하는 데 사용되는 솔트를 제공할 수 있습니다. 그렇지 않으면 임의의 솔트가 생성됩니다.
- hdPathString(필수): 사용자는 BIP39준수 HD 경로 문자열을 제공해야 합니다. 이전의 기본값은 m/0'/0'/0'였으며 또 다른 인기 있는 값은 BIP44 경로 문자열 m/44'/60'/0'/0입니다.
keystore.keyFromPassword(password, callback)
이 인스턴스 메서드는 내부적으로 구성된 솔트를 사용하여 적절한 pwDerivedKey.
사용자의 암호를 입력으로 Uint8Array사용하고 키 저장소를 암호화/암호 해독하는 데 사용되는 유형의 대칭 키를 생성합니다.
keystore.generateNewAddress(pwDerivedKey, [num])
저장소에서 추가 내부 주소/개인 키 쌍을 생성할 수 있습니다.
가장 간단한 사용법은 ks.generateNewAddress(pwDerivedKey)입니다.
num에 대한 호출과 함께 반환될 시드 구에서 키 저장소에 새 주소/개인 키 쌍을 생성합니다.
( ex)) ks.getAddresses() )
전체 코드
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 {
let mneMonic = lightwallet.keystore.generateRandomSeed();
return res.json({ mneMonic });
} catch (err) {
console.log(err);
}
});
// TODO : 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
router.post("/newWallet", async (req, res) => {
let randomNum = Math.random().toString();
let password = req.body.password;
let mnemonic = req.body.mnemonic;
console.log("password", password);
console.log("mnemonic", mnemonic);
try {
lightwallet.keystore.createVault(
{
password: password,
seedPhrase: mnemonic,
salt: randomNum,
hdPathString: "m/0'/0'/0'",
},
function (err, ks) {
console.log("err", err);
console.log("ks", ks);
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
let address = ks.getAddresses().toString();
let keystore = ks.serialize();
console.log("address", address);
console.log("keystore", keystore);
fs.writeFile("wallet.json", keystore, function (err, data) {
if (err) {
res.status(400).json({ code: 999, message: "실패" });
} else {
res.status(200).json({ code: 1, message: "성공" });
}
});
});
}
);
} catch (exception) {
console.log("NewWallet", exception);
}
});
module.exports = router;
출처 : https://github.com/ConsenSys/eth-lightwallet#readme
GitHub - ConsenSys/eth-lightwallet: Lightweight JS Wallet for Node and the browser
Lightweight JS Wallet for Node and the browser . Contribute to ConsenSys/eth-lightwallet development by creating an account on GitHub.
github.com