KAS API | Klaytn

장민우·2023년 1월 9일
0

Solidity

목록 보기
6/6

KAS 정의

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는 개발자가 개발하기 용이하게 만든 라이브러리 입니다.

KAS API 이용하기

  • 자바에서 KAS API 이용하는 방법에 대해 알아 보겠습니다.

gradle 등록하기

    // gradle 작업시 의존성 문제 때문에 제대로 작동하지 않을 수 있습니다. 그럴 땐 아래처럼 직접 maven 의존성을 주입해 주시면 됩니다.
    repositories {
		mavenCentral()
		maven { url 'https://jitpack.io' } // 블록체인용 의존성 설치를 위한 레포지토리 설정
	}
    
    implementation 'xyz.groundx.caver:caver-java-ext-kas:1.9.0' // 저는 1.9.0 버전을 사용했습니다.

maven 등록하기

 <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>

KAS Console 의 회원가입을 진행 후 accessKesId,secetAccessKey 받습니다.

  • 자세한 링크는 여기에 남겨두겠습니다.

KAS 라이브러리 사용하기

 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();
            }
        }
    }
  • 이제 KAS 라이브러리를 사용하기 위한 기본 세팅이 끝나게 되었습니다.
  • 저는 이 세팅을 기본으로 작업의 진행을 했습니다.
  1. KAS 라이브러리를 이용한 간단한 비즈니스 로직
  // 기본세팅은 완료가 된 가정하에 진행하겠습니다.
  
  // 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());

    }
  
  • call 기능은 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();
        }
    }
  • 위 처럼 send 형식의 함수는 정보를 저장하기 때문에 수수료(gas Fee)를 소모되게 됩니다.
  • 사전의 준비 했던 options 기준으로 수수료를 소모하게 되며, Solidity 함수를 이용하기 위해서 함수명을 그대로 적어줘야 하고, 해당 그 함수가 필요로 하는 파라미터를 같이 보내시면 됩니다.
  • 해당 결과는 receiptData 라는 변수에 담겨 있으며, 변수 안에 정보들로 성공여부를 확인 할 수 있습니다.

글을 마치며..

오늘은 KAS 라이브러리를 사용하는 방법에 대해서 알아봤습니다.
실제로 직접 Klaytn node를 구축하지 않고 사용할 수 있다는 사실이 너무나 편리했습니다.
이런 방식을 이용하게 된다면 개발자분 들이 편리하고 쉽게 사용할 수 있을 것 같습니다.
아직 저도 많은 것을 알지 못하고 실력도 많이 부족하지만 이 글이 누구에게는 도움이 된다면 하는 바람에 작성을 하고 있습니다.
어떤 어려운 작업이어도 포기하지 않고 끝까지 간다면 할 수 있다는 것을 이번 프로젝트 기간 동안 알게 되었습니다.
모든 작업을 누구한테 배운 것이 아닌 독학으로 검색을 하면서 작업을 진행 한다는 것이 얼마나 어렵고 힘든 일이지만, 포기하지 않는다면
해결할 수 있다는 좋은 시간이었고 그 기간 동안 배운 점을 공유하고 싶습니다.
오늘도 긴 글 읽어주셔서 너무나 감사합니다 🙇🏻🙇🏻
profile
꿈틀대는꼬마개발자

0개의 댓글