이 페이지는 KAS SDK(caver-js-ext-kas/caver-java-ext-kas)를 소개합니다.
KAS SDK(Software Development Kit)는 여러 개발 환경에서 KAS를 쉽게 사용하도록 제공되는 개발 도구입니다. KAS SDK는 Caver의 확장 라이브러리이며 Caver와 마찬가지로 JavaScript와 Java 환경을 지원합니다. KAS SDK로 BApp을 개발하면 하나의 라이브러리를 통해 KAS 기능과 기존 Caver의 기능을 모두 사용할 수 있습니다.
생성자에 chainId, accessKeyId 그리고 secretAccessKey를 전달하면 내부적으로 caver.initKASAPI 함수를 호출하고, 해당 함수에서는 Node API, Wallet API, Token History API, Anchor API, KIP-17 API 그리고 KIP-7 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 [, useHttp] [, 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-js extension)를 사용할 때 KAS의 Node API를 활용해 최신 블록 정보를 불러오는 방법입니다.
위의 caver.initKASAPI 함수를 사용하면 Node API, Wallet API, Token History API, Anchor API, KIP-17, KIP-7 그리고 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를 활용해 최신 블록 정보를 불러오는 방법입니다.
KAS SDK v1.0.2부터는 caver.wallet에서 KAS의 Wallet API를 사용하여 동작하는 지갑인 KASWallet이 제공됩니다. 이를 통하여 KAS Wallet API의 클레이튼 계정을 사용하여 caver.contract 패키지와 caver.kct를 사용할 수 있습니다.
KAS Wallet API의 클레이튼 계정으로 caver.contract 사용하기
caver.contract는 caver.wallet을 사용하여 Klaytn에 컨트랙트를 배포하거나 기배포된 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.contract를 사용하면 KAS Wallet API의 클레이튼 계정을 사용하여 손쉽게 Klaytn에 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 클레이튼 계정을 사용하여 caver.contract를 사용하는 방법은 기존의 caver.contract를 사용하는 방법과 동일합니다. 여기서는 간단하게 배포하고 실행하는 방법을 설명합니다. 여기서 스마트 컨트랙트를 배포하고 실행할 때 사용되는 클레이튼 계정은 KAS Wallet API에서 관리되고 있는 클레이튼 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KLAY를 소유하고 있어야 합니다.
KAS SDK(caver-js extension)
caver-js-ext-kas를 사용하여 스마트 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-js-ext-kasconstCaverExtKAS=require('caver-js-ext-kas')constchainId=1001constaccessKeyId='{access key ID of your KAS account}'constsecretAccessKey='{secret access key of your KAS account}'constcaver=newCaverExtKAS(chainId, accessKeyId, secretAccessKey)constabi= [ { 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', },]constbyteCode= '0x608060405234801561001057600080fd5b5061051f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063693ec85e1461003b578063e942b5161461016f575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506102c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf6004803603604081101561018557600080fd5b81019080803590602001906401000000008111156101a257600080fd5b8201836020820111156101b457600080fd5b803590602001918460018302840111640100000000831117156101d657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561023957600080fd5b82018360208201111561024b57600080fd5b8035906020019184600183028401116401000000008311171561026d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103cc565b005b60606000826040518082805190602001908083835b602083106102f957805182526020820191506020810190506020830392506102d6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b50505050509050919050565b806000836040518082805190602001908083835b6020831061040357805182526020820191506020810190506020830392506103e0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061044992919061044e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061048f57805160ff19168380011785556104bd565b828001600101855582156104bd579182015b828111156104bc5782518255916020019190600101906104a1565b5b5090506104ca91906104ce565b5090565b6104f091905b808211156104ec5760008160009055506001016104d4565b5090565b9056fea165627a7a723058203ffebc792829e0434ecc495da1b53d24399cd7fff506a4fd03589861843e14990029'
const contract =newcaver.contract(abi)// SmartContractDeploy 트랜잭션을 발생시키는 from 계정은 충분한 KLAY를 소유하고 있어야 합니다.const deployed = await contract.deploy({ data: byteCode }).send({ from: '0x{the address of a Klaytn account in KAS Wallet API}', gas: 10000000 })
console.log(`Deployed contract address: ${deployed.options.address}`)
caver.kct.kip7은 caver.wallet을 사용하여 Klaytn에 KIP-7 토큰 컨트랙트를 배포하거나 기배포된 KIP-7 토큰 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.kct.kip7를 사용하면 KAS Wallet API의 클레이튼 계정을 사용하여 손쉽게 Klaytn에 KIP-7 토큰 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 클레이튼 계정을 사용하여 caver.kct.kip7를 사용하는 방법은 기존의 caver.kct.kip7를 사용하는 방법과 동일합니다. 여기서는 간단하게 KIP-7 토큰 컨트랙트를 배포하고 실행하는 방법을 설명합니다. 여기서 토큰 컨트랙트를 배포하고 실행할 때 사용되는 계정은 KAS Wallet API에서 관리되고 있는 클레이튼 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KLAY를 소유하고 있어야 합니다.
KAS SDK(caver-js extension)
caver-js-ext-kas를 사용하여 KIP-7 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
// caver-js-ext-kasconstCaverExtKAS=require('caver-js-ext-kas')constchainId=1001constaccessKeyId='{access key ID of your KAS account}'constsecretAccessKey='{secret access key of your KAS account}'constcaver=newCaverExtKAS(chainId, accessKeyId, secretAccessKey)constdeployed=awaitcaver.kct.kip7.deploy({ name:'Jasmine', symbol:'JAS', decimals:18, initialSupply:'100000000000000000000'},'0x{the address of a Klaytn account in KAS Wallet API}')console.log(`Deployed contract address: ${deployed.options.address}`)
caver-js-ext-kas를 사용하여 Klaytn에 배포된 KIP-7 토큰 컨트랙트를 실행하는 방법은 아래와 같습니다.
// caver-js-ext-kasconstCaverExtKAS=require('caver-js-ext-kas')constchainId=1001constaccessKeyId='{access key ID of your KAS account}'constsecretAccessKey='{secret access key of your KAS account}'constcaver=newCaverExtKAS(chainId, accessKeyId, secretAccessKey)constcontractAddress='0x42c3809EeED7c5C497067fE4092D1c354D3a01Cb'constkip7=newcaver.kct.kip7(contractAddress)const receipt = await kip7.transfer('0x{address in hex}', 1, { from: '0x{the address of a Klaytn account in KAS Wallet API}' })
console.log(receipt)
위의 코드를 실행하면 아래와 같이 SmartContractExecution 트랜잭션의 실행 결과가 출력됩니다.
caver.kct.kip17는 caver.wallet을 사용하여 Klaytn에 KIP-17 토큰 컨트랙트를 배포하거나 기배포된 KIP-17 토큰 컨트랙트를 실행하는 기능을 제공합니다. KAS SDK의 caver.wallet은 KAS Wallet API를 사용하는 지갑이기 때문에 KAS SDK의 caver.kct.kip17를 사용하면 KAS Wallet API의 클레이튼 계정을 사용하여 손쉽게 Klaytn에 KIP-17 토큰 컨트랙트를 배포하거나 실행할 수 있습니다.
KAS Wallet API의 클레이튼 계정을 사용하여 caver.kct.kip17를 사용하는 방법은 기존의 caver.kct.kip17를 사용하는 방법과 동일합니다. 여기서는 간단하게 KIP-17 토큰 컨트랙트를 배포하고 실행하는 방법을 설명합니다. 여기서 토큰 컨트랙트를 배포하고 실행할 때 사용되는 계정은 KAS Wallet API에서 관리되고 있는 클레이튼 계정이며, 이 계정은 트랜잭션을 전송하기 위한 충분한 KLAY를 소유하고 있어야 합니다.
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 Klaytn account in KAS Wallet API}')
console.log(`Deployed contract address: ${deployed.options.address}`)
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에서 사용하는 방법은 아래와 같습니다.
위의 코드를 실행하여 배포된 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 토큰 컨트랙트를 배포하는 방법은 아래와 같습니다.
위의 코드를 실행하여 배포된 deployed 컨트랙트 인스턴스도 또한 keyringContainer를 사용하는 객체입니다. 만약 이미 배포된 컨트랙트를 사용하는 경우 아래와 같이 setWallet 함수를 사용하여 keyringContiainer를 사용하도록 지정할 수 있습니다.
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의 내용을 확인하는 코드입니다.
생성자의 마지막 파라미터에는 초기화에 필요한 options를 정의할 수 있는 오브젝트를 넘겨줄 수 있습니다. options 오브젝트의 useNodeAPIWithHttp 필드는 KAS Node API를 호출할 때 사용하는 provider를 정할 수 있습니다. 기본 값은 true로 Http Provider를 사용합니다. WebSocket Provider를 사용하기 위해서는 useNodeAPIWithHttp를 false로 정의하여 넘겨주면 됩니다.
만약 생성자가 아닌 caver.initKASAPI를 사용하여 초기화를 하는 경우에도 마찬가지로 아래와 같이 마지막 파라미터에 useNodeAPIWithHttp 필드가 정의된 오브젝트를 넘겨줍니다.
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로 정의하여 넘겨주면 됩니다.