Introduction aux contrats intelligents eosio.system (1) Comptes et autorisations

Les comptes identifient les participants à la blockchain EOSIO. Pour utiliser la blockchain EOSIO, vous devez d'abord créer un compte. Les contrats intelligents peuvent ensuite être déployés sur ce compte et d'autres autorisations de compte utilisées pour autoriser les transactions de contrat intelligent. Ce didacticiel présente en détail les modules de compte et d'autorisation du contrat intelligent eosio.system. Il convient aux développeurs juniors de contrats intelligents EOS. Ils savent comment créer des comptes, enchérir sur des comptes courts et créer, lier et dissocier autorisations personnalisées. , supprimer, etc.

01

aperçu

(1) Présentation du compte

Un compte EOSIO est composé de 12 caractères, dont uniquement les lettres minuscules az et les chiffres 1-5. La propriété de chaque compte est déterminée uniquement par le nom du compte, de sorte qu'un compte peut mettre à jour ses clés sans avoir à les redistribuer à d'autres parties. Outre le nom du compte, l'instance de compte est également associée à d'autres champs, tels que l'heure de création, le quota/l'utilisation de RAM, la limite/le poids net/cpu, etc. (comme illustré dans la figure ci-dessous). Dans le même temps, chaque compte dispose d'une liste d'autorisations nommée indépendante, ce qui rend possible l'autorisation mono-utilisateur ou multi-utilisateur grâce à une structure d'autorisation flexible.

nom taper décrire
nom du compte nom Nom de compte codé à 12 caractères
créé time_point Lorsque le compte a été créé
core_liquid_balance actif Solde liquide des actifs symboliques
ram_quota int64_t La quantité maximale de RAM pour le compte
poids net int64_t Poids en pourcentage NET (poids/total)
cpu_weight int64_t Pourcentage de poids du processeur (poids/total)
net_limit account_resource_limit Utilisation NET, disponibilité et maximum
cpu_limit account_resource_limit Utilisation du processeur, disponibilité et maximum
ram_usage int64_t Quantité de RAM utilisée par le compte (en octets)
autorisations tableau d'autorisation Liste des autorisations nommées
ressources_totales une variante Poids CPU/NET total de tous les comptes

(2) Enchère de compte court

En règle générale, un compte EOSIO se compose de 12 caractères, composés uniquement de lettres minuscules az et de chiffres 1-5. Lorsque nous enregistrons des comptes dans les principaux portefeuilles, nous ne pouvons enregistrer que des adresses de compte à 12 chiffres. Cependant, il existe des comptes courts dans le système EOSIO. Selon les restrictions de format des noms de compte EOSIO, les comptes de moins de 12 caractères doivent activer le mécanisme d'enchères. Nous pouvons effectuer des [enchères de compte] dans le système EOSIO, par exemple : des comptes courts tels que a/com/cn/eos/1. Si nous obtenons le compte [a] dans l'enchère, nous pouvons créer tous les comptes avec le suffixe [.a], tels que : aa/bb.a/111.a, etc.

(3) Introduction aux autorisations

Les autorisations vous permettent de contrôler ce qu'un compte EOSIO est autorisé à faire et comment effectuer les opérations autorisées. Ceci est rendu possible par une structure d'autorisation flexible qui lie chaque compte à une liste hiérarchique d'autorisations nommées et relie chaque autorisation nommée à une table d'autorisations (illustrée ci-dessous). Les niveaux d'autorisation hiérarchiques sont autorisés dans EOSIO, par exemple, le champ parent de la figure relie un niveau d'autorisation nommé à son autorisation parent.

nom taper décrire
perm_name nom nom de l'autorisation
parent nom nom de l'autorité parentale
required_auth autorité Tableau des autorisations d'association

(4) Niveau d'autorisation

Les autorisations nommées peuvent être créées sous une autre autorisation, permettant une structure d'autorisation parent-enfant hiérarchique. Lors de la création de chaque compte, deux autorisations nommées sont générées par défaut : propriétaire et actif, où propriétaire est l'autorisation parente de l'actif. Bien sûr, cela peut également être personnalisé en ajoutant d'autres niveaux d'autorisation et hiérarchies.

