니모닉 지갑을 만들어보자

박세규·2022년 6월 9일
1

니모닉(mnemonic) 이란?

블록체인에서 니모닉(Mnemonic)은 지갑을 복구하기 위해 일반적인 단어들의 조합을 나열하는 것을 뜻합니다. METAMASK를 사용해 보았다면 계정을 만들때 주어진 단어들을 순서에 맞게 넣어 봤을 것입니다. 이런 디지털 서명의 방식을 니모닉이라고 합니다.

니모닉 키 얻기 newMnemonic API 만들기

현재 이미 개발이 되어있는 eth-lightwallet 모듈 사용 하여 간단하게 니모닉 키를 얻어 실습해 볼 수 있습니다.

수도 코드

mnemonic 변수를 만들고 변수에 lightwallet.keystore.generateRandomSeed() 함수를 사용해 랜덤 문구를 할당하여 응답으로 전송합니다.

Reference code

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

Postman을 사용하여 니모닉코드 확인하기

수도 코드

로컬 서버를 실행 시킨 후 http://localhost:3000/wallet/newMnemonic post 요청 하면 다음과 같이 mnemonic 변수에 랜덤한 문구가 들어가 있는 것을 확인 할 수 있습니다.

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

수도코드

password 와 mnemonic을 입력값으로, 서버에 요청을 합니다.
lightwallet.keystore.createVault를 사용하여 키스토어를 생성합니다.
첫번째 인자에는 password, seedPhrase, hdPathString을 담습니다.
두번째 인자에는 키스토어를 인자로 사용하는 함수를 만듭니다.
eth-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장 함수를 사용합니다.
첫번째 인자에는 password, 두번째 인자(callback)에는 pwDerivedKey두번째 콜백함수가 실행되면, eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, [num])을 이용해 새로운 주소 생성 함수를 실행합니다.를 인자로 사용하는 함수를 만듭니다.
address 변수를 만들고, keystore.getAddresses()을 문자열로 할당합니다.
eystore 변수를 만들고, keystore.serialize()을 할당합니다.
위에서 만들어준 변수를 응답으로 전송합니다.

Reference code

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

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

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

수도 코드

로컬 서버를 실행 후 http://localhost:3000/wallet/newWallet 으로 mnewmonic 값과 원하는 password를 JSON형식으로 post요청을 합니다.

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

수도 코드

첫번째 인자에는 .json 형식의 파일 이름을, 두번째 인자에는 keystore를 입력합니다.
세번째 인자에는 콜백 함수를 입력합니다.

Reference code

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

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

Postman으로 로컬에 키스토어 파일이 생기는지 확인

result

{"encSeed":{"encStr":"JzXvu/nKwzSUc4bc8UYjQAG3kkYHiNZNV3WtHSSRguOuY48NYLgvp/T766gbRx4FQW7CxZj54pwuaCK/5Z0FRbRmcNJWPGXf5SZ1OJq2Dfv5du6XfuDIZ7xfr8jpLFRSHPM9iL0YTrsq/ZmmMGcDNZ5fSL4iAkkBqlii8zkIJ9abZqLM9pGOwA==","nonce":"TlYRl6F0v/QVOzOPvFmLEUY0ZS1Dm9qe"},"encHdRootPriv":{"encStr":"VhemZpwOB4ZUTgrPCXytIV44ydIpYZevrCtq5HeiaEdhg1OxSYNJ59YTKfct62G7W7vxKNGTvoWGl0zMiPJiCCXoUNDPj72XNbSx8IL/hvoq+1fsNekCnkFDrQSeEVjxdiTI2gzJaovlqfMLq6ptQjkiucEliEvWFnt09mNKRw==","nonce":"ZKDc/evNpwX5p7NYqx/U9dKio2s9xT6U"},"addresses":["bc6dbf4f92907e16408a18eb4268a1d2a723373d"],"encPrivKeys":{"bc6dbf4f92907e16408a18eb4268a1d2a723373d":{"key":"UlvVdlYxgU8buUccVyGnxJlAJi899vRvpaB9gWq3WUt3mAGHcySxT5yamVMVwIkT","nonce":"9ZCK5Z5Sw0yxkKuOWPQUE6XOfu7E+4sE"}},"hdPathString":"m/0'/0'/0'","salt":"qxAcXL8yC5k0yQBej28oa/RVPkhJTCvACZJam7Jskbw=","hdIndex":1,"version":3}

이상으로 니모닉(Mnimonic) 지갑 실습을 마치겠습니다

profile
실력있는 블록체인 개발자가 되자

0개의 댓글