[KAS] CaverExtKAS JAVA 스마트 컨트랙트 함수 Call 문의

안녕하세요.
CaverExtKAS JAVA 를 사용하여 배포 된 스마트 컨트랙트의 함수를 Call 하는방법을 문의드리려 합니다.

문의 드리고 싶은 내용은 총 세가지 입니다.

  1. caver-java-ext-kas 1.9.0-android javadoc (xyz.groundx.caver) 위의 CaverExtKAS JAVA 문서를 확인해 보면 “requestFDSmartContractExecutionPaidByUser” 를 사용해 스마트 컨트랙트에 요청을 보내게 되어있는데요. 해당 메소드 사용시 인자로 받는 “FDUserContractExecutionTransactionRequest” 의 클래스 내 Input 변수값으로 어떤값을 사용해야 되는지, 현재는 우선 Web3J 의 Function 객체를 FunctionEncoder로 인코딩 하여 변수값으로 사용 하고 있는데 이 사용법이 맞는지 궁금합니다.

  2. “FDUserContractExecutionTransactionRequest” 의 파라미터 중 To 변수를 콜하고자 하는 Contract의 Address 로 설정하시면 되는지 궁금합니다.

  3. 아래의 코드와 같이 “FDUserContractExecutionTransactionRequest” 의 To 변수를 Contract의 Address로, Feepayer 는 FeePayer 의 Address 값으로, Input 은 FunctionEncoder 를 사용한 인코딩 된 값으로, From 은 전송자의 Address로 서명하여 전송 한 결과 ApiEcxeption : Bad Request 를 받았습니다. 에러의 발생 원인을 알고 싶습니다. 코드는 아래 첨부하겠습니다.

CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(ChainId, “KASId”, “KasSecret”);

Function function = new Function(
“testFunction”,
Arrays.asList(
new Uint256(1),
new Utf8String(“1”),
new Address(userAddress),
),
Collections.emptyList()
);

String inputData = FunctionEncoder.encode(function);
System.out.println(String.format("]-----] Function Encoder %s [-----[", inputData));

FDUserContractExecutionTransactionRequest request = new FDUserContractExecutionTransactionRequest();

request.setInput(inputData);
request.setFeePayer(feeAddress);
request.setFrom(userAddress);
request.setTo(smartContractAddress);
request.setFeeRatio(100L);
request.setSubmit(true);

FDTransactionResult result = caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(request);

감사합니다 :grinning:

안녕하세요. 클레이트 포럼에 질문을 주셔서 감사드립니다.

KAS를 통해 스마트 컨트랙트에 요청을 보내는 방법은 수수료 대납의 유무와 수수료 대납을 지원하는 종류에 따라 분류가 됩니다.

  • 트랜잭션 수수료를 사용자가 직접 부담.
  • 트랜잭션 수수료를 사용자가 설정한 Fee Payer가 부담.(PaidByUserFeePayer)
  • 트랜잭션 수수료를 KAS에서 부담.(PaidByGlobalFeePayer)

KAS tutorial를 참고부탁드립니다.

  1. Input값은 Solidity ABI Specification - Function Selector And Argument Encoding에 기반한 값을 넣으시면 됩니다. Web3J의 Function객체를 FunctionEncoder로 인코딩한 값을 사용하셔도 무관하나,
    Caver-java에서 제공되는 com.klaytn.caver.contract 패키지Contract classencodeABI() 활용하시면 편하게 Smart contract의 Input 값을 가지고 올 수 있습니다. 아래 이슈가 있는 코드를 예시로 들자면 아래와 같이 코드를 작성하시면 됩니다. CaverExtKAS는 Caver-java 라이브러리를 사용할 수 있습니다.

     CaverExtKAS caver = new CaverExtKAS();
     caver.initKASAPI(ChainId, “KASId”, “KasSecret”);
     
     String ABI = "contract ABI";
     Contract contract = new Contract(caver, ABI);
    
     //encoding testFunction(uint256,string,address);
     String input = contract.encodeABI("testFunction", 1, "1", "0x{address}");
     System.out.println(input);
    
  2. To 변수는 Contract address로 설정하시면 됩니다.

  3. 알려주신 Error message만으로는 원인 분석을 하기가 어렵습니다. API 호출 시 error가 발생하는 부분을 try-catch문으로 감싸서 ApiException instance의 getResponseBody로 보다 자세한 error원인을 확인해주셔서 다시 댓글로 문의 부탁드리겠습니다.

감사합니다.

1 Like

답변 감사합니다 :slight_smile: 해당 코드로 진행해 보도록 하겠습니다.

테스트가 늦어져 늦게 피드백 드리게 된 점 죄송하며,
코드 테스트 도중 의문이 추가적으로 생겨 다시금 여쭈어보겠습니다.

ApiException으로 예외 처리 한 후 스마트컨트랙에 콜을 한 결과 총 두가지 에러를 확인하였습니다.

  1. Request의 FeeRatio 변수의 값을 1~99 사이에서 지정해야 한다는 에러 메시지를 받았습니다. Delegation 계정이 99%가 아니라 100%로 Delegation을 할 수 있는 방법이 있는지 궁금합니다.

  2. FeeRatio를 99L(Long Type 99)로 설정한 후 “1065100” 에러를 확인했습니다. Delegation 계정이 AMS에 등록되지 않아 발생하는 에러로 보이는데 Delegation 기능을 사용하기 위해서는 KAS에 계정을 등록한 후 등록된 계정으로 대납을 진행해야만 하는지 궁금합니다. 추가적으로 그래야 한다면 기존 Private Key나 KeyStore로 생성된 계정을 KAS에 Migration 하는 방법이 궁금합니다.

많은 질문 드려 번거롭게 해드려 죄송하며
답변 기다리도록 하겠습니다.

감사합니다.

안녕하세요.

KAS SDK는 기본적으로 KAS에서 제공해주는 REST API를 각 Programming Language SDK형태로 가공하여 제공하고 있습니다. 그러므로 KAS에서 제공해주는 각 API Reference 문서를 참고하시면 많은 도움이 되실거라고 생각합니다. :slight_smile:

  1. FeeRatio 필드를 셋팅하지않거나 0으로 셋팅하면 100%의 fee delegation을 할 수 있습니다. Wallet API의 문서를 참고 부탁드립니다.

  2. Account Migration하실 필요없이, KAS Docs - Getting started : 클레이튼 계정 생성의 문서를 참고하시어 수수료 대납 계정을 생성하신 후, 생성된 수수료 대납 계정의 address로 Klay를 전송한 뒤(수수료 대납을 위한) 사용해주시면 됩니다.

감사합니다.

1 Like

이슈 해결하였습니다.

답변주셔 감사합니다. :slight_smile: