Klaytn API Service (KAS)는 블록체인 플랫폼인 Klaytn을 API로 사용할 수 있는 서비스입니다. KAS를 사용하면 기존 Klaytn을 사용했을 때보다 개발의 용이성, 생산성, 효율성을 높여서 블록체인 애플리케이션을 개발할 수 있습니다.
일반적으로 블록체인 애플리케이션은 블록체인 플랫폼에 트랜잭션을 보내려는 목적으로 사용합니다. 지금까지는, 엔터프라이즈 환경에서 Klaytn 혹은 이더리움에 트랜잭션을 보내려면 비싼 비용을 지불하고 고성능의 노드를 준비해 운영해야 했고, 여러 계정(Account)을 만들고 이들의 개인키-공개키 쌍을 일일이 관리해야 했습니다.
하지만, KAS를 사용하면 여러분은 노드를 설치, 운영하거나 계정 키를 관리할 필요가 없습니다. 트랜잭션 전송과 관련된 모든 작업을 REST API 혹은 SDK로 실행할 수 있습니다. 또 블록체인 계정을 그룹화하여 용도별로 묶어 관리할 수 있으며 서비스 체인을 운영할 경우 메인 체인에 데이터를 앵커링하는 작업도 API로 간단히 수행할 수 있습니다.
뿐만 아니라, 여러분의 토큰 컨트랙트(KIP-7, KIP-17, ERC-20, ERC-721)로 발행한 모든 토큰 정보와 이 토큰들을 다른 계정에게 전송한 트랜잭션 이력도 조회하는 기능도 제공합니다. 여러분이 KAS 사용으로 얻는 장점을 정리하면 아래와 같습니다.
이 처럼 KAS는 개발자가 개발하기 용이하게 만든 라이브러리 입니다.
// gradle 작업시 의존성 문제 때문에 제대로 작동하지 않을 수 있습니다. 그럴 땐 아래처럼 직접 maven 의존성을 주입해 주시면 됩니다.
repositories {
mavenCentral()
maven { url 'https://jitpack.io' } // 블록체인용 의존성 설치를 위한 레포지토리 설정
}
implementation 'xyz.groundx.caver:caver-java-ext-kas:1.9.0' // 저는 1.9.0 버전을 사용했습니다.
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>xyz.groundx.caver</groupId>
<artifactId>caver-java-ext-kas</artifactId>
<version>X.X.X</version>
</dependency>
</dependencies>
accessKesId
,secetAccessKey
받습니다. public class KAS {
private CaverExtKAS caver;
private String accessKeyId = "각 계정의 accessKeyId";
private String secretAccessKey = "각 계정의 secretAccessKey";
private Contract contract;
private SendOptions options;
// 저는 KAS의 제공해주는 NFT 규약을 사용하지 않고 직접 제작한 Bapp을 가지고 운영하기 떄문에 따로 연동하기 위해 ABI 코드를 준비했습니다.
private ABI = "[ { \"constant\": false, \"inputs\": ....";
KAS () {
// 먼저 전역 변수로 지정해 놓은 KAS 라이브러리를 사용합니다.
caver = new CaverExtKAS();
// 그런 다음 BApp과 연동하기 위한 사전준비를 해줍니다.
this.options = new SendOptions("가스비를 지급할 계정의 주소", "최대 가스값");
try {
this.contract = new Contract(caver, ABI,"연결할 BApp의 SmartContract 주소");
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 기본세팅은 완료가 된 가정하에 진행하겠습니다.
// NFT 개수 반환하기
public int balanceOf(String address) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException {
List<Type> value = kip17Contract.call("balanceOf",address);
Uint256 token = (Uint256) value.get(0);
log.info("현재 보유중인 NFT 개수 : {}",token.getValue());
BigInteger result = token.getValue();
return Integer.parseInt(result.toString());
}
klaytn
저장된 정보를 보는 기능이기 때문에 따로 수수료(gas Fee) 소모되지 않습니다.Solidity
자료형으로 반환하기 때문에 일반적으로 사용하기 위해 형변환이 필요합니다.public boolean sendTransferFrom(String to, int token, String smartContract) {
boolean check = false;
setContractInfo(smartContract);
TransactionReceipt.TransactionReceiptData receiptData = null;
try {
receiptData = kip17Contract.send(options, "transferFrom",klaytnFrom,to,token);
} catch (Exception e) {
log.error(e.toString());
return false;
}
if (receiptData != null && receiptData.getStatus().equals("0x1")) {
log.info("receiptData check --> {}", receiptData);
check = true;
}
return check;
}
// setContractInfo 기능은 간단히 Contract를 편리하게 사용하기 위해 따로 함수를 준비했습니다.
public void setContractInfo(String contract) {
this.klaytnContract = contract;
this.sendOptions = new SendOptions(klaytnFrom, new BigInteger("최대 가스값"));
try {
this.kip17Contract = new Contract(caver, klaytnABI,klaytnContract);
} catch (IOException e) {
e.printStackTrace();
}
}
options
기준으로 수수료를 소모하게 되며, Solidity
함수를 이용하기 위해서 함수명을 그대로 적어줘야 하고, 해당 그 함수가 필요로 하는 파라미터를 같이 보내시면 됩니다.오늘은 KAS 라이브러리를 사용하는 방법에 대해서 알아봤습니다.
실제로 직접 Klaytn node를 구축하지 않고 사용할 수 있다는 사실이 너무나 편리했습니다.
이런 방식을 이용하게 된다면 개발자분 들이 편리하고 쉽게 사용할 수 있을 것 같습니다.
아직 저도 많은 것을 알지 못하고 실력도 많이 부족하지만 이 글이 누구에게는 도움이 된다면 하는 바람에 작성을 하고 있습니다.
어떤 어려운 작업이어도 포기하지 않고 끝까지 간다면 할 수 있다는 것을 이번 프로젝트 기간 동안 알게 되었습니다.
모든 작업을 누구한테 배운 것이 아닌 독학으로 검색을 하면서 작업을 진행 한다는 것이 얼마나 어렵고 힘든 일이지만, 포기하지 않는다면
해결할 수 있다는 좋은 시간이었고 그 기간 동안 배운 점을 공유하고 싶습니다.
오늘도 긴 글 읽어주셔서 너무나 감사합니다 🙇🏻🙇🏻