안녕하세요.
Caver를 통해 RoleBasedKey로 업데이트한 지갑을 이용하여 이체함수를 테스트하여 성공하였습니다
EN노드의 접속이 불가능할 경우 KAS를 이용하여 토큰이체를 하기위해 테스트를 진행하고 있습니다
몇 달전에 KAS에서는 RoleBasedKey를 지원하지 않는다는 답글을 받았던 기억이 있었고
버전이 올라가면서 지원해주실 것 같아 테스트용으로 한번 호출해보았습니다
CaverExt를 사용하여 transfer를 호출하였고 그때 응답으로 받은 Hash는 “0xb3599e57fbcfa0faf30e2d17bf5596c96dfc91e30303b2a46e32893fc66bf5d4” 입니다
roleBaseKey로 업데이트한 지갑은 KAS를 이용하지 못하는 건지 확인차 문의드립니다.
감사합니다.
@ToTheMoon
안녕하세요.
업데이트에 성공한 주소 0x806885b8fd7b4c232796c0139165f2afec5f5a77
의 개인키는 @ToTheMoon 님이 소유하고 계신가요?
즉 해당 Account를 KAS Console의 AccountPool에서 생성하신 것인지 여부가 궁금합니다.
@Denver
네 현재 제가 소유하고 있는 계정입니다.
이곳 에서 생성하였습니다
@ToTheMoon
네 확인 감사합니다.
KAS의 AccountPool에서 생성하신 게 아니라면 제약 없이 마음대로 활용가능하십니다.
KAS 이용 시 RoleBasedKey가 지원 안된다는 뜻은 KAS의 AccountPool을 통해 생성한 계정 (개인키가 @ToTheMoon 님께 있는 것이 아닌 KAS의 HSM 에 있는 것)에 대해서는 되지 않는다는 의미였던 거 같습니다
본인이 갖고 있는 개인키로 본인의 트랜잭션에 서명해서 전송하는 건 언제든 가능합니다.
@Denver
아~ 그러면 KAS를 이용해서 wallet 에서 생성한 지갑도 자유롭게
사용이 가능하다는 말씀으로 이해했습니다.
CaverExt를 이용하여 transfer를 하려고 하는데 Caver처럼 사용하면 될까요??
@ToTheMoon
@ToTheMoon 님의 케이스처럼 개인키를 본인이 소유하고 있는 경우에 KAS를 사용한다는 의미를 조금 더 풀어 해석해드리면, KAS에게 “내가 내 개인키로 서명한 트랜잭션이야. 이거 확인해보고 이상 없으면 블록체인에 기록 부탁해” 정도로 일을 맡기는 걸 뜻합니다.
만약 KAS가 없다면 직접 클레이튼 노드를 구축하셔야 하겠지요. 그 역할을 현재 KAS가 해주고 있는 것이구요
transfer를 사용한다는 것이 KIP-7의 transfer를 말씀하시는 걸까요?
큰 틀에서 보면 Caver와 CaverExt 간의 사용성에는 큰 차이가 없기에 무리 없이 사용 가능하실 걸로 생각됩니다.
@Denver
네 KIP-7의 transfer를 사용하려고 했습니다
동일하게 사용해도 큰 무리는 없을거 같네요.
답변 감사합니다
1개의 좋아요
@ToTheMoon
네 감사합니다.
caver-java-examples/CaverExample.java at master · klaytn/caver-java-examples · GitHub 를 참고해보셔도 도움이 많이 될 거 같습니다.
본인이 갖고 있는 개인키와 address를 caver.wallet.add
로 추가하신 뒤 사용하시는 방법으로 하시면 될 거 같습니다.
1개의 좋아요
@Denver
알려주신 샘플코드와 제가 테스트 했던 방식으로 테스트를 진행해봤는데 아래와 같이 진행했습니다.
CaverExtKAS caverExt = new CaverExtKAS();
caverExt.initKASAPI(ChainId.BAOBAB_TESTNET, accessKeyId, secretAccessKey);
AbstractKeyring fromKeyring = TokenUtils.createFromPrivateKey("롤베이스로 업데이트한 지갑 privateKey");
BufferedReader br = new BufferedReader(new FileReader(토큰json파일));
KIP7Json kip7Json = new Gson().fromJson(br, KIP7Json.class);
Contract contract = KIP7.create(caverExt, kip7Json.getAbi().toString(), contractAddress);
AbstractKeyring feePayerKering = keyStoreTools.getFeePayerKeyring(true);
RoleBaseKey roleBaseKey = keyStoreTools.getRoleBaseKey(null, null);
Caver caver = new Caver(new HttpService(caverUrl));
String convertAmount = caverExt.utils.convertToPeb("1", Utils.KlayUnit.KLAY);
caver.wallet.add(fromKeyring);
caver.wallet.setFeePayer(feePayer);
String input = contract.encodeABI("transfer", fromKeyring.getAddress(), new BigInteger(convertAmount));
FeeDelegatedSmartContractExecution fdsce = new FeeDelegatedSmartContractExecution.Builder()
.setKlaytnCall(caver.rpc.klay)
.setFrom(fromKeyring.getAddress())
.setTo(A지갑 (레거시지갑))
.setGas(BigInteger.valueOf(1000000))
.setInput(input)
.setFeePayer(feePayerKering.getAddress())
.build();
// Decoding하지 않고 sign(), signAsFeePayer()를 수행
caver.wallet.sign(fromKeyring.getAddress(), fdsce);
caver.wallet.signAsFeePayer(feePayerKering.getAddress(), fdsce);
String decoded = fdsce.getRLPEncoding();
Bytes32 txHash_executed = caverExt.rpc.klay.sendRawTransaction(decoded).send();
TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(caverExt, 1000, 15);
TransactionReceipt.TransactionReceiptData receiptData = receiptProcessor.waitForTransactionReceipt(txHash_executed.getResult());
log.info("### receiptData : {}", objectToString(receiptData));
이렇게 작성해서 테스트를 진행했는데
org.web3j.protocol.exceptions.TransactionException: Error processing request: invalid argument 0: json: cannot unmarshal non-string into Go value of type common.Hash
at com.klaytn.caver.transaction.response.TransactionReceiptProcessor.sendTransactionReceiptRequest(TransactionReceiptProcessor.java:43)
at com.klaytn.caver.transaction.response.PollingTransactionReceiptProcessor.getTransactionReceipt(PollingTransactionReceiptProcessor.java:48)
at com.klaytn.caver.transaction.response.PollingTransactionReceiptProcessor.waitForTransactionReceipt(PollingTransactionReceiptProcessor.java:41)
위와 같은 에러가 발생했습니다
KAS쪽으로 트랜잭션에 보낼때 서명값이 틀려서 발생한 오류 같은데
혹시 KAS쪽에 트랜잭션을 보낼 때 서명하는 샘플소스가 있을까요??
Denver
12월 28, 2021, 6:27오전
10
CaverExt Transfer KeyringContainer질문드립니다 - Denver님의 글 #2 답변으로 대신하겠습니다.
현재 @ToTheMoon 님 구조에는 위에 답글에 있는 구조가 좀 더 적합하실 거 같습니다.
caver-java 로 의존성을 변경해주시고 예제 코드를 적극 참고하셔서 개발하시면 큰 변경 없이, 본인의 개인키를 사용하셔서 KAS 측에 트랜잭션을 보내실 수 있을 거 같습니다.
전체적인 코드 흐름에는 큰 이상이 없어보입니다