1. Autorisation du propriétaire

L'autorisation du propriétaire se trouve à la racine de la hiérarchie des autorisations de chaque compte et est l'autorisation relative la plus élevée qu'un compte peut avoir dans sa structure d'autorisation. Bien que le privilège du propriétaire puisse effectuer n'importe quelle action que les privilèges de niveau inférieur peuvent effectuer, il est souvent utilisé pour récupérer lorsque les privilèges de niveau inférieur sont compromis. Par conséquent, les clés associées aux autorisations du propriétaire sont généralement conservées dans un entrepôt frigorifique et ne sont pas utilisées pour signer des opérations générales.

2. Autorisations actives

L'autorisation active est un niveau en dessous de l'autorisation du propriétaire dans la hiérarchie et, dans l'implémentation EOSIO actuelle, est une autorisation par défaut implicite liée à toutes les opérations. Par conséquent, l'autorisation active peut faire tout ce que l'autorisation du propriétaire peut faire, sauf modifier la clé associée au propriétaire. En général, l'autorisation active peut être utilisée pour les opérations de compte telles que le vote et le transfert.

3. Autorisations personnalisées

Les autorisations personnalisées sont des autorisations nommées arbitraires créées par le compte EOSIO lui-même, généralement en tant que sous-autorisations de propriétaire, actives ou autres autorisations personnalisées. Les autorisations personnalisées doivent spécifier des paires de clés publiques-privées, qui peuvent être liées à des opérations de contrat intelligent et spécifier les autorisations requises pour effectuer les opérations. Grâce au compte EOSIO et à la structure d'autorité, les opérations de contrat intelligent peuvent être contrôlées de manière flexible et précise.

02

Fonctionnement du compte

(1) Préparation

1. Une blockchain opérationnelle et accessible

Configuration de l'environnement de test de China Mobile Chain (basé sur EOS) :

https://mp.weixin.qq.com/s/NBNFk9Xk9FCukMVgl0tfHA

2. Assurez-vous que le portefeuille local est ouvert et déverrouillé

Comment créer un portefeuille :

https://developers.eos.io/manuals/eos/latest/cleos/how-to-guides/how-to-create-a-wallet

3. La construction et le déploiement d'eosio.contracts sont terminés

Comment construire eosio.contracts :

https://developers.eos.io/manuals/eosio.contracts/latest/build-and-deploy

(2) Créer un compte

1. Créer une paire de clés

La première façon : créez des paires de clés publiques/privées et imprimez-les sur la console, où --to-console= paramètre d'option pour imprimer la paire de clés sur la console.

cleos create key --to-console
# 示例输出:
Private key: 5JX5oYkHjLBqdQLy7ofDfz4MFzYkMzvLwnJYaFpKbcsuiTQiPjv
Public key: EOS66tp9fQ6kYGQ6kJzt8goLmvvMY7Xmb2u1HFer3PScPahbSjqpt

La deuxième façon : créez une paire de clés publique/privée et enregistrez-la dans un fichier, où --file=paramètre d'option pour enregistrer la paire de clés dans un fichier.

第二种方式:创建公钥/私钥对并将其保存到文件中,其中--file=将密钥对保存到文件的选项参数。

cleos create key --file pw.txt
cat pw.txt
# 示例输出:
Private key: 5JW1NqFovGTo9wX3MLJAWWFP7PhMH82jcr2c5DKcky64ZgV6LQJ
Public key: EOS5sbzsWwmDPcW64nmYiGpjAhQj4i7XCz6bznr5TZ73VAKWFg6C2
2、创建一个账户

2. Créez un compte

Avant d'initialiser le contrat système : exécutez la commande suivante pour créer un nouveau compte bob, où eosio=le compte système autorisé à créer un nouveau compte, bob=le nouveau nom de compte conforme à la spécification de nommage de compte, EOS87TQ...AoLGNN= la clé publique propriétaire du nouveau compte, à ce moment il n'est pas nécessaire d'initialiser des ressources telles que NET, CPU, RAM, etc.

