[Caver] Mettre à jour la clé de compte de Klaytn avec Caver #3 — AccountKeyRoleBased

Tech at Klaytn
9 min readSep 28, 2021

--

Cliquez ici pour la liste complète des articles.

🇰🇷: Caver로 Klaytn 계정의 키를 바꾸는 방법 #3— AccountKeyRoleBased
🇬🇧: How to Update Klaytn Account Keys with Caver #3— AccountKeyRoleBased
🇩🇪:[Caver] Klaytn-Kontoschlüssel Updaten mit Caver #3 AccountKeyRoleBased

L’une des principales caractéristiques de la plate-forme Blockchain Klaytn est que la clé est découplée de l’adresse, qui vous permet de mettre à jour votre clé de compte. Dans ce poste, nous expliquons comment vous pouvez la mettre à jour vers AccountKeyWeightedMultisig en utilisant caver-js et caver-java. Cette fonctionalité vous permet mettre en place une multisignature pours les transactions. Pour plus de détails, référez-vous à Klaytn Docs.

Avant toute chose, il faut mettre en place l’environnement de développement. Si vous ne l’avez pas déjà fait, consultez caver-js — Prerequisites ou caver-java — Prerequisites.

Dans chaque section, ils y a des petits extraits de code. Le code complet se trouve dans ces liens:

1. Créer un Keyring

Tout d’abord, vous allez créer un compte de Klaytn. C’est avec ce compte que vous allez soumettre une transaction pour la mise à jour de la clé de compte, qui se trouve dans le réseau. Vous devez donc disposer de suffisamment de KLAY dans votre compte pour effectuer la transaction.

Caver a une structure qui s’appelle Keyring qui est une sorte de conteneur des clés privées, et qui est utilisé pour les adresses et les comptes.

Vous pouvez créer une instance de Keyring qui contient des données de compte de Klaytn en utilisant caver-js:

// caver-js
const senderKeyring = caver.wallet.keyring.create(senderAddress, senderPrivateKey)

Si vous avez un fichier de keystore et non une chaîne de caractères (String) de la clé privée, vous pouvez créer un Keyring à l’aide de caver.wallet.keyring.decrypt.

Une instance de Keyring en caver-java se crée comme suit:

// caver-java
SingleKeyring senderKeyring = caver.wallet.keyring.create(senderAddress, senderPrivateKey);

Vous pouvez aussi créer un Keyring à l’aide de caver.wallet.keyring.decrypt avec caver-java si vous avez un fichier de keystore.

2. Ajouter un Keyring au portefeuille d’in-memory de Caver

Dans ce tutoriel, nous utiliserons un portefeuille d’in-memory. Si vous y avez ajouté un Keyring, c’est la clé dedans qui sera dorénavant automatiquement utilisée pour signer des transactions, même si vous n’en avez pas la destiné à ce but.

Vous ajoutez un Keyring à un portefeuille d’in-memory en utilisant caver-js comme le suivant:

// caver-js
caver.wallet.add(senderKeyring)

Il va même pour caver-java:

// caver-java
caver.wallet.add(senderKeyring);

3. Créer une nouvelle clé privée

Pour mettre à jour AccountKey vers AccountKeyRoleBased, il faut avoir une clé privée pour votre compte de Klaytn. Dans ce tutoriel, nous utilisons une clé générée de manière aléatoire par la fonction generateSingleKey. Mais s’il y en a une en particulier que vous voulez utiliser, allez-y. Vous pouvez en savoir davantage sur chaque rôle en consultant Klaytn Docs.

Au-dessous se trouve le code pour créer des chaînes de caractères de nouvelle clé privée en utilisant caver-js. Le tableau qui a été passé en tant qu’un paramètre définit les nombres des clés qui seront utilisés pour chaque rôle. Celui dans l’exemple au-dessous va créer deux clés privées comme RoleTransactionKeys, une commeRoleAccountUpdateKey, et trois comme RoleFeePayerKeys

// caver-js
const newRoleBasedKeys = caver.wallet.keyring.generateRoleBasedKeys([2, 1, 3])

Voilà à quoi ça ressemble avec caver-java:

List<String[]> newRoleBasedKeys = caver.wallet.keyring.generateRolBasedKeys(new int[]{2, 1, 3});

4. Créer un nouveau Keyring

Maintenant que nous avons une nouvelle clé privée, nous passerons à l’étape suivante, à savoir la création d’une instance de Keyring pour la stocker. Une fois que la AccountKey dans le compte de Klaytn mise à jour, vous pouvez commencer à utiliser l’instance qui contient la nouvelle clé.

Voice le code pour créer une instance de Keyring qui stocke les nouvelles clés privées en caver-js:

