본문 바로가기

이더리움

이더리움 simple wallet 만들기(6) (토큰사용)

 

안녕하세요.

 

이더리움 월렛관련 포스팅은 이번이 마지막입니다. 이정도면 어떻게 월렛을 만드는지, 기존의 월렛을 연동시키는지 등 월렛을 사용하고 이보다 더 응용해서 다룰수 있을거라 확신하는 바입니다.

 

저번시간에 truffle.js를 사용해서 자신만의 새로운 토큰을 발행하는 방법에 대해 알아보았습니다. 이번시간에는 저번에 만든 토큰의 잔액을 조회하고, 다른 지갑주소로 보내는 방법에 대해 알아보도록 하겠습니다.

 

 


기존에 사용하던 wallet.js는 이더리움 관련 api만 만들기로하고, 토큰관련 api는  routes/wallet폴더안에 token.js라는 파일을 만들어 이 파일에 코드를 작성하도록 하겠습니다.

 

 

 

 

그리고 일단 token.js 파일안에 api껍데기만 작성하겠습니다. 저희는 특정지갑주소의 token 잔액조회와 보내는 기능 두가지에 관한 코드를 작성하겠습니다. 

 

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

 

}

 

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

 

}

 

그리고 index.js파일에 다음과 같이 추가해주세요.

 

 

 

저희가 토큰을 사용하는데 가장중요한게 바로 토큰을 생성한 컨트랙트의 abi.json 파일입니다.

 

ABI는 컨트랙트 내의 함수를 호출하거나 컨트랙트로부터 데이터를 얻는 방법이고 이더리움 스마트 컨트랙트는 이더리움 블록체인에 배포된 바이트코드입니다. 컨트랙트 내에 여러 개의 함수가 있을 수 있는데 저희는 이 컨트랙트의 abi파일을 통해 어떤 함수가 있는지 파악하고 그 함수를 사용할수 있게됩니다.

 

abi를 추출하는 법은 간단합니다. 저희가 truffle.js를 통해 토큰관련 컨트랙트를 ropsten네트워크에 배포할때 build폴더가 생겼고 그안에 관련 json파일이 생성되었을겁니다. 그 json파일안에 abi가 있는데 저희는 BasicToken이라는 이름으로 배포를 했으니 이 안에 저희가 사용할 abi가 존재합니다.

 

 

 

위와 같이 코드를 작성해주시고 Postman으로 api를 호출해 보도록 하겠습니다.

 

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

    const web3 = req.web3

 

    var minojsInstance = new web3.eth.Contract(

        BasicTokenAbi.abi,

        "내가 배포한 스마트 컨트랙트 주소"

    )

    minojsInstance.methods.balanceOf("내 지갑 주소").call().then(data => {

        console.log(data)

        res.send(data)

 

    })

}

 

혹시 내가 배포했던 토큰관련 스마트컨트랙트 주소를 모르시는분은 이더스캔에 가셔서 내 지갑주소를 검색해서 조회해보시면 알수 있습니다.

 

여기서 가장 중요한부분은 빨간색박스 부분인데, 내가 배포한 토큰관련 컨트랙트의 abi코드와 컨트랙트 주소를 사용해 새로운 인스턴스를 만드는 과정입니다. 저부분이 틀린다면 저희는 저희가 배포한 컨트랙트를 사용할수가 없게됩니다.

 

제 지갑에 있는 monoJS 토큰의 잔액은 9000.000000 => 9000개 입니다. decimal을 6자리로 줬기때문에 뒤에0 6개는 소수점으로 빼서 계산을 하셔야 합니다. 이제 나의 토큰 잔액을 알아봤으니 내 지갑주소에 있는 토큰을 다른 지갑주소로 전송해보는 부분에 대해 알아보도록 하겠습니다. 마찬가지로 이더리움 전송부분과 크게 다르지 않고 간단합니다.

 

 

 

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

 

    const web3 = req.web3

 

    var minojsInstance = new web3.eth.Contract(

        BasicToken.abi,

        "0xc8419bd91851426cc52a0cebacd23e6b8ca97dfb"

    )

 

    var gasPrice = req.gas

 

    minojsInstance.methods.transfer("받는사람 지갑주소", 보내는 토큰양).send(

        { from: "보내는사람 지갑주소", gasPrice: 가스 가격, gas: 가스리밋 },

        function (err, txhash) {

            try {

              console.log(txhash)

              res.send(txhash)

            } catch (err) {

                console.log("Send Token Error ==>>>>" + err.toString());

                res.json({ code: 310, err: err.toString() });

            }

        }

    );

}

 

가스비를 *1.5 해준 이유는 트랜잭션 속도를 평균보다 빠르게 하기위함이고 이렇게 작성하고 마찬가지로 postman을 통해 호출해보도록 겠습니다.

 

 

 

 

이렇게 트랜잭션이 만들어지고 저 트랜잭션을 이더스캔에서 검색해보시면 토큰이동이 정상적으로 처리된건 확인할수가 있습니다.

 


여기까지 이더리움,Erc20토큰 월렛을 만들고 잔액조회 전송기능까지 갖춘 api서버를 만들어 보았습니다.

 

이를 활용해서 더 많은 기능이 있는 월렛,토큰을 만들어 보실수도있고, 프론트화면도 한번 만들어서 직접 테스트를 해보시면 좋을거같네요.

 

궁금하신점은 언제든지 댓글 남겨주시면 확인하는대로 답변드리겠습니다.

 

 

 

 

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