트랜젝션 대납 관련(수수료 대납 기능)에서 계정 생성의 차이가 나서 에러가 발생합니다. java입니다. 관련 소스와 질문을 올립니다

안녕하세요 블록체인 초보입니다.
대납 관련해서 작업중인 내용입니다.

사용하는 자바 버젼입니다.
implementation ‘com.klaytn.caver:core:1.5.7’
implementation ‘xyz.groundx.caver:caver-java-ext-kas:1.1.0’

소스 내용입니다.

밑에 소스를 보냅니다.

  1. 이 계정이 지갑에서 만드는 계정과 차이가 있는것인지요?

// Account from = caver.kas.wallet.createAccount();
// Account to = caver.kas.wallet.createAccount();

Account from = caver.kas.wallet.getAccount("0x476E8656AADD1B7518905DE62ddc9F7e3F211111"); 
Account to   = caver.kas.wallet.getAccount("0xBBFB37E66f0f3ADef08e7e8e0b4C25Aas1221121");

이 계정은 프로그램에서 생성한 내용입니다.
{“address”:“0x476E8656AADD1B7518905DE62ddc9F7e3F211111”,“chainId”:1001,“createdAt”:1618199259,“keyId”:“krn:1001:wallet:d1794ae0-24ad-402d-a046-0567e567d6fd:account-pool:default:0x410c4de55102159ee6c0c06cc696eefd3961616a346ce37838107a7efbaa5738”,“krn”:“krn:1001:wallet:d1794ae0-24ad-402d-a046-0567e567d6fd:account-pool:default”,“publicKey”:“0x0483c8d8f02ccb0fe61b8b011172df79d89a70b9eb6551eb63a6d25178db6edbcea77ab805fd3a7c24f33e0f138bd5cc88d24f5e76e4fa83338e9b1a6fe7867084”,“updatedAt”:1618199259}

0x929a5822ddb5a0036f4e7007c1e00ac437ea140e

현재 소스는 에러가 없이 잘됩니다.
하지만 https://baobab.wallet.klaytn.com/ 작성한 Account를 이용하면 에러가 발생이 됩니다.

    @RequestMapping(value = "/sampleresult")
    public void sampleresult() throws Exception {        	
   	    CaverExtKAS caver = new CaverExtKAS("1001", ACCESS_KEY_ID, SECRET_ACCESSKEY);
    	    caver.kas.wallet.getApiClient().setDebugging(true); // Show http request and response in a console.

// Account from = caver.kas.wallet.createAccount();
// Account to = caver.kas.wallet.createAccount();

// Account from = caver.kas.wallet.getAccount(“0x053b3a90d281f21e16b675bcd84ea7077dcc9187”); // https://baobab.wallet.klaytn.com/ 작성한 Account를 이용하면 에러가 발생이 됩니다.
Account from = caver.kas.wallet.getAccount(“0x476E8656AADD1B7518905DE62ddc9F7e3F211111”); // caver.kas.wallet.createAccount() 로 생성한 내용임
Account to = caver.kas.wallet.getAccount(“0x476E8656AADD1B7518905DE62ddc9F7e3F211111”);

	        BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, "kpeb"));
    	    FDValueTransferTransactionRequest request = new FDValueTransferTransactionRequest();
    	    request.setFrom(from.getAddress());
    	    request.setTo(to.getAddress());
    	    request.setMemo("memo");
    	    
    	    request.setValue("0x0");
    	    request.setSubmit(true);
    	    
    	    // call a request.
    	    FDTransactionResult result = caver.kas.wallet.requestFDValueTransferPaidByGlobalFeePayer(request);
    	    System.out.println("getTransactionHash=================================>" + result.getTransactionHash());        	
    }
  1. https://baobab.wallet.klaytn.com/
    작성한 Account를 이용하면 에러가 발생이 됩니다.

에러 내용
GET https://wallet-api.klaytnapi.com/v2/account/0x053b3a90d281f21e16b675bcd84ea7077dcc9187 HTTP/1.1
Authorization: Basic S0FTSzE1VktVTlNJMDhPTUQzQkdPRkI0OkRGbWJqYkRzS0VtdTMzTmtzaFR2eEJ6U3VJekhScFpIYW03VDN5c2E=
Accept: application/json
x-chain-id: 1001
User-Agent: Swagger-Codegen/1.0.0/java
→ END GET
← HTTP/1.1 400 Bad Request (57ms)
content-type: application/json; charset=utf-8
date: Tue, 13 Apr 2021 04:33:21 GMT
content-length: 96
x-envoy-upstream-service-time: 6
server: istio-envoy
OkHttp-Sent-Millis: 1618288402707
OkHttp-Received-Millis: 1618288402735

{"code":1061010,"message":"data don't exist","requestId":"3cb05fe2-0313-4501-a081-9f4662a7f877"}
<-- END HTTP (96-byte body)
  1. 그래서 프로그램을 이용해서 caver.kas.wallet.createAccount() 를 사용하는 경우 에러가 나지 않습니다.

  2. https://baobab.wallet.klaytn.com/ 작성한 Account와 caver.kas.wallet.createAccount() 의 차이가 있는지요?

  3. 그리고 View Transaction List 를 볼 경우 화면의 내용이 다릅니다.

    https://baobab.wallet.klaytn.com 로 작성한 화면