// caver-js
const newKeyring = caver.wallet.keyring.create(senderKeyring.address, newRoleBasedKeys)

Désormais, l’instance newKeyring qui contient la nouvelle clé privée sera utilisée pour signer des transactions avec newRoleBasedKeys.

Voici l’exemple en caver-java:

RoleBasedKeyring newKeyring = caver.wallet.keyring.create(senderKeyring.getAddress(), newRoleBasedKeys);

5. Créer une instance d’Account

La classe Account fourni par Caver contient des données nécessaires pour mettre à jour les comptes. Pour effectuer la mise à jour vers AccountKeyRoleBased, il faut avoir l’adresse du compte de Klaytn que vous allez mettre à jour, et les role based keys qui sont définies en fonction de chaque rôle. AccountKeyRoleBased stocke les clés sous la forme de clés publiques. Vous pouvez aussi définir le seuil (threshold) de poids ainsi que les poids (weights) attribués à chaque clé publique, si plusieurs clés sont utilisées pour un rôle.

Vous pouvez créer une instance d’Account par appel de la fonction toAccount du keyring qui stocke les nouvelles clés privées. Regardez l’exemple en caver-js ci-dessous:

// caver-js
const account = newKeyring.toAccount([{ threshold: 2, weights: [1, 1] }, {}, { threshold: 3, weights: [2, 1, 1] }])

Le newKeyring à utiliser après la mise à jour a deux clés de RoleTransaction et trois clés de RoleFeePayer. Il faut définir le seuil et les poids pour les clés pour chaque rôle. Lorsque vous appelez la fonction toAccount, vous passez les objets qui définissent les WeightedMultisigOptions pour chaque rôle. Le premier élément du tableau est un objet qui définit le seuil et les poids pour les deux clés qui seront utilisées dans le rôle de RoleTransaction. Passez un objet vide comme le deuxième élément, car une seule clé est utilisée pour RoleAccountUpdate. Le dernier élément du tableau est un objet qui définit le seuil et les poids pour les trois clés utilisées le rôle de RoleFeePayer.

Vous pouvez créer une instance d’Account par appel de la fonction toAccount du keyring qui stocke les nouvelles clés privées en fonction de leurs rôles respectifs en caver-java. Le seuil de AccountKeyRoleBased et les poids de les clés sont définis en utilisant la class WeightedMultiSigOptions.

// caver-java
BigInteger[][] optionWeight = {
{BigInteger.ONE, BigInteger.ONE},
{},
{BigInteger.valueOf(2), BigInteger.ONE, BigInteger.ONE},
};WeightedMultiSigOptions[] options = {
new WeightedMultiSigOptions(BigInteger.valueOf(2), Arrays.asList(optionWeight[0])),
new WeightedMultiSigOptions(),
new WeightedMultiSigOptions(BigInteger.valueOf(3), Arrays.asList(optionWeight[2])),
};Account account = newKeyring.toAccount(Arrays.asList(options));

Avec caver-java aussi, vous pouvez créer une instance d’Account en passant un tableau dans lequel WeightedMultiSigOptions sont définis pour chaque rôle à la fonction toAccount.

L’instance d’Account contient maintenant l’adresse de compte de Klaytn, et les clés publiques pour chaque rôle dan lesquelles le seuil et les poids sont définis.

6. Créer une transaction

Une fois l’instance d’Account crée, vous pouvez l’utiliser pour générer une transaction pour mettre à jour le compte.

Voici l’exemple pour créer une transaction en utilisant caver-js:

// caver-js
const accountUpdate = caver.transaction.accountUpdate.create({
from: senderKeyring.address,
account: account,
gas: 150000,})

Et avec caver-java:

// caver-java
AccountUpdate accountUpdate = caver.transaction.accountUpdate.create(
TxPropertyBuilder.accountUpdate()
.setFrom(senderKeyring.getAddress())
.setAccount(account)
.setGas(BigInteger.valueOf(150000))
);

7. Signer la transaction

Vous devez maintenant signer la transaction crée avec le Keyring qui a été ajouté au portefeuille d’in memory. Le portefeuille d’in memory de Caver, caver.wallet, dispose de la fonction sign.

Vous signez la transaction comme ça en caver-js:

// caver-js
await caver.wallet.sign(senderKeyring.address, accountUpdate)

Et en caver-java:

// caver-java
caver.wallet.sign(senderKeyring.getAddress(), accountUpdate);

Si la fonction caver.wallet.sign est bien exécutée, vous pourrez constater que la signature a été ajoutée au champ signatures de accountUpdate.

Nous sommes fin prêts a envoyer une transaction au réseau.

8. Envoyer la transaction

