본문 바로가기

이더리움

이더리움 simple wallet 만들기 (1)

안녕하세요.

 

처음 이더리움을 접하고 관련 Dapp를 만들때가 2~3년전이였는데 그 당시에는 정말로 레퍼런스가 많이 부족해서 간단한 Dapp하나 만드는것도 몇일씩 걸리고 했었는데 요즘은 다양한 블로그에서 많이들 포스팅을 해주셔서 진입장벽이 많이 낮아졌죠.



이번 포스팅에선 eth-lightwallet, web3 모듈을 사용해 간단하게 이더리움 월렛을 만들어 보려고 합니다.

 

1. mnemonic코드(임의의 영문 12개 단어) 생성

2. mnemonic코드와 password를 사용해서 keystore만들고 관리하기

3. keystore를 사용해 tx에 서명을하고 , tx를 생성하여 이더리움블록체인에 배포하기 (코인보내기)

4. mnemonic코드 복구, 내 keystore복구등등 다양한 기능 테스트

 

vscode를 사용해 서버는 nodejs express, 프론트는 react를 사용해 진행 하려 합니다. 

postman사용법, express, react 문법에 대한 설명은 드리지 않아요. (hooks,redux-saga등 최신 리액트 문법을 사용합니다)


 

먼저 express-generator을 사용해 express빈 프로젝트를 생성한후 npm이나 yarn을 사용해서 eth-lightwallet 모듈을 설치해주세요

 

그리고 대충 폴더구조를 잡았는데 여기까지 github에 basic이라는 이름으로 커밋을 달아놓았습니다.

 

 

https://github.com/MinhoKim1018/eth-wallet

위 주소에 현재까지 초기세팅 코드 올려두었습니다.

 

route/wallet 폴더안에 wallet.js 파일을 보시면 newMnemonic와 newWallet 두가지 api를 만들어두었습니다.

 

 

 

저희는 12개 영어단어인 mnemonic와 password를 통해 keystore를 생성하고 이 keystore(wallet)를 통해 이더리움에 tx를 생성할 것 입니다.

 

eth-lightwallet 모듈에 심플하게 hd-wallet를 생성할수있도록 많은 기능을 지원해주기때문에 쉽게 만들수있어요.

 

exports.newMnemonic = async (req, res) => {

    var mnemonic;

 

    try {

        mnemonic = lightwallet.keystore.generateRandomSeed();

        res.json({mnemonic})

    } catch (err) {

        console.log(err)

    }

}

 

이렇게 작성해주고 express서버를 실행한후 postman을 통해서 api를 호출해주면 mnemonic코드 받아오는 부분은 끝이납니다!

 

mnemonic코드를 받아왔으면 mnemonic 코드 + 패스워드를 가지고 아래와 같이 생긴 keystore를 만들겠습니다.

저희는 이 keystore를 이용해 private key, address 를 생성하고 tx를 만들고 이더리움 블록체인에 배포 할 수 있습니다 

exports.newWallet = async(req,res)=>{

 

    var password = req.body.password

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

 

            var address = (ks.getAddresses()).toString();

            var keystore = ks.serialize();

  

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

          });

        }

      );

    } catch (exception) { 

      console.log("NewWallet ==>>>> " + exception);

    }

}

 

이렇게 wallet address와 keystore를 반환해주고 저희는 최종적으로 이 값을 암호화 해 웹 로컬스토리지에 저장해서 앞으로 사용할예정입니다.

 

 

 

 

여기서 hd wallet 무엇인지 궁금해 하실분들을 위해 짧게 설명 드리겠습니다.

 

 Hierarchical Deterministic Wallet의 약자로 seed값(mnemonic코드)만 있으면 계정을 아수 쉽게 생성해줄 수 있도록 해주는 지갑 만드는 방법중 한가지 입니다.

seed값으로부터 마스터 키(최상위 부모)를 생성하고, 부모 키가 자식 키를 만들수있고 각각의 자식 키는 손자 키를 만들 수 있게 되는 어떻게보면 각각의 주소,키가 사슬처럼 엮여있는 형태의 지갑입니다.

 

 

저희는 현재 프론트화면이 없어 로컬스토리지에 저장을 할수 없으므로 keystore를 json형태의 파일로 만들어 서버에 저장해 사용하도록 하겠습니다.

먼저 nodejs 내장모듈인 fs모듈을 wallet.js 파일에 importg 시키고 코드를 아래와 같이 수정해주세요!

 

exports.newWallet = async(req,res)=>{

 

    var password = req.body.password

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

 

            var address = (ks.getAddresses()).toString();

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

    }

}

 

다시한번 postman을 사용해 newWallet api를 호출하면 프로젝트안에 wallet.json이라는 키스토어 파일이 생성되고 저희는 앞으로 이 파일을 사용해 직접 keystore에 접근할 예정입니다.

 

 

 

이번에 keystore만드는 부분까지 진행했는데 정말 별거 없는데 주

저리주저리 제가 말이 많았네요 다음시간에는 web3를 사용해 직접 이더리움 테스트넷과 통신을 진행하겠습니다.

 

 

https://github.com/MinhoKim1018/eth-wallet/tree/ch02

 

 

이더리움 simple wallet 만들기 (2) 보러가기