Titres Titres
Explication détaillée du papier jaune Ethereum
— — Arbre de Merkle et objets Ethereum

Dans cet article, nous en apprendrons davantage sur les principaux objets d’Ethereum et leurs rôles, et nous discuterons également brièvement de l’utilisation des arbres Merkle dans Ethereum.
Bienvenue à suivre et à discuter avec nous
Auteur : support@lunaray.co
0x01 Merkle arbres
Dans un arbre Merkle, les nœuds feuilles contiennent des hachages de blocs de données et les nœuds non feuilles contiennent des hachages de leurs enfants.

Dans un arbre Merkle, toute modification des données sous-jacentes entraîne la modification du hachage du nœud faisant référence à ces données. Étant donné que chaque hachage de nœud parent dépend des données de son nœud enfant, toute modification des données du nœud enfant entraînera la modification du hachage du nœud parent. Cela se produit de chaque nœud parent au nœud racine. Par conséquent, toute modification des données sur le nœud feuille entraînera la modification du hachage du nœud racine. A partir de là, nous pouvons obtenir deux propriétés importantes :
- Pour juger si les données pointées par les deux arbres de Merkle sont exactement les mêmes, nous n’avons pas besoin de comparer chaque nœud feuille, mais uniquement le hachage stocké par le nœud racine.
- Nous pouvons utiliser la technique de preuve de Merkel pour déterminer si des données spécifiques sont pointées par l’arbre.
La première propriété est importante car elle ne peut stocker que le hachage du nœud racine pour représenter les données à ce moment précis. Cela signifie que nous n’avons besoin que de stocker le hachage racine de l’arbre représentant le bloc sur la blockchain (au lieu de stocker toutes les données dans la blockchain) et de conserver les données intactes.
0x02 État du monde
- L’état mondial est un mappage entre les adresses (comptes) et les états des comptes. L’état mondial n’est pas stocké sur la blockchain, mais le livre jaune indique que les implémentations sont censées stocker ces données dans un arbre (également appelé base de données d’état ou arbre d’état). L’état mondial peut être considéré comme un état global constamment mis à jour exécuté par le biais de transactions.
- Toutes les informations sur un compte Ethereum sont dans l’état mondial et stockées dans l’arbre d’état mondial. Si vous souhaitez connaître le solde d’un compte ou l’état actuel d’un contrat intelligent, vous pouvez récupérer l’état du compte pour ce compte en interrogeant l’état mondial.

0x03 État du compte
- Dans Ethereum, il existe deux types de comptes : les comptes externes (EOA) et comptes contractuels.
- EOA les comptes peuvent l’utiliser pour s’envoyer de l’Ether et déployer des contrats intelligents
- Compte contractuelt est un compte créé lors du déploiement d’un contrat intelligent.
- Chaque contrat intelligent a son propre compte Ethereum
- L’état du compte contient des informations sur un compte Ethereum. Par exemple, il stocke la quantité d’ether d’un compte et le nombre de transactions envoyées par ce compte. Chaque compte a un statut de compte.
Le statut du compte Ethereum contient les informations suivantes :
- nonce
Le nombre de transactions envoyées depuis cette adresse (s’il s’agit actuellement d’un compte EOA) ou d’opérations de création de contrat générées par ce compte
2. équilibre
La quantité d’éther (mesurée en Wei) détenue par ce compte.
3. racine de stockage
Valeur de hachage du nœud racine de l’arborescence de stockage du compte
4. hachage de code
Pour les comptes contractuels, il s’agit du compte sur lequel le hash du code EVM est stocké. Pour les comptes EOA, laissez ce champ vide. Un détail dans l’état du compte qui ne peut être ignoré est que tous les objets, y compris ceux ci-dessus, sont modifiables (à l’exception de codeHash). Par exemple, lorsqu’un compte envoie de l’éther à d’autres comptes, en plus de l’augmentation du nonce, le solde du compte change en conséquence. L’immuabilité de codeHash rend impossible la réparation et la mise à jour de ce contrat si un contrat intelligent vulnérable est déployé. En conséquence, seul un nouveau contrat peut être déployé (et la version vulnérable existera toujours sur la blockchain). C’est pourquoi il est nécessaire d’utiliser Truffle pour le développement et le déploiement de contrats intelligents et de suivre les meilleures pratiques lors de la programmation avec Solidity.
L’arborescence de stockage de compte est une structure qui contient les données associées à un compte : Cet élément n’est disponible que pour les comptes de contrat, et dans EOA, storageRoot est laissé vide et codeHash est une valeur de hachage d’une chaîne vide. Toutes les données du contrat intelligent sont stockées dans l’arborescence de stockage du compte sous la forme d’une carte de 32 octets. La manière de gérer les données de contrat dans l’arborescence d’état du compte ne sera pas répétée ici.

