[Klaytn][caver-java] 1. 계정 생성과 Klay Transfer Transaction

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

안녕하세요. 저는 (주)34일의 주니어 개발자 Woody 라고 합니다. 제가 소개할 내용은 클레이튼에서 Dapp개발을 위해 제공하는 JAVA SDK인 caver-java 입니다.

caver-java가 나온지 얼마되지 않아, 레퍼런스가 많이 부족하여 삽질 많이 했습니다. ㅎㅎ 제가 정리한 내용이 많은 개발자분들에게 도움이 되었으면 좋겠네요.

caver-java의 dependency설정은 아래 클레이튼 공식문서를 확인해 주시길 바랍니다.

계정 생성하기

caver-java를 통한 클레이튼 계정 생성방법은 EC Key Pair 방식과 Keystore File방식이 있습니다. EC Key Pair 방식이란 타원 곡선 이론에 기반한 공개키 암호 방식을 말하며, Keystore File 방식은 Klaytn Wallet의 Keystore파일과 비밀번호를 통한 계정생성 방식을 말합니다.

1. Using an EC Key Pair

caver-java에서 EC(Elliptic Curve) Key pair 방식으로 클레이튼 어카운트를 만드는 방법은 다음과 같습니다.

KlayCredentials credentials =        
KlayCredentials.create(Keys.createEcKeyPair());
String privateKey =
Numeric.toHexStringWithPrefix(
credentials.getEcKeyPair().getPrivateKey());
String address = credentials.getAddress();

EC Key pair 방식으로 생성한 어카운트는 다음과 같은 방법으로 로드 할 수 있습니다.

KlayCredentials credentials = KlayCredentials.create(<private key>);

Example :

Keys.createEcKeyPair()를 통해 계정을 생성하고 생성된 계정에서 비밀키와 어드레스 값을 스트링에 저장하여 출력하는 테스트 코드입니다.

Using Ec Key Pair Test Code

테스트 코드의 실행 결과를 다음 그림을 통해 확인하실 수 있습니다.

output : privateKey, address

2. Using a Keystore File

Keystore File방식으로 클레이튼 어카운트를 만드는 방법은 다음과 같습니다. KlayWalletUtils.generateNewWalletFile()을 통해 KeyStore 파일을 생성할 수 있으며, 인자로는 (1)password, (2)파일경로를 필요로 합니다. 반환 값은 제가 테스트한 결과, 저장된 파일의 경로가 반환되었습니다.

String fileName = 
KlayWalletUtils.generateNewWalletFile(
password, new File(path)
);

Keystore file을 이용해 클레이튼 어카운트를 로드하는 방법은 다음과 같습니다.

KlayCredentials credentials =
KlayWalletUtils.loadCredentials(<password>, <walletFilePath>);

그럼 테스트 코드를 통해 조금 더 자세히 살펴보도록 하겠습니다.

Example :

다음 보시는 거와 같이 KlayWalletUtils.generateNewWalletFile() 함수를 통해 KeyStore 파일을 생성하였습니다. 그리고 KlayWalletUtils.loadCredentials()함수를 통해 계정을 로드 하여 해당 계정의 주소값을 출력하였습니다. 계정을 로드할 때 필요한 인자는 KeyStore파일을 생성할 때 사용한 password와 KeyStore파일의 파일경로가 필요합니다.

Using Keystore Test Code

생성된 KeyStore 파일은 제가 지정한 파일 경로 안에 있음을 확인하실 수 있습니다.

Created Key Store File

출력된 fileName의 값을 통해, KeyStore파일 이름은 생성된 시간과 계정의 주소의 이름의 조합으로 이루어져 있음을 알 수 있습니다.

output : fileName, address

Klay Transfer Transaction

이번에는 가장 기본적인 Klay를 전송 방법에 대해 알아보도록 하겠습니다. EOA(External owned Account)계정 간의 Klay를 전송하는 두가지 방법이 있습니다. 첫번째는 ValueTransfer.sendFunds()를 이용하는 방법이며, 두번째는 TransactionManager를 이용하여 Klay를 전송하는 방법입니다

  1. ValueTransfer.sendFunds()
