article thumbnail image
Published 2022. 6. 10. 16:42

Mnmocic이란?

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

 

목표

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

 

개발순서

 

 

dir

. 디렉토리 구조
├── index.js (express 서버)
├── node_modules
├── package-lock.json
├── package.json
└──  routes
   └── wallet.js (wallet API)

 

서버생성 및 쿠키사용(소모되는 자원소모감소 시키기위함)

//index.js

const express = require('express');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const cors = require('cors');

const app = express();
const port = 3000;

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(
  cors({
    origin: ['http://localhost:3000'],
    methods: ['GET', 'POST'],
    credentials: true
  })
);

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


// 404 error catch
app.use((req, res, next) => {
  const err = new Error('Not Found');
  err['status'] = 404;
  next(err);
});

// error handler
app.use((err, req, res, next) => {
  res.status(err.status || 500);
  res.json({
      errors: {
          message: err.message,
      },
  });
});

app.listen(port, () => {
  console.log(`
  ################################################
  🛡️  Server listening on port: ${port} 🛡️
  http://localhost:${port}
  ################################################
  `);
});

module.exports = app;

eth-lightwallet API를 사용하기위한 파일 생성

const express = require('express');
const router = express.Router();
const lightWallet = require("eth-lightwallet");
const fs = require('fs');

router.post('/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;

fs 모듈을 이용하여 키스토어 로컬 저장하기

 

서버에 router연결하기위한 변수저장 및 사용

const walletRouter = require('./routes/wallet');

....
....

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

POSTMAN으로 테스트하기

 

나모닉키 생성

지갑생성

 Keep (장점, 유지할 점)

  • API를 활용해 어려운 과정을 한번에 할 수 있었다

 Problem (단점, 변경 또는 버릴 점)

  • 생성된 지갑 정보는 fs모듈을 통해 json 파일로 생성하여 충돌 위험

 Try (시도할 점, 앞으로의 행동)

  • 홈페이지에 지갑연결과정을 같이넣어 짜볼때 도움이 될것같다.

https://github.com/minwoogramer/mnemonic

복사했습니다!