BlockChain/이더리움

니모닉(Mnemonic) 지갑 개발

정신이 많이없는 개발자 2021. 12. 10. 11:04
728x90
반응형
♨항상 글 마지막에 질문을 남기는데 혼자서 고민해보고 답하는 시간을 가져봅시다!
항상 저 같은 ㅃㄷㄱㄹ를 위해서 자세하고 쉽게 설명을 하도록 노력하겠습니다.
*욕은 사절 비판은 환영*

▶ 니모닉이란?

 

니모닉 - 해시넷

니모닉(Mnemonic)이란 지갑을 복구하기 위한 12개의 단어이다. 개인 키가 너무 복잡한 단어들로 구성되어 있기 때문에, 이를 쉽게 입력할 수 있도록 갖춰진 형식이다. 니모닉의 어원은 그리스 신화

wiki.hash.kr

  - 블록체인에서 니모닉(Mnemonic)은 지갑을 복구하기 위한 일반적인 단어들의 조합을 뜻함!

  - 숫자의 나열처럼 직관적인 관계가 없어 외우기 어려운 정보에 대한

ex )9ce2aedc1cd8ab1a4acd4d753b0da1941a13707845ab4db9e1ccfb1da1176956) 

   어려운 정보에 다른 정보를 연결하여 외우기 쉽게 함!!

메타마스크 니모닉


니모닉이 필요한 이유?

더보기
더보기

 암호화폐 지갑은 비대칭키 암호화 방식(공개키, 개인키)을 사용함!

* 비대칭키 암호화 방식 및 공개키, 개인키를 찾아보는 것을 추천드립니다. 여기서는 간단하게 

  공개키 - 계좌번호 

  비밀키 - 비밀번호 (9ce2aedc1cd8ab1a4acd4d753b0da1941a13707845ab4db9e1ccfb1da1176956) 

   질문 - 지금 위에 보이는 비밀키를 우리가 평소에 외우고 다닐 수 있을까요?? 

  결국 우리가 편하게 비밀키를 사용하기 위해서 만들어진 것이 니모닉임

  니모닉 생성 

더보기
더보기

-  니모닉은 순서대로 맞춰진 단어가 암호화된 보안 비밀번호 방식 

   *주의사항 ( 문자 배열을 초기대로 하지 못하면 어느 누구도 지갑을 열 수 없습니다.

   ex) 위에 메타 마스크 니모닉 참조 초기 boil brass chicken..... 이렇게 설정했다면 

         이 단어의 나열 순서(boil brass chicken ...)를 기억해야 함!

 메타 마스크 지갑을 만들 때 영단어 그룹을 사용하여 고유의 지갑 문구를 생성하며, 이 지갑 문구가 니모임!

-  니모닉은 12개 또는 24개의 랜덤 한 영어 단어로 이루어져 있음.

-  일반적인 단어로 표현되는 니모닉 코드는 암호화폐 지갑 사용자가 난해한 기술에 대한 이해 없이도 지갑을 편리하게 사용할 수 있음!

 


♨ 니모닉 지갑 개발 Start!!!

   개발에 사용된 tool 정리 

    -개발 tool : vscode 

    - 사용 언어 : JS

    - get/post 사용  : postman

    - 코드 저장  - https://github.com/ms3221/MnemonicWallet-/tree/main

   - 지갑 생성 모듈 = eth-lightWallet모듈

 

GitHub - ConsenSys/eth-lightwallet: Lightweight JS Wallet for Node and the browser

Lightweight JS Wallet for Node and the browser . Contribute to ConsenSys/eth-lightwallet development by creating an account on GitHub.

github.com

 

<전체 코드>  

  *밑에 순서대로 작성해놨으니 차례대로 진행 후에 전체 코드를 복사해 가면 좋을 것 같다!*↓

더보기
더보기

 

const express = require('express');
const app = express();
const fs = require('fs')
const lightwallet = require("eth-lightwallet");
const port = 8889;

app.use(express.json());
app.use(express.urlencoded({ extended: false }));



app.listen(port,()=>{
    console.log(port+' 운행중 이여라~~');
})


//lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
app.post('/newMnemonic', async(req,res) => {
  
    let mnemonic;
    try{
        mnemonic = lightwallet.keystore.generateRandomSeed();   //지갑의 12단어의 seed구문을 생성시켜주는 이더리움 자체 코드 함수 
        res.json({mnemonic})
    }catch(err){
        console.log(err);
    }
 
 });



// 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
app.post('/newWallet', async(req, res) => {
    
    
    
   let password = req.body.password;
    let mnemonic = req.body.mnemonic;
 
    console.log(password);
    console.log(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);
    }
 
 });

 * 나와 같은 초보자들은 그냥 순서대로 따라오시면 실습을 진행할 수 있습니다. 

 *그대로 따라 해라*

1. vscode를 켠다 

2. 폴더를 만든다 나 같은 경우는 wallet라는 폴더를 만들었다.

3. 만든 폴더에서 터미널을 켠다(나는 mac를 사용한다).

터미널 위치가 현재 폴더에 위치해 있어야함.

4. npm init (enter갈기면 알아서 init 된다.) -> npm install express (express 다운로드한다) -> npm i(나는 귀찮으니까 install 대신 i 를 쓴다. i === install 이다.) ->  npm i eth-lightwallet  여기까지 설치를 해주면 일단 세팅은 끝이 난다.  

*설치가 제대로 확인하고 싶다?

