FT 컨트랙트는 대체 가능 토큰(Fungible Token, FT)을 발행, 삭제, 전송하는 기능을 제공
NFT 컨트랙트는 대체 불가 토큰(Non-Fungible Token, NFT)을 발행, 삭제, 전송하는 기능을 제공
NFT(대체 불가 토큰)의 토큰 ID값과 이 NFT를 발행한 NFT 컨트랙트 주소값을 입력해서 NFT의 정보를 조회한다.
Node API로 계정에 관한 최신 정보를 확인하기 위해서는 클레이튼 상의 가장 최신 블록의 블록 번호를 알아야한다.
const accessKeyId = "{accessKeyId}"
const secretAccessKey = "{secretAccessKey}"
const chainId = 1001
const CaverExtKAS = require('caver-js-ext-kas')
const caver = new CaverExtKAS()
caver.initKASAPI(chainId, accessKeyId, secretAccessKey)
async function testFunction() {
const blockNumber = await caver.rpc.klay.getBlockNumber()
console.log(blockNumber)
}
testFunction()
>> 0x29987e6
const accessKeyId = "{accessKeyId}"
const secretAccessKey = "{secretAccessKey}"
const chainId = 1001
const CaverExtKAS = require('caver-js-ext-kas')
const caver = new CaverExtKAS()
caver.initKASAPI(chainId, accessKeyId, secretAccessKey)
async function testFunction() {
const account = await caver.rpc.klay.getAccount('0x06545b70b18068ccf5ee6eb5eb1f465c5dbe4f05')
// 내 계정의 계정 주소
console.log(account)
}
testFunction()
다중계정도 조회해보기
여기에서 계정 만들기 확인
현재 조회한 계정 목록
클레이튼 계정을 삭제하면 해당 계정으로는 서명을 할 수 없다.
const result = await caver.kas.wallet.deleteAccount(created.address)
// 비활성화
const result = await caver.kas.wallet.disableAccount(accountToTest.address)
// 활성화
const result = await caver.kas.wallet.enableAccount(accountToTest.address)
트랜잭션이 다중 서명을 받아야하는 상황이 아니라면 Wallet API가 자동으로 서명해준다.
해당 API는 트랜잭션이 다중 서명을 받아야하는 경우에 사용(트랜잭션이 다중 서명을 받아야한다 == 트랜잭션을 보내려는 클레이튼 계정이 다중 서명 키를 가진 경우)
const address = '{서명하려는 클레이튼 계정 주소(EOA)'
const transactionId = '{서명을 받을 트랜잭션의 ID'
const result = await caver.kas.wallet.signTransaction(address, transactionId) // 트랜잭션 서명 API
출력되는 내용은 Signature(R, S, V)
Wallet API를 통해 생성한 클레이튼 계정 중에서, 특정 공개키를 가진 계정 정보를 조회함.
const result1 = await caver.kas.wallet.createAccount()
console.log(result1)
// Wallet API로 클레이튼 계정 생성
// 해당 공개키를 갖는 계정 정보를 조회
const publicKey = '0x04fcf178cd33f35d063d8da6d37159e05c39387938d62c1cc4f7b9d480d101253e690afc118a25e41d6b229d690754f600ecc8bb1357fcb1559a186124e8da0e4a'
const result2 = await caver.kas.wallet.getAccountListByPublicKey(publicKey)
console.log(result2)
먼저 KAS에 클레이튼 계정들을 생성한다. (A, B, C 계정에서 A를 B의 key, C의 key를 사용하게 한다.)
const address = '{다중 서명 계정으로 업데이트할 계정의 주소(A의주소)}'
const weightedMultisig = {
threshold: 4,
weightedKeys: [
{
weight: 3,
// 계정 B의 Public Key
publicKey: '0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379'
},
{
weight: 1,
// 계정 C의 public Key
publicKey: '0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1'
}
]
}
const result = await caver.kas.wallet.updateToMultiSigAccount(address, weightedMultisig)
이렇게 업데이트하고 계정을 출력하면 다중 서명 계정으로 나오는 것을 확인할 수 있음
KAS의 트랜잭션 == Klaytn 트랜잭션
트랜잭션을 보낸다 : 블록체인의 상태를 변화시킨다.
서명(sign)은 트랜잭션을 보내는 사람이 내가 맞다는 것을 증명한느 자격증명. KAS Wallet API는 클레이튼 계정이 트랜잭션에 서명하는 작업을 대신 실행한다.
const tx = {
from: '0xDaAc8e561627312743f6f11b2f54e985Da0619fd', // KLAY를 보내는 계정 주소
to: '0xBCE532829A462eFB8964DE684CdCDA1D5DcB6723', // KLAY를 받는 주소
value: 1,
gas: 25000,
memo: 'memo',
submit: true
}
const result = await caver.kas.wallet.requestValueTransfer(tx)
console.log(result)
const tx = {
from: '0xd2061D4bdbee433Dd2f99C28E25d301593f544e0',
to: '0x76c6b1f34562ed7a843786e1d7f57d0d7948a6f1',
value: 1,
gas: 50000,
memo: 'memo',
feeRatio: 99,
feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
// 수수료를 대납하는 사람의 계정 주소
submit: true
}
const result = await caver.kas.wallet.requestFDValueTransferPaidByUser(tx)
const tx = {
from: '0xd2061D4bdbee433Dd2f99C28E25d301593f544e0',
to: '0x76c6b1f34562ed7a843786e1d7f57d0d7948a6f1',
value: 1,
gas: 50000,
memo: 'memo',
feeRatio: 99,
// 전체 수수료에서 feePayer가 납부할 비율 (위의 대납 경우에서도 사용 가능)
submit: true
}
const result = await caver.kas.wallet.requestFDValueTransferPaidByGlobalFeePayer(tx)
스마트 컨트랙트를 배포하는 경우, 수수료 납부에 대한 3가지 타입이 있음
await caver.kas.wallet.requestSmartContractDeploy(tx)
await caver.kas.wallet.requestFDSmartContractDeployPaidByUser(tx)
await caver.kas.wallet.requestFDSmartContractDeployPaidByGlobalFeePayer(tx)
스마트 컨트랙트 함수를 실행하는 경우, 수수료 납부 3가지 방법
await caver.kas.wallet.requestSmartContractExecution(tx)
await caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(tx)
await caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer(tx)
Wallet API로 클레이튼에 전송한 트랜잭션이 보류(Pending) 상태일 때, 이 트랜잭션을 취소하는 방법
const tx = {
from: '0x008Ad97530612A272d16228ec893e6Ce0F180b06',
// 트랜잭션을 보낸 계정(취소 트랜잭션을 보내는 계정)
gas: 25000,
nonce: '0x1',
submit: true
}
const result = await caver.kas.wallet.requestCancel(tx)
const tx = {
from: '0x008Ad97530612A272d16228ec893e6Ce0F180b06',
gas: 45000,
nonce: '0x1',
feeRatio: 99,
// 대납 계정이 납부할 비율
feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
submit: true
}
await caver.kas.wallet.requestFDCancelPaidByUser(tx)
await caver.kas.wallet.requestFDCancelPaidByGlobalFeePayer(tx)
Wallet API로 RLP 인코딩된 문자열로 표현된 트랜잭션을 클레이튼에 보내는 방법
// 트랜잭션 서명 RLP 또는 트랜잭션 해시 RLP를 입력하고 RLP 트랜잭션 전송 API를 호출한다.
const rlp = '0x08f87e808505d21dba008261a89476c6b1f34562ed7a843786e1d7f57d0d7948a6f10194dbe9312beb546a5b518f8bb7ac315cc6eb96b34cf847f8458207f6a0276299929f4b805b1e1376543001652eff9f47cf34332e042c8aded29fd022fca077f1ff2f4bb668b49aa228c170e72d84ffdc456bd3ac9e5e6291d8e6cd61508b'
const result = await caver.kas.wallet.requestRawTransaction({ rlp, submit: true })
const result = await caver.kas.wallet.requestFDRawTransactionPaidByUser({ rlp, feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8', submit: true })
// 양식은 위와 거의 모두 동일. 얘도 feeRatio있음
const result = await caver.kas.wallet.requestFDRawTransactionPaidByGlobalFeePayer({ rlp:, submit: true, feeRatio: 99 })
Wallet API로 계정 키를 업데이트하는 트랜잭션을 클레이튼에 보내기
클레이튼 계정을 다중 서명 계정으로 업데이트하는 것은 계정 키를 AccountKeyWeightedMultiSig로 업데이트하는 것과 동일
다중 서명 키를 구성하는 각 키를 가지고 있는 계정들은 모두 같은 계정 저장소에 있어야한다.
// Update to AccountKeyWeightedMultiSig
const tx = {
from: '0x443f01B81ECC1e83dC46edA711F3D707511ef257',
// 업데이트할 계정 주소
accountKey: {
keyType: 4,
key: {
threshold: 2,
weightedKeys: [
{
weight: 1,
publicKey: '0x04a4dad8e41de69fdbf7c2d3b76eeeed47d449fd680d7dda0ae6346ac9e2c8de1637d8cbc4adbfa7b0f02ffedf39d8edb7dae983ba24a33fcdde37feedbe2a5cd7'
},
{
weight: 1,
publicKey: '0x0424a43009be004a10cf6d2d7ddb3fa31aa8e73bf540d8ad2a7a870c697981f3743f3691a45fc1c5ff13a7f521c5488b5a7926063b307c0def3d5f8f1f3a7fde0b'
}
]
}
},
gas: 1000000,
submit: true
}
const result = await caver.kas.wallet.requestAccountUpdate(tx)
const tx = {
from: '0xA3E79115c78bbC8eFdDA2a17a4Bdb48Dca2b5333',
accountKey: {
keyType: 4,
key: {
threshold: 2,
weightedKeys: [
{
weight: 1,
publicKey: '0x04371334d038d983f3b560b2534385138ffaf69cf1aef039b268ef69c1736ec6544bc9a04598ca5ba4c2e75e648c6d8e6a892b33662bfe680544daa53c75b06e35'
},
{
weight: 1,
publicKey: '0x041640a55aed2c871f8896a263b378ce73e323254de9173fd071bb29aa8d4c52855ed8b4164db5db21d3c4e3baed2611d9d34932f36b6096086eee0c690417fb97'
}
]
}
},
gas: 1000000,
feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
submit: true
}
const result = await caver.kas.wallet.requestFDAccountUpdatePaidByUser(tx)
const result = await caver.kas.wallet.requestFDAccountUpdatePaidByGlobalFeePayer(tx)
Wallet API로 서비스 체인 데이터를 메인 체인에 앵커링하는 데이터 앵커링 트랜잭션을 클레이튼에 보내기
const result = await caver.kas.wallet.requestChainDataAnchoring(tx)
const result = await caver.kas.wallet.requestFDChainDataAnchoringPaidByUser(tx)
대납 계정의 잔고가 수수료 미만이면 앵커링 트랜잭션 전송은 실패
const result = await caver.kas.wallet.requestFDChainDataAnchoringPaidByGlobalFeePayer(tx)
Wallet API로 여러 계정이 서명해야하는 트랜잭션 전송
1. KAS에 클레이튼 계정 생성
2. 계정 키를 다중 서명 키로 변경
3. KLAY 전송 트랜잭션 생성
4. 보류중인 KLAY 전송 트랜잭션에 모든 계정이 서명
계정이 다중 서명 계정이고, 트랜잭션을 전송하는데 서명을 충분히 받지 못한 경우 트랜잭션은 보류(pending)상태이다.
const result = await caver.kas.wallet.getMultiSigTransactionList(size, cursor, to-timestamp, from-timestamp)
const result = await caver.kas.wallet.signMultiSigTransction(address, transactionId)
>> MultisigTransactionStatus {
signedWeight: 1,
status: 'Signed',
threshold: 3,
transactionId: '0xfe2be4de37ed40c6c049d3c2771a6e7577916c951dd331b297b517b25609b4ad',
weight: 1,
// reminders: 아직 서명하지 않은 키의 계정 주소
reminders: [
'0xc4Dd4D041430c65d95CaaF6fB1506A542d6583d0',
'0x55afF286674559caB1Fd4427C91C4cC045766140'
]
}
KAS 외부에서 만든 Klaytn 계정이 있고, 이 계정의 서명 값이 있다면 이 서명 값으로 트랜잭션에 서명할 수 있다.
const transactionId = '0x7e7f18b16fb1807654d9cd2b1ad1c0cbb649b81648543a792a6db2f43e1a8ad5'
const signatures = [
{
V: '0x7f6'
R: '0xc2902ebb52f554fd257eda57a3fe7cbf1e046bb43d1472bd396f2c3053f8bf55',
S: '0x32f7d5b99e91510ecaefc5fe65816e6e43043c408873b2453d02116be1674278',
}
] // 서명 값
const result = await caver.kas.wallet.appendSignatures(transactionId, signatures)