Mnemonic Wallet

김경식·2022년 4월 6일
0
post-thumbnail

니모닉 지갑 개발이전에 니모닉(Mnemonic)에 대해 먼저 알아보자

What is a Mnemonic?

암호화폐 지갑은 비대칭키 암호 방식을 사용한다.
때문에 공개키와 개인키가 사용되는데, 이 개인키를 쓰기 편하게 만들어진 것이 니모닉이다.

니모닉은 12개의 단어를 순서대로 맞추는 것으로 니모닉 문자를 초기 설정 순서대로 맞추지 못하면 지갑을 열 수 없다.

More About Mnemonics

Developing Mnemonic Wallet

eth-lightwallet을 이용하여 간단한 니모닉 지갑을 개발해 보았다.
사용한 모듈에 대해 더 알고 싶다면 공식문서를 참고하자.
실제로 eth-lightwallet모듈을 사용한 코드에 대해서만 정리해보자.

Mnemonic API

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

/newMnemonic으로 post요청을 보내면 json 형태로 Mnemonic pharse를 응답한다.
generateRandomSeed()함수를 이용하여 니모닉 코드(Seed)를 랜덤하게 발행하고, 좀 더 보기 편하게 Mnemonic pharse로 변환했다.

newWallet API

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

응답받은 Mnemonic pharse를 이용하여 지갑을 개설한다.
/newWallet으로 post 요청을 보내면 key store파일을 로컬에 저장하고 address를 응답받게 된다.

key store로 만들기 위해 body에 password 와 mnemonic을 요청해야 하므로 passwordmnemonic변수를 만들어 값을 할당하고, createVault 함수를 사용하여 key store를 만든다.

createVault

  • 첫번째 인자로 요청할 password, mnemonic, option 을 객체로 묶어 값을 주어야한다.
    option의 경우 hdPathString 값을 주어야하는데 디폴트 값 "m/0'/0'/0'"을 주었다. (option에 대해서 더 알고 싶다면 공식문서를 참고하자)
  • 두번째 인자(callback)에는 key store를 인자로 사용하는 함수를 만든다. 만든 함수에는 첫번째 인자로 error를, 두번째 인자로는 createVault 함수에서 만든 key store를 받는다.

  • 받은 key store를 이용하여 keyFromPassword함수를 이용, 새로운 주소를 받는다.

Using Postman

Postman을 이용하여 key store와 address의 응답테스트를 진행해보자.

서버를 실행시키고 Postman에서 POST를 선택하고 http://localhost:3000/wallet/newMnemonic를 입력 후 SEND를 눌러 서버로 요청을 보내면 니모닉 코드를 응답받을 수 있다.

응답받은 니모닉코드를 mnemonic이라는 키값으로, password에는 원하는 임의의 값으로 입력 후 http://localhost:3000/wallet/newWallet 엔드포인트로 SEND를 눌러 요청을 보낸다.

개발회고

eth-lightwallet 모듈을 사용하여 지갑을 직접 개발해 보았다.
공식문서를 참고하여 함수의 사용법과 동작원리를 이해하고 개발을 하니 큰 어려움없이 진행할 수 있었던거 같다.
공식문서가 영어로 되어있어 보기 힘들고, 때론 보기 싫어 자주 참고하는 편은 아니었다.
이번 개발을 진행하면서 공식문서의 중요성을 알게 되었고, 앞으로도 공식문서를 참고하면서 개발 능력을 키워나가야겠다.

코드공유(Github)

썸네일 이미지 출처

bytecoin.org

0개의 댓글