cleos create account eosio bob EOS87TQktA5RVse2EguhztfQVEh6XXxBmgkU8b4Y5YnGvtYAoLGNN
# 示例输出:
executed transaction: 4d65a274de9f809f9926b74c3c54aadc0947020bcfb6dd96043d1bcd9c46604c  200 bytes  166 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"bob","owner":{"threshold":1,"keys":[{"key":"EOS87TQktA5RVse2EguhztfQVEh6X...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

Après avoir initialisé le contrat système : exécutez la commande suivante pour créer un nouveau compte testaccount1, eosio=compte système autorisé à créer un nouveau compte, testaccount1=nouveau nom de compte conforme à la convention de nommage du compte, EOS7TBG...wsq6kT=clé publique propriétaire du nouveau compte, EOS5sbz.. .WFg6C2=clé publique active du nouveau compte, --stake-net=ressources NET jalonnées (unité : SYS), --stake-cpu=ressources CPU jalonnées (unité : SYS), - -buy-ram-kbytes= Ressources RAM achetées (unité : Ko).

cleos system newaccount eosio testaccount1 EOS7TBGFys7sqAEWjvsHnUS8KKymCVmYAKq4NMAFPZMyEV2wsq6kT EOS5sbzsWwmDPcW64nmYiGpjAhQj4i7XCz6bznr5TZ73VAKWFg6C2 --stake-net '1.00 SYS' --stake-cpu '1.00 SYS' --buy-ram-kbytes 1024
# 示例输出:
executed transaction: 1dec3d4ea7203ef0d9d29fb8734aa78770848c0867b1d331382922b0c2534e9a  336 bytes  1795 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"testaccount1","owner":{"threshold":1,"keys":[{"key":"EOS7TBGFys7sqAEWjvsH...
#         eosio <= eosio::buyrambytes           {"payer":"eosio","receiver":"testaccount1","bytes":1048576}
#         eosio <= eosio::delegatebw            {"from":"eosio","receiver":"testaccount1","stake_net_quantity":"1.0000 SYS","stake_cpu_quantity":"1....
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"15.3005 SYS","memo":"buy ram"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0769 SYS","memo":"ram fee"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"15.3005 SYS","memo":"buy ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"15.3005 SYS","memo":"buy ram"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0769 SYS","memo":"ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0769 SYS","memo":"ram fee"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"2.0000 SYS","memo":"stake bandwidth"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"2.0000 SYS","memo":"stake bandwidth"}
#   eosio.stake <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"2.0000 SYS","memo":"stake bandwidth"}
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

03

Autorisation d'opérer

(1) Préparation

1. Un compte nommé testaccount2 et les clés pour contrôler ce compte sont stockés dans le portefeuille local.

2. Un compte appelé testholder et les clés pour contrôler ce compte sont stockés dans le portefeuille local.

3. Un contrat intelligent nommé hello a été déployé sur le compte testholder.

// 这个智能合约有三个动作:what(eosio::name user)、why(eosio::name user)、how(eosio::name user)。
#include <eosio/eosio.hpp>
class [[eosio::contract]] hello : public eosio::contract {
  public:
      using eosio::contract::contract;
      [[eosio::action]] void what( eosio::name user ) {
         print( "hi, what do you want ", user);
      }

      [[eosio::action]] void why( eosio::name user ) {
         print( "why not ", user);
      }

      [[eosio::action]] void how( eosio::name user ) {
         print( "how are you ", user);
      }
};

(2) Créer des autorisations personnalisées

1. Utilisez la commande cleos set account permission pour créer une autorisation personnalisée customp1 sur le compte testaccount2, et le parent est l'autorisation active.

cleos set account permission testaccount2 customp1 EOS5DQMoqswknpe5qXsMt3M4su1wK38Mj7Rzc5jxs1Ak5jq7BF623 active -p testaccount2@active
# 示例输出:
executed transaction: 6eda9c3cde793064eea900800f892d55891ddf6f2427d97f41943666c40219b9  160 bytes  184 us
#         eosio <= eosio::updateauth            {"account":"testaccount2","permission":"customp1","parent":"active","auth":{"threshold":1,"keys":[{"...
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

2. Utilisez la même commande pour créer une autorité personnalisée customp2 sur le compte testaccount2, et le niveau parent est l'autorité customp1.

cleos set account permission testaccount2 customp2 EOS5DQMoqswknpe5qXsMt3M4su1wK38Mj7Rzc5jxs1Ak5jq7BF623 customp1 -p testaccount2@active
# 示例输出:
executed transaction: 4d65bbbf6a3e5711be413994c59ad1744bf3ca5ff4b678a98a7e002556564188  160 bytes  221 us
#         eosio <= eosio::updateauth            {"account":"testaccount2","permission":"customp2","parent":"customp1","auth":{"threshold":1,"keys":[...
warning: transaction executed locally, but may not be confirmed by the network yet

3. Vous pouvez créer une autorisation personnalisée sans spécifier de parent, qui prendra l'autorisation active comme parent par défaut.

cleos set account permission testaccount2 customp3 EOS5DQMoqswknpe5qXsMt3M4su1wK38Mj7Rzc5jxs1Ak5jq7BF623 -p testaccount2@active
# 示例输出:
executed transaction: aa1bcef2a8db09111160b5d393797b4252ac5909c4dbb1881af846f44b887491  160 bytes  208 us
#         eosio <= eosio::updateauth            {"account":"testaccount2","permission":"customp3","parent":"active","auth":{"threshold":1,"keys":[{"...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(3) Autorisations personnalisées de lien

Une fois que vous disposez d'une autorisation personnalisée, vous pouvez lier cette autorisation personnalisée à une opération de contrat intelligent qui nécessite une autorisation à ce niveau d'autorisation ou supérieur pour effectuer l'opération. Ce qui suit relie deux autorisations personnalisées customp1 et customp2 à deux opérations quoi et comment. customp1 peut appeler quoi et comment. Autorisations customp1 est un parent de customp2 et donc capable d'appeler tout ce que customp2 peut appeler. customp2 peut appeler comment. Testons cela en utilisant des autorisations pour appeler des opérations de contrat intelligent.

1. Utilisez la commande cleos set action permission pour lier l'autorisation personnalisée customp1 à l'opération what.

cleos set action permission testaccount2 testscholder what customp1 -p testaccount2@active
# 示例输出:
executed transaction: 975d6d88f1324e431db49a9ec86e86b70ea733bdf4a7415266dac4de1614e7c9  128 bytes  19436 us
#         eosio <= eosio::linkauth              {"account":"testaccount2","code":"testscholder","type":"what","requirement":"customp1"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

2. Utilisez la commande cleos set action permission pour lier l'autorisation personnalisée customp2 à l'opération how.

cleos set action permission testaccount2 testscholder how customp2 -p testaccount2@active
# 示例输出:
executed transaction: 74b7f0da804413fe6200d1501f82bf4804a973e89395084ec529dbe8463c115e  128 bytes  227 us
#         eosio <= eosio::linkauth              {"account":"testaccount2","code":"testscholder","type":"how","requirement":"customp2"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

3. Utilisez l'autorisation customp1 pour appeler respectivement les opérations pourquoi, quoi et comment, et vous pouvez appeler avec succès les actions quoi et comment, mais vous ne pouvez pas appeler l'action pourquoi.

cleos push action testscholder why '["name"]' -p testaccount2@customp1
# 示例输出:
Error 3090005: Irrelevant authority included
Please remove the unnecessary authority from your action!
Error Details:
action declares irrelevant authority '{"actor":"testaccount2","permission":"customp1"}'; minimum authority is {"actor":"testaccount2","permission":"active"}

cleos push action testscholder what '["name"]' -p testaccount2@customp1
# 示例输出:
executed transaction: 2e4d6008abb95441bbb4e2458d09e697a87d6d4e31deede86b445d8f9e7b6c26  104 bytes  228 us
#  testscholder <= testscholder::what           {"user":"name"}
>> hi, what do you want name
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

cleos push action testscholder how '["name"]' -p testaccount2@customp1
# 示例输出:
executed transaction: b3d0c8d381952c28df4bca6a9f4bd39439abc0f28ce9c0fc8a3e0621f6aa8ce6  104 bytes  173 us
#  testscholder <= testscholder::how            {"user":"name"}
>> how are you name
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

4. Utilisez l'autorité customp2 pour appeler les opérations pourquoi, quoi et comment, et vous pouvez appeler avec succès l'action comment, mais vous ne pouvez pas appeler les actions pourquoi et quoi.

cleos push action testscholder why '["name"]' -p testaccount2@customp2
# 示例输出:
Error 3090005: Irrelevant authority included
Please remove the unnecessary authority from your action!
Error Details:
action declares irrelevant authority '{"actor":"testaccount2","permission":"customp2"}'; minimum authority is {"actor":"testaccount2","permission":"active"}

cleos push action testscholder what '["name"]' -p testaccount2@customp2
# 示例输出:
Error 3090005: Irrelevant authority included
Please remove the unnecessary authority from your action!
Error Details:
action declares irrelevant authority '{"actor":"testaccount2","permission":"customp2"}'; minimum authority is {"actor":"testaccount2","permission":"customp1"}

cleos push action testscholder how '["name"]' -p testaccount2@customp2
# 示例输出:
executed transaction: 46b3cfc82741a5d9bce283dd7d46f63575411f6fd8c77c6df7a6991667aa3d6a  104 bytes  208 us
#  testscholder <= testscholder::how            {"user":"name"}
>> how are you name
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

(4) Dissocier les autorisations personnalisées

Annulez le lien de l'autorisation customp2 et ne conservez que le lien de l'autorisation customp1. De cette façon, l'autorité customp1 peut appeler quoi, mais l'autorité customp2 n'est pas liée, elle ne devrait donc pas pouvoir appeler quoi que ce soit. Testons cela en utilisant des autorisations pour appeler des opérations de contrat intelligent.

1. Utilisez la commande cleos set action permission pour annuler le lien entre l'autorisation customp2 et le fonctionnement.

cleos set action permission testaccount2 testscholder how NULL -p testaccount2@customp2
# 示例输出:
executed transaction: b7f091b92a13e1c7d6688f06c440dd9b6a7c12a2bf7fbc4ed4d891b3921113b0  120 bytes  212 us
#         eosio <= eosio::unlinkauth            {"account":"testaccount2","code":"testscholder","type":"how"}
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

2. Utilisez l'autorisation customp1 et l'autorisation customp2 pour appeler l'opération comment, respectivement, et l'action comment ne doit pas être appelée.

cleos push action testscholder how '["name"]' -p testaccount2@customp1
# 示例输出:
Please remove the unnecessary authority from your action!
Error Details:
action declares irrelevant authority '{"actor":"testaccount2","permission":"customp1"}'; minimum authority is {"actor":"testaccount2","permission":"active"}

cleos push action testscholder how '["name"]' -p testaccount2@customp2
# 示例输出:
Error 3090005: Irrelevant authority included
Please remove the unnecessary authority from your action!
Error Details:
action declares irrelevant authority '{"actor":"testaccount2","permission":"customp2"}'; minimum authority is {"actor":"testaccount2","permission":"active"}

(5) Supprimer les autorisations personnalisées

1. L'autorisation customp2 a été dissociée. Vous pouvez utiliser la commande cleos set account permission pour supprimer cette autorisation.

cleos set account permission testaccount2 customp2 NULL active -p testaccount2@active
# 示例输出:
executed transaction: 95392e8442b9aa82fedf4e757f7962cb5d208ca99228f8901bcac20d22d4ac7d  112 bytes  15996 us
#         eosio <= eosio::deleteauth            {"account":"testaccount2","permission":"customp2"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

-FIN-

Guess you like

Origin blog.csdn.net/BSN_yanxishe/article/details/131129549