package-json click!! 해라잉!!

 

이렇게 보이면 제대로 설치된거다.

   5.  다음 index.js를 만들어서 밑에 그림처럼 작성을 해주라. 

     - 여기서 require  === import 와 같다고 생각하시오!!

  6. 선언된 변수 lightwallet를 이용해서 12개 영단어 니모닉을 생성시키는 함수를 작성해 봅시다. 

더보기
더보기

   

//lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
app.post('/newMnemonic', async(req,res) => {  
  
    let mnemonic;
    try{
        mnemonic = lightwallet.keystore.generateRandomSeed();   //지갑의 12단어의 seed구문을 생성시켜주는 이더리움 자체 코드 함수 
        res.json({mnemonic})
    }catch(err){
        console.log(err);
    }
 
 });
   
위와 같은 코드를 작성하면 이더리운 lightwallet 모듈에 있는 generateRandomSeed() 함수를 사용해서 12개 영단어 니모닉을 발생시킬 수 있습니다.
 

 

7. 위에 선언된 함수를 사용하기 위해서 postman에 접속한 후에 나의 워크스페이스에서 

  method - post, 그리고 localhost:8889/newMnemonic 를 작성한 후  send버튼 누르기!! 

   ** 초보자들을 위해서 잠시 설명한다 초보자가 아니라면 볼 필요가 없다. 

더보기
더보기

     지금 method 가 무엇인지 localhost:8889/newMnemonics 이 무엇인지 모르는 사람들이 있을 수 있다.

     일단 전체적인 실습이 중요하기 때문에 간단하게만 알고 가자. 

     그냥 영어 그대로 방법 중에서 post get 등등이 있는데 그중에서 post방식을 선택한것이다. 너가 작성한 코드중에  

     app.post()이 작성된 코드가 method post를 쓰겠다라고 말한것이다. 

     그리고 app.post('/newMnemonic') 즉 포스트에 기본 local서버에 / newMnonic라는 주소로 접속하면 이 app.post()이 함     수가 실행된다 이렇게 간단하게 생각하고 넘어가자 

   만약 보고있는 분들이 더 알고 싶다면 node에 express, app, rest 등등을 구글에 쳐보면 아주 잘나온다!! 

   ** 마지막 8889 이 게 먼지 모르겠다면 알지말고 그냥 너가 작성한 코드중에 port봐봐라 그러면 거기에 8889라고 작성되어있         다.  다른 번호 쓰고 싶으면 너가 맘대로 해서 되는지 확인해 보면 이해가 더 잘될 것이다. 

 

postman을 사용해서 니모닉 코드 얻기

8.  선언된 변수 lightwallet를 이용해서 keystore파일을 생성해 봅시다.

더보기
더보기
app.post('/newWallet', async(req, res) => {
    
   let password = req.body.password;
    let mnemonic = req.body.mnemonic;
 
    console.log(password);
    console.log(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);
    }
 
 });

우리는 12개 영어단어인 mnemonic와 password를 통해 keystore를 생성하고 이 keystore(wallet)를 통해 이더리움에 tx를 생성!! 

 

postman을 이용해서 ketystore파일 생성

이렇게 wallet address와 keystore를 반환해줍니다. (keystore 파일 내부들여다 보면 나와있다. address / privatekey 등!)

 

** 여기서 keystorefile과 동시에 keystore.json형식으로 파일을 만들어 보고 싶으신 분들은 혼자서 도전해 보시고 안되면 밑에 코드를 훔쳐보시길 바랍니다!

더보기
더보기
app.post('/newWallet', async(req, res) => {
    
    
    
   let password = req.body.password;
    let mnemonic = req.body.mnemonic;
 
    console.log(password);
    console.log(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);
    }
 
 });

* 주의사항 : 맨위에  const fs = require('fs'); 한줄을 추가해주셔야합니다. 

 file 입출력시 사용하는 파일로써 한번 찾아보시고 사용하시면 공부하시는데 충분한 도움이 될 거라고 생각합니다.

 

 


총 정리 

목표 : 이더리움 lightwallet 을 이용해서 지갑을 생성해보기.

 - keep : 만들어진 모듈을 가져와서 내가 필요한 부분에 적용시킬 때 천천히 하나씩 뜯어가면서 코드를 작성하면 일단 생성되는 순서를 생각 해 볼 수 있었다. 모듈이 가진 모든 함수를 작성하지는 않았지만 지금 당장 필요한 함수가 어떻게 작동하는지 검색해보고 공식 doc를 확인하는 것은 내 코드로 만드는데 있어서 중요한 방식인 것 같다. 

 

 - problem :  여럭가지함수들이 있지만 아직 정확하게 내가 무엇을 사용해야하는지 어려움이있다. 지금의 단계는 하나하나의 이해보다는 코드 작성 방법 및 방식에 대해서 조금 더 초점을 맞춘 경향이 있다. 

 

 - Try  :  모듈을 사용하기 전에 공식문서와 그리고 그바탕으로 된 예제를 이해할 수 있게 노력할 것이다. 그리고 지금 만든 지갑을 바탕으로

Tx를 이더리움 테스트넷에 올리고 그 지갑으로 erc20을 사용하여 코인을 배포후 전송하는 것 까지 web3와 연결해서 진행 해 볼 생각이다. 기능은 없지만 전체적으로 간략하게 돌려본 후에 흐름을 잡고 세세한 부분들은 추가하는 방식으로 공부를 할 예정이다.

 

반응형