<초보개발> caver.java 1.5의 API ValueTransferMemo를 사용할 경우 생기는 내용이 궁금합니다

안녕하세요

klaytn 초보 개발자 입니다.(블럭체인 초보개발자)

caver.java 1.5의 API ValueTransferMemo를 사용할 경우 생기는 내용이 궁금합니다.

자바 API ValueTransferMemo 를 이용해서 ValueTransferMemo 를 사용해서 블럭체인과 영수증 발행은 되었습니다.
ValueTransferMemo 를 사용할 경우 궁금한점이 있어서 질문 올립니다.

  1. 스마트 컨트랙트 트랜잭션이 발생하는지요?
  2. ValueTransferMemo를 사용할 경우 저장되는 TOken은 어떤 Token 방식으로 저장이 되는지요?
  3. ValueTransferMemo를 사용해도 스마트 컨트랙트 트랜잭션이 생성이 되는것인지요?
  4. 예를 들어 KLAY 대신 홍길동 코인을 만들게 된다면 ValueTransferMemo 로만 가능한것인지요?
  5. NFT Token을 만들 수 있나요?

수고하세요

안녕하세요, 질문 올려주셔서 감사합니다.

  1. ValueTransferMemoSmartContractExecution(스마트 컨트랙트를 실행할 때에 사용되는 트랜잭션 타입)과 동일하게 트랜잭션 타입의 한 종류입니다. 하지만 ValueTransferMemo는 단순히 KLAY를 메모와 함께 전송하는 트랜잭션이라서 스마트 컨트랙트와는 무관합니다.
  2. ValueTransferMemo에는 Token을 저장하는 기능은 제공되지 않습니다. 이 부분은 코드와 함께 질문해 주시면 더욱 자세하게 답변드릴 수 있을 것 같습니다.
  3. 위에서 말씀드린 것과 같이, ValueTransferMemo 트랜잭션은 스마트 컨트랙트와 관련이 없습니다. 스마트 컨트랙트를 실행하고 싶으시다면 SmartContractExecution 트랜잭션을 사용하셔야 합니다. caver-java를 사용하여 Smart Contract를 사용하는 방법은 Klaytn Docs를 참고해 주시기 바랍니다.
  4. ValueTransferMemo를 사용해서 스마트컨트랙트를 실행할 수 없습니다. 위에서 답변드렸다시피 SmartContractExecution을 사용하셔야 합니다.
  5. NFT Token은 caver-java에서 제공하는 KIP17 클래스를 사용하시면 쉽게 KIP-17 컨트랙트를 배포하거나 토큰을 생성/전송할 수 있습니다.

감사합니다.

안녕하세요

