니모닉(Mnemonic)은 암호화폐 지갑을 복구하기 위해 사용하는 랜덤 단어 12 개이다.
개인 키가 사람이 기억하기엔 너무 복잡하게 구성되어있기 때문에 이를 쉽게 입력하기 위해 개발되었다.
니모닉 코드 단어는 지갑을 파생하기 위한 시드로 사용되는 단어 시퀀스이다.
repository: https://github.com/haejeonghy/mnemonic-wallet
. 디렉토리 구조
├── index.js (express 서버)
├── node_modules
├── package-lock.json
├── package.json
└── routes
└── wallet.js (wallet API)
❯ mkdir ha-mnemonic-wallet
❯ cd ha-mnemonic-wallet/
❯ npm init
eth-lightwallet
: 로컬 이더리움 노드를 실행하지 않아도 이더리움 dapp을 실행할 수 있도록 브라우저에 암호화된 개인 키를 저장할 수 있는 HD 지갑 관련 패키지❯ npm i express
❯ npm i eth-lightwallet
// 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;
❯ node index.js
Server listening on port: 3000 ...
❯ curl localhost:3000
{"message":"Mnemonic server is running..."}%
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;
index.js
에 라우터를 추가한다.const walletRouter = require('./routes/wallet');
app.use('/wallet', walletRouter);
사용이 편리한 패키지가 있어 개발이 어렵지 않았다.
다만 지갑을 개발하는 코드에서 함수가 중첩되어 명확히 보기 어렵다.
지갑 개발에 관련하여 기능을 추가로 개발하게 된다면 중복되는 항목을 분리해야 할 것 같다.
http://wiki.hash.kr/index.php/%EB%8B%88%EB%AA%A8%EB%8B%89
https://www.npmjs.com/package/eth-lightwallet
good👍🏻