Rejoignez-Nous sur

Introduction aux contrats intelligents – Le blog Coinbase

0*9FHmbKqcIUrpQP7r

News

Introduction aux contrats intelligents – Le blog Coinbase

Tout cela nous amène à notre poste d’aujourd’hui, où nous étudierons un exemple simple d’application décentralisée, ou dapp, que vous implémenterez vous-même sur votre ordinateur local.

Les applications Dapp sont des applications écrites à l'aide de langages tels que JavaScript, HTML et CSS, exploitant des contrats intelligents sur le back-end pour afficher et modifier des informations. Ils constituent une partie importante d'un mouvement des architectures Web2 centralisées vers une architecture Web3 décentralisée.

Cet article vous guidera dans la rédaction d'un contrat intelligent pour la programmation d'un contrat de jeton non fongible dans Solidity, le langage le plus populaire pour la rédaction de contrats intelligents Ethereum. Ensuite, nous allons nous connecter à ce contrat intelligent en utilisant une simple application React.

La dapp que vous allez mettre en place aujourd’hui est une petite parodie du populaire CryptoKitties collection dapp.

Assurez-vous que vous avez Nœud, Git, et Métamasque installé et mis en place. Metamask est une extension qui vous permet de vous connecter et d'interagir avec les applications Ethereum.

Aller vers ce dépôt GitHub Pour cloner le code, vous devez vous lancer dans cet atelier.

$ git clone https://github.com/jp3hou/dapp-demo
$ cd dapp-demo

Après avoir cloné le référentiel, ouvrez le projet dans un éditeur de texte et accédez au fichier «contracts / KatCoin.sol».

Ether est la devise utilisée dans l'écosystème Ethereum pour payer les frais de transaction.

Ethereum suit l’état par le biais de comptes, qui peuvent être des comptes externes ou des comptes contractuels. Les comptes appartenant à l'extérieur appartiennent à un utilisateur et sont contrôlés par une clé privée, tandis que les comptes de contrat sont contrôlés par leur code de contrat.

