[Klaytn][caver-java] 3. 스마트 컨트랙트 배포와 실행

Woody Kim
Day34 Inc.
Published in
6 min readJul 17, 2019

안녕하세요. 저는 (주)34일의 주니어 개발자 라고 합니다. 이번에 소개할 내용은 이전에 만든 스마트 컨트랙트 wrapper클래스를 이용하여 스마트 컨트랙트를 배포하고 실행하는 방법에 대해 알아보도록 하겠습니다.

스마트 컨트랙트 배포

생성된 wrapper 클래스를 사용하여 자바환경에서 다음과 같이 스마트 컨트랙트를 배포할수 있습니다.

<smartContract> contract = <smartContract>.deploy(
caver, credentials, <chainId>, <gasProvider>,
<param1>, ..., <paramN>).send();

<smartContract>부분은 컨트랙트 wrapper 클래스의 클래스명, 즉 스마트컨트랙트의 이름을 나타냅니다. wrapper클래스에는 deploy()라는 함수가 정의되어 있으며, 이를 이용하여 컨트랙트를 배포하실 수 있습니다.

인자로는 (1)caver, (2)credentials, (3)chainId (4)gasProvider, (5)param가 필요합니다. (3)chainId는 클레이튼에서 이미 정의한 chainId를 사용하시면 되며, 바오밥 테스트넷의 chainId는 ChainId.BAOBAB_TESTNET, 메인넷인 경우 ChainId.MAINNET을 사용하시면 됩니다.

(4)gasProvider는 기본적으로 new DefaultGasProvider()를 사용하시면 되는데, 주의하실 점은 gasLimit이 4,300,000으로 고정되어 있습니다. 따라서 컨트랙트를 배포할 때, 가스비가 4,300,000보다 많이 든다면 배포를 실패하게 됩니다. 이럴 경우, 다음과 같이 별도의 GasProvider클래스를 만들어 사용하시길 바랍니다.

ContractGasProvider

(5)param은 컨트랙트가 배포될 때, 필요한 인자값을 넣어주시면 됩니다.

Example :

다음은 스마트 컨트랙트를 배포하는 테스트 코드입니다. EEToken이라는 스마트 컨트랙트를 배포해 보도록 하겠습니다. EEToken은 Example ERC20 Token을 의미합니다. EEToken은 배포할 때, constructor에서 필요한 인자가 없으므로 param 부분은 없습니다. 출력값으로는 배포된 컨트랙트의 어드레스를 출력하도록 하였습니다.

Contract Deploy Test Code
output : deployedContractAddress
Check on the Klaytn Scope

스마트 컨트랙트 실행

스마트 컨트랙트를 배포한 이후, 다음과 같이 스마트 컨트랙트 인스턴스를 생성할 수 있으며, 생성된 컨트랙트 인스턴스를 이용하여 컨트랙트의 함수를 실행 할 수 있습니다.

<smartContract> contract = <smartContract>.load(
<deployedContractAddress>,
caver,
credentials,
<chainId>,
<gasProvider> );

load()의 인자로는 (1)deployedContractAddress, (2)caver, (3)credentials, (4)chainId, (5)gasProvider를 필요합니다. (1)deployedContractAddress는 배포된 컨트랙트의 주소(CA)를 의미하며, (3)credentials는 해당 컨트랙트를 실행할 계정을 연결하는 역할을 합니다.

생성된 인스턴스를 이용해 컨트랙트를 실행하는 일반적인 방법은, 다음과 같습니다.

contract.<methodeName>(<param1>, ..., <paramN>).send()

테스트 코드를 통해 일반적인 스마트 컨트랙트의 실행에 대해 자세히 알아보도록 하겠습니다.

Example :

배포된 EEToken컨트랙트는 ERC20기반의 토큰 컨트랙트로 기본적으로 transfer, balanceOf, approve 등의 함수를 사용할 수 있습니다. 테스트 코드에서는 balanceOf를 통해 sender와 receiver의 토큰잔액을 확인하고, transfef를 통해 토큰을 전송하도록 하겠습니다.

ERC20 Contract Execute Test Code

출력값을 통해 sender의 토큰이 receiver에게 5Klay만큼 전송되었음을 확인할 수 있으며, 클레이튼 스코프를 통해 트랜잭션이 성공적으로 처리 되었음을 볼 수 있습니다.

output : senderBalance, receiverBalance, txHash
Check on the Klaytn Scope

다음에는 많은 분들이 궁금해 하실 수수료 대납을 통한 Klay 전송 및 컨트랙트 실행에 대한 이야기를 하도록 하겠습니다.

혹시 잘못된 부분이 있으면, 말씀해 주시길 바랍니다. 선배 개발자로서 조언도 감사하겠습니다 :)

[참고] https://docs.klaytn.com/sdk/caverjava/getting_started

--

--