ValueTransferMemo는 SmartContractExecution(스마트 컨트랙트를 실행할 때에 사용되는 트랜잭션 타입)과 동일하게 트랜잭션 타입의 한 종류입니다. 하지만 ValueTransferMemo는 단순히 KLAY를 메모와 함께 전송하는 트랜잭션이라서 스마트 컨트랙트와는 무관합니다.
ValueTransferMemo에는 Token을 저장하는 기능은 제공되지 않습니다. 이 부분은 코드와 함께 질문해 주시면 더욱 자세하게 답변드릴 수 있을 것 같습니다.
위에서 말씀드린 것과 같이, ValueTransferMemo 트랜잭션은 스마트 컨트랙트와 관련이 없습니다. 스마트 컨트랙트를 실행하고 싶으시다면 SmartContractExecution 트랜잭션을 사용하셔야 합니다. caver-java를 사용하여 Smart Contract를 사용하는 방법은 Klaytn Docs를 참고해 주시기 바랍니다.
ValueTransferMemo를 사용해서 스마트컨트랙트를 실행할 수 없습니다. 위에서 답변드렸다시피 SmartContractExecution을 사용하셔야 합니다.
NFT Token은 caver-java에서 제공하는 KIP17 클래스를 사용하시면 쉽게 KIP-17 컨트랙트를 배포하거나 토큰을 생성/전송할 수 있습니다.
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 을 인식 못해서 에러 발생합니다.
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 {
//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]---------------------------------------
먼저 caver-java-ext-kas는 caver-java와는 다르게 초기화 과정이 필요합니다.
소스코드를 보니 KAS를 사용하시는 것이 아니라 별도의 EN노드를 사용하시는게 맞으실까요?
만약 그렇다면 caver-java-ext-kas가 아니라 caver-java를 사용하셔야 합니다.
만약 KAS API 서비스를 사용하시는 경우에는 auth 정보를 세팅해야 하는데, 문서를 참고해 주세요.
BRANDON과 LUMAN은 테스트에 사용되는 계정이므로 따로 임포트해서 사용하실 필요가 없습니다.
따로 private key를 관리하고 계시다면 아래와 같이 키링을 생성하고 in-memory wallet에 추가할 수 있습니다
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());
이런식으로 해주시면 됩니다.
ValueTransferMemo는 KLAY 를 메모와 함께 전송하기 위해 제공되는 트랜잭션입니다. 스마트컨트랙트와는 무관하므로 NFT, FT를 전송할 때에는 SmartContractExecution 트랜잭션을 사용해야 합니다. 트랜잭션에 대한 내용은 문서를 읽어주시기 바랍니다.
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보다 적게 지정하시면 됩니다.