Maintenant que nous avons créé et signé la transaction, nous allons l’envoyer sur Klaytn. Quand la transaction est traitée sur le réseau, le ancien Keyring, qui contient la ancienne clé, ne sera plus utilisable. Il faut plutôt utiliser le nouveau Keyring qui a la nouvelle clé privée.

Vous pouvez envoyer la transaction signée au réseau à l’aide de caver.rpc.klay.sendRawTransaction.

Voici un exemple qui montre comment vous envoyez unes transaction en caver-js en utilisant EventEmitter:

// caver-js
caver.rpc.klay.sendRawTransaction(accountUpdate)
.on(‘transactionHash’, hash => {
console.log(hash)
})
.on(‘receipt’, receipt => {
console.log(receipt)
})

Lors que vous envoyez la transaction avec caver-js, vous recevez le receipt de la transaction avec Promise comme montré ci-dessous:

// caver-js
const receipt = await caver.rpc.klay.sendRawTransaction(accountUpdate)

Et vous envoyez la transaction avec caver-java comme ça:

// caver-java
Bytes32 sendResult = caver.rpc.klay.sendRawTransaction(accountUpdate).send();
String txHash = sendResult.getResult();

L’exécution de ce code vous donne le hash de transaction. Le résultat de la transaction peut être obtenu avec le code montré ci-dessous:

// caver-java
public String objectToString(Object value) throws JsonProcessingException {
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
return ow.writeValueAsString(value);
}TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);TransactionReceipt.TransactionReceiptData receiptData = receiptProcessor.waitForTransactionReceipt(txHash);System.out.println(objectToString(receiptData));

Si le status a renvoyé true dans le receipt, ça veut dire que la transaction a été traitée avec succès. Le type de transaction est TxTypeAccountUpdate. La AccountKeyRoleBased qui a été mise à jour sera renvoyée dans le champ key sous forme codée.

{
blockHash: ‘0xe1a010ffef58727d47ed34d071a523c21a661f0c50a0074f8ec2bb8389bf7775’,
blockNumber: ‘0x33ca958’,
contractAddress: null,
from: ‘0x344de28e3e3089c3d7b9076f30dbbafcb329176f’,
gas: ‘0x249f0’,
gasPrice: ‘0x5d21dba00’,
gasUsed: ‘0x226c8’,
key: ‘0x05f8e8b84e04f84b01f848e301a102e2b8b818b0668e26651ed7fa199eccdc9b77e40775db80db6391244175ad6e5ee301a1033c79532bdd5b2c7265754df31f3665ed13a8556c24525a69cf0eedbbf5ff7ef1a302a102670a11eba2c17d92c01dfe272263db6c6d3eed5b1119401f9a62b7023cde6a6ab87204f86f01f86ce301a102104b2f85f43abc7b295cfd3ce91f6cb2c68e47c76d4bcc765b28c6ef2e0a86e8e301a1021190e282cf2a5066013784e08e29fb7821b3044a5f500059575bc003e926528be301a10289a57b9501c831e6b41537d3adbcaeca07ad5685d2963601b282def87ee619f2’,
logs: [],
logsBloom: ‘0x00000…’,
nonce: ‘0x0’,
senderTxHash: ‘0x826e5fbe3f33fd19c9a07b0f315eda2066ce2150b17656825e926374d32ef39a’,
signatures: [
{ V: ‘0x7f5’, R: ‘0xa952b…’, S: ‘0x936ad…’ }
],
status: ‘0x1’,
transactionHash: ‘0x826e5fbe3f33fd19c9a07b0f315eda2066ce2150b17656825e926374d32ef39a’,
transactionIndex: ‘0x0’,
type: ‘TxTypeAccountUpdate’,
typeInt: 32
}

9. Confirmer la mise à jour d’AccountKey

Si la transaction a marché comme prévue, la clé du compte stockée sur le réseau Klaytn sera être mise à jour. Vous pouvez confirmer le résultat en utilisant caver.rpc.klay.getAccountKey.

Pour voir la nouvelle accountKey en caver-js:

// caver-js
const accountKey = await caver.rpc.klay.getAccountKey(senderKeyring.address)console.log(accountKey)

Ou en caver-java:

// caver-java
AccountKey accountKey = caver.rpc.klay.getAccountKey(senderKeyring.getAddress()).send();System.out.println(objectToString(accountKey));

Le code au-dessus va retourner la clé stockée dans le compte de Klaytn. Puisque la clé a été mise a jour vers AccountKeyRoleBased, le keyType, qui représente un identifiant de key type (key type ID), est 5. Pour plus de details sur key type ID, consultez dans Klaytn Docs.

