Blockchain/Project
eth-lightwallet을 사용한 니모닉 지갑 개발
beeimp
2022. 6. 13. 02:01
니모닉 지갑
🔎 Goal
- eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 개발
- 랜덤한 니모닉 코드를 생성
- 니모닉을 시드로 키스토어를 생성
- Postman을 사용하여 결과 확인
- fs 모듈을 이용한 키스토어 로컬 저장
- Advanced - 파생된 주소 생성
💻 Implementation
Main Functions - express.js를 활용한 API
- POST - 랜덤한 니모닉 코드 생성
// lightwallet 모듈을 사용한 랜덤한 니모닉 코드 생성 API router.post('/newMnemonic', async (req, res) => { // 니모닉 변수 생성 let mnemonic; try { // mnemonic 변수에 lightwallet.keystore.generateRandomSeed()을 담아, mnemonic을 응답으로 전송 mnemonic = lightwallet.keystore.generateRandomSeed(); res.json({ mnemonic }); } catch (err) { // (에러) 에러를 응답합니다. console.log(err); } });
- POST - 니모닉 + 패스워드 = 키스토어 생성
// 니모닉 코드와 패스워드를 이용한 keystore와 address 생성 API router.post('/newWallet', async (req, res) => { // 요청에 포함된 니모딕, 패스워드 const { password, mnemonic } = req.body; try { // 키스토어 생성 lightwallet.keystore.createVault({ password: password, seedPhrase: mnemonic, hdPathString: "m/0'" }, (err, ks) => { // 파생키 생성 ks.keyFromPassword(password, (err, pwDerivedKey) => { // 새로운 주소 생성 ks.generateNewAddress(pwDerivedKey, ks.getAddresses().length); const address = ks.getAddresses().toString(); const keystore = ks.serialize(); // res.json({keystore: keystore, address: address}); fs.writeFile('wallet.json', keystore, (err, data) => { if (err) throw err; res.json({ code: 1, message: `지갑 생성!(${__dirname + '/wallet.json'})`, address: ks.getAddresses()[0] }); }) }) }) } catch (error) { console.error("NewWallet ==>>>>", error); } });
- POST - 파생된 주소 생성
// 패스워드와 생성된 월랫을 이용한 파생주소 생성 API router.post('/newSubWallet', async (req, res) => { const { password } = req.body; try { const wallet = require('../wallet.json'); const ks = lightwallet.keystore.deserialize(JSON.stringify(wallet)); ks.keyFromPassword(password, (err, pwDerivedKey) => { ks.generateNewAddress(pwDerivedKey, 1); const keystore = ks.serialize(); fs.writeFile('wallet.json', keystore, (err, data) => { if (err) throw err; res.json({ code: 1, message: `지갑 생성!(${__dirname + '/wallet.json'})`, address: ks.getAddresses()[ks.getAddresses().length - 1] }); }) }) } catch (error) { res.status(404).send(error); } })
💡 Keep (장점, 유지할 점)
- 매우 간단하게 임시 문자와 지갑의 패스워드를 넣어 니모닉 지갑 생성이 가능함
🔨 Problem (단점, 변경 또는 버릴 점)
- 생성된 지갑 정보는 fs모듈을 통해 json 파일로 생성하여 충돌 위험
🏊🏻♂️ Try (시도할 점, 앞으로의 행동)
- 파일 충돌 해결 → DB 연동을 통한 지갑 정보 관리