안녕하세요.
CaverExtKAS JAVA 를 사용하여 배포 된 스마트 컨트랙트의 함수를 Call 하는방법을 문의드리려 합니다.
문의 드리고 싶은 내용은 총 세가지 입니다.
caver-java-ext-kas 1.9.0-android javadoc (xyz.groundx.caver) 위의 CaverExtKAS JAVA 문서를 확인해 보면 “requestFDSmartContractExecutionPaidByUser” 를 사용해 스마트 컨트랙트에 요청을 보내게 되어있는데요. 해당 메소드 사용시 인자로 받는 “FDUserContractExecutionTransactionRequest” 의 클래스 내 Input 변수값으로 어떤값을 사용해야 되는지, 현재는 우선 Web3J 의 Function 객체를 FunctionEncoder로 인코딩 하여 변수값으로 사용 하고 있는데 이 사용법이 맞는지 궁금합니다.
“FDUserContractExecutionTransactionRequest” 의 파라미터 중 To 변수를 콜하고자 하는 Contract의 Address 로 설정하시면 되는지 궁금합니다.
아래의 코드와 같이 “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();
Input값은 Solidity ABI Specification - Function Selector And Argument Encoding에 기반한 값을 넣으시면 됩니다. Web3J의 Function객체를 FunctionEncoder로 인코딩한 값을 사용하셔도 무관하나,
Caver-java에서 제공되는 com.klaytn.caver.contract 패키지의 Contract class의 encodeABI() 활용하시면 편하게 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);
To 변수는 Contract address로 설정하시면 됩니다.
알려주신 Error message만으로는 원인 분석을 하기가 어렵습니다. API 호출 시 error가 발생하는 부분을 try-catch문으로 감싸서 ApiException instance의 getResponseBody로 보다 자세한 error원인을 확인해주셔서 다시 댓글로 문의 부탁드리겠습니다.
테스트가 늦어져 늦게 피드백 드리게 된 점 죄송하며,
코드 테스트 도중 의문이 추가적으로 생겨 다시금 여쭈어보겠습니다.
ApiException으로 예외 처리 한 후 스마트컨트랙에 콜을 한 결과 총 두가지 에러를 확인하였습니다.
Request의 FeeRatio 변수의 값을 1~99 사이에서 지정해야 한다는 에러 메시지를 받았습니다. Delegation 계정이 99%가 아니라 100%로 Delegation을 할 수 있는 방법이 있는지 궁금합니다.
FeeRatio를 99L(Long Type 99)로 설정한 후 “1065100” 에러를 확인했습니다. Delegation 계정이 AMS에 등록되지 않아 발생하는 에러로 보이는데 Delegation 기능을 사용하기 위해서는 KAS에 계정을 등록한 후 등록된 계정으로 대납을 진행해야만 하는지 궁금합니다. 추가적으로 그래야 한다면 기존 Private Key나 KeyStore로 생성된 계정을 KAS에 Migration 하는 방법이 궁금합니다.