KAS를 이용하여 이체할 때 RoleBasedKey로 업데이트한 지갑에서 이체를 시킬 수 있나요?

안녕하세요.

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에 있는 것)에 대해서는 되지 않는다는 의미였던 거 같습니다 :slight_smile:

본인이 갖고 있는 개인키로 본인의 트랜잭션에 서명해서 전송하는 건 언제든 가능합니다.

@Denver

아~ 그러면 KAS를 이용해서 wallet에서 생성한 지갑도 자유롭게
사용이 가능하다는 말씀으로 이해했습니다.

CaverExt를 이용하여 transfer를 하려고 하는데 Caver처럼 사용하면 될까요??

@ToTheMoon

@ToTheMoon 님의 케이스처럼 개인키를 본인이 소유하고 있는 경우에 KAS를 사용한다는 의미를 조금 더 풀어 해석해드리면, KAS에게 “내가 내 개인키로 서명한 트랜잭션이야. 이거 확인해보고 이상 없으면 블록체인에 기록 부탁해” 정도로 일을 맡기는 걸 뜻합니다.

만약 KAS가 없다면 직접 클레이튼 노드를 구축하셔야 하겠지요. 그 역할을 현재 KAS가 해주고 있는 것이구요 :slight_smile:

transfer를 사용한다는 것이 KIP-7의 transfer를 말씀하시는 걸까요?

큰 틀에서 보면 Caver와 CaverExt 간의 사용성에는 큰 차이가 없기에 무리 없이 사용 가능하실 걸로 생각됩니다.

@Denver

네 KIP-7의 transfer를 사용하려고 했습니다
동일하게 사용해도 큰 무리는 없을거 같네요.

답변 감사합니다 :grinning:

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쪽에 트랜잭션을 보낼 때 서명하는 샘플소스가 있을까요??

CaverExt Transfer KeyringContainer질문드립니다 - Denver님의 글 #2 답변으로 대신하겠습니다.

현재 @ToTheMoon 님 구조에는 위에 답글에 있는 구조가 좀 더 적합하실 거 같습니다.
caver-java 로 의존성을 변경해주시고 예제 코드를 적극 참고하셔서 개발하시면 큰 변경 없이, 본인의 개인키를 사용하셔서 KAS 측에 트랜잭션을 보내실 수 있을 거 같습니다.

전체적인 코드 흐름에는 큰 이상이 없어보입니다 :slight_smile: