이 장에서는 Baobab 네트워크에서 caver-js를 사용하여 KLAY를 보내는 방법을 보여줍니다.
Getting KLAY via Baobab Faucet
테스트를 위해 KLAY가 필요한 경우 Klaytn Wallet에서 Baobab testnet KLAY를 얻을 수 있습니다. Log in to the Klaytn Wallet using the private key or the keystore file and receive Baobab testnet KLAY via the faucet for testing.
Sending a Value Transfer Transaction
트랜잭션 서명은 caver-js 지갑을 통해 할 수 있습니다. 만약 caver-js 지갑에 계정이 있다면, caver.klay.sendTransaction을 실행할 때 caver-js 지갑에 저장된 개인키로 서명이 생성됩니다. 이때 caver.klay.sendTransaction은 서명 생성과 트랜잭션 제출을 동시에 처리합니다.
// 아직 caver-js 지갑에 계정을 추가하지 않았다면 'caver.klay.accounts.wallet.add'를 실행하여 지갑에 계정을 추가하세요.
// 동일한 계정이 이미 지갑에 있는 경우 'Error: Account exists with {hex in address}'가 출력됩니다. 이 경우 출력된 주소값을 'from' 필드에 입력하여 해당 계정을 참조할 수 있습니다.
> const account = caver.klay.accounts.wallet.add('0x{private key}')
> caver.klay.sendTransaction({
type: 'VALUE_TRANSFER',
from: account.address',
to: '0xeF5cd886C7f8d85fbe8023291761341aCBb4DA01',
gas: '300000',
value: 1,
}).then(console.log)
{
blockHash: '0x5e9f427c9550a6f7575bcf60aba9257634884519a6273a23e8eefee2a696cce4',
blockNumber: 3841096,
contractAddress: null,
from: '0x3bd32d55e64d6cbe54bec4f5200e678ee8d1a990',
...
status: true,
to: '0xef5cd886c7f8d85fbe8023291761341acbb4da01',
transactionHash: '0xb09f6d26734074a259f6cbe4d509d2bf40f6f0a4559081354527ae211dd9d00f',
transactionIndex: 1,
type: 'TxTypeValueTransfer',
typeInt: 8,
value: '0x1'
}
caver-js 지갑 없이 해당 개인키로부터 서명을 직접 생성하고자 하는 경우 다음과 같이 진행할 수 있습니다.
You can get a RLP-encoded transaction (rawTransaction) using caver.klay.accounts.signTransaction as above and use this to transfer the transaction to the Klaytn network as below.
위 예시와 같이 프로미스(promise)와 이벤트 이미터(event emitter)를 통해 트랜잭션을 전송한 결과를 가져올 수 있습니다. And also, if you know the transaction hash, you can query the transaction receipt using the caver.klay.getTransactionReceipt RPC call. The example below shows how to get a receipt using the caver.klay.getTransactionReceipt RPC call.
서명된 RLP 인코딩된 트랜잭션 객체 (rawTransaction)으로 트랜잭션 수수료 납부자는 서명을 첨부한 후 트랜잭션을 보낼 수 있습니다. 트랜잭션 수수료 납부자는 senderRawTransaction에 rawTransaction를 설정하고 아래 예시와 같이 트랜잭션 수수료 납부자의 주소로 서명합니다.
// 아직 caver-js 지갑에 트랜잭션 수수료 납부자의 계정을 추가하지 않았다면, 'caver.klay.accounts.wallet.add'를 실행하여 지갑에 계정을 추가하세요.
// 이미 계정이 지갑에 추가된 경우 'Error: Account exists with {hex in address}'가 출력됩니다. 이 경우 `feePayer.address` 대신 계정 주소를 사용하세요.
> const feePayer = caver.klay.accounts.wallet.add('0x{private key}')
> caver.klay.sendTransaction({
senderRawTransaction: rawTransaction,
feePayer: feePayer.address,
}).then(console.log)
{
blockHash: '0xf0c4ef717a674ffaea8bf68597c936ce8a3773dab1e1f6f42508963f124bc301',
blockNumber: 3840725,
...
transactionHash: '0x8d1fea7710bc351540257a4ae7f2274d66ddd7f62bcdb6f1f77893cecb659405',
transactionIndex: 2,
type: 'TxTypeFeeDelegatedValueTransfer',
typeInt: 9,
value: '0xde0b6b3a7640000'
}
참고: 트랜잭션 수수료 납부자의 계정은 caver-js 지갑에 있어야 합니다.
Account Update
계정의 키를 변경하려면 아래와 같은 트랜잭션을 보내세요. Please check Account Update for the transaction field according to the key type.
// If you have not added an account to caver-js's wallet, add it to your wallet by running 'caver.klay.accounts.wallet.add'.
// If the same account is already in the wallet, 'Error: Account exists with {hex in address}' is returned. In this case, you can use the address string in the `from` field to reference the account in the wallet.
> const account = caver.klay.accounts.wallet.add('0x{private key}')
> caver.klay.sendTransaction({
type: 'ACCOUNT_UPDATE',
from: account.address,
publicKey: '0x9016de15ebb219b1e8bc732070df93a28903e5799d0cd24a807a5afabf4601f7e5ab312b5a682dd8c0e72e71e67552174d5082cde25db3626a5b025f97f8a005',
gas: '300000',
}).then(console.log);
Smart Contract
The caver.klay.Contract package makes it easy to interact with smart contracts on Klaytn. 저수준 ABI(Application Binary Interface)가 주어지면 스마트 컨트랙트의 모든 메소드를 자동으로 자바스크립트 호출로 변환합니다. This allows you to interact with smart contracts as if they were JavaScript objects.
컨트랙트 인스턴스가 생성되면, 아래와 같이 바이트코드를 data 필드에 전달하는 것으로 배포할 수 있습니다:
// If you have not added an account to caver-js's wallet, add it to your wallet by running 'caver.klay.accounts.wallet.add'.
// If the same account is already in the wallet, 'Error: Account exists with {hex in address}' is returned. In this case, you can use the address string in the `from` field to reference the account in the wallet.
> const account = caver.klay.accounts.wallet.add('0x{private key}')
> contractInstance.deploy({
data: '60806040526000805534801561001457600080fd5b50610123806100246000396000f3fe6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306661abd14605857806342cbb15c146080578063d14e62b81460a8575b600080fd5b348015606357600080fd5b50606a60df565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b50609260e5565b6040518082815260200191505060405180910390f35b34801560b357600080fd5b5060dd6004803603602081101560c857600080fd5b810190808035906020019092919050505060ed565b005b60005481565b600043905090565b806000819055505056fea165627a7a72305820e381897039d8e48bf74b4a096bb1c4ed02f331bd1a7a4add6217b72fa888f2f10029',
}).send({
from: account.address,
gas: '0x4bfd200',
value: '0x0',
}).then(console.log)
{
blockHash: '0x71426773ed65f307bdfac5070ac54f11f406086bbe8dfa170215ed4190f176ed',
blockNumber: 226,
codeFormat: '0x0',
contractAddress: '0xC9f0b868e5103b6823171a2Df85E7B696660E466',
from: '0x71959675eeb7c7ec1e0c74f206a9c488d7f178d4',
gas: '0x4bfd200',
gasPrice: '0x5d21dba00',
gasUsed: 149017,
humanReadable: false,
input: '0x60806040526000805534801561001457600080fd5b50610123806100246000396000f3fe6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306661abd14605857806342cbb15c146080578063d14e62b81460a8575b600080fd5b348015606357600080fd5b50606a60df565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b50609260e5565b6040518082815260200191505060405180910390f35b34801560b357600080fd5b5060dd6004803603602081101560c857600080fd5b810190808035906020019092919050505060ed565b005b60005481565b600043905090565b806000819055505056fea165627a7a72305820e381897039d8e48bf74b4a096bb1c4ed02f331bd1a7a4add6217b72fa888f2f10029',
...
type: 'TxTypeSmartContractDeploy',
typeInt: 40,
value: '0x0',
events: {}
}
배포된 컨트랙트 주소는 트랜잭션 영수증의 contractAddress에서 찾을 수 있습니다. 스마트 컨트랙트 실행 트랜잭션을 보내기 전, 다음과 같이 주소를 컨트랙트 인스턴스의 주소로 설정하세요:
One way to invoke a specific method of a smart contract is to use it with caver.klay.Contract or use SMART_CONTRACT_EXECUTION.
To transact with a smart contract:
// If you have not added an account to caver-js's wallet, add it to your wallet by running 'caver.klay.accounts.wallet.add'.
// If the same account is already in the wallet, 'Error: Account exists with {hex in address}' is returned. In this case, you can use the address string in the `from` field to reference the account in the wallet.
> const account = caver.klay.accounts.wallet.add('0x{private key}')
> contractInstance.methods.setCount(1).send({from:account.address, gas:'0x4bfd200'}).then(console.log)
{
blockHash: '0x159f8515102951bca9c403b2b1b37850ca01a08dffb9a763837f55a6d518bbb6',
blockNumber: 644,
contractAddress: null,
from: '0x71959675eeb7c7ec1e0c74f206a9c488d7f178d4',
gas: '0x4bfd200',
gasPrice: '0x5d21dba00',
gasUsed: 44875,
input: '0xd14e62b80000000000000000000000000000000000000000000000000000000000000001',
...
type: 'TxTypeSmartContractExecution',
typeInt: 48,
value: '0x0',
events: {}
}
caver.klay.accounts 패키지는 개인키를 저장하고 관리하는 AccountKeyPublic을 기본으로 사용합니다.
다음 예제는 AccountKeyPublic을 AccountKey로 가지는 계정을 만듭니다.
// test.js fileasyncfunctiontestFunction() {// Create random account with accountKeyPublic by defaultconstaccount=caver.klay.accounts.create()printAccount(account)// Create account with specific private key stringconstprivateKey=caver.klay.accounts.create().privateKeyconstaccountFromKey=caver.klay.accounts.privateKeyToAccount(privateKey)printAccount(accountFromKey)}functionprintAccount(account) {console.log(`address: ${account.address}`)console.log(`privateKey: ${account.privateKey}`)console.log(`accountKeyType: ${account.accountKeyType}`)console.log(`accountKey`)console.log(account.accountKey)console.log(`account.keys: ${account.keys}`)console.log(`account.transactionKey: ${account.transactionKey}`)console.log(`account.updateKey: ${account.updateKey}`)console.log(`account.feePayerKey: ${account.feePayerKey}\n`)}
위의 printAccount는 계정 인스턴스의 속성을 사용하는 방법을 보여줍니다. 계정 내부의 속성은 다음과 같습니다.
참고transactionKey, updateKey, 그리고 feePayerKey는 역할에 사용해야 하는 개인키 문자열 또는 개인키 문자열 배열을 반환합니다. 따라서 privateKey 속성을 사용하는 대신, accountKey 유형에 대한 걱정 없이 transactionKey, updateKey 그리고 feePayerKey를 적절하게 사용하는 것이 권장됩니다.
AccountKey는 계정의 키를 저장하는 데이터 구조입니다. 계정에는 서명에 사용할 하나의 개인키 문자열 또는 여러 개인키 문자열이 있을 수 있습니다. 계정은 역할들로 개인키를 관리할 수도 있습니다.
이 구조를 지원하기 위해, caver-js는 AccountKeyPublic, AccountKeyMultiSig 및 AccountKeyRoleBased라는 새로운 클래스를 도입했습니다.
AccountKey를 만들려면 caver.klay.accounts.createAccountKey를 사용하세요. 이 함수는 매개변수 유형에 따라 생성할 AccountKey를 결정합니다. 개인키 문자열이 매개변수로 제공되면 AccountKeyPublic을 생성하고, 개인키 문자열 배열이 제공되면 AccountKeyMultiSig를 생성합니다. 각 역할마다 다른 키를 가진 객체가 있으면 AccountKeyRoleBased를 생성합니다.
참고 caver-js에서 정의된 AccountKey에 대한 클래스는 caver-js에서 개인키를 저장하기 위한 데이터 구조입니다. Klaytn 네트워크 계정의 키와 다를 수 있습니다.
AccountKeyPublic
AccountKeyPublic은 하나의 개인키 문자열을 저장하고 관리하기 위한 클래스입니다.
다음은 AccountKeyPublic으로 계정을 업데이트하는 방법에 대해 설명합니다. 다음 코드를 testFunction()에 작성하고 실행하세요.
constprivateKey=caver.klay.accounts.create().privateKeyconstaccountKey=caver.klay.accounts.createAccountKey(privateKey)constaddress=caver.klay.accounts.create().address// Create an Account instance with a private key stringconstaccountFromStringKey=caver.klay.accounts.createWithAccountKey(address, privateKey)// Create an Account instance with an AccountKeyPublic instanceconstaccountFromAccountKey=caver.klay.accounts.createWithAccountKey(address, accountKey)
AccountKeyMultiSig
AccountKeyPublic은 여러 개인키 문자열을 저장하고 관리하기 위한 클래스입니다.
다음은 AccountKeyMultiSig으로 계정을 업데이트하는 방법에 대해 설명합니다. Write the following code into testFunction() and run it.
AccountKeyPublic는 여러 개인키 문자열을 저장하고 관리하므로, 위의 예제를 실행하면, keys, transactionKey, updateKey 그리고 feePayerKey 모두 동일한 여러 개인키 문자열을 나타내는 것을 볼 수 있을 것입니다.
만일 트랜잭션을 서명할 때 사용할 개인키(또는 개인키 문자열의 배열)를 명시하지 않았다면, caver-js는 인메모리 지갑에서 from 또는 fee payer와 일치하는 계정을 찾아 서명합니다. 이 경우, 계정에 여러 개의 개인키가 있는 경우, caver-js는 모든 해당하는 키로 트랜잭션에 서명합니다.
constprivateKeyArray= [caver.klay.accounts.create().privateKey,caver.klay.accounts.create().privateKey]constaccountKey=caver.klay.accounts.createAccountKey(privateKeyArray)constaddress=caver.klay.accounts.create().address// Create Account instance with an array of private key stringsconstaccountFromStringKey=caver.klay.accounts.createWithAccountKey(address, privateKeyArray)// Create Account instance with AccountKeyMultiSig instanceconstaccountFromAccountKey=caver.klay.accounts.createWithAccountKey(address, accountKey)
AccountKeyRoleBased
AccountKeyRoleBased는 각 역할의 키를 저장하고 관리하기 위한 클래스입니다. 각 역할은 하나의 개인키 문자열 또는 여러 개인키 문자열을 가질 수 있습니다.
다음은 AccountKeyRoleBased으로 계정을 업데이트하는 방법에 대해 설명합니다. Write the following code into testFunction() and run it.
AccountKeyRoleBased는 역할별로 키를 저장하고 관리하므로, 위의 예제를 실행하면, keys 속성에 정의된 세 가지 역할(transactionKey, updateKey, feePayerKey)을 확인할 수 있습니다. 따라서, 다른 AccountKey(AccountKeyPublic 또는 AccountKeyMultiSig)와 달리, transactionKey, updateKey 및 feePayerKey는 각각 다른 키를 나타냅니다.
constkeyobject= { transactionKey: [caver.klay.accounts.create().privateKey, caver.klay.accounts.create().privateKey, caver.klay.accounts.create().privateKey],
updateKey:caver.klay.accounts.create().privateKey, feePayerKey: [caver.klay.accounts.create().privateKey, caver.klay.accounts.create().privateKey, caver.klay.accounts.create().privateKey]
}constaccountKey=caver.klay.accounts.createAccountKey(keyobject)constaddress=caver.klay.accounts.create().address// Create Account instance with an object that defines key by roleconstaccountFromStringKey=caver.klay.accounts.createWithAccountKey(address, keyobject)// Create Account instance with AccountKeyRoleBased instanceconstaccountFromAccountKey=caver.klay.accounts.createWithAccountKey(address, accountKey)
위의 예제를 통해 caver-js에서 계정 및 다양한 AccountKey 유형을 사용하는 방법을 볼 수 있습니다.
이 예제는 Klaytn 네트워크에 영향을 미치지 않음을 유의하세요. AccountKeyPublic, AccountKeyMultiSig 또는 AccountKeyRoleBased와 같은 특정 계정 키 유형으로 계정을 사용하려면, Klaytn 네트워크에 계정 업데이트 트랜잭션을 보내야합니다.
다음 AccountForUpdate는 Klaytn 네트워크에 트랜잭션을 보내 계정을 업데이트하는 방법에 대해 설명합니다.
AccountForUpdate
AccountForUpdate는 계정 업데이트를 위한 트랜잭션을 보다 쉽게 사용할 수 있도록 설계한 클래스입니다.
AccountForUpdate는 계정 업데이트에 사용할 공개키와 업데이트 할 계정의 주소만 가지고 있습니다.
아래 예제는 accountKey로 계정을 업데이트하는 것으로 시작합니다. 계정에 테스트에 사용하기 충분한 KLAY가 있어야 합니다. Baobab 네트워크에서 사용할 테스트 KLAY는 Baobab Faucet에서 얻을 수 있습니다.
AccountForUpdate 생성하기
AccountForUpdate를 생성하는 것으로 시작하겠습니다.
업데이트할 계정 주소와 사용할 새로운 키로 createAccountForUpdate()를 호출하여 생성할 수 있습니다.
참고 개인키 문자열 여러 개를 가지도록 업데이트 할 때는 option 개체에 임계 값과 가중치를 정의해야 합니다.
AccountForUpdate로 계정 업데이트
위에서 만든 AccountForUpdate를 사용하여 계정 업데이트 트랜잭션을 쉽게 만들 수 있습니다.
계정을 업데이트 하는데 사용하는 트랜잭션은 세 종류가 있습니다 : ACCOUNT_UPDATE, FEE_DELEGATED_ACCOUNT_UPDATE 그리고 FEE_DELEGATED_ACCOUNT_UPDATE_WITH_RATIO.
아래 예에서 account는 KLAY 잔액이 충분한 계정이며 accountForUpdate는 새로운 키와 변경하고자 하는 계정 주소를 가진 AccountForUpdate 객체입니다. accountForUpdate는 caver.klay.accounts.createAccountForUpdate를 사용하여 생성됩니다.
아래 예는 AccountForUpdate를 사용하여 트랜잭션을 생성하고 Klaytn 네트워크로 전송하는 방법을 보여줍니다.
constupdateTx= { type:'ACCOUNT_UPDATE', from:account.address, key: accountForUpdate, gas:300000,}// Sign transaction with updateKey of accountconstsigned=awaitcaver.klay.accounts.signTransaction(updateTx,account.updateKey)// Send account update transactionconstreceipt=awaitcaver.klay.sendSignedTransaction(signed)console.log(receipt)// Get accountKey from Klaytn networkconstupdatedKey=awaitcaver.klay.getAccountKey(account.address)console.log(updatedKey)
FEE_DELEGATED_ACCOUNT_UPDATE 트랜잭션을 사용하는 방법은 아래 예를 참조하세요.
constupdateTx= { type:'FEE_DELEGATED_ACCOUNT_UPDATE', from:account.address, key: accountForUpdate, gas:300000,}// Sender signs transaction with updateKey of accountconstsenderSigned=awaitcaver.klay.accounts.signTransaction(updateTx,account.updateKey)// Fee payer signs transaction with feePayerKey of fee payerconst feePayerSigned = await caver.klay.accounts.feePayerSignTransaction(senderSigned.rawTransaction, feePayer.address, feePayer.feePayerKey)
// Send fee delegated account update transactionconstreceipt=awaitcaver.klay.sendSignedTransaction(feePayerSigned)console.log(receipt)// Get accountKey from Klaytn networkconstupdatedKey=awaitcaver.klay.getAccountKey(account.address)console.log(updatedKey)
NOTEcaver.klay.accounts.feePayerSignTransaction is supported since caver-js v1.2.0.
FEE_DELEGATED_ACCOUNT_UPDATE_WITH_RATIO 트랜잭션을 사용하려는경우 위의 예제에 updateTx를 아래와 같이 정의하세요.
rawTransaction은 RLP 인코딩된 트랜잭션으로 signatures와 feePayerSignatures를 가지고 있습니다. feePayerSignature is included only when the transaction is a fee delegated transaction.
다음 예제는 여러 개인 키를 사용하여 트랜잭션에 순차적으로 서명하는 방법을 보여줍니다. 계정의 transactionKey에 두 개의 개인키 문자열이 있다고 가정해보죠.
consttx= { type:'VALUE_TRANSFER', from:account.address, to:caver.klay.accounts.create().address, value:1, gas:900000,}// Sign with transactionKey[0]constuser1Signed=awaitcaver.klay.accounts.signTransaction(tx,account.transactionKey[0])// Append sender's signatures with transactionKey[1]constuser2Signed=awaitcaver.klay.accounts.signTransaction(user1Signed.rawTransaction,account.transactionKey[1])constreceipt=awaitcaver.klay.sendSignedTransaction(user2Signed)console.log(receipt)
AccountKeyRoleBased 타입의 수수료 납부자 키로 서명하려면 아래 예를 참조하십시오. 수수료 납부자는 feePayerKey에 3개의 개인키 문자열이 있다고 가정합니다.
consttx= { type:'FEE_DELEGATED_VALUE_TRANSFER', from:account.address, to:caver.klay.accounts.create().address, value:1, gas:900000,}// Sign with transactionKey[0] and transactionKey[1]const userSigned = await caver.klay.accounts.signTransaction(tx, [account.transactionKey[0], account.transactionKey[1]])
// Fee payer signs transaction with feePayerKey[0]const feePayer1Signed = await caver.klay.accounts.feePayerSignTransaction(userSigned.rawTransaction, feePayer.address, feePayer.feePayerKey[0])
// Append feePayerSignatures with feePayerKey[1] and feePayerKey[2]const feePayer2Signed = await caver.klay.accounts.feePayerSignTransaction(feePayer1Signed.rawTransaction, feePayer.address, [feePayer.feePayerKey[1], feePayer.feePayerKey[2]])
constreceipt=awaitcaver.klay.sendSignedTransaction(feePayer2Signed)console.log(receipt)
NOTEcaver.klay.accounts.feePayerSignTransaction is supported since caver-js v1.2.0.
사용하는 계정이 caver-js의 인메모리 지갑에 있으면 키를 signTransaction 또는 feePayerSignTransaction에 전달할 필요가 없습니다. See the example below.
consttx= { type:'FEE_DELEGATED_VALUE_TRANSFER_WITH_RATIO', from:account.address, to:caver.klay.accounts.create().address, value:1, gas:900000, feeRatio:10,}// Sign with transactionKey[0] and transactionKey[1]constuserSigned=awaitcaver.klay.accounts.signTransaction(tx)// Fee payer signs transaction with feePayerKey[0], feePayerKey[1] and feePayerKey[2]constfeePayerSigned=awaitcaver.klay.accounts.feePayerSignTransaction(userSigned.rawTransaction,feePayer.address)constreceipt=awaitcaver.klay.sendSignedTransaction(feePayerSigned)console.log(receipt)
RawTransaction의 서명을 통합하기
여러 사람으로부터 caver.klay.accounts.signTransaction 또는 caver.klay.accounts.feePayerSignTransaction이 반환하는 오브젝트를 전달받은 경우, 모든 서명 정보를 포함한 하나의 RLP 인코딩된 트랜잭션을 생성할 수 있습니다.
NOTEcaver.klay.accounts.combineSignatures is supported since caver-js v1.2.0.
Signatures 및 FeePayerSignatures와 함께 트랜잭션 오브젝트 전송하기
여러 서명인로부터 signatures 또는 feePayerSignatures만을 전달받는 경우, 아래와 같이 트랜잭션을 전송할 수 있습니다.
consttx= { type:'FEE_DELEGATED_VALUE_TRANSFER_WITH_RATIO', from:account.address, to:caver.klay.accounts.create().address, value:1, gas:900000, feeRatio:10,}// Sign with transactionKey[0] and transactionKey[1]const { signatures } =awaitcaver.klay.accounts.signTransaction(tx)// Fee payer signs transaction with feePayerKey[0], feePayerKey[1] and feePayerKey[2]const { feePayerSignatures } =awaitcaver.klay.accounts.feePayerSignTransaction(tx,feePayer.address)// Fill in the missing information in the tx object.tx.signatures = signaturestx.feePayer =feePayer.addresstx.feePayerSignatures = feePayerSignaturesconstreceipt=awaitcaver.klay.sendSignedTransaction(tx)console.log(receipt)
또한, caver.klay.accounts.getRawTransactionWithSignatures을 호출하여 트랜잭션 오브젝트의 signatures와 feePayerSignatures를 포함한 RLP 인코딩된 트랜잭션을 얻을 수 있습니다.
consttx= { type:'FEE_DELEGATED_VALUE_TRANSFER_WITH_RATIO', from:account.address, to:caver.klay.accounts.create().address, value:1, gas:900000, feeRatio:10,}// Sign with transactionKey[0] and transactionKey[1]const { signatures } =awaitcaver.klay.accounts.signTransaction(tx)// Fee payer signs transaction with feePayerKey[0], feePayerKey[1] and feePayerKey[2]const { feePayerSignatures } =awaitcaver.klay.accounts.feePayerSignTransaction(tx,feePayer.address)// Fill in the missing information in the tx object.tx.signatures = signaturestx.feePayer =feePayer.addresstx.feePayerSignatures = feePayerSignaturesconst { rawTransaction } =awaitcaver.klay.accounts.getRawTransactionWithSignatures(tx)console.log(rawTransaction)
NOTEcaver.klay.accounts.getRawTransactionWithSignatures is supported since caver-js v1.2.0.
샘플 프로젝트
Sample projects for development of dApps (Decentralized Applications) using caver-js can be found below:
Default key string of accountKey that the account has. This property is left for backward compatibility. privateKey only represents the default key of accountKey, so using privateKey to sign or send a transaction is not recommended. It is recommended to use transactionKey, updateKey, or feePayerKey in context.
accountKeyType
Type of accountKey the account has. This can be AccountKeyPublic, AccountKeyMultiSig, or AccountKeyRoleBased
accountKey
The key of the account. This is AccountKeyPublic, AccountKeyMultiSig or AccountKeyRoleBased.
keys
계정이 가진 accountKey의 모든 키.
transactionKey
RoleTransaction에 사용되는 키. AccountKeyPublic or AccountKeyMultiSig are not bound to any roles, so transactionKey holds the same value as keys.
updateKey
RoleAccountUpdate에 사용되는 키. AccountKeyPublic or AccountKeyMultiSig are not bound to any roles, so updateKey holds the same value as keys.
feePayerKey
RoleFeePayer에 사용되는 키. AccountKeyPublic or AccountKeyMultiSig are not bound to any roles, so feePayerKey holds the same value as keys.