[Caver] “Fee Delegation” verwenden mit Contract-Klasse
Hier ist die komplette Liste aller Artikel.
Dieser Post ist auch verfügbar auf Koreanisch und Englisch.
Wenn Du eine App betreibst auf der Blockchain Platform Klaytn, hast Du die Option, die Transaktionsgebühren der Nutzer zu übernehmen. Dieses sogenannte “Fee Delegation Modell” wird ab caver v1.6.1 über caver.contract
unterstützt. In diesem Post zeigen wir wie man Fee Delegation mit der Contract-Klasse in Caver in Anspruch nehmen kann.
In jedem Abschnitt, gehen wir durch einzelne Codeschnipsel durch, und der Gesamte findest Du unten verlinkt:
📢 Wichtig
Auf Deinem Wallet-Konto muss ausreichend KLAY vorhanden sein, um den hier demonstrierten Code auszuführen.
1. Der In-Memory Wallet ein Testkonto hinzufügen
Bevor mit caver.contract
einen Smart Contract deployt und durchgeführt wird, muss der In-Memory-caver.wallet
ein Konto mit ausreichendem KLAY hinzugefügt werden. Dazu brauchst Du ein deployer
-Konto, aus dem die Transaktion gesendet wird, und ein feePayer
-Konto, das die Transaktionsgebühren zahlt.
So geht’s mit caver-js:
// Erstelle einen “keyring” und füge ihn der In-Memory-Wallet hinzu- caver-js
const deployerAddress = '0x{address}'
const deployerPrivateKey = '0x{private key}'
const feePayerAddress = '0x{address}'
const feePayerPrivateKey = '0x{private key}'
const deployerKeyring = caver.wallet.keyring.create(deployerAddress, deployerPrivateKey)
caver.wallet.add(deployerKeyring)const feePayerKeyring = caver.wallet.keyring.create(feePayerAddress, feePayerPrivateKey)
caver.wallet.add(feePayerKeyring)
Erstelle eine Keyring-Instanz mit der Funktion caver.wallet.keyring.create
mit der Adresse und dem Private Key für des Test-Kontos als Parameter. Dann kann die Keyring-Instanz der In-Memory-Wallet hinzugefügt werden mit caver.wallet.add
.
Wenn Du eine “keystore” anstelle von einem Private Key hast, kannst du eine Keyring-Instanz erstellen mit caver.wallet.keyring.decrypt
. Und falls dein Account Key upgedatet wurde, kannst Du die Keyring-Instanz über caver.wallet.keyring.create
erstellen.
Für caver-java wird die Funktion caver.wallet.add
verwendet:
// Erstelle einen "keyring" und füge ihn der In-Memory-Wallet hinzu - caver-java
String deployerAddress = "0x{address}";
String deployerPrivateKey = "0x{private key}";String feePayerAddress = "0x{address}";
String feePayerPrivateKey = "0x{private key}";
SingleKeyring deployerKeyring =
caver.wallet.keyring.(deployerAddress, deployerPrivateKey);
caver.wallet.add(deployerKeyring);
SingleKeyring feePayerKeyring = caver.wallet.keyring.create(feePayerAddress, feePayerPrivateKey);
caver.wallet.add(feePayerKeyring);
2. Smart Contract Deployen
In diesem Abschnitt werden wir einen ganz schlichten Smart Contract für das Mapping zwischen Schlüsseln und Werten erstellen. Der sieht so aus:
pragma solidity ^0.5.6;
contract KVstore {
mapping(string=>string) store;
constructor (string memory key, string memory value) public {
store[key] = value;
}
function get(string memory key) public view returns (string memory) {
return store[key];
}
function set(string memory key, string memory value) public {
store[key] = value;
}
}
Unten ist eine Anleitung zum Deployment eines Smart Contracts mit Fee Delegation für caver-js. Die abi
und das byteCode
im Quellcode sind die Rückgabewerten der Kompilierung des obigen Contracts.
// Einen Smart Contract im Klaytn deployen- caver-js
const byteCode = '0x608060405234801561001057600080fd5b5060405161072d38038061072d8339810180604052604081101561003357600080fd5b81019080805164010000000081111561004b57600080fd5b8281019050602081018481111561006157600080fd5b815185600182028301116401000000008211171561007e57600080fd5b5050929190602001805164010000000081111561009a57600080fd5b828101905060208101848111156100b057600080fd5b81518560018202830111640100000000821117156100cd57600080fd5b5050929190505050806000836040518082805190602001908083835b6020831061010c57805182526020820191506020810190506020830392506100e9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061015292919061015a565b5050506101ff565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019b57805160ff19168380011785556101c9565b828001600101855582156101c9579182015b828111156101c85782518255916020019190600101906101ad565b5b5090506101d691906101da565b5090565b6101fc91905b808211156101f85760008160009055506001016101e0565b5090565b90565b61051f8061020e6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063693ec85e1461003b578063e942b5161461016f575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506102c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf6004803603604081101561018557600080fd5b81019080803590602001906401000000008111156101a257600080fd5b8201836020820111156101b457600080fd5b803590602001918460018302840111640100000000831117156101d657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561023957600080fd5b82018360208201111561024b57600080fd5b8035906020019184600183028401116401000000008311171561026d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103cc565b005b60606000826040518082805190602001908083835b602083106102f957805182526020820191506020810190506020830392506102d6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b50505050509050919050565b806000836040518082805190602001908083835b6020831061040357805182526020820191506020810190506020830392506103e0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061044992919061044e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061048f57805160ff19168380011785556104bd565b828001600101855582156104bd579182015b828111156104bc5782518255916020019190600101906104a1565b5b5090506104ca91906104ce565b5090565b6104f091905b808211156104ec5760008160009055506001016104d4565b5090565b9056fea165627a7a72305820adabefbb9574a90843d986f100c723c37f37e79f289b16aa527705b5341499aa0029'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',
},
{
inputs: [{ name: 'key', type: 'string' }, { name: 'value', type: 'string' }],
payable: false,
stateMutability: 'nonpayable',
type: 'constructor',
},
]let contract = caver.contract.create(abi)const keyString = 'keyString'// Eine FeeDelegatedSmartContractDeploy-Transaktion direkt an Klaytn senden.
contract = await contract.deploy({
from: deployerKeyring.address,
feeDelegation: true,
feePayer: feePayerKeyring.address,
gas: 1000000,}, byteCode, keyString, 'valueString')console.log(`The address of deployed smart contract: ${contract.options.address}`)
Gebe die ABI (Application Binary Interface) des Smart Contracts als Parameter für caver.contract.create
über und erstelle eine Contract-Instanz. Dann wird der Contract im Klaytn-Netzwerk deployt über die Methode contract.deploy
. Der erste Parameter ist das Objekt options
, wo die erforderlichen Werten zur Sendung von Transaktionen definiert sind. Auf dem Beispiel unten kannst Du sehen, dass feeDelegation: true
ist, und feePayer
innerhalb options
definiert ist. Wenn das Feld feeDelegation
true
ist, wird eine Fee Delegation-Transaktion zum Deployen des Smart Contracts verwendet. Die Transaktion FeeDelegatedSmartContractDeployWithRatio wird verwendet, wenn feeRatio
im Objekt options
definiert ist. Ansonsten wird FeeDelegatedSmartContractDeploy benutzt.
Die Funktion contract.deploy
aus dem obigen Beispiel erstellt eine FeeDelegatedSmartContractDeploy
-Transaktion zum Deployment des Smart Contracts. Weil der imcaver.wallet
verwaltete Keyring des Senders und des Fee Payers zum “Signen” (zu Deutsch: Unterschreiben) von Transaktionen verwendet werden vor dem Senden an Klaytn, das Fee Payer-Konto muss im Voraus im Feld feePayer
definiert sein, wenn die Transaktion durch Fee Delegation erfolgt. Übergebe das Byte Code des Smart Contracts als zweiten Parameter, gefolgt vom Konstruktor-Parameter des Contracts.
contract.deploy
gibt die Contract-Instanz zurück, die die Adresse des eingesetzten Contracts speichert.
Wenn die Transaktion nicht sofort gesendet werden kann, weil die Adressen vom sender
und feePayer
anders sind, müssen die beiden ihre Unterschrift separat geben.
// Sender unterschreibt die Transaktion zum Deployment des Smart Contracts — caver-js
const deployTx = await contract.sign({
from: deployerKeyring.address,
feeDelegation: true,
gas: 1000000,
}, ‘constructor’, byteCode, keyString, ‘valueString’)
console.log(`Sender signed transaction: `)
console.log(deployTx)const rlpEncoded = deployTx.getRLPEncoding()
Du kannst die Transaktion mit der Unterschrift des Deployers versehen mit der contract.sign
Funktion. Im obigen Beispiel ist das options
Objekt, welches die erforderlichen Daten zur Erstellung einer Transaktion ist, der erste Parameter der contract.sign
Funktion. Und Du siehst constructor
als den zweiten Parameter. contract.sign
benötigt den Methodennamen als zweiten Parameter, aber zum Deployen eines Smart Contracts kann man constructor
benutzen.
Du brauchst nicht feePayer
in options
zu definieren, denncontract.sign
nur eine Aktion ist, die der Transaktion die Unterschrift des Deployers hinzufügt. Die mit Unterschrift versehende FeeDelegatedSmartContractDeploy
-Transaktion, die vom contract.sign
als ein RLP-enkodierter String zurückgegeben wurde, kann abgefragt werden über die getRLPEncoding
Funktion.
// Fee Payer unterschreibt die Transaktion zum Deployment eines Smart Contracts — caver-js
const deployTx = caver.transaction.decode(rlpEncoded)await caver.wallet.signAsFeePayer(feePayerKeyring.address, deployTx) // Unterschreibt als Fee Payer
const receipt = await caver.rpc.klay.sendRawTransaction(deployTx)
console.log(`The address of deployed smart contract: ${receipt.contractAddress}`)
contract = caver.contract.create(abi, receipt.contractAddress)
Der Fee Payer, der den RLP-enkodierten String erhalten hat, erstellt eine Transaktion über caver.transaction.decode
. Der Fee Payer kann die FeeDelegatedSmartContractDeploy
-Transaktion unterschreiben, die von der caver.transaction.decode
über.wallet.signAsFeePayer
zurückgegeben wurde. Erst wenn die Transaction von den beiden Deployer und FeePayer unterschrieben ist, kann sie jetzt ans Klaytn-Netzwerk gesendet werden über caver.rpc.klay.sendRawTransaction
.
Wenn der Fee Payer zuerst unterschreiben muss, erfolgt das über contract.signAsFeePayer
. Diese Funktion gibt die Transaktion zurück, auf der die Unterschrift des Fee Payers dem feePayerSignatures
hinzugefügt ist. Danach kannst Du die Unterschrift des Deployers über caver.wallet.sign
addieren und an Klaytn schicken mit caver.rpc.klay.sendRawTransaction
.
Mit caver-java kannst du einen Smart Contract deployen mit Fee Delegation wie unten gezeigt:
// Einen Smart Contract im Klaytn deployen — caver-javaString byteCode = “0x608060405234801561001057600080fd5b5060405161072d38038061072d8339810180604052604081101561003357600080fd5b81019080805164010000000081111561004b57600080fd5b8281019050602081018481111561006157600080fd5b815185600182028301116401000000008211171561007e57600080fd5b5050929190602001805164010000000081111561009a57600080fd5b828101905060208101848111156100b057600080fd5b81518560018202830111640100000000821117156100cd57600080fd5b5050929190505050806000836040518082805190602001908083835b6020831061010c57805182526020820191506020810190506020830392506100e9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061015292919061015a565b5050506101ff565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019b57805160ff19168380011785556101c9565b828001600101855582156101c9579182015b828111156101c85782518255916020019190600101906101ad565b5b5090506101d691906101da565b5090565b6101fc91905b808211156101f85760008160009055506001016101e0565b5090565b90565b61051f8061020e6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063693ec85e1461003b578063e942b5161461016f575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506102c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf6004803603604081101561018557600080fd5b81019080803590602001906401000000008111156101a257600080fd5b8201836020820111156101b457600080fd5b803590602001918460018302840111640100000000831117156101d657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561023957600080fd5b82018360208201111561024b57600080fd5b8035906020019184600183028401116401000000008311171561026d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103cc565b005b60606000826040518082805190602001908083835b602083106102f957805182526020820191506020810190506020830392506102d6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b50505050509050919050565b806000836040518082805190602001908083835b6020831061040357805182526020820191506020810190506020830392506103e0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061044992919061044e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061048f57805160ff19168380011785556104bd565b828001600101855582156104bd579182015b828111156104bc5782518255916020019190600101906104a1565b5b5090506104ca91906104ce565b5090565b6104f091905b808211156104ec5760008160009055506001016104d4565b5090565b9056fea165627a7a72305820adabefbb9574a90843d986f100c723c37f37e79f289b16aa527705b5341499aa0029”;
String abi = “[\n” +
“ {\n” +
“ \”constant\”:true,\n” +
“ \”inputs\”:[\n” +
“ {\n” +
“ \”name\”:\”key\”,\n” +
“ \”type\”:\”string\”\n” +
“ }\n” +
“ ],\n” +
“ \”name\”:\”get\”,\n” +
“ \”outputs\”:[\n” +
“ {\n” +
“ \”name\”:\”\”,\n” +
“ \”type\”:\”string\”\n” +
“ }\n” +
“ ],\n” +
“ \”payable\”:false,\n” +
“ \”stateMutability\”:\”view\”,\n” +
“ \”type\”:\”function\”\n” +
“ },\n” +
“ {\n” +
“ \”constant\”:false,\n” +
“ \”inputs\”:[\n” +
“ {\n” +
“ \”name\”:\”key\”,\n” +
“ \”type\”:\”string\”\n” +
“ },\n” +
“ {\n” +
“ \”name\”:\”value\”,\n” +
“ \”type\”:\”string\”\n” +
“ }\n” +
“ ],\n” +
“ \”name\”:\”set\”,\n” +
“ \”outputs\”:[],\n” +
“ \”payable\”:false,\n” +
“ \”stateMutability\”:\”nonpayable\”,\n” +
“ \”type\”:\”function\”\n” +
“ },\n” +
“ {\n” +
“ \”inputs\”:[\n” +
“ {\n” +
“ \”name\”:\”key\”,\n” +
“ \”type\”:\”string\”\n” +
“ },\n” +
“ {\n” +
“ \”name\”:\”value\”,\n” +
“ \”type\”:\”string\”\n” +
“ }\n” +
“ ],\n” +
“ \”payable\”:false,\n” +
“ \”stateMutability\”:\”nonpayable\”,\n” +
“ \”type\”:\”constructor\”\n” +
“ }\n” +
“]”;Contract contract = caver.contract.create(abi);
String keyString = “keyString”;SendOptions sendOptionsForDeployment = new SendOptions();
sendOptionsForDeployment.setFrom(deployerKeyring.getAddress());
sendOptionsForDeployment.setGas(BigInteger.valueOf(1000000));
sendOptionsForDeployment.setFeeDelegation(true);
sendOptionsForDeployment.setFeePayer(feePayerKeyring.getAddress());// Send a FeeDelegatedSmartContractDeploy transaction to Klaytn directly.
contract.deploy(sendOptionsForDeployment, byteCode, keyString, “valueString”);
System.out.println(“The address of deployed smart contract:” + contract.getContractAddress());
Falls die Transaktion nicht sofort gesendet werden kann weil der Deployer und der Fee Payer nicht dieselbe Person sind, können die beiden ihre Unterschrift separat geben.
// Sender unterschreibt die Transaktion zum Deployment des Smart Contracts — caver-java
SendOptions sendOptionsForSigning = new SendOptions();
sendOptionsForSigning.setFrom(deployerKeyring.getAddress());
sendOptionsForSigning.setGas(BigInteger.valueOf(1000000));
sendOptionsForSigning.setFeeDelegation(true);
AbstractTransaction signedTx = contract.sign(sendOptionsForSigning, “constructor”, byteCode, keyString, “valueString”);String rlpEncoded = signedTx.getRLPEncoding();// Fee Payer unterschreibt die Transaktion zum Deployment des Smart Contracts — caver-java
AbstractTransaction signedTx = caver.transaction.decode(rlpEncoded);caver.wallet.signAsFeePayer(feePayer.getAddress(), (AbstractFeeDelegatedTransaction)signedTx);
Bytes32 sendResult = caver.rpc.klay.sendRawTransaction(signedTx).send();String txHash = sendResult.getResult();
TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);TransactionReceipt.TransactionReceiptData receiptData = receiptProcessor.waitForTransactionReceipt(txHash);
System.out.println(“The address of deployed smart contract:” + receiptData.getContractAddress());
3. Smart-Contract-Funktion aufrufen
3.1. Aufrufen
Du kannst über die get
Funktion im Smart Contract sicherstellen, dass dem Konstruktor der Schlüssel und der Wert richtig übergeben und dort gespeichert wurden. Die get
Funktion gibt Daten zurück, ohne den Contract-Zustand zu verändern. Du kannst die Funktion aufrufen mit contract.call
.
Der Code unten zeigt, wie man die get
Funktion aufruft für caver-js:
// Daten abfragen vom Smart Contract — caver-js
let valueString = await contract.call(‘get’, keyString)
console.log(`key: ${keyString} / value: ${valueString}`)
Du kannst die Funktion aufrufen mit über contract.call
. Gebe den Funktionsnamen als ersten Parameter über, und dann der Parameter, den die Funktion benötigt, als der zweiter Parameter. Wenn du options
definieren möchtest beim Funktionsaufruf, gebe ein Objekt als erster Parameter über. Mehr Informationen dazu finden sich in Klaytn Docs.
Für caver-java lässt sich auch die get
Funktion aufrufen:
// Daten abfragen vom Smart Contract — caver-java
Utf8String valueString = (Utf8String)contract.call(“get”, keyString).get(0);
System.out.println(“key: “ + keyString + “ / value: “ + valueString.toString());
3.2. Senden
Um die Daten im Smart Contract zu verändern, kannst Du die set
Funktion des deployeten Smart Contracts aufrufen. Die set
Funktion verändert nun den Zustand des Contracts, und Du musst eine Transaktion senden, um sie aufzurufen. Dabei kannst Du die contract.send
Funktion verwenden. contract.send
wird das Objekt entgegennehmen, bei dem die zur Transaktionserstellung erforderlichen Werte als der erste Parameter definiert sind. Wenn du Fee Delegation in Anspruch nimmst, kannst Du im Objekt zusätzlich feeDelegation
, feePayer
und feeRatio
definieren.
Für caver-js lässt sich dieset
Funktion so aufrufen:
// Eine FeeDelegatedSmartContractExecutionWithRatio-Transaktion direkt an Klaytn senden — caver-js
const setResult = await contract.send({
from: deployerKeyring.address,
feeDelegation: true,
feePayer: feePayerKeyring.address,
feeRatio: 50, // Without feeRatio, `send` will use FeeDelegatedSmartContractExecution
gas: 1000000,
}, ‘set’, keyString, ‘anotherValue’)
Im Objekt, das als erster Parameter für contract.send
übergeben wurde, feeDelegation
ist als true
definiert. Das bedeutet, dass die Ausführung der set
Funktion durch Fee Delegation erfolgt. Um genauer zu sein, weil feeRatio
auch definiert ist, handelt es sich dabei um dieFeeDelegatedSmartContractExecutionWithRatio
-Transaktion. Gebe den Funktionsnamen als zweiter Parameter, und gefolgt von den Parametern, die die Funktion benötigt. Nachdem contract.send
eine Transaktion erstellt hat, ist erforderlich, dass sowohl der Deployer als auch der Fee Payer sie unterschreiben. Daher muss feePayer
im ersten Parameter definiert sein, um Fee Delegation zu verwenden.
Wenn die Transaktion nicht sofort gesendet werden kann, weil die Adressen vom Deployer und Fee Payer anders sind, können die beiden ihre Unterschrift separat geben, wie unten veranschaulicht:
// Deployer und Fee Payer unterschreiben die Transaktion zur Ausführung des Smart Contracts — caver-js
const executionTx = await contract.sign({
from: deployerKeyring.address,
feeDelegation: true,
feeRatio: 50, // Without feeRatio, `send` will use FeeDelegatedSmartContractExecution
gas: 1000000,
}, ‘set’, keyString, ‘anotherValue’)
console.log(`Sender signed transaction: `)
console.log(executionTx)await caver.wallet.signAsFeePayer(feePayerKeyring.address, executionTx) // Unterschreibt die Transaktion als Fee Payer
const setResult = await caver.rpc.klay.sendRawTransaction(executionTx)
Nachdem der Deployer die Transaktion mit der contract.sign
Funktion unterschrieben hat, wird die Unterschrift des Fee Payers mit caver.wallet.signAsFeePayer
hinzugefügt. Danach kann sie ans Klaytn-Netzwerk gesendet werden über caver.rpc.klay.sendRawTransaction
.
Nach der Ausführung der Transaktion kannst Du mit contract.call
das Ergebnis sehen wie unten:
// value string abfragen vom Smart Contract. — caver-js
valueString = await contract.call(‘get’, keyString)console.log(`After executing set function => key: ${keyString} / value: ${valueString}`)
Für caver-java kannst Du die set
Funktion aufrufen wie im Folgenden:
// Eine FeeDelegatedSmartContractExecutionWithRatio-Transaktion direkt an Klaytn senden. — caver-java
SendOptions sendOptionsForExecution = new SendOptions();
sendOptionsForExecution.setFrom(sender.getAddress());
sendOptionsForExecution.setGas(BigInteger.valueOf(1000000));
sendOptionsForExecution.setFeeDelegation(true);
sendOptionsForExecution.setFeePayer(feePayer.getAddress());
sendOptionsForExecution.setFeeRatio(BigInteger.valueOf(50)); // Without feeRatio, `send` will use FeeDelegatedSmartContractExecutionTransactionReceipt.TransactionReceiptData receiptData = contract.send(sendOptionsForExecution, “set”, “key_inserted”, “value_inserted”);
System.out.println(“Transaction type : “ + receiptData.getType());
System.out.println(“From : “ + receiptData.getFrom());
System.out.println(“Fee payer : “ + receiptData.getFeePayer());
System.out.println(“Fee ratio : “ + receiptData.getFeeRatio());
Und wenn für caver-java zwei separate Unterschriften vom Deployer un Fee Payer benötigt sind:
// Deployer und Fee Payer unterschreibt die Transaktion zur Ausführung des Smart Contracts — caver-javaSendOptions sendOptionsForExecution = new SendOptions();
sendOptionsForExecution.setFrom(deployer.getAddress());
sendOptionsForExecution.setGas(BigInteger.valueOf(1000000));
sendOptionsForExecution.setFeeDelegation(true);
sendOptionsForExecution.setFeeRatio(BigInteger.valueOf(50)); // Without feeRatio, `send` will use FeeDelegatedSmartContractExecution
AbstractTransaction executionTx = contract.sign(sendOptionsForExecution, “set”, “key_inserted”, “value_inserted”);
caver.wallet.signAsFeePayer(feePayer.getAddress(), (AbstractFeeDelegatedTransaction)executionTx);Bytes32 sendResult = caver.rpc.klay.sendRawTransaction(executionTx).send();String txHash_executed = sendResult.getResult();
TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);TransactionReceipt.TransactionReceiptData receiptData = receiptProcessor.waitForTransactionReceipt(txHash_executed);
Wenn die Transaktion endlich gesendet ist, überprüfe das Ergebnis mitcontract.call:
// Daten abfragen vom Smart Contract — caver-java
Utf8String value = (Utf8String)contract.call(“get”, keyString).get(0);
System.out.println(“After executing set function => key: “ + keyString + “value: “ + value.toString());
Der gesamte Code, der in diesem Post erschienen ist:
Ich hoffe, dass dieser Post für Dich hilfreich ist. Bei irgendwelchen Fragen oder Anliegen, schreibe sie in die Kommentare oder im Klaytn Developer Forum. Natürlich kannst Du auch auf Deutsch. 😉
Vielen Dank fürs Lesen!