본문 바로가기

[BLOCKCHAIN]

Mnemonic Wallet - 개발

 

eth-lightwallet 모듈을 이용하여 간단한 Mnemonic Wallet을 개발해보고, Postman을 이용하여 API 테스트를 해보고자 한다.

 

먼저 사용할 Lightwallet에 알아보자.

깃허브링크 : https://github.com/ConsenSys/eth-lightwallet

 

LightWallet은 이더리움 노드를 실행하지 않는 경우에도 이더리움 Dapp을 실행할 수 있도록 암호화된 키를 저장할 수 있는 HD wallet이다. 

 

1. 설치

npm install eth-lightwallet

2. eth-lightwallet 의 내장되어있는 keystore 함수를 사용하여 개발

keystore.generateRandomSeed()

먼저, 임의의 12개의 단어 시드로 구성된 문자열을 생성하고 반환

mnemonic 변수 생성 후,

mnemonic 변수에 lightwallet.keystore.generateRandomSeed() 를 담아, mnemoic을 응답으로 전송

 

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

3.mnemonic 코드와 password를 이용해 newWallet API 만들기

 

 

password와 mnemonic을 입력값으로, 서버에 요청을 보내기

  • password 와 mnemonic 변수를 생성
  • 요청에 포함되어 있는 password와 mnemonic을 각 변수에 할당

keystore.createVault(options, callback)

새로운 월렛 키스토어를 생성하기 위한 인터페이스 함수를 사용하여 키스토어 생성

Options

  • password (필수) 
  • seedPhrase (필수)
  • salt (선택사항)
  • hdPathString (필수) 사용자는 BIP39에 호환되는 HD 경로 문자열을 제공해야함

기본값은 m/0'/0'/0'  BIP44 에서는 m/44'/60'/0'/0 이다.

  • 첫번째인자 (options)에는 password, seedPhrase, hdPathString
  • 두번째인자 (callback)에는 키스토어를 인자로 사용하는 함수를 생성
  • 콜백함수에는 eth-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장 함수를 사용
  • 첫번째인자에는 (password), 두번째인자 (callback) 에는 pwDerivedKey를 인자로 사용하는 함수를 만듬
  • 두번째 콜백 함수가 실행되면  eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, [num])을 사용하여 새로운 주소 생성 함수를 실행
  • address 변수를 만들고, keystore.getAddresses() 를 문자열로 할당
  • keystore 변수를 만들고, keystore.serialize() 를 할당
  • 위에서 만든 변수를 응답으로 전송 및 테스트
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);
    }
});

니모닉코드와 패스워드를 전송하여, 키스토어와 어드레스를 응답받음

 

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

Node.js에 내장 모듈인 fs 모듈을 이용하여 응답 대신 fs.writeFile을 사용하여 로컬 서버에 json 파일을 저장

res.json({ keystore: keystore, address: address });

대신

fs.writeFile('wallet.json',keystore,function(err,data){
            if(err) {
                res.json({code:999,message:"failed"});
            } else {
                res.json({code:1,message:"sucsess"});
            }
          });

으로 바꿔준다.

 

fs.writeFile의 첫번째 인자는 .json 형식의 파일이름, 두번째 인자에는 keystore, 세번째 인자에는 응답에 대한 콜백함수를 입력 해준다. 로컬 서버에 json파일을 저장하기 때문에 응답으로는 성공 또는 실패 메세지만 전송한다.

 

이전과 같은 방법으로 니모닉 코드와 패스워드를 newWallet으로 전송해본다

 

성공했다는 메세지를 응답받고, 로컬 서버의 경로에 파일이 생기는 것을 확인할 수 있다.

기존에 응답받던 키스토어 내용들이 들어가있는 것도 확인

wallet.json

{"encSeed":{"encStr":"YjPbk2KSrAczo+diulmvoDCtD61i/nuoD89pkNvGU1IYdOHTGM2jAjfKUSUu+m0exdpUWP7V68WMYVAmt5M2XLTjaK+arbTdEMFDDHQPsTMnf3EYFn84VPvgzvvcfvFKr9kqGJWbRNwtVBRsTcT/KnhGvydSdanYyMdRHxKp0NGuUdwjfi8zvw==","nonce":"YWc7Jv5b0e95aST75zGR9S9I0mW81kXC"},"encHdRootPriv":{"encStr":"07Jv67Pr+DhATrf7KH0dRdcjSfl+iPmb+WH/A2nQ8+2/4xe28Sj2YN8k3z9g6RoVnlLgZdKbS9LTj/Np86hgpmwFHzehV8s2nYYdcMJG7MUO7jOaTaqrWuw08PQCN1uh7jMBzw/Iku5ZaxKuOyoyR2YdwPF+87f1Pfj3QkD9zQ==","nonce":"tHcLtW9CbrzYws1pjv1XjZ/8bi51+WyV"},"addresses":["ccf1821ee305daa3dccf91f40c3e9b158594e6e9"],"encPrivKeys":{"ccf1821ee305daa3dccf91f40c3e9b158594e6e9":{"key":"HmngIj3BWza9K+LMuvtjG13fbD2sAaFBlPwg+cVaneyvzwLBq5S5GM3oZpvY6+ml","nonce":"Lswp3lToebhrh8XGpNF6tmxB1doI4sdO"}},"hdPathString":"m/0'/0'/0'","salt":"KLl9IFtFkQJn+IXF/WOr+S5Tg6EHwQxsw+d3mEDAt2A=","hdIndex":1,"version":3}

 

 

깃허브 링크 : https://github.com/BABOAIO/MnemonicWallet

 

GitHub - BABOAIO/MnemonicWallet

Contribute to BABOAIO/MnemonicWallet development by creating an account on GitHub.

github.com

 

 

개발 회고

 

지갑을 만들면서 eth-lightwallet 모듈을 사용, 내장함수들이 어떻게 구동되는지 알수 있었다.

 

이후엔 메타마스크 혹은 카이카스 클론코딩을 통하여 실제로 적용까지해보는 실습을 해봐야겠다.

'[BLOCKCHAIN]' 카테고리의 다른 글

solidity 패턴 분석 - Guard Check  (0) 2022.06.04
Opensea 클론코딩  (0) 2022.02.19
Truffle을 이용한 ERC-721 개발  (0) 2022.02.09
Mnemonic Wallet - 개발이론  (0) 2022.02.08
블록체인과 암호화폐  (1) 2021.12.30