니모닉 지갑(Mnemonic Wallet)을 만들어보자

송승기·2022년 6월 13일
0
post-thumbnail

니모닉(Mnemonic)이란?

니모닉은 블록체인에서 지갑을 복구하기 위한 일반적인 단어들의 조합을 말한다. 보통 키를 생성하면 의미없는 숫자들이 나열되어 있다보니 그걸 기억하고 있기 어려운 반면, 니모닉은 외우기 어려운 정보를 의미있는 단어들의 나열을 통해 외우기 쉽도록 만드는 데 쓰인다.

니모닉은 개인키를 대신한다. 지갑을 다른 환경에서 불러올 때 쓰이며, 이걸 탈취당하면 지갑 내 자산을 모두 잃을 수 있으니 꼭 안전한 곳에 보관하는 것이 중요하다.

니모닉 지갑 개발

eth-lightwallet을 이용해 간단하게 니모닉 지갑을 개발하는 과정에 대해 설명하려 한다.

1. post 요청을 받으면 eth-lightwallet 모듈의 generateRandomSeed() 함수를 이용해 니모닉 코드를 생성!!

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

이더리움 자체 코드함수를 통해서 니모닉 코드를 생성한 다음, 변수에 저장한다.

2. 니모닉 코드와 패스워드를 이용해 newWallet API를 만들어준다.

post요청을 보낼 때 이전에 생성한 니모닉 코드와 설정할 패스워드를 파라미터로 보내 새로운 지갑을 생성!!

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

니모닉 코드와 비밀번호를 입력해주면 생성된 지갑 주소가 반환된다.

3. 생성된 keystore를 json 파일로 만들어 로컬 서버에 저장해준다.

fs 모듈의 writeFile 함수를 이용해 wallet.json이라는 이름의 파일을 생성하고 안에 keystore 값을 담아준다.

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:"성공"});
            }
          });
        });

wallet.json 파일이 생성되었다면 성공적으로 지갑을 만든 것이다. 안에 keystore 데이터가 담긴것을 확인할 수 있다.

{"encSeed":{"encStr":"QY8W7ihSJ6GHUpI8k1w9z3m8vGCRuKMvhhbsFoNP/vGnmvPRAMkH9wOZwX81lokfeTnVqkTq0ec5epulwVa6k++kgueEhEq0ioisYsoHy8uwYxQYO8Do9OVnh3938nOrQCZqVZ+nWZESdMgploUhTqbX0ucHAhcBTjTh5qLKZDCe66qHJpzUDA==","nonce":"dtekEkVe0yArBnxS2t0dVJ7XxqATay2u"},"encHdRootPriv":{"encStr":"GqnyhqR3Xm2oQdXfIbKcEn4/1ZYEfj5gThEqT3kVgCPco9cUwcVoElWmEqJwQ3eWF9m2Grc/FcYd0YjCGxmta0TWN9jZB1OWwXxLI1dYNi8/sHcs+IuinQvhOQZhl2qPCdUnROnMkAkss3gm4hM3NAAasaYdetFRmfqxgHFmzg==","nonce":"1nG2nRCEcl+B++PafBiIGcQC8lcMoVkx"},"addresses":["61f6a99fe3005e619f7fcba7908a56db793b7636"],"encPrivKeys":{"61f6a99fe3005e619f7fcba7908a56db793b7636":{"key":"uq7xrRibx65ji1fWB+1NM6VG4rObUg1M9SI8RgbGoPxRgKFERlHwbrybT/in/dqw","nonce":"Tg8VQk89Vp+Oxh0mxP3aGTaGm+CsOeS6"}},"hdPathString":"m/0'/0'/0'","salt":"50Jwxho3teHnPv8FPXRJ3sWXnKngGZgHfhIKMsZhub4=","hdIndex":1,"version":3}

Git

깃 주소 : Github Pages

회고

니모닉은 메타마스크 계정 만들 때 처음 접했었는데 이렇게 코딩을 짜보니 새로운 경험이었다. 니모닉 코드와 지갑이 어떻게 연동되는지, 어떤 식으로 코드를 짜야하는 지 알아보았다.
코딩은 직접 하는 것과 보는 것은 천지 차이라는 것. 직접 손으로 쳐보니 머릿 속에 더 많이 남는다.

0개의 댓글