caver.kas.wallet.createAccount() 로 작성한 화면

  1. request.setValue(“0x0”); → 에러가 없습니다. 정상 작동
    밑의 내용은 왜 그런지요?

    request.setValue(“0x1”); → 이 부분 변경하면 에러 발생합니다.
    에러 메시지 :
    {“code”:1065001,“message”:"failed to send a raw transaction to klaytn node; -32000::insufficient funds of the sender for value ",“requestId”:“a0bb6e8a-7de4-4c68-b775-b24c16d50a8b”}

    BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, “kpeb”));
    request.setValue(“0x” + value.toString()); → 이 부분 변경하면 에러 발생합니다.

    {“code”:1065001,“message”:"failed to send a raw transaction to klaytn node; -32000::insufficient funds of the sender for value ",“requestId”:“aa15b4ae-a764-41c2-a00b-76ec0ffe94a6”}

    BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, “kpeb”));
    request.setValue(“0x” + value.toString(16)); → 이 부분 변경하면 에러 발생합니다.
    {“code”:1065001,“message”:"failed to send a raw transaction to klaytn node; -32000::insufficient funds of the sender for value ",“requestId”:“4f141b5d-9a64-4a23-86dc-b1826b685622”}

수고하세요

안녕하세요.

  1. Klaytn Wallet과 KAS를 통해 만드는 Account의 차이인데요.
    KAS의 Wallet API를 사용해서 Account를 만들고 그 Account를 통해서만 KAS Wallet API를 사용하실 수 있습니다.
    Klaytn Wallet를 통해 만들어지는 Account는 KAS Wallet API로 만들어진 Account가 아닙니다.

  2. View Transaction List관련
    스크린샷을 보면 두 스크린샷에 나와있는 Transaction Type이 서로 다른 것 같습니다.
    아래 스크린샷의 Value Transfer는 Account 계정의 Klay를 사용하여 전송하는 Transaction 입니다.
    ValueTransfer를 실행시킬 계정에 돈은 충분한지? 돈은 충분하다면 여러건 Transaction을 발생시킨 Transaction hash들의 정보를 제공해주신다면 확인하는데 더 도움이 될 것 같습니다.

  3. 5번 질문과 관련하여
    {“code”:1065001,“message”:"failed to send a raw transaction to klaytn node; -32000::insufficient funds of the sender for value ",“requestId”:“a0bb6e8a-7de4-4c68-b775-b24c16d50a8b”}
    위 에러 메세지는 Account 계정에 Transaction에 포함시켜 보낼 Klay가 없을 경우 발생합니다.

    value값은 전송할 클레이를 명시하는 부분이므로, Account에 전송할 klay가 있는지 확인해보시고 테스트 부탁드립니다. 그리고 value값은 16진수로 표기해야합니다.

    아래 코드 확인 부탁드리겠습니다.

    BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, “KLAY”));
    String hexValue = Numeric.toHexStringWithPrefix(value);
    request.setValue(hexValue);

안녕하세요 블록체인 초보입니다

항상 답변 주셔서 감사합니다.

질문할 내용입니다.

  1. Klaytn Wallet를 통해 만들어지는 Account를 KAS Wallet API로 변환 할수 있는지요?

계정 업데이트부분인데 이 부분이 맞는지요?
https://docs.klaytnapi.com/tutorial/wallet-transaction-api/wallet-transaction-update

관련 참고할 내용 또는 자바로 사용할수 있는 내용이 있는지 부탁드립니다.

수고하세요

안녕하세요.

AccountUpdate Transaction을 만드시면 되는데,
Klaytn Wallet을 통해 만들어진 Account의 Address에 KAS Wallet API로 부터 생성된 Public Key로 업데이트하여 Account의 Key Type을 바꿔서 방법을 사용하시면 됩니다.

예제와 자세한 설명은 KAS Tutorial의 계정 마이그레이션 문서 참고 부탁드립니다.

1 Like

@Kale

1. Klaytn Wallet API를 사용해서 만든 Account여야만 KAS Wallet API를 이용할 수 있지만, migration으로도 가능하잖아요? 아래처럼 해도 사용이 가능하던데 이 방법도 migration이 되는건가요??


const keyringContainer = new caver.keyringContainer()
const keyring = keyringContainer.keyring.createFromPrivateKey('KaytnWallet계정주소')
keyringContainer.add(keyring)
const kip7 = new caver.kct.kip7('컨트랙주소')
kip7.setWallet(keyringContainer)

위에 문의주신 코드는 migration 이라기 보다는
caver-js에서 제공되는 KeyringContainer를 사용하여 Transaction을 생성 및 sign하는 방식입니다.
위 코드를 사용하시면 KAS Wallet API를 통한 migration은 수행하시지 않으셔도 됩니다만, KeyringContainer를 통해 account의 Key를 직접 관리하셔야 하며 KAS Node API의 sendRawTransaction을 통해서 Transaction을 보내실 수 있습니다.

아래 문서 참고 부탁드립니다.
https://docs.klaytnapi.com/v/ko/sdk#kas-sdk-using-kaswallet