Transaction 0x04
Les transactions pilotent la transition de l’état actuel à l’état suivant. Il existe trois types de transactions dans Ethereum :
- Transactions qui transfèrent de la valeur entre EOA (comptes externes) (par exemple, modification de la taille du solde de l’expéditeur et du destinataire).
- Envoyez un message pour appeler la transaction du contrat (par exemple, en envoyant un appel de message pour déclencher une méthode setter pour définir une valeur dans le contrat).
- La transaction utilisée pour déployer le contrat (créant ainsi le compte du contrat).
Une transaction se compose des parties suivantes :
- nonce: Le nombre de numéros de série de transactions envoyés par ce compte (ce qui peut être grosso modo compris comme « c’est la première transaction de ce compte »).
- prix du gaz: Les frais (mesurés en Wei) payés par unité de gaz pour effectuer cette transaction et effectuer des calculs.
- GasLimit: La quantité maximale de gaz qui peut être utilisée lors de l’exécution de cette transaction.
- pour: Si cette transaction est utilisée pour envoyer de l’ether, voici l’adresse EOA qui reçoit l’ether ; si cette transaction est utilisée pour envoyer un message au contrat (par exemple, appeler une méthode dans un contrat intelligent), voici l’adresse du contrat ; si cette transaction est utilisée pour créer le contrat, ici la valeur est vide.
- évaluer: Si cette transaction est utilisée pour envoyer et recevoir de l’éther, voici le nombre de jetons mesurés en Wei dans le compte de réception ; si cette transaction sert à envoyer un message d’appel au contrat, voici le montant de Wei versé au smart contract qui reçoit ce message ; si cette transaction est utilisée pour créer un contrat, voici la quantité d’éther en Wei stockée dans le compte lorsque le contrat a été initialisé.
- v, r, s: Valeurs utilisées dans la signature cryptographique de la transaction, qui peuvent être utilisées pour déterminer l’expéditeur de la transaction.
- Les données (utilisé uniquement pour le transfert de valeur et l’envoi d’appels de message aux contrats intelligents) les données d’entrée qui accompagnent l’appel de message (par exemple, si vous souhaitez exécuter une méthode setter dans un contrat intelligent, le champ de données doit inclure l’identifiant de la méthode setter, et la valeur du paramètre que vous souhaitez définir).
- initialiser (création de contrat uniquement) Code EVM utilisé pour initialiser le contrat.
Toutes les transactions du bloc sont également stockées dans l’arborescence Merkle. Et la valeur de hachage du nœud racine de cet arbre est enregistrée par l’en-tête du bloc !
0x05 BLOC
- Un bloc est divisé en deux parties, la en-tête de bloc et le corps de bloc.
- L’en-tête de bloc est la partie de la blockchain dans Ethereum. Il stocke la valeur de hachage du bloc précédent (également appelé bloc parent) et forme une chaîne approuvée cryptographiquement via la connexion des en-têtes de bloc.
- Le corps du bloc contient une série de transactions enregistrées dans ce bloc, ainsi qu’une liste d’en-têtes de bloc ommer.

- hachage parent :Le hachage d’en-tête de bloc du bloc précédent. Chaque bloc contient le hachage du bloc précédent, jusqu’au bloc de genèse de la chaîne. Il s’agit de la conception structurelle qui empêche les données d’être falsifiées (toute falsification du bloc précédent affectera la valeur de hachage de tous les blocs suivants).
- ommersHash : L’en-tête du bloc oncle et la valeur de hachage d’une partie du corps du bloc.
- Bénéficiaire: Le compte Ethereum qui est payé pour miner ce bloc.
- étatRoot : Le hachage du nœud racine de l’arbre d’état mondial (après que toutes les transactions ont été exécutées).
- transactionsRoot :La valeur de hachage du nœud racine de l’arborescence des transactions. Cette arborescence contient toutes les transactions dans le corps du bloc.
- reçusRoot:Chaque fois qu’une transaction est exécutée, Ethereum génère un reçu de transaction correspondant au résultat. Voici le hachage du nœud racine de cet arbre de réception de transaction.
- logsBloom : Il est utilisé pour juger si la transaction d’un certain bloc génère un certain journal. Cela évite de stocker les informations de journal en morceaux (économise beaucoup d’espace).
- difficulté:La valeur de difficulté de ce bloc. Ceci est une mesure de la difficulté de minage du bloc actuel
- numéro: Le nombre total de blocs de précommande. Cela indique la hauteur de la blockchain (c’est-à-dire combien de blocs se trouvent sur la blockchain). Le numéro du bloc de genèse est 0 .
- Limite de gaz : Chaque transaction nécessite du gaz. La limite de gaz indique la quantité totale de gaz pouvant être utilisée par toutes les transactions enregistrées dans ce bloc. C’est un moyen de limiter le nombre de transactions dans un bloc.
- gazutilisé:La quantité totale de gaz réellement consommée par chaque central du bloc.
- horodatage: L’horodatage Unix lorsque le bloc a été créé.
- extraData:Un tableau d’octets de longueur variable qui peut entrer n’importe quoi. Lorsque les mineurs créent des blocs, tout peut être ajouté à cette zone.
- mixHash:La valeur de hachage utilisée pour vérifier qu’un bloc a bien été enregistré sur la chaîne.
- nonce : Comme mixHashla valeur utilisée pour vérifier que le bloc a bien été enregistré en chaîne.
0x06 En conclusion
- L’arbre d’état mondial inclut le mappage des adresses aux états de compte. Le hachage racine de l’arbre d’état mondial est stocké par le bloc (dans le champ stateRoot), qui indique l’état actuel du bloc lors de sa création. Il n’y a qu’un seul arbre d’état mondial dans l’ensemble du réseau.
- L’arborescence de stockage de compte enregistre les informations de données liées à un contrat intelligent. Le hachage racine de l’arborescence de stockage du compte (dans le champ storageRoot) est stocké par l’état du compte. Chaque compte a une arborescence de stockage de compte.
- L’arborescence des transactions contient toutes les informations de transaction dans un bloc. La valeur de hachage du nœud racine de l’arbre des transactions est stockée par l’en-tête du bloc (dans la zone transactionsRoot). Chaque bloc a un arbre de transaction.
- L’arborescence des reçus de transaction contient les informations de reçu pour toutes les transactions d’un bloc. La valeur de hachage du nœud racine de l’arbre de reçu de transaction est également stockée par l’en-tête de bloc (dans la zone receptionsRoot) ; chaque bloc a un arbre de réception de transaction correspondant.