klaytn 초보 개발자 입니다.(블럭체인 초보개발자)

  1. 현재 사용환경은 윈도우 10입니다.
    자바 버젼입니다.
    jdk1.8.0_161 사용
    caver 사용하는 버젼입니다.

    implementation ‘com.klaytn.caver:core:1.5.7’
    implementation ‘xyz.groundx.caver:caver-java-ext-kas:1.1.1-rc.1’

  2. KIP17 클래스를 사용하기 위해서 셋팅을 해주어야 하는 부분이 있는지요?
    예제를 봐서 값을 올리려는데 에러가 생깁니다.
    소스
    import static com.klaytn.caver.base.Accounts.BRANDON; → 에러 발생
    import static com.klaytn.caver.base.Accounts.LUMAN; → 에러 발생

    public static KIP17 kip17Contract;
    public static final String CONTRACT_NAME = “NFT”;
    public static final String CONTRACT_SYMBOL = “NFT_KALE”;

    public void sendingKLAYMemo17() throws IOException, CipherException, TransactionException ,Exception{
        Caver caver = new Caver(KLAYTON_URL);
        caver.wallet.add(KeyringFactory.createFromPrivateKey(from_address));
    
        KIP17DeployParams kip7DeployParam = new KIP17DeployParams(CONTRACT_NAME, CONTRACT_SYMBOL);
        SendOptions sendOptions = new SendOptions(LUMAN.getAddress(), BigInteger.valueOf(45000)); --> 에러 발생
        kip17Contract = KIP17.deploy(caver, kip7DeployParam, LUMAN.getAddress()); --> 에러발생			
    }	
    
    LUMAN 을 인식 못해서 에러 발생합니다.
    
  3. 스마트 컨트랙트에 대한 내용은 이론적으로는 내용을 봐서 알고 있습니다.
    // 스마트 컨트랙트란? 초보자를 위한 안내서
    // 왜 블록체인을 사용해야하나?. +부록 스마트 컨트랙트는 과연 스마트한가? | by Harry Hong | Merkline | Medium
    하지만 활용도가 궁금합니다.
    3.1 ValueTransferMemo로 쌓인 블럭은 추후에 Token이 없어서 KLAY에서만 사용가능하다.
    3.2 ValueTransferMemo로 쌓인 블럭은 스마트 컨트랙트가 아니기 때문에 예를들어 NFT 방식의 거래 그리고 ERC-20방식의 거래는 못하게 되는것인지요?
    너무 초보적인 질문을 드려 죄송합니다.

  4. ValueTransferMemo 사용하면서 생기는 궁금한점이 있어서 질문합니다.

    4.1 .setSignatures(signatureData) → 역할이 궁금합니다.(사인을 한다라는 의미로 알고 있는데 이 부분이 없을때 생기는 부분이 궁금합니다)
    4.2 .setValue(value) → 테스트시 지값에 12KLAY가 있었는데 value에 1 KLAY로 값을 보내니
    20건 블럭을 쌓으려고 하니까 문제가 13번째부터
    insufficient funds of the sender for value 라고 내용이 나옵니다.
    지갑에 KLAY가 부족하다라는 내용입니다.

                            여기에 들어가는 value가 정보에 대한 값어치로 인식이됩니다. 이 부분이 맞는것인지요?
                          
    
     				        ValueTransferMemo valueTransfer = new ValueTransferMemo.Builder()
     				                .setKlaytnCall(caver.rpc.getKlay())
     				                .setFrom(keyring.getAddress())
     				                .setTo(to_address)
     				                .setValue(value)
     				                .setGas(BigInteger.valueOf(75000))
     //				                .setSignatures(signatureData) --> 역할이 궁금합니다.(사인을 한다라는 의미는 알겟는데 이 부분이 없을때 생기는 부분이 궁금합니다) 에러가 발생해서 주석처리후 테스트 했습니다.
     			                    .setInput(input)
     				                .build();
    

수고하세요.

// ------------------------------- ValueTransferMemo 샘플 코드 [시작]---------------------------------------
Caver caver = new Caver(“https://api.baobab.klaytn.net:8651”);

			        //Decrypt keystore.
				     ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
			        String address = "0x000000000000000000000000000000000"; //포럼에 올리기 위해 사용한  값
			        String privateKey = "0x11111111111111111111111111111111111111";
			        SingleKeyring keyring = KeyringFactory.createWithSingleKey(address, privateKey);
			        
			        
			        //Add to caver wallet.
			        caver.wallet.add(keyring);
		
	//		        BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, "KLAY"));
			        BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, "kpeb"));
			        
			        
			        	try {

// SignatureData signatureData = new SignatureData(
// Numeric.hexStringToByteArray(“0x25”),
// Numeric.hexStringToByteArray(“0xf3d0cd43661cabf53425535817c5058c27781f478cb5459874feaa462ed3a29a”),
// Numeric.hexStringToByteArray(“0x6748abe186269ff10b8100a4b7d7fea274b53ea2905acbf498dc8b5ab1bf4fbc”)
// );

					        //Create a value transfer transaction
					        String val = "test value";					        
					        String input = Numeric.toHexString(val.getBytes(StandardCharsets.UTF_8));				        
					        ValueTransferMemo valueTransfer = new ValueTransferMemo.Builder()
					                .setKlaytnCall(caver.rpc.getKlay())
					                .setFrom(keyring.getAddress())
					                .setTo(to_address)
					                .setValue(value)
					                .setGas(BigInteger.valueOf(75000))
	//				                .setSignatures(signatureData) --> 역할이 궁금합니다.(사인을 한다라는 의미는 알겟는데 이 부분이 없을때 생기는 부분이 궁금합니다) 에러가 발생해서 주석처리후 테스트 했습니다.
				                    .setInput(input)
					                .build();
				
							
							
					        //Sign to the transaction
				
					        //Sign to the transaction
					        valueTransfer.sign(keyring);
					        
	
	
	//				        위 코드는 Keyring을 caver.wallet에 추가하고, 트랜잭션을 생성하고, caver.wallet.sign를 통해 이 트랜잭션에 서명합니다.
	//				        위 코드를 실행하면 아래 결과를 얻습니다. 위 코드가 실행되었을 때, RLP 인코딩된 트랜잭션 문자열은 아래와 같이 나타납니다. (The RLP-encoded string output you got could be different from the string output shown below.)				        
					        
					        String rlpEncoded = valueTransfer.getRLPEncoding();
					        System.out.println("RLP-encoded string: " + rlpEncoded);	
					        
					        //Send a transaction to the klaytn blockchain platform (Klaytn)
					        Bytes32 result = caver.rpc.klay.sendRawTransaction(valueTransfer.getRawTransaction()).send();
					        
	//				        System.out.println("aaaaaaaaaaaa========>6");
					        if(result.hasError()) {
					            throw new RuntimeException(result.getError().getMessage());
					        }
					        
					        
					        
					        //Check transaction receipt. 영수증 받아오기
			//		        //Sleep duration - 1000ms
			//		        //Attempts count - 15
					        TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(caver, 4000, 15);
							Gson gson = new Gson();
							String hashContent = gson.toJson(result.getResult());
					        com.klaytn.caver.methods.response.TransactionReceipt.TransactionReceiptData transactionReceipt = transactionReceiptProcessor.waitForTransactionReceipt(result.getResult());
						} catch(Exception error2) {
							error2.printStackTrace();
						}