{
keyType: 5,
key: [
{
keyType: 4,
key: {
threshold: 1,
keys: [
{
weight: 1,
key: { x: ‘0xe2b8b…’, y: ‘0xc8004…’ }
},
{
weight: 1,
key: { x: ‘0x3c795…’, y: ‘0x18799…’ }
}
]
}
},
{
keyType: 2,
key: { x: ‘0x670a1…’, y: ‘0x1fe76…’ }
},
{
keyType: 4,
key: {
threshold: 1,
keys: [
{
weight: 1,
key: { x: ‘0x104b2…’, y: ‘0xa388d…’ }
},
{
weight: 1,
key: { x: ‘0x1190e…’, y: ‘0x3c23b…’ }
},
{
weight: 1,
key: { x: ‘0x89a57…’, y: ‘0xfedd0…’ }
}
]
}
}
]
}

10. Mettre à jour le Keyring dans le portefeuille d’in-memory

Maintenant que votre clé de compte est mise à jour, c’est cette nouvelle clé que vous désormais utiliserez pour signer les transactions.

Pour l’instant, la clé qui est utilisée dans le Keyring et qui se trouve dans le portefeuille d’in memory, est encore la ancienne version avant la mise à jour. Si vous envoyez une transaction dans cet état va jeter une erreur comme suit:

Error: Returned error: invalid transaction v, r, s values of the sender

C’est pourquoi il faut mettre a jour aussi la clé dans le portefeuille d’in memory.

Vous pouvez la mettre à jour en utilisant caver.wallet.updateKeyring. Passez newKeyring, qui contient l’adresse de compte mis à jour, et la nouvelle clé privée comme paramètre.

Voici l’exemple en caver-js:

// caver-js
caver.wallet.updateKeyring(newKeyring)

Et en caver-java:

// caver-java
caver.wallet.updateKeyring(newKeyring);

11. Envoyer une transaction avec le nouveau compte

Votre clé de Klaytn a été mise mise à jour. Maintenant vous pouvez envoyer une transaction avec cette nouvelle clé.

Puisque la clé de compte qui est stockée dans le réseau a été mise à jour, c’est avec cette clé que vous devez signer la transaction. Dans la section [10. Mettre à jour le Keyring dans le portefeuille d’in-memory], nous avons aussi mis à jour la clé dans le Keyring. Une transaction va alors envoyée avec une signature par cette nouvelle clé mise à jour.

Dans ce tutoriel, nous allons envoyer une transaction simple, à savoir une de valueTransfer.

L’exemple ci-dessous montre comment créer, signer et envoyer une transaction de valueTransfer avec caver-js:

// caver-js
const vt = caver.transaction.valueTransfer.create({
from: senderKeyring.address,
to: recipientAddress,
value: 1,
gas: 100000,
})
await caver.wallet.sign(senderKeyring.address, vt)const vtReceipt = await caver.rpc.klay.sendRawTransaction(vt)

Vous pouvez créer une transaction par appel à caver.transaction.valueTransfer et la signer en utilisant la fonction caver.wallet.sign comme déjà montré. Puisque le Keyring dans caver.wallet a été mis à jour dans [10. Mettre à jour le Keyring d’in-memory wallet], vous devez désormais utiliser la nouvelle clé pour signer la transaction. D’après, la transaction sera envoyée au réseau Klaytn en utilisant caver.rpc.klay.sendRawTransaction. Dans ce tutoriel, le résultat est renvoyé avec Promise.

Voici le même processus avec caver-java:

// caver-javaValueTransfer vt = caver.transaction.valueTransfer.create(
TxPropertyBuilder.valueTransfer()
.setFrom(senderKeyring.getAddress())
.setTo(recipientAddress)
.setValue(BigInteger.valueOf(1))
.setGas(BigInteger.valueOf(100000))
);caver.wallet.sign(senderKeyring.getAddress(), vt);Bytes32 vtResult = caver.rpc.klay.sendRawTransaction(vt).send();TransactionReceipt.TransactionReceiptData vtReceiptData = receiptProcessor.waitForTransactionReceipt(vtResult.getResult());

Créez une transaction de ValueTransfer, et la signer avec la fonction caver.wallet.sign. La transaction peut être envoyée par appel à caver.rpc.klay.sendRawTransaction. Puis vous pouvez voir le statut de la transaction en utilisant le hash qui est retourné.

Dans ce poste, nous avons montré comment mettre à jour une clé de compte vers AccountKeyRoleBased. C’était le dernier de la série sur la mise à jour de clé du compte de Klaytn. La prochaine fois, nous reviendrons avec un nouveau thème.

Merci d’avoir lu jusqu’au bout. Si vous avez des questions, n’hésitez pas à laisser un commentaire ci-dessous ou dans notre Klaytn Developer Forum. Vous pouvez nous écrire en français.

Le code complet qui a été utilisé dans ce tutoriel:

--

--

Tech at Klaytn
Tech at Klaytn

No responses yet