관리 메뉴

평행우주 : world 1

[실습 | 블록체인] Mnemonic Wallet 개발하기 본문

텃밭 1 : BlockChain/Solidity

[실습 | 블록체인] Mnemonic Wallet 개발하기

parallelworlds 2022. 3. 17. 16:48

 

 

학습목표 : Mnemonic Wallet 개발하기

eth-lightwallet 모듈을 이용하여 간단한 Mnemonic Wallet을 개발하고, Postman을 사용하여 API 테스트 하기

 

  • eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 개발
    • 랜덤한 니모닉 코드를 생성
    • 니모닉을 시드로 키스토어를 생성
  • Postman을 사용하여 결과 확인
  • fs 모듈을 이용한 키스토어 로컬 저장

Advanced Challenges


newMnemonic API 만들기

code

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


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);
  }
});


module.exports = router;

Postman으로 테스트하여 니모닉코드 얻기

로컬 서버를 실행시키고, 엔드포인트를 정확히 입력.

  • http://localhost:3000/wallet/newMnemonic
  • Postman에서 정확한 method POST 를 입력했다면, send를 눌러 서버로 요청

 

 

 

send를 누를 때 마다, 니모닉은 바뀐다


mnemonic code와 password를 이용해 newWallet API 만들기

 

code

//password 와 mnemonic 을 입력값으로, 서버에 요청
router.post('/newWallet', async(req, res) => {
    let password = req.body.password
    let mnemonic = req.body.mnemonic;

    try {
//lightwallet.keystore.createVault를 사용하여 키스토어를 생성
      lightwallet.keystore.createVault(
        {
          password: password, 
          seedPhrase: mnemonic,
          hdPathString: "m/0'/0'/0'"
        }, 
//두번째 인자(callback)에는 키스토어를 인자로 사용하는 함수 생성
        function (err, ks) {
//인자에는 password, 두번째 인자(callback)에는 pwDerivedKey를 인자로 사용하는 함수 생성
          ks.keyFromPassword(password, function (err, pwDerivedKey) {
 //두번째 콜백함수가 실행되면, eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, 
 //[num])을 이용해 새로운 주소 생성 함수를 실행, 두 번째 인자인 숫자는 생성할 주소의 개수
            ks.generateNewAddress(pwDerivedKey, 1);
            
            let address = (ks.getAddresses()).toString();
            let keystore = ks.serialize();

            res.json({ keystore: keystore, address: address });
          });
        }
      );
    } catch (exception) { 
      console.log("NewWallet ==>>>> " + exception);
    }
});

Postman을 이용해 keystore와 address의 응답 API 테스트

  • 로컬 서버를 실행시키고, 엔드포인트를 정확히 입력.
    • http://localhost:3000/wallet/newWallet 
  • Postman에서 정확한 method POST 를 입력했다면, send를 눌러 서버로 요청
  • 위에서 얻은 니모닉 코드를 mnemonic이라는 키의 값으로, password에는 원하는 비밀번호를 입력 후 send 

 


생성된 keystore를 json 파일로 만들어 로컬 서버에 저장하기

 code

var express = require('express');
var router = express.Router();
const lightwallet = require("eth-lightwallet");
//wallet/index.js 파일에 fs 모듈을 import 
const fs = require('fs');

// TODO : lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
router.post('/newMnemonic', async(req,res) => {
    let mnemonic;
try {
    mnemonic = lightwallet.keystore.generateRandomSeed();
    res.json({mnemonic});
} catch(err) {
    console.log(err);
}
});


// TODO : 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
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 address = (ks.getAddresses()).toString();
          let keystore = ks.serialize();
// keyFromPassword의 콜백 함수에서, 응답대신 fs.writeFile 또는 fs.writeFileSync 를 사용
//첫번째 인자에는 .json 형식의 파일이름, 두번째 인자에는 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;

 


 Postman을 실행하여, 로컬에 키스토어 파일이 생기는지 확인하기

 

 

Reference keystore file(wallet.json)

{"encSeed":{"encStr":"low95I8NyboOjPWnjBqLqh2EHWMEWKFr4ugGWtHR9MyFPLMIwepIaCmnvQZbueQDVS8c+xzrXLIihqiK9/6/DoZu5u+Xwhs0is6U1PRUgEVJ9wlHCX54+TCQkrAEgsmNZw5W0tCacvBtAksXpTfzvlGSRNJDrXVZiQGo89Tf08xs1V7SUqvfkw==","nonce":"9d+yJS2zQrLkKdXkMF4z94YszobP6xKb"},"encHdRootPriv":{"encStr":"EzldevsVjLxCbgniR0l2cYgfiFs7jCO+n+y4FEX3V3buBApszXtvPyxuOKaRR+phWSdTWBvJ4UBjJbbF72zMMTPUViPecpxx1JBRZhht4jLggwQ5hb0gh77AFJ7N6PVi/osSF+YRzt/STokMgooaLB4Iaxtwa8K5/KND67aI/w==","nonce":"t6sAKrEgkZqvWPVWgpdnb+1fVnQU8MFg"},"addresses":["b48f0dac43b8a1bda5595d5bb2d46ba6b3b6cede"],"encPrivKeys":{"b48f0dac43b8a1bda5595d5bb2d46ba6b3b6cede":{"key":"t5ua+ZqO7A4it17rfFr66uNY4MT2Rwz4+UzGdkGsHFdXGC5mIVvD3GzAXvNblJlc","nonce":"PIsnwUkT/rvVNBr5tO1RAIxYBamvaOV5"}},"hdPathString":"m/0'/0'/0'","salt":"TABp5NmjYF1GoCfN6BgW7e85iOsVXFfsMlz5HOEPeAc=","hdIndex":1,"version":3}
Comments