니모닉 지갑 개발

강윤채·2022년 6월 10일
0

📒 개념 잡기

📌 니모닉이란?

  • 니모닉은 지갑을 복구할 때 사용되는 12개 혹은 24개의 랜덤한 영어 단어의 조합으로 이루어져 있다.
  • 니모닉은 디지털 서명에 사용되는 방식 중 비대칭 암호 방식에서 사용되는 공개 키(Public key), 비밀 키(Private key)에서 비밀 키를 사람이 쓰기 편하게 만든 것이다.

📒 개발 목표

  • 랜덤한 Mnemonic code를 생성
  • Mnemonic을 시드로 키스토어를 생성
  • Postman을 사용하여 결과 확인
  • fs모듈을 이용한 키스토어 로컬 저장

📒 개발

npm init를 이용해 기존 파일의 라이브러리를 다운 후 개발을 진행한다.

💡newMnemonic API 만들기

router.post('/newMnemonic', async(req,res) => {
  // mnemonic 변수 생성
  let mnemonic;
  try {
    //eth-lightwallet 모듈의 내장 함수를 이용해 RandomSeed를 생성하여 변수에 저장한다.
      mnemonic = lightwallet.keystore.generateRandomSeed();
      res.json({mnemonic});
  } catch(err) {
    //에러를 응답한다.
      console.log(err);
  }
});

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

npm start를 이용해 로컬서버를 실행시킨다.

  "scripts": {
    "start": "node ./app.js"
  },

위 코드에서 Post방식을 이용해 /newMnemonic으로 전송하므로,
엔드포인트를 http://localhost:3000/wallet/newMnemonic 로 설정하고 서버로 요청을 보낸다.

12개의 영단어로 이루어진 mnemonic코드가 잘 생성된 걸 볼 수 있다.

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

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

    try {
      //새로운 키스토어를 생성한다.
      /*
      keystore.createVault(options, callback)
      options
      암호: (필수) 직렬화 시 볼트를 암호화하는 데 사용되는 문자열입니다.
      seedPhrase: (필수) 모든 계정을 생성하는 데 사용되는 12단어 니모닉.
      salt: (선택 사항) 사용자는 볼트를 암호화 및 해독하는 데 사용되는 솔트를 제공할 수 있
      다.그렇지 않으면 임의의 솔트가 생성됩니다.
      hdPathString(필수): 사용자는 BIP39호환되는 HD 경로 문자열을 제공해야 합니다. 이전
      에 기본값은 m/0'/0'/0'BIP44 경로 문자열 m/44'/60'/0'/0입니다.
      */
      lightwallet.keystore.createVault(
        {//첫번째 인자(options)에는 password, seedPhrase, hdPathString을 담는다.
          password: password, 
          seedPhrase: mnemonic,
          hdPathString: "m/0'/0'/0'"
        },
        //두번째 인자(callback)에는 키스토어를 인자로 사용하는 함수를 만든다.
        function (err, ks) {
          /*
          keystore.keyFromPassword(password, callback)
          이 인스턴스 메소드는 내부적으로 구성된 솔트를 사용하여 적절한 pwDerivedKey.\
          사용자의 암호를 입력으로 Uint8Array사용하고 키 저장소를 암호화/복호화하는 데 사
          용되는 유형의 대칭 키를 생성합니다.
          */
          //첫번째 인자는 password, 두번째 인자는 callback함수로 pwDerivedKey를 인자로 사용하는 함수를 만든다. 
          ks.keyFromPassword(password, function (err, pwDerivedKey) {
            //새로운 주소 생성함수
            ks.generateNewAddress(pwDerivedKey, 1);
            //변수생성 및 할당
            let address = (ks.getAddresses()).toString();
            let keystore = ks.serialize();
			// json형식의 응답으로 전송
            res.json({ keystore: keystore, address: address });
          });
        }
      );
      //예외처리(에러)
    } catch (exception) { 
      console.log("NewWallet ==>>>> " + exception);
    }
});

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


엔드포인트는 http://localhost:3000/wallet/newWallet가 되고 password와 기존에 응답받은 mnemonic을 post방식으로 전송한다.

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

keyFromPassword의 콜백 함수에서 json 형식으로 응답 받았던 것을 응답 대신 fs.writefile을 사용하여 파일을 생성한다.
fs모듈은 Node.js 내장모듈로 사용하기 전 import 한다.

      function (err, ks) {
        ks.keyFromPassword(password, function (err, pwDerivedKey) {
          ks.generateNewAddress(pwDerivedKey, 1);

          let address = (ks.getAddresses()).toString();
          let keystore = ks.serialize();
		//fs 내장모듈 이용 첫번째 인자는 json형태의 파일 생성 두번째 인자 data에 들어갈 값으로 keystore를 넣어준다. 세번째 인자는 에러처리 함수를 넣어준다.
          fs.writeFile('wallet.json',keystore,function(err,data){
            if(err) {
                res.json({code:999,message:"실패"});
            } else {
                res.json({code:1,message:"성공"});
            }
          });
        });
      }

라우터 형식은 같기에 같은 엔드포인트로 전송 후 json파일이 생성되는지 확인한다.

wallet.json형식의 파일이 새로 생성된 것을 볼 수 있다.

json형식의 파일은 한줄로 표기되는데 가독성을 위해 정렬해 주었다.

📌 개발 회고

  • 한번 해보았던 작업인지라 지갑생성 자체는 그렇게 어렵게 느껴지지 않았으나, 블로깅을 함으로써 내가 아직 모르는 부분이 많구나라는걸 더 느끼게 되었고 코드에 사용된 모듈에 대해 더욱 자세히 찾아보게 된 계기가 되었다.
    또한, 지갑 생성 및 니모닉코드를 왜 사용하는지에 대해서도 다시 한번 복습할 수 있는 시간이었다.

git address : git@github.com:Yoonchae92/HA4_Test.git

0개의 댓글