// ------------------------------- ValueTransferMemo 샘플 코드 [END]---------------------------------------

  1. 먼저 caver-java-ext-kas는 caver-java와는 다르게 초기화 과정이 필요합니다.
    소스코드를 보니 KAS를 사용하시는 것이 아니라 별도의 EN노드를 사용하시는게 맞으실까요?
    만약 그렇다면 caver-java-ext-kas가 아니라 caver-java를 사용하셔야 합니다.
    만약 KAS API 서비스를 사용하시는 경우에는 auth 정보를 세팅해야 하는데, 문서를 참고해 주세요.
    BRANDON과 LUMAN은 테스트에 사용되는 계정이므로 따로 임포트해서 사용하실 필요가 없습니다.
    따로 private key를 관리하고 계시다면 아래와 같이 키링을 생성하고 in-memory wallet에 추가할 수 있습니다

    SingleKeyring keyring = KeyringFactory.createFromPrivateKey(privateKey);
    AbstractKeyring deployer = caver.wallet.add(keyring);

위와 같이 추가한 이후에는

KIP17DeployParams kip7DeployParam = new KIP17DeployParams(CONTRACT_NAME, CONTRACT_SYMBOL);
SendOptions sendOptions = new SendOptions(deployer.getAddress(), BigInteger.valueOf(45000));
KIP17 kip17Contract = KIP17.deploy(caver, kip7DeployParam, deployer.getAddress());

이런식으로 해주시면 됩니다.

  1. ValueTransferMemo는 KLAY 를 메모와 함께 전송하기 위해 제공되는 트랜잭션입니다. 스마트컨트랙트와는 무관하므로 NFT, FT를 전송할 때에는 SmartContractExecution 트랜잭션을 사용해야 합니다. 트랜잭션에 대한 내용은 문서를 읽어주시기 바랍니다.

  2. 4.1. setSignatures는 트랜잭션의 signatures 필드에 대한 setter입니다. setSignatures를 호출하지 않는 경우 valueTrasnferMemo 트랜잭션의 signatures는 빈 값을 가지게 됩니다. 에러가 발생하는 이유는 invalid한 signatures를 세팅하는 경우 발생합니다. caver.wallet.sign(keyring.getAddress(), valueTransfer) 함수를 사용해서 서명하면 해당 서명을 완료한 후 결과를 signatures필드에 세팅합니다. 만약 서명을 다른 곳에서 생성해서 이를 세팅하고자 하는 경우 SignatureData 를 사용하여 세팅할 수 있습니다.
    4.2. ValueTransferMemo 트랜잭션의 value 필드는 전송하고자 하는 KLAY의 양입니다. 그러므로 1KLAY를 지정하면 1KLAY만큼 to_address로 전송됩니다. 20 블록을 쌓으시려는 경우 value에 1KLAY보다 적게 지정하시면 됩니다.