KlayTransactionReceipt.TransactionReceipt transactionReceipt 
= ValueTransfer.sendFunds(
caver,
credentials,
<TO_ADDRESS>,
BigDecimal.valueOf(1),
KLAY,
gaslimit).send();

이 함수의 인자는 순서대로 (1)caver, (2)klayCredentials, (3)toAddress, (4)value, (5)unit,(6)gasLimit을 필요로 하며, 리턴값으로는 TransactionReceipt를 반환합니다.

좀 더 자세히 설명하자면, (1)caver는 바오밥이나 메인넷체인과 연결하는 역할을 하며, (2)klayCredentials는 보내는 사람의 계정을 의미합니다. (3)toAddress는 Klay를 받는 사람의 EOA 주소, (4)value는 보내는 클레이의 값, (5)unit은 Klay의 단위, (6)gasLimit은 Klay를 전송할 때 드는 수수료(가스비)의 최대값을 의미합니다.

(5)unit은 Convert.Unit.KLAY, Convert.Unit.PEB을 이용하여 Klay의 전송 단위를 바꿀 수 있으며, 이때 보내는 (4)value의 값에 유의하시길 바랍니다.

Example :

저는 다음과 같이 테스트 코드를 작성하였으며, 트랜잭션해쉬값을 출력하여, 스코프를 통해 트랜잭션을 확인하였습니다.

ValueTransferTransaction Test Code
output : Transaction Hash

다음 보시는 거와 같이 제가 send한 트랜잭션이 성공적으로 이루어 진 것을 확인할 수 있습니다.

Check on the klaytn scope

2. TransactionManager

TransactionManager는 첫번째 방법보다 다소 복잡합니다. 하지만, 이를 통해 다양한 Transaction을 처리 할 수 있으니, 기본 사용법을 알아보도록 합시다.

TransactionManager를 사용하여 EOA간의 Klay를 전송하는 방법은 다음과 같습니다.

TransactionManager txManager = new Transaction.Builder(
caver, credentials).setChainId(ChainId.BAOBAB_TESTNET).build();
ValueTransferTransaction valueTransferTransaction
= new ValueTransferTransaction.create(
fromAddress,
toAddress,
value,
gasLimit
);
KlayRawTransaction klayRawTransation =
txManager.sign(valuTransferTransaction);
String transactionHash = txManger.send(klayRawTransaction);

우선 TransactionManager 인스턴스를 생성합니다. 이때, 인자로는 (1)caver, (2)credentials가 필요합니다. 위에서 설명하였듯이, caver는 메인넷 또는 바오밥 테스트넷에 연결하기 위해 필요한 인스턴스이며, credentials는 로드된 계정, 즉 트랜잭션을 실행할 계정이 되겠습니다.

ValueTransferTransaction은 클레이튼의 트랜잭션 모델로, 이를 생성할 때의 인자로 fromAddress, toAddress, value, gasLimit을 필요로 합니다. 이때, value의 값의 단위는 PEB value라는 것에 주의하시길 바랍니다.

ValueTransferTransaction을 생성하였으면 이를 TransactionManager의 인스턴스로 사인한 후, send를 통해 트랜잭션을 일으키면 됩니다.

Example :

다음 그림은 TransactionManager를 통해 1Klay를 다른 EOA계정에게 전송하는 테스트 코드이며, 트랜잭션을 일으킬 때 반환되는 트랜잭션해쉬의 값을 출력하였습니다.

TransactionManager Transaction Test Code
output : transaction hash

다음 그림은 출력된 트랜잭션 해쉬의 값을 클레이튼 스코프에서 확인한 사진입니다. 보시다시피 트랜잭션이 성공적이루어 진 것을 확인하실 수 있습니다.

Check on the klaytn scope

이상 caver-java의 계정생성과 기본적인 Klay Transfer Transaction부분을 마무리 하도록 하겠습니다. 주의할 점이 있다면, 여기서 다룬 Klay Transfer Transaction부분은 EOA계정 간의 Klay 전송만을 허용한다는 것 입니다.

이후, 내용에서는 자바환경에 컨트랙트를 배포하고 실행하는 법에 대해 알아보고, EOA뿐 아니라, 폴백함수를 포함한 CA(Contract Address)로의 Klay Transfer를 다루도록 하겠습니다.

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

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

--

--