Chaque compte a une adresse de 20 octets et contient quatre champs:

  • Le nonce, un compteur pour s'assurer qu'une transaction n'est traitée qu'une seule fois
  • La balance de l'éther
  • Le stockage
  • Le code du contrat (s'il s'agit d'un compte contractuel)

Les transitions d’un état à l’autre se produisent lors de transactions contenant un expéditeur, un destinataire, la quantité d’éther transférée de l’expéditeur au destinataire et des limites de gaz pour cette transaction.

«Gas» est utilisé pour suivre la quantité de puissance de calcul utilisée. Cela évite les attaques par déni de service en obligeant les utilisateurs à payer pour chaque ressource consommée et en annulant les fonctions une fois qu'un contrat intelligent atteint la limite d'essence allouée.

Solidity est le langage le plus utilisé pour le développement de contrats intelligents Ethereum. Il est:

  • Statiquement tapé
  • Orienté objet
  • Compilé dans le bytecode EVM avant son déploiement dans la blockchain
pragma solidity ^0.4.24;import './Ownable.sol';contract KatCoin is Ownable {
event Minted(address owner, uint256 katId, uint256 genes);
event Sent(address from, address to, uint256 katId);
struct Kat {
uint32 color;
uint16 generation;
}
Kat() kats; mapping (uint256 => address) private _katOwner;
mapping (address => uint256) private _ownedKatsCount;
constructor() public {
for (uint32 i = 0; i < 30; i++) {
kats.push(Kat((i + 3) * 32, 0));
_mint(address(this), kats.length - 1, i * 32);
}
}
function balanceOf(address owner) public view returns (uint256) {
// FILL ME OUT
}
function ownerOf(uint256 katId) public view returns (address) {
// FILL ME OUT
}
function getKat(uint256 katId) public view returns (
uint32 color,
uint16 generation
) {
// FILL ME OUT
}
function purchase(uint256 katId) public payable {
// FILL ME OUT
}
function _transferFrom(address from, address to, uint256 katId) internal {
// FILL ME OUT
}
function _mint(
address to,
uint256 katId,
uint256 genes
) internal {
// FILL ME OUT
}
function _addKatTo(address to, uint256 katId) internal {
// FILL ME OUT
}
function _removeKatFrom(address from, uint256 katId) internal {
// FILL ME OUT
}
}

Vous verrez dans ce fichier que notre contrat KatCoin est dérivé d'un contrat Ownable situé dans le même répertoire, qui définit certaines fonctionnalités de base de contrôle des autorisations et des autorisations utilisateur dont notre KatCoin hérite. Les contrats intelligents ouvrent la possibilité de réinventer l'architecture des applications et des systèmes actuels à partir de la base, en tenant compte des données des utilisateurs et de la confidentialité.

Choses à noter:

  • L’appel «pragma» au début du fichier définit la version du compilateur Solidity à utiliser.
  • Les événements peuvent être définis et lancés / capturés. Cela peut être utile pour le débogage ou la journalisation
  • Nous définissons des variables d'état privées pour savoir quelle adresse possède quel KatCoin et combien de KatCoins une adresse est propriétaire. La désignation "privé" garantit que ces variables ne sont accessibles que dans le contrat intelligent actuel, pas à aucun de ses descendants.
  • Le constructeur frappera 30 pièces KatCoins au moment de l’initialisation de ce contrat et affectera le propriétaire de chaque jeton au contrat intelligent lui-même.
function balanceOf(address owner) public view returns (uint256) {
require(owner != address(0));
return _ownedKatsCount(owner);
}
function ownerOf(uint256 katId) public view returns (address) {
address owner = _katOwner(katId);
require(owner != address(0));
return owner;
}

Choses à noter:

  • "Require" est une fonction Solidity intégrée qui lève une exception si la condition donnée renvoie false
  • Les fonctions publiques font partie de l’interface d’un contrat et peuvent être appelées en interne depuis le contrat ou en externe à partir d’autres contrats / adresses.
  • Les fonctions d'affichage sont des fonctions en lecture seule, ce qui signifie qu'elles ne modifient pas l'état d'un contrat intelligent.
function getKat(uint256 katId) public view returns (
uint32 color,
uint16 generation
) {
Kat storage kat = kats(katId); color = kat.color;
generation = kat.generation;
}

Choses à noter:

  • Un type de structure est affecté à une variable locale avec l’emplacement de données «stockage», qui stocke une référence à la structure.
function _addKatTo(address to, uint256 katId) internal {
require(_katOwner(katId) == address(0));
_katOwner(katId) = to;
_ownedKatsCount(to)++;
}
function _removeKatFrom(address from, uint256 katId) internal {
require(ownerOf(katId) == from);
_ownedKatsCount(from)--;
_katOwner(katId) = address(0);
}

Choses à noter:

  • Les fonctions internes ne sont accessibles que par le contrat en cours et par ses descendants
  • _addKatTo valide que le KatCoin n'appartient actuellement à personne avant de l'attribuer à un propriétaire
  • _removeKatFrom valide que le propriétaire du KatCoin est la seule personne pouvant transférer la propriété
  • Ces fonctions modifient les variables d’état du contrat pour refléter la mise à jour de la propriété de ces KatCoins.
function _mint(address to, uint256 katId, uint256 genes) internal {
require(to != address(0));
_addKatTo(to, katId);
emit Minted(to, katId, genes);
}

Choses à noter:

  • _mint valide que le jeton doit être attribué à une adresse valide
  • Cette fonction exploite notre fonction interne précédemment implémentée pour attribuer la propriété de ce KatCoin à l'adresse donnée.
  • Emet l'événement "Minted"
function _transferFrom(
address from,
address to,
uint256 katId
)
internal {
require(from == _katOwner(katId));
require(to != address(0)); _removeKatFrom(from, katId);
_addKatTo(to, katId); emit Sent(from, to, katId);
}

Choses à noter:

  • _transferFrom valide la propriété du jeton et l'adresse valide
  • Exploite nos fonctions _removeKatFrom et _addKatTo internes précédemment implémentées pour réaffecter la propriété de l’adresse «de» donnée à l’adresse «de»
  • Emet l'événement "Envoyé"
function purchase(uint256 katId) public payable {
require(katId >= 0 && katId < 30);
require(address(this) == _katOwner(katId));
_transferFrom(address(this), msg.sender, katId);
owner.transfer(msg.value);
}

Choses à noter:

  • Valide que le jeton est l'un des 30 jetons initialisés dans le constructeur
  • Valide que le contrat intelligent est le propriétaire actuel du jeton sur le point d'être acheté
  • Le modificateur "payable" indique que cette fonction peut recevoir de l’éther
  • Utilise notre fonction _transferFrom précédemment mise en œuvre pour changer la propriété de ce jeton.
  • Créditez le propriétaire de la valeur du message envoyé à la fonction

Ouvrez une fenêtre de terminal et exécutez ce qui suit:

$ npm run blockchain

Cela démarrera un serveur local de blockchain sur votre ordinateur fonctionnant sur le port 8545. Veillez à faire attention au résultat, car il créera un ensemble de comptes de test contenant 100 éther de test chacun pour que vous puissiez travailler.

Copiez l'une des clés privées données dans le résultat, ouvrez votre extension Metamask, sélectionnez l'option "Importer un compte" et collez cette clé privée afin d'importer ce compte pour interagir avec votre dapp. Assurez-vous que vous avez sélectionné votre réseau local (Localhost 8545), et non le réseau Ethernet principal.

Remarque: ces clés privées générées par Truffle sont uniquement destinées au développement! Traitez avec soin les clés privées que vous possédez pour vos comptes principaux.

Ensuite, ouvrez une nouvelle fenêtre de terminal et exécutez:

$ npm run migrate

Cela compilera votre code en bytecode Ethereum Virtual Machine (EVM) et déploiera vos contrats intelligents sur votre serveur blockchain.

Faites attention à la sortie de cette commande, elle vous dira combien d’éther a été consommée dans le cadre de la redevance d’essence pour le déploiement de ces contrats sur votre serveur Blockchain ainsi que l’adresse du contrat pour votre contrat KatCoin intelligent.

Copiez la valeur «adresse du contrat» dans la troisième ligne de la sortie de déploiement KatCoin

Avec l’adresse de contrat que vous avez copiée à partir de la dernière étape, ouvrez le fichier «src / App.js» de votre projet et remplacez le commentaire «ADRESSE DE CONTRAT ALLANT ICI» par une chaîne contenant cette adresse. Les résultats finaux devraient ressembler à ceci:

constructor() {
super();
const Kats = window.web3.eth.contract(KatCoin.abi); this.state = {
kats: Kats.at("0x8d37b292DE9c41c7A9969461718b1cA8008F421f"),
loading: true,
cats: ()
};
}

Dans votre terminal, lancez:

$ npm run start

Cela lancera votre application de réaction à http: // localhost: 3000. Vous devriez voir les 30 KatCoins que le contrat intelligent a frappés, avec leurs identifiants et leurs adresses de propriétaire.

Cliquez sur l'un des KatCoins pour essayer de l'acheter (qui devrait essayer de le transférer du contrat intelligent vers le compte dans votre portefeuille Metamask) et vous devriez voir une fenêtre contextuelle dans votre extension Metamask demandant une confirmation pour cette transaction d'achat.

Confirmez cette transaction pour finaliser votre achat KatCoin!

Toutes nos félicitations! Vous devriez maintenant voir que l'adresse du propriétaire est passée du contrat intelligent à votre compte et vous devriez pouvoir consulter l'historique de vos transactions dans Metamask.

Achat d'un KatCoin et confirmation de la transaction avec Metamask

N'oubliez pas que les contrats intelligents traitent de la valeur réelle du monde, ce qui peut mettre en péril les fonds des utilisateurs. Les bogues dans les contrats intelligents vous coûteront littéralement.

Les contrats intelligents sont immuables une fois déployés dans la blockchain. Cependant, vous pouvez programmer au préalable la fonctionnalité d’autodestruction si vous le souhaitez. Découvrez CryptoFin liste de contrôle d'audit de sécurité pour un exemple de certaines directives à suivre.



Traduction de l’article de Coinbase : Article Original

BlockBlog

Le Meilleur de l'Actualité Blockchain Francophone & Internationale | News, Guides, Avis & Tutoriels pour s'informer et démarrer facilement avec Bitcoin, les Crypto-Monnaies et le Blockchain. En Savoir Plus sur L'Équipe BlockBlog

Commenter cet Article

Commenter cet Article

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Plus dans News

Top
Nullam risus. porta. ut ipsum Lorem dapibus