brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO Mar 24. 2019

[TezosXSkkrypto] 테조스 실습노트 #4

테조스 웹개발, Tezos eztz 알아보기 

 본격적으로 테조스의 스마트 컨트랙트를 실습하기에 앞서서 오늘은 웹에서 테조스 블록체인과 스마트 컨트랙트의 기능을 호출할 수 있게 돕는 Javascript API인 eztz에 대해서 살펴보겠습니다


eztz는 웹 또는 노드 기반 어플리케이션에서 쉽게 테조스의 블록체인과 상호작용할 수 있게 해주는 api입니다. 이더리움에서 개발 경험이 있는 분들이라면 eztz가 이더리움의 web3와 같은 역할을 하는 친구라는 것을 알 수 있을 것입니다. 

우선 eztz를 사용하기 위해서는 

https://github.com/TezTech/eztz/tree/master/dist 

이 링크로 들어가서 eztz.min.js를 다운받아 저장하고,


index.html 파일에서 다음과 같은 코드를 추가하여 eztz.min.js 파일을 include시켜줍니다. 

<script src="./eztz.min.js"></script>  

그 이후에 app.js 파일에 eztz.node.setprovider(url)을 추가해 provider를 설정해줍니다. 

이렇게 하면 간단하게, 웹에서 실행할 javascript 코드(app.js)에서 eztz를 사용할 수 있습니다.


eztz를 사용할 준비가 되었으면 본격적으로, eztz library에서 주로 사용하게 될 eztz.crypto, eztz.node, eztz.rpc, eztz.contract 4가지 오브젝트에 대해 각각의 역할과 대표적인 function을 살펴보겠습니다.


eztz.crypto

eztz.crypto 는 키 생성과, 메시지에 대한 signing & verification 에 관련된 기능을 제공합니다.

eztz.crypto.generateKeys(mnemonic, passphrase): 15개의 영단어로 이루어진 mnemonic과, 사용자 설정의 passphrase를 같이 조합하여 키를 생성합니다. mnemonic이 유출되는 경우의 문제점을 보완합니다. 키를 생성하면 다음과 같은 정보를 담은 object를 반환합니다. 

이 반환값에서 pkh를 account의 address로 저장하고 이용하면 됩니다.


eztz.node

eztz.node 는 테조스 노드 (혹은 노드 네트워크)와의 통신과 관련된 기능을 제공합니다.

eztz.node.setProvider(provider): provider를 설정해 줍니다. url을 넣어 자신의 로컬 노드로 설정하거나 할 수 있습니다. 설정하지 않을 경우 default값은 https://rpc.tezrpc.me 입니다. 

eztz.node.query(endpoint, data): endpoint에 RPC API request를 보냅니다. 필요할 때만 data를 추가로 넘겨줍니다. 이 함수는 javascript의 promise 패턴을 사용하므로 다음과 같이 작성하여 비동기 로직을 이용합니다.

위 코드와 같이 작성하면, setprovider를 이용해 저장해준 provider의 url의 뒤에 /blocks/head/hash 를 덧붙인 url로 request를 보냅니다. 정상적으로 실행완료되었을 경우 결과값을 로그로 찍어주고 에러가 발생했을 경우 catch문 안의 함수를 실행합니다. 다른 함수의 내용을 보면 확인할 수 있겠지만 eztz의 다른 function들 중 테조스 node와의 통신이 필요한 기능은 모두 이 node.query를 이용해 처리하게 됩니다.


eztz.rpc

eztz.rpc 는 테조스 RPC API를 다이렉트로 실행할 수 있게 합니다. eztz.rpc 내부의 함수들은 모두 node.query를 반환하므로, 마찬가지로 promise 패턴으로 작성해서 사용합니다. 

eztz.rpc.getBalance(address): 해당 주소의 balance를 가져오게 하는 함수입니다. 

eztz.rpc.getBalance 함수가 정의되어있는 코드입니다. 이것을 보면 getBalance가 node.query를 호출해서 balance를 불러오는 요청을 수행하므로 eztz.node에 저장되어있는 provider로 rpc call을 보낸다는 것을 알 수 있습니다.  eztz.rpc 내부의 함수는 모두 이것과 같은 방식으로 실행됩니다.


eztz.contract

eztz.contract 는 테조스 블록체인 상의 스마트컨트랙트와 상호작용할 수 있는 기능을 제공합니다. 

eztz.contract.watch(contractAddress, interval, callback): 특정 시간 간격마다 스마트 컨트랙트에 저장된 storage를 확인하고, storage에 변화가 생겼을 경우에 callback 함수를 실행합니다. callback 함수는 업데이트된 storage를 (JSON array로 변환된 형태) 인자로 넘겨받습니다. 

위 작성 예시의 경우에는 “TZ1...” 주소의 contract의 storage를 2초마다 확인하고 storage가 새롭게 업데이트됐을 경우에는 “New storage”라는 문구와 함께 업데이트된 storage의 내용을 로그로 찍는 callback 함수가 실행됩니다.


eztz.contract.send(contractAddress, keys, amount, parameter, fee): 파라미터를 전달해서 스마트컨트랙트의 함수를 실행시킬 수 있습니다. 컨트랙트의 주소와, 트랜잭션을 보내는 사람의 주소, keys, 테지의 amount, 스마트 컨트랙트의 함수 호출에 필요한 parameter, fee를 넘겨줍니다. 특정 endpoint를 지정하지 않기 때문에 스마트컨트랙트의 main함수로 연결됩니다.

위는 eztz.contract.send 함수가 정의되어 있는 코드입니다. 이것을 보면 fee의 다음 인자로서 gasLimit과 storageLimit을 추가로 넘겨줄 수 있고, 설정하지 않을 경우에 디폴트 값은 각각 2000, 0인 것을 확인할 수 있습니다. 이 함수는 rpc.transfer를 반환하고 있기 때문에 마찬가지로 node.query를 통해 RPC call을 보내게 됩니다. 더 자세한 내용은 아래 링크의 메인 코드에서 찾아볼 수 있습니다.


eztz에서 가장 주요하게 자주 쓰일 수 있는 API들에 대해서 알아보았습니다. 이외에도 eztz가 제공하는 기능들은 아래 링크 1)의 eztz Documentation에서 내용을 확인할 수 있고, 링크 2)에서 eztz의 main.js 파일의 코드를 뜯어보면 eztz가 제공하는 API가 어떤 방식으로 동작하는지 자세히 확인할 수 있습니다.

1)    https://github.com/TezTech/eztz/wiki/Documentation 

2)    https://github.com/TezTech/eztz/blob/master/src/main.js 


다음주에는 테조스 스마트 컨트랙트에 대해 자세히 알아보고 간단한 컨트랙트를 디플로이하는 실습까지 해보겠습니다. 





작성자 : 김예서

개발팀 : 김예서 김형준 김승태

매거진의 이전글 [TezosXSkkrypto] 테조스 실습노트 #3
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari