SDK
다음은 KAS SDK(caver-js extension)를 사용할 때 KAS의 Node API를 활용해 최신 블록 정보를 불러오는 방법입니다.
caver.initNodeAPI
함수에서는 useHttp
파라미터를 통해 KAS Node API를 호출할 때 사용할 provider를 지정할 수 있습니다. 자세한 내용은 WebSocket Provider를 사용하여 KAS Node API 호출하기를 참고하시기 바랍니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const blockNumber = await caver.rpc.klay.getBlockNumber();
console.log(blockNumber);
위의 코드를 실행하면 아래와 같이 최신 블록 넘버가 출력됩니다.
0x26b0736
다음은 KAS SDK(caver-js extension)를 사용하여 KAS의 Wallet API를 사용하여 계정을 생성하는 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const account = await caver.kas.wallet.createAccount();
console.log(account);
위의 코드를 실행하면 아래와 같이 KAS에 생성된 계정의 정보가 출력됩니다.
Account {
address: '0x4d6de1Fe6a281306C54AD81b79a0c137b13872DC',
chainId: 1001,
createdAt: 1602124416,
keyId: 'krn:1001:wallet:9c42dff5-d317-4abd-a7ab-576aad12ea07:account-pool:default:0x975fa77efbde347b0c471f0f29ba73c1281521f69485d650c8c10125e37b57fc',
krn: 'krn:1001:wallet:9c42dff5-d317-4abd-a7ab-576aad12ea07:account-pool:default',
publicKey: '0x0433f1b15d33e821155988408e949d21d5bd0d053d9f2ed90f3df57e96f0ce7a766ba36617f43f2ad1e0f3caca5bdb431a88c51c1bdaab8dc781589b1658e646f1',
updatedAt: 1602124416
}
다음은 KAS SDK(caver-js extension)를 사용하여 KAS의 Token History API를 사용하여 NFT 컨트랙트 리스트를 조회하는 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
// 쿼리 파라미터는 optional 파라미터이므로, 쿼리 파라미터 없이 실행할 수 있습니다.
const query = { size: 1 };
const nftContractList = await caver.kas.tokenHistory.getNFTContractList(query);
console.log(nftContractList);
위의 코드를 실행하면 아래와 같이 NFT 컨트랙트 리스트가 출력됩니다.
PageableNftContractDetails {
items: [
NftContractDetail {
address: '0x44b12eea91acb7866737e5157f1525503a3c7d11',
name: 'YouTube Thumbnail Token',
symbol: 'YTT',
totalSupply: '0x3',
createdAt: 1601417429,
updatedAt: 1601417429,
deletedAt: 0,
type: 'KIP-17',
status: 'completed'
}
],
cursor: 'omYpAQ8xGDrlz5O3akAbYDPolJ1r7kx3ZWg2L5mwDQ5GAk7ONYdpzXW0LBZVq2n60WRJKPg8469bvxMl1rmoaew3EQVa6Gq8KpeEdzB0O9vMX4NE1X9eb206gBNLJ7qW'
}
다음은 KAS SDK(caver-js extension)를 사용하여 KAS의 Anchor API를 사용하여 앵커링 데이터를 전송하는 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const operator = "0x{address in hex}";
const payload = { id: "12837851", customField: "custom test" };
const anchoringResult = await caver.kas.anchor.sendAnchoringData(
operator,
payload
);
console.log(anchoringResult);
위의 코드를 실행하면 아래와 같이 앵커링 데이터를 전송한 결과가 출력됩니다.
AnchorBlockStatus { status: 'succeed' }
다음은 KAS SDK(caver-js extension)를 사용할 때 KAS의 KIP-17 API를 활용한 KIP-17 컨트랙트 배포 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const name = "Jasmine";
const symbol = "JAS";
const alias = "jasmine-alias";
const result = await caver.kas.kip17.deploy(name, symbol, alias);
console.log(result);
위의 코드를 실행하면 아래와 같이 KIP-17 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
{
status: 'Submitted',
transactionHash: '0x4707420eeda479477eae0c73878d9186150c153a9e2cbfe43e9d37750b64a4ec',
}
다음은 KAS SDK(caver-js extension)를 사용할 때 KAS의 KIP-7 API를 활용한 KIP-7 컨트랙트 배포 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const name = "Jasmine";
const symbol = "JAS";
const decimals = 18;
const initialSupply = "1000000000000000000";
const alias = "jasmine-alias";
const result = await caver.kas.kip7.deploy(
name,
symbol,
decimals,
initialSupply,
alias
);
console.log(result);
위의 코드를 실행하면 아래와 같이 KIP-7 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
{
status: 'Submitted',
transactionHash: '0xf4a9c11fb3e5148050ac2a19ab221be72bebfea95078317dda01a1c207f6f779',
}
다음은 KAS SDK(caver-js extension)를 사용할 때 KAS의 KIP-37 API를 활용한 KIP-37 컨트랙트 배포 방법입니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const uri = "https://token-cdn-domain/{id}.json";
const alias = "jasmine-alias";
const result = await caver.kas.kip37.deploy(uri, alias);
console.log(result);
위의 코드를 실행하면 아래와 같이 KIP-37 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
{
status: 'Submitted',
transactionHash: '0x7dbb6f9c823f1f8bc4a3203486bd79d5979a1c7e23c207ccfe8fdb611bd5cfd8',
options: {
enableGlobalFeepayer: true,
userFeePayer: { krn: '', address: '' }
}
}
KAS SDK(caver-java extension)
KAS SDK(caver-java extension)를 통하여 KAS의 API를 사용하기 위해서는 사용할 "chain id" 와 "인증키"를 세팅해야 합니다. KAS API 서비스를 사용하기 위해서 초기화하는 방법은 아래와 같습니다.
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey)
위의 caver.initKASAPI
함수를 사용하면 Node API, Wallet API, Token History API, Anchor API, KIP-17 API, KIP-7 API, 그리고 KIP-37 API에서 사용되는 인증키를 한 번에 초기화 합니다. KAS API 서비스 별로 초기화 하는 방법은 아래와 같습니다. 마지막 파라미터로 Endpoint URL을 선택적으로 전달할 수 있으며, 따로 URL이 전달되지 않으면 아래와 같이 KAS Production URL이 기본값으로 세팅됩니다.
KAS Production URL
-
Node API:
https://node-api.klaytnapi.com
-
Wallet API:
https://wallet-api.klaytnapi.com
-
Anchor API:
https://anchor-api.klaytnapi.com
-
Token History API:
https://th-api.klaytnapi.com
-
KIP-17 API:
https://kip17-api.klaytnapi.com
-
KIP-7 API:
https://kip7-api.klaytnapi.com
-
KIP-37 API:
https://kip37-api.klaytnapi.com
// Node API 초기 세팅
caver.initNodeAPI(chainId, accessKeyId, secretAccessKey [, url]);
// Wallet API 초기 세팅
caver.initWalletAPI(chainId, accessKeyId, secretAccessKey [, url]);
// TokenHistory API 초기 세팅
caver.initTokenHistoryAPI(chainId, accessKeyId, secretAccessKey [, url]);
// Anchor API 초기 세팅
caver.initAnchorAPI(chainId, accessKeyId, secretAccessKey [, url]);
// KIP-17 API 초기 세팅
caver.initKIP17API(chainId, accessKeyId, secretAccessKey [, url]);
// KIP-7 API 초기 세팅
caver.initKIP7API(chainId, accessKeyId, secretAccessKey [, url]);
// KIP-37 API 초기 세팅
caver.initKIP37API(chainId, accessKeyId, secretAccessKey [, url]);
다음은 KAS SDK(caver-java extension)를 사용할 때 KAS의 Node API를 활용해 최신 블록 정보를 불러오는 방법입니다.
import com.klaytn.caver.methods.response.Quantity;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
public class HelloKAS {
public static void getBlockNumber() throws IOException {
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey);
Quantity response = caver.rpc.klay.getBlockNumber().send();
System.out.println(response.getResult());
}
public static void main(String[] args) throws IOException {
getBlockNumber();
}
}
위의 코드를 실행하면 아래와 같이 최신 블록 넘버가 출력됩니다.
0x26b0736
다음은 KAS SDK(caver-java extension)를 사용하여 KAS의 Wallet API를 사용하여 계정을 생성하는 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.wallet.model.Account;
public class HelloKAS {
public static void createAccount() throws ApiException {
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey);
Account account = caver.kas.wallet.createAccount();
System.out.println(account);
}
public static void main(String[] args) throws ApiException {
createAccount();
}
}
위의 코드를 실행하면 아래와 같이 KAS에 생성된 계정의 정보가 출력됩니다.
class Account {
address: 0x0BA67C887F922AF3d0D781dD940c6d0C80D395DE
chainId: 1001
createdAt: 1602550121
keyId: krn:1001:wallet:d5c346f5-bb80-4f45-9093-57e25205cdc8:account-pool:pool:0xbedefad10db4df3488aaf1669b9164549c1aebe7c326f4b19ba6c6ce0f330fa5
krn: krn:1001:wallet:d5c346f5-bb80-4f45-9093-57e25205cdc8:account-pool:pool
publicKey: 0x041d56cbe46915854600c9d3c4ef614906f27473abe948cf587d990dcbce030d5989f4458bc470e44b2916d75194729102bb60e1e6a27c01030de84208a13232c2
updatedAt: 1602550121
multiSigKeys: null
threshold: null
}
다음은 KAS SDK(caver-java extension)를 사용하여 KAS의 Token History API를 사용하여 NFT 컨트랙트 리스트를 조회하는 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.kas.tokenhistory.TokenHistoryQueryOptions;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.tokenhistory.model.PageableNftContractDetails;
public class HelloKAS {
public static void getNFTContractList() throws ApiException {
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey);
// 쿼리 파라미터는 optional 파라미터이므로, 쿼리 파라미터 없이 실행할 수 있습니다.
TokenHistoryQueryOptions options = new TokenHistoryQueryOptions();
options.setSize((long)1);
PageableNftContractDetails result = caver.kas.tokenHistory.getNFTContractList(options);
System.out.println(result);
}
public static void main(String[] args) throws ApiException {
getNFTContractList();
}
}
위의 코드를 실행하면 아래와 같이 NFT 컨트랙트 리스트가 출력됩니다.
class PageableNftContractDetails {
items: [class NftContractDetail {
address: 0x1d15887950aa821814b793ed4a4cfa38937df5da
name: KIP17
symbol: KIP17
totalSupply: 0x0
createdAt: 1602495497
updatedAt: 1602495497
deletedAt: 0
type: KIP-17
status: completed
}]
cursor: owN0deEJPGMZ69Q3L5V34MAgJ5xpNmrQ9lWk0EDvxv7bkQq1aLX58AZz0GlgNEyd1kRwK94JBdVP6rm3eopO2DMWYz6BKoXPYbdOewaGqZ1728La7rbx8YDBgW2lkqAK
}
다음은 KAS SDK(caver-java extension)를 사용하여 KAS의 Anchor API를 사용하여 앵커링 데이터를 전송하는 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.anchor.model.AnchorBlockPayload;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.anchor.model.AnchorBlockStatus;
public class HelloKAS {
public static void sendAnchoringData() throws ApiException {
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey);
String operatorID = "operatorId";
AnchorBlockPayload payload = new AnchorBlockPayload();
payload.put("id", "12837851");
payload.put("field", "1");
payload.put("filed2", 4);
AnchorBlockStatus status = caver.kas.anchor.sendAnchoringData(operatorID, payload);
System.out.println();
}
public static void main(String[] args) throws ApiException{
sendAnchoringData();
}
}
위의 코드를 실행하면 아래와 같이 앵커링 데이터를 전송한 결과가 출력됩니다.
class AnchorBlockStatus {
status: succeed
}
다음은 KAS SDK(caver-java extension)를 사용할 때 KAS의 KIP-17 API를 활용한 KIP-17 컨트랙트 배포 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.kip17.model.Kip17TransactionStatusResponse;
public class HelloKAS {
public static void deployKip17() throws ApiException {
CaverExtKAS caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
String operatorID = "operatorId";
String name = "My First KIP-17";
String symbol = "MFK";
String alias = "my-first-kip17";
Kip17TransactionStatusResponse res = caver.kas.kip17.deploy(name, symbol, alias);
System.out.println(res);
}
public static void main(String[] args) throws ApiException {
deployKip17();
}
}
위의 코드를 실행하면 아래와 같이 KIP-17 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
class Kip17TransactionStatusResponse {
status: Submitted
transactionHash: 0x....
}
다음은 KAS SDK(caver-java extension)를 사용할 때 KAS의 KIP-7 API를 활용한 KIP-7 컨트랙트 배포 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.kip7.model.Kip7TransactionStatusResponse;
public class HelloKAS {
public static void deployKip7() throws ApiException {
CaverExtKAS caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
String alias = "my-first-kip7";
String name = "My First KIP-7";
String symbol = "MFK7";
int decimals = 18;
BigInteger initial_supply = BigInteger.valueOf(100_000).multiply(BigInteger.TEN.pow(18)); // 100000 * 10^18
Kip7TransactionStatusResponse res = caver.kas.kip7.deploy(name, symbol, decimals, initial_supply, testAlias);
System.out.println(res);
}
public static void main(String[] args) throws ApiException {
deployKip7();
}
}
위의 코드를 실행하면 아래와 같이 KIP-7 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
class Kip7TransactionStatusResponse {
status: Submitted
transactionHash: 0x....
}
다음은 KAS SDK(caver-java extension)를 사용할 때 KAS의 KIP-37 API를 활용한 KIP-37 컨트랙트 배포 방법입니다.
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.ApiException;
import xyz.groundx.caver_ext_kas.rest_client.io.swagger.client.api.kip37.model.Kip37DeployResponse;
public class HelloKAS {
public static void deployKip37() throws ApiException {
CaverExtKAS caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
String alias = "my-first-kip37-contract";
String uri = "https://token-cdn-domain/{id}.json";
Kip37FeePayerOptions option = new Kip37FeePayerOptions();
option.setEnableGlobalFeePayer(true);
Kip37DeployResponse deployResponse = caver.kas.kip37.deploy(uri, alias, option);
System.out.println(deployResponse);
}
public static void main(String[] args) throws ApiException {
deployKip37();
}
}
위의 코드를 실행하면 아래와 같이 KIP-37 컨트랙트 배포 API를 호출한 결과가 출력됩니다.
class Kip37DeployResponse {
status: Submitted
transactionHash: 0x....
options: class Kip37FeePayerOptionsResponse {
enableGlobalFeepayer: true
userFeePayer: class Kip37FeePayerOptionsUserFeePayer {
krn:
address:
}
}
}
KAS Wallet API의 Kaia 계정으로 스마트 컨트랙트 사용하기
KAS SDK v1.0.2부터는 caver.wallet
에서 KAS의 Wallet API를 사용하여 동작하는 지갑인 KASWallet
이 제공됩니다. 이를 통하여 KAS Wallet API의 Kaia 계정을 사용하여 caver.contract
패키지와 caver.kct
를 사용할 수 있습니다.
KAS Wallet API의 Kaia 계정으로 caver.contract 사용하기
caver.contract
는 caver.wallet
을 사용하여 Kaia에 컨트랙트를 배포하거나 기배포된 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet
은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.contract
를 사용하면 KAS Wallet API의 Kaia 계정을 사용하여 손쉽게 Kaia에 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 Kaia 계정을 사용하여 caver.contract
를 사용하는 방법은 기존의 caver.contract
를 사용하는 방법과 동일합니다. 여기서는 간단하게 배포하고 실행하는 방법을 설명합니다. 여기서 스마트 컨트랙트를 배포하고 실행할 때 사용되는 Kaia 계정은 KAS Wallet API에서 관리되고 있는 Kaia 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KAIA를 소유하고 있어야 합니다.
KAS SDK(caver-js extension)
caver-js-ext-kas를 사용하여 스마트 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require("caver-js-ext-kas");
const chainId = 1001;
const accessKeyId = "{access key ID of your KAS account}";
const secretAccessKey = "{secret access key of your KAS account}";
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const abi = [
{
constant: true,
inputs: [{ name: "key", type: "string" }],
name: "get",
outputs: [{ name: "", type: "string" }],
payable: false,
stateMutability: "view",
type: "function",
},
{
constant: false,
inputs: [
{ name: "key", type: "string" },
{ name: "value", type: "string" },
],
name: "set",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function",
},
];
const byteCode =
"0x608060405234801561001057600080fd5b5061051f8...";
const contract = new caver.contract(abi);
// SmartContractDeploy 트랜잭션을 발생시키는 from 계정은 충분한 KAIA를 소유하고 있어야 합니다.
const deployed = await contract.deploy({ data: byteCode }).send({
from: "0x{the address of a Kaia account in KAS Wallet API}",
gas: 10000000,
});
console.log(`Deployed contract address: ${deployed.options.address}`);
위의 코드를 실행하면 아래와 같이 배포된 스마트 컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0x5D3Cd9eB73f00BbECB949DCE08BB26019FcB599f
caver-js-ext-kas를 사용하여 Kaia에 배포된 스마트 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require("caver-js-ext-kas");
const chainId = 1001;
const accessKeyId = "{access key ID of your KAS account}";
const secretAccessKey = "{secret access key of your KAS account}";
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const abi = [
{
constant: true,
inputs: [{ name: "key", type: "string" }],
name: "get",
outputs: [{ name: "", type: "string" }],
payable: false,
stateMutability: "view",
type: "function",
},
{
constant: false,
inputs: [
{ name: "key", type: "string" },
{ name: "value", type: "string" },
],
name: "set",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function",
},
];
const contractAddress = "0x5D3Cd9eB73f00BbECB949DCE08BB26019FcB599f";
const contract = new caver.contract(abi, contractAddress);
// SmartContractExecution 트랜잭션을 발생시키는 from 계정은 충분한 KAIA를 소유하고 있어야 합니다.
const receipt = await contract.methods.set("key", "value").send({
from: "0x{the address of a Kaia account in KAS Wallet API}",
gas: 5000000,
});
console.log(receipt);
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 실행 결과가 출력됩니다.
{
blockHash: '0x86ba9ee3428d575438dc7dd0a83d151e400b853a948365d1aef0f73794d0e194',
blockNumber: 45759390,
contractAddress: null,
from: '0x2f87b35ce367eefaa78a5d922dab39113e0bd5a9',
gas: '0x2faf080',
gasPrice: '0x5d21dba00',
gasUsed: 62351,
input: '0xe942b...',
logsBloom: '0x00000...',
nonce: '0x1',
senderTxHash: '0x4eb995c841a81153f7cfec45b316b2b59c64d28e1af0be8b157d0e3f87647744',
signatures: [
{
V: '0x7f6',
R: '0x2bc966ba636c8b6358783f852ad64f372a97f8513b38e5a2dc84524850c3a6d7',
S: '0x147e4d0a93c5052dee2d8ce5c783d10396c8f5da438b659898d0eb47c832d648',
},
],
status: true,
to: '0x5d3cd9eb73f00bbecb949dce08bb26019fcb599f',
transactionHash: '0x4eb995c841a81153f7cfec45b316b2b59c64d28e1af0be8b157d0e3f87647744',
transactionIndex: 0,
type: 'TxTypeSmartContractExecution',
typeInt: 48,
value: '0x0',
events: {},
}
KAS SDK(caver-java extension)
caver-java-ext-kas를 사용하여 스마트 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.contract.Contract;
import com.klaytn.caver.contract.SendOptions;
import com.klaytn.caver.utils.ChainId;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
public class SampleContract {
static final String BINARY = "608060405234801561001057600080fd5b5061051f...";
static final String ABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]";
public static void main(String[] args) throws NoSuchMethodException, TransactionException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
String deployer = "0x{address}";
BigInteger gas = BigInteger.valueOf(10000000);
SendOptions sendOptions = new SendOptions(deployer, gas);
Contract contract = new Contract(caver, ABI);
Contract sampleContract = contract.deploy(sendOptions, BINARY);
System.out.println("Deployed contract address: " + sampleContract.getContractAddress());
}
}
위의 코드를 실행하면 아래와 같이 배포된 스마트컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0x5D3Cd9eB73f00BbECB949DCE08BB26019FcB599f
caver-java-ext-kas를 사용하여 Kaia에 배포된 스마트 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.contract.Contract;
import com.klaytn.caver.contract.SendOptions;
import com.klaytn.caver.methods.response.TransactionReceipt;
import com.klaytn.caver.utils.ChainId;
import org.web3j.abi.datatypes.Type;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
public class SampleContract {
static final String ABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]";
public static void main(String[] args) throws NoSuchMethodException, TransactionException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
String contractAddress = "0x5D3Cd9eB73f00BbECB949DCE08BB26019FcB599f";
String executor = "0x{address}";
Contract sampleContract = new Contract(caver, ABI, contractAddress);
SendOptions sendOptions = new SendOptions(executor, BigInteger.valueOf(5000000));
TransactionReceipt.TransactionReceiptData receiptData = sampleContract.send(sendOptions, "set", "key", "value");
System.out.println(receiptData.getTransactionHash());
}
}
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 Hash값이 출력됩니다.
0x4eb995c841a81153f7cfec45b316b2b59c64d28e1af0be8b157d0e3f87647744
Caver의 caver.contract
에 관한 자세한 내용은 caver-js 혹은 caver-java을 확인하십시오.
KAS Wallet API의 Kaia 계정으로 caver.kct.kip7 사용하기
caver.kct.kip7
은 caver.wallet
을 사용하여 Kaia에 KIP-7 토큰 컨트랙트를 배포하거나 기배포된 KIP-7 토큰 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet
은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.kct.kip7
를 사용하면 KAS Wallet API의 Kaia 계정을 사용하여 손쉽게 Kaia에 KIP-7 토큰 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 Kaia 계정을 사용하여 caver.kct.kip7
를 사용하는 방법은 기존의 caver.kct.kip7
를 사용하는 방법과 동일합니다. 여기서는 간단하게 KIP-7 토큰 컨트랙트를 배포하고 실행하는 방법을 설명합니다. 여기서 토큰 컨트랙트를 배포하고 실행할 때 사용되는 계정은 KAS Wallet API에서 관리되고 있는 Kaia 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KAIA를 소유하고 있어야 합니다.
KAS SDK(caver-js extension)
caver-js-ext-kas를 사용하여 KIP-7 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require("caver-js-ext-kas");
const chainId = 1001;
const accessKeyId = "{access key ID of your KAS account}";
const secretAccessKey = "{secret access key of your KAS account}";
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const deployed = await caver.kct.kip7.deploy(
{
name: "Jasmine",
symbol: "JAS",
decimals: 18,
initialSupply: "100000000000000000000",
},
"0x{the address of a Kaia account in KAS Wallet API}"
);
console.log(`Deployed contract address: ${deployed.options.address}`);
위의 코드를 실행하면 아래와 같이 배포된 KIP-7 토큰 컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb
caver-js-ext-kas를 사용하여 Kaia에 배포된 KIP-7 토큰 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require("caver-js-ext-kas");
const chainId = 1001;
const accessKeyId = "{access key ID of your KAS account}";
const secretAccessKey = "{secret access key of your KAS account}";
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const contractAddress = "0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb";
const kip7 = new caver.kct.kip7(contractAddress);
const receipt = await kip7.transfer("0x{address in hex}", 1, {
from: "0x{the address of a Kaia account in KAS Wallet API}",
});
console.log(receipt);
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 실행 결과가 출력됩니다.
{
blockHash: '0x00335de146548227d0800087685380efcfd206f7fe1e905874ad4b6bb8e0a3f7',
blockNumber: 45760341,
contractAddress: null,
from: '0x2f87b35ce367eefaa78a5d922dab39113e0bd5a9',
gas: '0xd637',
gasPrice: '0x5d21dba00',
gasUsed: 41487,
input: '0xa9059...',
logsBloom: '0x00000...',
nonce: '0x5',
senderTxHash: '0x752d6ac8cf7ba0e12de8c0200fda68925f588a0b614118e19568eec4ad3fe4dd',
signatures: [
{
V: '0x7f5',
R: '0xf9d37f109b6e17099d7808ded81fe9e69086a710e027d0c64330c3b434022ea4',
S: '0x20cb7a6afdeeaf35bb83ed9d0ca9caca17746ed475af44fe342c271ac638e1b1',
},
],
status: true,
to: '0x42c3809eeed7c5c497067fe4092d1c354d3a01cb',
transactionHash: '0x752d6ac8cf7ba0e12de8c0200fda68925f588a0b614118e19568eec4ad3fe4dd',
transactionIndex: 0,
type: 'TxTypeSmartContractExecution',
typeInt: 48,
value: '0x0',
events: {
Transfer: {
address: '0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb',
blockNumber: 45760341,
transactionHash: '0x752d6ac8cf7ba0e12de8c0200fda68925f588a0b614118e19568eec4ad3fe4dd',
transactionIndex: 0,
blockHash: '0x00335de146548227d0800087685380efcfd206f7fe1e905874ad4b6bb8e0a3f7',
logIndex: 0,
id: 'log_29039dd9',
returnValues: {
'0': '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
'1': '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
'2': '1',
from: '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
to: '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
value: '1',
},
event: 'Transfer',
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
raw: {
data: '0x0000000000000000000000000000000000000000000000000000000000000001',
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x0000000000000000000000002f87b35ce367eefaa78a5d922dab39113e0bd5a9',
'0x0000000000000000000000002f87b35ce367eefaa78a5d922dab39113e0bd5a9',
],
},
},
},
}
KAS SDK(caver-java extension)
caver-java-ext-kas를 사용하여 KIP-7 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.kct.kip7.KIP7;
import com.klaytn.caver.utils.ChainId;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
public class SampleKIP7 {
public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, TransactionException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
//deployer must have KAIA to deploy and execute smart contract.
String deployer = "0x{address}";
BigInteger initialSupply = BigInteger.TEN.multiply(BigInteger.TEN.pow(18)); // 10 * 10^18
KIP7 kip7 = KIP7.deploy(caver, deployer, "JASMINE", "JAS", 18, initialSupply);
System.out.println("Deployed contract address : " + kip7.getContractAddress());
}
위의 코드를 실행하면 아래와 같이 배포된 KIP-7 토큰 컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb
caver-java-ext-kas를 사용하여 Kaia에 배포된 KIP-7 토큰 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.contract.SendOptions;
import com.klaytn.caver.kct.kip7.KIP7;
import com.klaytn.caver.methods.response.TransactionReceipt;
import com.klaytn.caver.utils.ChainId;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
public class SampleKIP7 {
public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, TransactionException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
//from must have KAIA to deploy and execute smart contract.
String from = "0x{address}";
String to = "0x{address}";
String contractAddress = "0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb";
KIP7 kip7 = new KIP7(caver, contractAddress);
BigInteger transferAmount = BigInteger.ONE.multiply(BigInteger.TEN.pow(18));
SendOptions sendOptions = new SendOptions(from);
TransactionReceipt.TransactionReceiptData receiptData = kip7.transfer(to, transferAmount, sendOptions);
System.out.println(receiptData.getTransactionHash());
}
}
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 Hash값이 출력됩니다.
0x752d6ac8cf7ba0e12de8c0200fda68925f588a0b614118e19568eec4ad3fe4dd
Caver의 caver.kct.kip7
에 관한 자세한 내용은 caver-js 혹은 caver-java을 확인하십시오.
KAS Wallet API의 Kaia 계정으로 caver.kct.kip17 사용하기
caver.kct.kip17
는 caver.wallet
을 사용하여 Kaia에 KIP-17 토큰 컨트랙트를 배포하거나 기배포된 KIP-17 토큰 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet
은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.kct.kip17
를 사용하면 KAS Wallet API의 Kaia 계정을 사용하여 손쉽게 Kaia에 KIP-17 토큰 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 Kaia 계정을 사용하여 caver.kct.kip17
를 사용하는 방법은 기존의 caver.kct.kip17
를 사용하는 방법과 동일합니다. 여기서는 간단하게 KIP-17 토큰 컨트랙트를 배포하고 실행하는 방법을 설명합니다. 여기서 토큰 컨트랙트를 배포하고 실행할 때 사용되는 계정은 KAS Wallet API에서 관리되고 있는 Kaia 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KAIA를 소유하고 있어야 합니다.
KAS SDK는 KAS의 KIP-17 API를 제공합니다. KAS의 KIP-17 API를 사용하려면 Tutorial 혹은 API Reference Docs(JS, JAVA)를 참고하세요.
KAS SDK(caver-js extension)
caver-js-ext-kas를 사용하여 KIP-17 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require("caver-js-ext-kas");
const chainId = 1001;
const accessKeyId = "{access key ID of your KAS account}";
const secretAccessKey = "{secret access key of your KAS account}";
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
const deployed = await caver.kct.kip17.deploy(
{
name: "Jasmine",
symbol: "JAS",
},
"0x{the address of a Kaia account in KAS Wallet API}"
);
console.log(`Deployed contract address: ${deployed.options.address}`);
위의 코드를 실행하면 아래와 같이 배포된 KIP-17 토큰 컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0xAD719B194457D0641B410Ce75C4D22442533A781
caver-js-ext-kas를 사용하여 Kaia에 배포된 KIP-17 토큰 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-js-ext-kas
const CaverExtKAS = require('caver-js-ext-kas')
const chainId = 1001
const accessKeyId = '{access key ID of your KAS account}'
const secretAccessKey = '{secret access key of your KAS account}'
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey)
const contractAddress = '0xAD719B194457D0641B410Ce75C4D22442533A781'
const kip17 = new caver.kct.kip17(contractAddress)
const receipt = await kip17.mintWithTokenURI('0x{the recipient's Kaia account address in hex}', tokenId, tokenURI, { from: '0x{the address of a Kaia account in KAS Wallet API}' })
console.log(receipt)
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 실행 결과가 출력됩니다.
{
blockHash: '0xefde3a7ab101486edb9aa77b7f2f8163eb0aaaa4e8ed6d9899715a624a8daabd',
blockNumber: 45760605,
contractAddress: null,
from: '0x2f87b35ce367eefaa78a5d922dab39113e0bd5a9',
gas: '0x4246d',
gasPrice: '0x5d21dba00',
gasUsed: 194419,
input: '0x50bb4...',
logsBloom: '0x00000...',
nonce: '0x7',
senderTxHash: '0x6cf0c3a649a15001ede8ad522c623affe453b7da6be27276badba3a8189587be',
signatures: [
{
V: '0x7f5',
R: '0x1441ab33ade89a81ffb670791178035f8af31940b77d10cd0dc2aa86457738c9',
S: '0x30a7cf7258f05fcf270996b14aaaba00744d6c790721de3fce21c70397c07157',
},
],
status: true,
to: '0xad719b194457d0641b410ce75c4d22442533a781',
transactionHash: '0x6cf0c3a649a15001ede8ad522c623affe453b7da6be27276badba3a8189587be',
transactionIndex: 0,
type: 'TxTypeSmartContractExecution',
typeInt: 48,
value: '0x0',
events: {
Transfer: {
address: '0xAD719B194457D0641B410Ce75C4D22442533A781',
blockNumber: 45760605,
transactionHash: '0x6cf0c3a649a15001ede8ad522c623affe453b7da6be27276badba3a8189587be',
transactionIndex: 0,
blockHash: '0xefde3a7ab101486edb9aa77b7f2f8163eb0aaaa4e8ed6d9899715a624a8daabd',
logIndex: 0,
id: 'log_54be99f9',
returnValues: {
'0': '0x0000000000000000000000000000000000000000',
'1': '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
'2': '1',
from: '0x0000000000000000000000000000000000000000',
to: '0x2F87b35Ce367EEfaA78a5d922DaB39113E0bd5a9',
tokenId: '1',
},
event: 'Transfer',
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
raw: {
data: '0x',
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x0000000000000000000000002f87b35ce367eefaa78a5d922dab39113e0bd5a9',
'0x0000000000000000000000000000000000000000000000000000000000000001',
],
},
},
},
}
KAS SDK(caver-java extension)
caver-java-ext-kas를 사용하여 KIP-17 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.kct.kip17.KIP17;
import com.klaytn.caver.utils.ChainId;
import org.junit.Ignore;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class SampleKIP17 {
public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, TransactionException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
//deployer must have KLAY to deploy and execute smart contract.
String deployer = "0x{deployer address}";
KIP17 kip17 = KIP17.deploy(caver, deployer, "JASMINE", "JAS");
System.out.println("Deployed contract address : " + kip17.getContractAddress());
}
}
위의 코드를 실행하면 아래와 같이 배포된 KIP-17 토큰 컨트랙트의 주소가 출력됩니다.
Deployed contract address: 0xAD719B194457D0641B410Ce75C4D22442533A781
caver-java-ext-kas를 사용하여 Kaia에 배포된 KIP-17 토큰 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-java-ext-kas
import com.klaytn.caver.contract.SendOptions;
import com.klaytn.caver.kct.kip17.KIP17;
import com.klaytn.caver.methods.response.TransactionReceipt;
import com.klaytn.caver.utils.ChainId;
import org.junit.Ignore;
import org.web3j.protocol.exceptions.TransactionException;
import xyz.groundx.caver_ext_kas.CaverExtKAS;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
public class SampleKIP17 {
public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, TransactionException {
String accessKey = "your access key";
String secretAccessKey = "your secret access key";
CaverExtKAS caver = new CaverExtKAS(ChainId.BAOBAB_TESTNET, accessKey, secretAccessKey);
String contractAddress = "0xAD719B194457D0641B410Ce75C4D22442533A781";
KIP17 kip17 = new KIP17(caver, contractAddress);
//from must have KAIA to deploy and execute smart contract.
String from = "0x{from address}";
String to = "0x{to address}";
String tokenURI = "tokenURI";
SendOptions sendOptions = new SendOptions(from);
TransactionReceipt.TransactionReceiptData receiptData = kip17.mintWithTokenURI(to, BigInteger.ZERO, tokenURI, sendOptions);
System.out.println(receiptData.getTransactionHash());
}
}
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 Hash값이 출력됩니다.
0x6cf0c3a649a15001ede8ad522c623affe453b7da6be27276badba3a8189587be
Caver의 caver.kct.kip17
에 관한 자세한 내용은 caver-js 혹은 caver-java을 확인하십시오.
KAS SDK에서 KeyringContainer 사용하기
KAS SDK에서는 기존 caver의 caver.wallet
에서 제공되던 in-memory wallet인 KeyringContainer
을 대신하여 KAS Wallet API를 사용하는 KASWallet
이 제공됩니다. KAS SDK에서 in-memory wallet인 KeyringContainer
를 사용하고 싶으면 별도의 인스턴스 생성이 필요합니다.
caver-js-ext-kas와 caver-java-ext-kas 모두 caver.contract
와 caver.kct
에서 컨트랙트를 배포하거나 실행할 때 사용하는 지갑을 지정할 수 있는 setWallet
함수가 제공됩니다. 이를 통하여 인스턴스 별로 컨트랙트를 배포하거나 실행할 때 사용될 지갑을 유연하게 지정하여 사용할 수 있습니다.
KAS SDK(caver-js extension)
먼저 caver-js-ext-kas를 사용하여 KeyringContainer
인스턴스를 생성하는 방법은 아래와 같습니다.
const keyringContainer = new caver.keyringContainer();
위의 방식으로 생성된 keyringContainer를 caver.contract
에서 사용하는 방법은 아래와 같습니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
// 스마트 컨트랙트 배포할 때에 keyringContainer 사용하기
const contract = new caver.contract(abi);
contract.setWallet(keyringContainer);
const deployed = await contract
.deploy({ data: byteCode })
.send({ from: keyring.address, gas: 10000000 });
const receipt = await deployed.methods
.set("key", "value")
.send({ from: keyring.address, gas: 5000000 });
위의 코드를 실행하여 배포된 deployed
컨트랙트 인스턴스도 또한 keyringContainer
를 사용하는 객체입니다. 만약 이미 배포된 컨트랙트를 사용하는 경우 아래와 같이 setWallet
함수를 사용하여 keyringContiainer를 사용하도록 지정할 수 있습니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
// 스마트 컨트랙트 실행할 때에 keyringContainer 사용하기
const contract = new caver.contract(abi, contractAddress);
contract.setWallet(keyringContainer);
const receipt = await contract.methods
.set("key", "value")
.send({ from: keyring.address, gas: 5000000 });
따로 생성한 keyringContainer를 caver.kct
에서 사용하는 방법은 아래와 같습니다. KIP-7 혹은 KIP-17 토큰 컨트랙트를 배포하는 static 함수인 deploy의 경우에는 마지막 파라미터로 사용할 지갑을 넘겨줄 수 있습니다.
caver.kct.kip7
에서 keyringContainer를 사용하여 KIP-7 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
// 마지막 파라미터로 keyringContainer를 전달하면 내부적으로 인스턴스를 생성하여 setWallet을 호출
const kip7 = await caver.kct.kip7.deploy(
{
name: "Jasmine",
symbol: "JAS",
decimals: 18,
initialSupply: "100000000000000000000",
},
keyring.address,
keyringContainer
);
const receipt = await kip7.transfer("0x{address in hex}", 1, {
from: keyring.address,
});
이미 배포된 KIP-7 토큰 컨트랙트를 실행할 때 keyringContainer를 사용하기 위해서는 아래와 같이 setWallet
함수를 호출해 주어야 합니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
const kip7 = new caver.kct.kip7(contractAddress);
kip7.setWallet(keyringContainer);
const receipt = await kip7.transfer("0x{address in hex}", 1, {
from: keyring.address,
});
caver.kct.kip17
에서 keyringContainer를 사용하여 KIP-17 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
// 마지막 파라미터로 keyringContainer를 전달하면 내부적으로 인스턴스를 생성하여 setWallet을 호출
const kip17 = await caver.kct.kip17.deploy(
{
name: "Jasmine",
symbol: "JAS",
},
keyring.address,
keyringContainer
);
const receipt = await kip17.transfer("0x{address in hex}", 1, {
from: keyring.address,
});
caver.contract
의 deploy
와 마찬가지로 배포된 결과로 리턴되는 인스턴스는 keyringContainer
를 사용하는 객체입니다.
이미 배포된 KIP-17 토큰 컨트랙트를 실행할 때 keyringContainer를 사용하기 위해서는 아래와 같이 setWallet
함수를 호출해 주어야 합니다.
const keyringContainer = new caver.keyringContainer();
const keyring =
keyringContainer.keyring.createFromPrivateKey("0x{private key}");
keyringContainer.add(keyring);
const kip17 = new caver.kct.kip17(contractAddress);
kip17.setWallet(keyringContainer);
const receipt = await kip17.mintWithTokenURI(
"0x{address in hex}",
tokenId,
tokenURI,
{ from: keyring.address }
);
KAS SDK(caver-java extension)
먼저 caver-java-ext-kas를 사용하여 KeyringContainer
인스턴스를 생성하는 방법은 아래와 같습니다.
KeyringContainer container = new KeyringContainer();
위의 방식으로 생성된 keyringContainer를 caver.contract
에서 사용하는 방법은 아래와 같습니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"))
Contract contract = new Contract(caver, abi);
contract.setWallet(container);
SendOptions deploySendOptions = new SendOptions(keyring.getAddress(), BigInteger.valueOf(5000000));
Contract deployed = contract.deploy(deploySendOptions, bytecode);
SendOptions exeuteSendOptions = new SendOptions(keyring.getAddress(), BigInteger.valueOf(2500000));
TransactionReceipt.TransactionReceiptData receiptData = deployed.send(exeuteSendOptions, "set", "key", "value");
위의 코드를 실행하여 배포된 deployed
컨트랙트 인스턴스도 또한 keyringContainer
를 사용하는 객체입니다. 만약 이미 배포된 컨트랙트를 사용하는 경우 아래와 같이 setWallet
함수를 사용하여 keyringContiainer를 사용하도록 지정할 수 있습니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"));
String contractAddress = "0xAD719B194457D0641B410Ce75C4D22442533A781";
Contract deployed = new Contract(caver, abi, contractAddress);
deployed.setWallet(container);
SendOptions exeuteSendOptions = new SendOptions(keyring.getAddress(), BigInteger.valueOf(2500000));
TransactionReceipt.TransactionReceiptData receiptData = deployed.send(exeuteSendOptions, "set", "key", "value");
따로 생성한 keyringContainer를 caver.kct
에서 사용하는 방법은 아래와 같습니다. KIP-7 혹은 KIP-17 토큰 컨트랙트를 배포하는 static 함수인 deploy의 경우에는 마지막 파라미터로 사용할 지갑을 넘겨줄 수 있습니다.
caver.kct.kip7
에서 keyringContainer를 사용하여 KIP-7 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring deployer_keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"));
BigInteger initialSupply = BigInteger.TEN.multiply(BigInteger.TEN.pow(18)); // 10 * 10^18
KIP7 kip7 = KIP7.deploy(caver, deployer_keyring.getAddress(), "JASMINE", "JAS", 18, initialSupply, container);
이미 배포된 KIP-7 토큰 컨트랙트를 실행할 때 keyringContainer를 사용하기 위해서는 아래와 같이 setWallet
함수를 호출해 주어야 합니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring executor_keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"));
String contractAddress = "0xAD719B194457D0641B410Ce75C4D22442533A781";
KIP7 kip7 = new KIP7(caver, contractAddress);
kip7.setWallet(container);
SendOptions sendOptions = new SendOptions(executor_keyring.getAddress());
BigInteger transferAmount = BigInteger.ONE.multiply(BigInteger.TEN.pow(18));
TransactionReceipt.TransactionReceiptData receiptData_transfer = kip7.transfer("0x{to address}", transferAmount, sendOptions);
caver.kct.kip17
에서 keyringContainer를 사용하여 KIP-17 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring deployer_keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"));
KIP17 kip17 = KIP17.deploy(caver, deployer_keyring.getAddress(), "JASMINE", "JAS", container);
caver.contract
의 deploy
와 마찬가지로 배포된 결과로 리턴되는 인스턴스는 keyringContainer
를 사용하는 객체입니다.
이미 배포된 KIP-17 토큰 컨트랙트를 실행할 때 keyringContainer를 사용하기 위해서는 아래와 같이 setWallet
함수를 호출해 주어야 합니다.
KeyringContainer container = new KeyringContainer();
SingleKeyring executor_keyring = (SingleKeyring)container.add(KeyringFactory.createFromPrivateKey("0x{private key}"));
String contractAddress = "0xAD719B194457D0641B410Ce75C4D22442533A781";
KIP17 kip17 = new KIP17(caver, contractAddress);
kip17.setWallet(container);
String from = "0x{from address}";
String to = "0x{to address}";
String tokenURI = "tokenURI";
SendOptions sendOptions = new SendOptions(from);
TransactionReceipt.TransactionReceiptData receiptData = kip17.mintWithTokenURI(to, BigInteger.ZERO, tokenURI, sendOptions);
caver-java KASAPIException
KASWallet의 method를 실행하면서 발생하는 KAS Wallet API의 HTTP Error는 KASAPIException instance로 변환되어 throw합니다. KASAPIException은 unchecked exception인 RuntimeException을 상속받아 구현된 Exception 클래스이기 때문에 catch를 하지 않아도 되지만, KAS Wallet API에서 발생한 error의 상세 내용이 필요한 경우 try-catch문을 사용하여 KASAPIException의 상세 내용을 확인해야 합니다.
아래 예제는 KASWallet의 getAccount()를 실행시키다 발생한 KASAPIException을 try-catch문으로 catch해서 KASAPIExcetpion의 내용을 확인하는 코드입니다.
try {
String unKnownAddress = "0x785ba1146cc1bed97b9c8d73e9293cc3b6bc3691";
Account account = caver.wallet.getAccount(unKnownAddress);
} catch (KASAPIException e) {
System.out.println(e.getcode()); // 400
System.out.println(e.getMessage()); // "Bad Request"
System.out.println(e.getResponseBody().getCode()); // 1061010
System.out.println(e.getResponseBody().getMessage()); // "data don't exist"
}
WebSocket Provider를 사용하여 KAS의 Node API 호출하기
KAS에서 제공하는 Node API를 WebSocket Provider를 사용하여 호출할 수 있습니다. WebSocket Provider를 사용하기 위해서는 초기화 과정에서 Node API를 호출할 때 사용할 provider를 명시해 주어야 합니다.
KAS SDK(caver-js extension)
먼저 CaverExtKAS 생성자를 호출할 때 WebSocket Provider를 사용하도록 초기화하는 방법은 아래와 같습니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey, {
useNodeAPIWithHttp: false,
});
const blockNumber = await caver.rpc.klay.getBlockNumber();
console.log(blockNumber);
caver.currentProvider.connection.close();
생성자의 마지막 파라미터에는 초기화에 필요한 options를 정의할 수 있는 오브젝트를 넘겨줄 수 있습니다. options 오브젝트의 useNodeAPIWithHttp
필드는 KAS Node API를 호출할 때 사용하는 provider를 정할 수 있습니다. 기본 값은 true
로 Http Provider를 사용합니다. WebSocket Provider를 사용하기 위해서는 useNodeAPIWithHttp
를 false
로 정의하여 넘겨주면 됩니다.
만약 생성자가 아닌 caver.initKASAPI
를 사용하여 초기화를 하는 경우에도 마찬가지로 아래와 같이 마지막 파라미터에 useNodeAPIWithHttp
필드가 정의된 오브젝트를 넘겨줍니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey, {
useNodeAPIWithHttp: false,
});
const blockNumber = await caver.rpc.klay.getBlockNumber();
console.log(blockNumber);
caver.currentProvider.connection.close();
각 API마다 별도의 초기화 함수를 호출하는 경우, caver.initNodeAPI
함수 혹은 caver.initNodeAPIWithWebSocket
를 사용하여 Node API를 초기화할 수 있습니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS();
caver.initNodeAPI(chainId, accessKeyId, secretAccessKey, false);
const blockNumber = await caver.rpc.klay.getBlockNumber();
console.log(blockNumber);
caver.currentProvider.connection.close();
위의 예제에서 caver.initNodeAPI
를 호출할 때 파라미터로 Http Provider를 사용할 지에 대한 여부를 Boolean 값으로 전달합니다.
const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS();
caver.initNodeAPIWithWebSocket(chainId, accessKeyId, secretAccessKey);
const blockNumber = await caver.rpc.klay.getBlockNumber();
caver.currentProvider.connection.close();
console.log(blockNumber);
caver.initNodeAPIWithWebSocket
함수를 사용하면 추가적인 파라미터 정의 없이 바로 WebSocket Provider를 사용하도록 초기화할 수 있습니다.
KAS SDK(caver-java extension)
먼저 CaverExtKAS 생성자를 호출할 때 WebSocket Provider를 사용하도록 초기화하는 방법은 아래와 같습니다.
ConfigOptions options = new ConfigOptions();
options.setUseNodeAPIWithHttp(false);
CaverExtKAS caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey, options);
Quantity blockNumberRes = caver.rpc.klay.getBlockNumber().send();
System.out.println(blockNumberRes.getValue());
caver.currentProvider.close();
Node API provider를 초기화하하려면 ConfigOptions
클래스의 인스턴스를 생성자의 마지막 파라미터로 전달합니다.
ConfigOptions
의 useNodeAPIWithHttp
필드에서 사용하고자 하는 provider를 선택할 수 있습니다. Provider가 Http이면 true
, WebSocket이면 false
로 설정하여 넘겨줍니다.
생성자가 아닌 caver.initKASAPI
를 사용해 초기화하는 경우도 마찬가지로 아래와 같이 마지막 파라미터인 ConfigOptions
인스턴스를 생성한 뒤, useNodeAPIWithHttp
필드를 false
로 정의하여 넘겨주면 됩니다.
ConfigOptions options = new ConfigOptions();
options.setUseNodeAPIWithHttp(false);
CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, accessKeyId, secretAccessKey, options);
Quantity blockNumberRes = caver.rpc.klay.getBlockNumber().send();
System.out.println(blockNumberRes.getValue());
caver.currentProvider.close();
초기화 함수를 각 API마다 다르게 사용하려면 caver.initNodeAPI
함수의 마지막 파라미터인 useNodeAPIWithHttp
필드를 false
로 설정한 후 API별 초기화 함수를 호출하세요.
CaverExtKAS caver = new CaverExtKAS();
caver.initNodeAPI(chainId, accessKeyId, secretAccessKey, false)
Quantity blockNumberRes = caver.rpc.klay.getBlockNumber().send();
System.out.println(blockNumberRes.getValue());
caver.currentProvider.close();
위의 예제에서 caver.initNodeAPI
를 호출할 때 파라미터로써 Http Provider의 사용 여부는 Boolean 값으로 전달합니다.
caver-js에 관한 자세한 내용은 다음을 확인하십시오. caver-jave에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움 받으십시오.