Mnemonic Wallet 개발

HY·2022년 6월 9일
2

research

목록 보기
2/4
post-thumbnail

개념

니모닉(Mnemonic)은 암호화폐 지갑을 복구하기 위해 사용하는 랜덤 단어 12 개이다.
개인 키가 사람이 기억하기엔 너무 복잡하게 구성되어있기 때문에 이를 쉽게 입력하기 위해 개발되었다.
니모닉 코드 단어는 지갑을 파생하기 위한 시드로 사용되는 단어 시퀀스이다.

구현 기능

  • 니모닉 코드 생성 요청이 들어오면 랜덤한 니모닉 코드를 생성해 리턴한다.
  • 지갑 생성 요청이 들어오면 파라미터로 받은 니모닉 코드를 사용해 지갑을 생성하고 저장한다.

개발

repository: https://github.com/haejeonghy/mnemonic-wallet

. 디렉토리 구조
├── index.js (express 서버)
├── node_modules
├── package-lock.json
├── package.json
└──  routes
   └── wallet.js (wallet API) 
  1. 개발에 사용될 리포지토리를 생성한다.
mkdir ha-mnemonic-wallet
❯ cd ha-mnemonic-wallet/
❯ npm init
  1. 개발에 필요한 패키지를 설치한다.
    eth-lightwallet : 로컬 이더리움 노드를 실행하지 않아도 이더리움 dapp을 실행할 수 있도록 브라우저에 암호화된 개인 키를 저장할 수 있는 HD 지갑 관련 패키지
npm i express
❯ npm i eth-lightwallet 
  1. API 서버를 생성한다.
// wallet.js
const express = require('express');
const app = express();
const cors = require('cors');
const port = 3000;

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cors());

app.get('/', function(req, res, next) {
    res.status(200).send({"message": "Mnemonic server is running..."});
});

app.listen(port, () => {
    console.log(`Server listening on port: ${port} ...`);
});
  
module.exports = app;
  1. 서버를 실행하고 정상적으로 작동하는지 확인한다.
❯ node index.js
Server listening on port: 3000 ...
curl localhost:3000
{"message":"Mnemonic server is running..."}%
  1. 지갑 API를 제공할 라우터를 생성한다
const express = require('express');
const router = express.Router();
const lightWallet = require("eth-lightwallet");
const fs = require('fs');

router.get('/newMnemonic', async(req, res) => {
    let mnemonic;
    try {
        mnemonic = lightWallet.keystore.generateRandomSeed()
        res.json({mnemonic})
    } catch (err) {
        console.log(err);
    }
})

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 keystore = ks.serialize();
                        fs.writeFile('wallet.json', keystore, 
                            function(err, data) {
                                if(err) {
                                    res.json({code:999, message:'error'})
                                } else {
                                    res.send(200)
                                }
                            }
                        )
                    }
                )
            }
        )
    } catch (exception) {
        console.log('Exception ' + exception)
    }
})

module.exports = router;
  1. index.js 에 라우터를 추가한다.
const walletRouter = require('./routes/wallet');
app.use('/wallet', walletRouter);
  1. postman으로 테스트한다.


회고

사용이 편리한 패키지가 있어 개발이 어렵지 않았다.
다만 지갑을 개발하는 코드에서 함수가 중첩되어 명확히 보기 어렵다.
지갑 개발에 관련하여 기능을 추가로 개발하게 된다면 중복되는 항목을 분리해야 할 것 같다.

참고 문헌

http://wiki.hash.kr/index.php/%EB%8B%88%EB%AA%A8%EB%8B%89
https://www.npmjs.com/package/eth-lightwallet

profile
사실은 공부를 비밀스럽게 하고 싶었다

1개의 댓글

comment-user-thumbnail
2022년 6월 9일

good👍🏻

답글 달기