Académique Documents
Professionnel Documents
Culture Documents
com
Abstrait.Le paradigme de la blockchain, lorsqu'il est associé à des transactions sécurisées par cryptographie, a démontré son utilité à travers un
certain nombre de projets, notamment Bitcoin. Chacun de ces projets peut être considéré comme une simple application sur une ressource de
calcul décentralisée, mais unique. Nous pouvons appeler ce paradigme une machine singleton transactionnelle avec état partagé.
Ethereum implémente ce paradigme de manière généralisée. En outre, il fournit une pluralité de telles ressources, chacune avec un état et un
code de fonctionnement distincts mais capables d'interagir avec d'autres via un cadre de transmission de messages. Nous discutons de sa
conception, des problèmes de mise en œuvre, des opportunités qu'il offre et des obstacles futurs que nous envisageons.
protocole et le réutiliser ; Aron [2012] évoque par exemple identifiant de l'état final (mais ne stockez pas l'état final lui-même, ce
le projet Namecoin qui vise à fournir un système serait beaucoup trop volumineux). Ils ponctuent également la série de
décentralisé de résolution de noms. transactions avec des incitations pour les nœuds à exploiter. Cette
D'autres projets visent toujours à s'appuyer sur le réseau incitation se déroule comme une fonction de transition d'état, ajoutant
Bitcoin lui-même, en tirant parti de la grande quantité de valeur de la valeur à un compte désigné.
placée dans le système et de la grande quantité de calculs qui L'exploitation minière est le processus consistant à consacrer des
entrent dans le mécanisme de consensus. Le projet Mastercoin, efforts (travail) pour renforcer une série de transactions (un bloc) par
proposé pour la première fois par Willett [2013], vise à construire rapport à tout autre bloc concurrent potentiel. Elle est réalisée grâce à une
un protocole plus riche impliquant de nombreuses fonctionnalités preuve cryptographiquement sécurisée. Ce schéma est connu sous le nom
supplémentaires de haut niveau en plus du protocole Bitcoin de preuve de travail et est décrit en détail dans la section 11.5.
grâce à l'utilisation d'un certain nombre de parties auxiliaires du Formellement, nous nous étendons à :
Sompolinsky et Zohar [2013]. Ce processus est décrit en détail - ∗∗&c. Dans des occasions très particulières, afin de maximiser la lisibilité et
dans la section 10. uniquement si la signification est sans ambiguïté, je peux utiliser des indices
alphanumériques pour désigner des valeurs intermédiaires, en particulier
3.Conventions celles qui sont particulièrement importantes.
Lors de l'examen de l'utilisation de fonctions existantes, étant
J'utilise un certain nombre de conventions typographiques pour la
donné une fonctionF, la fonctionF∗désigne une version similaire,
notation formelle, dont certaines sont assez particulières au présent
élément par élément, du mappage de fonctions à la place entre les
travail :
séquences. Il est formellement défini dans la section 4.4.
Les deux ensembles de valeurs d'état hautement structurées, de
Je définis un certain nombre de fonctions utiles tout au long.
« niveau supérieur », sont indiqués par des lettres grecques
L'un des plus courants est ,̀ qui s'évalue au dernier élément de la
minuscules en gras. Ils tombent dans ceux de l'état-monde, qui sont
séquence donnée :
notésσ(ou une variante de celle-ci) et ceux de l'état machine,µ.
Les fonctions opérant sur des valeurs hautement structurées sont
désignées par une lettre grecque majuscule, par exemple Υ, la (5) (X)≡X[‖X‖−1]
fonction de transition d'état d'Ethereum.
Pour la plupart des fonctions, une lettre majuscule est utilisée, par
4.Blocs, état et transactions
exemple C, la fonction de coût générale. Ceux-ci peuvent être indicés
pour désigner des variantes spécialisées, par exempleCSTORE, la fonction Après avoir présenté les concepts de base derrière
de coût pour leSTOREopération. Pour les fonctions spécialisées et Ethereum, nous discuterons plus en détail de la signification
éventuellement définies en externe, je peux formater comme du texte d'une transaction, d'un bloc et de l'état.
de machine à écrire, par exemple la fonction de hachage Keccak-256
(selon l'entrée gagnante du concours SHA-3) est notéeKCE (et 4.1.État mondial.L'état du monde (État), est un mappage entre les adresses
généralement appelé Keccak ordinaire). AussiKEC512fait référence à la (identificateurs de 160 bits) et les états de compte (une structure de
fonction de hachage Keccak 512. données sérialisée en tant que RLP, voir l'annexe B). Bien que non stocké
Les tuples sont généralement désignés par une lettre majuscule, sur la blockchain, il est supposé que l'implémentation maintiendra ce
par exempleJ,est utilisé pour désigner une transaction Ethereum. Ce mappage dans un arbre Merkle Patricia modifié (essayer, voir Annexe D). Le
symbole peut, s'il est défini en conséquence, être mis en indice pour faire trie nécessite un backend de base de données simple qui maintient un
référence à un composant individuel, par exempleJn, désigne le nonce de mappage des bytearrays aux bytearrays ; nous nommons cette base de
ladite transaction. La forme de l'indice est utilisée pour indiquer son type ; données sous-jacente la base de données d'état. Cela a un certain nombre
par exemple, les indices majuscules font référence à des tuples avec des d'avantages; Premièrement, le nœud racine de cette structure dépend
composants inscriptibles. cryptographiquement de toutes les données internes et, en tant que tel,
Les scalaires et les séquences d'octets de taille fixe (ou, de manière son hachage peut être utilisé comme une identité sécurisée pour
synonyme, les tableaux) sont désignés par une lettre minuscule l'ensemble de l'état du système. Deuxièmement, étant une structure de
normale, par exemplenest utilisé dans le document pour désigner une données immuable, elle permet de rappeler tout état précédent (dont le
transaction nonce. Ceux qui ont une signification particulière peuvent hachage racine est connu) en modifiant simplement le hachage racine en
être grecs, par exempleδ, le nombre d'éléments requis sur la pile pour conséquence. Étant donné que nous stockons tous ces hachages racine
une opération donnée. dans la blockchain, nous sommes en mesure de revenir trivialement aux
Les séquences de longueur arbitraire sont généralement désignées par une anciens états.
lettre minuscule en gras, par exempleoest utilisé pour désigner la séquence L'état du compte comprend les quatre champs suivants :
d'octets donnée comme données de sortie d'un appel de message. Pour les nonce :Une valeur scalaire égale au nombre de trans-
valeurs particulièrement importantes, une lettre majuscule en gras peut être actions envoyées depuis cette adresse ou, dans le
utilisée. cas de comptes avec code associé, le nombre de
Partout, nous supposons que les scalaires sont des entiers positifs créations de contrats effectuées par ce compte. Pour
et appartiennent donc à l'ensemblePL'ensemble de toutes les compte d'adresseunen étatσ, cela serait
séquences d'octets estB,formellement défini dans l'annexe B. Si un tel formellement notéσ[un]n.
ensemble de séquences est limité à celles d'une longueur particulière, équilibre:Une valeur scalaire égale au nombre de Wei
il est désigné par un indice, ainsi l'ensemble de toutes les séquences appartenant à cette adresse. Formellement désignéσ[un]b. racine
d'octets de longueur 32 est nomméB32et l'ensemble de tous les entiers de stockage :Un hachage de 256 bits du nœud racine d'un
positifs inférieurs à 2256est appeléP256. Ceci est formellement défini Arbre Merkle Patricia qui encode le contenu de
dans la section 4.4. stockage du compte (un mappage entre des valeurs
Les crochets sont utilisés pour indexer et référencer des entières 256 bits), encodé dans le trie comme un
composants individuels ou des sous-séquences de séquences, par mappage du hachage Keccak 256 bits des clés
exemple µs[0] désigne le premier article sur la pile de la machine. Pour entières 256 bits vers les 256- encodés RLP valeurs
les sous-séquences, des ellipses sont utilisées pour spécifier la plage entières de bits. Le hachage est formellement notéσ[
prévue, pour inclure des éléments aux deux limites, par exempleµm[0.. un]s. hachage de code :Le hachage du code EVM de ce
31] désigne les 32 premiers éléments de la mémoire de la machine. compte—c'est le code qui est exécuté si cette adresse reçoit
Dans le cas de l'état globalσ, qui est une séquence de un appel de message ; il est immuable et donc,
comptes, eux-mêmes tuples, les crochets sont utilisés pour contrairement à tous les autres champs, ne peut pas être
référencer un compte individuel. modifié après la construction. Tous ces fragments de code
Lors de l'examen de variantes de valeurs existantes, je suis la sont contenus dans la base de données d'état sous leurs
règle selon laquelle, dans un champ de définition donné, si nous hachages correspondants pour une récupération ultérieure.
supposons que la valeur "d'entrée" non modifiée est désignée par Ce hachage est formellement notéσ[un]c, et donc le code
l'espace réservé - alors la valeur modifiée et utilisable est peut être noté commeb,étant donné queKEC(b) = σ[un]c.
désignée par -′, et les valeurs intermédiaires seraient -∗,
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 4
Étant donné que je souhaite généralement faire référence non pas au hachage Limite de gaz :Une valeur scalaire égale au maximum
racine du trie, mais à l'ensemble sous-jacent de paires clé/valeur stockées à l'intérieur, quantité de gaz qui devrait être utilisée pour exécuter
Je définis une équivalence commode : cette transaction. Celle-ci est payée à l'avance, avant
( ) tout calcul et ne peut être augmentée ultérieurement ;
(6) TRIE L∗je(σ[un]s)≡σ[un]s
officiellementJg.
La fonction de réduction pour l'ensemble de paires clé/valeur dans pour:L'adresse 160 bits du destinataire de l'appel de message
l'épreuve,L∗je,est défini comme la transformation élément par élément ent ou, pour une opération de création de contrat,∅,utilisé
de la fonction de baseLje,donné comme : ici pour désigner le seul membre deB0;officiellement Jt.
( )( )
(7) Lje(k, v) ≡ KEC(k),RLP(v)
valeur:Une valeur scalaire égale au nombre de Wei à
où: être reversé au destinataire de l'appel de message
ou, en cas de création de contrat, en dotation sur le
(8) k∈B32 ∧v∈P compte nouvellement créé ; officiellementJv.
Il sera entendu queσ[un]sn'est pas un membre v, r, s :Valeurs correspondant à la signature de la
"physique" du compte et ne contribue pas à sa transaction et utilisées pour déterminer l'expéditeur
sérialisation ultérieure. de la transaction ; officiellementJw,JretJs. Ceci est
Si lacodeHash fichamp est le(e K ) hachage eccak-256 du développé dans l'annexe F.
chaîne vide, c'est-à-direσ[un]c=KCE () ,alors le nœud De plus, une transaction de création de contrat contient :
représente un compte simple, parfois appelé compte «
initialisation :Un tableau d'octets de taille illimitée spécifiant
sans contrat ».
Code EVM pour la procédure d'initialisation du compte,
Ainsi, nous pouvons définir une fonction d'effondrement de l'état du mondeLS:
formellementJje.
(9) LS(σ)≡ {p(un) :σ[un]6 =∅} initialiserest un fragment de code EVM ; ça retourne lecorps,
où un deuxième fragment de code qui s'exécute chaque fois que le
( ( )) compte reçoit un appel de message (soit via une transaction, soit
(dix) p(un)≡KEC(un),RLP (σ[un]n,σ[un]b,σ[un]s,σ[un]c) en raison de l'exécution interne de code).initialisern'est exécuté
Cette fonction,LS, est utilisé avec la fonction trie pour fournir qu'une seule fois lors de la création du compte et est supprimé
une courte identité (hachage) de l'état du monde. Nous immédiatement après.
En revanche, une transaction d'appel de message contient :
supposons:
données:Un tableau d'octets de taille illimitée spécifiant
(11) ∀un:σ[un] =∅∨(un∈B20∧v(σ[un]))
données d'entrée de l'appel de message, formellementJd.
oùvest la fonction de validité du compte : L'annexe F précise la fonction,S, qui mappe les
(12) v(X)≡Xn∈P256∧Xb∈P256∧Xs∈B32∧Xc∈B32 transactions à l'expéditeur, et passe par l'ECDSA de la courbe
SECP-256k1, en utilisant le hachage de la transaction (à
4.2.Propriété.Un numéro de bloc important pour la l'exception des trois derniers champs de signature) comme
compatibilité avec le réseau public est le bloc marquant la donnée à signer. Pour le moment, nous affirmons
transition entre leFrontièreetPropriétéphases de la plate- simplement que l'expéditeur d'une transaction donnéeJpeut
forme, que nous désignons par le symboleNH, défini ainsi être représenté avecS(J).
(14) {
(13) NH≡1,150,000
(Jn, Tp, Tg, Tt, Tv, Tje, Tw, Tr, Ts) (Jn, T siJt=∅
LJ(J)≡
Le protocole a été mis à jour à ce bloc, donc ce symbole apparaît dans p, Tg, Tt, Tv, Td, Tw, Tr, Ts) sinon
certaines équations pour tenir compte des changements.
Ici, nous supposons que tous les composants sont interprétés par
4.3.La transaction.Une transaction (officiellement,J) est une instruction le RLP comme des valeurs entières, à l'exception des tableaux d'octets
unique signée cryptographiquement construite par un acteur en de longueur arbitraireJjeetJd.
dehors du champ d'application d'Ethereum. Alors que l'on suppose
que l'acteur externe ultime sera de nature humaine, des outils
(15) Jn∈P256 ∧ Jv∈P256 ∧ Jp∈P256 ∧
logiciels seront utilisés dans sa construction et sa diffusion1. Il existe
Jg∈P256 ∧ Jw∈P5 ∧ Jr∈P256 ∧
deux types de transactions : celles qui se traduisent par des appels de
Js∈P256 ∧ Jd∈B ∧ Jje∈B
message et celles qui se traduisent par la création de nouveaux où
comptes avec code associé (appelées officieusement « création de
contrat »). Les deux types spécifient un certain nombre de champs (16) Pn={P:P∈P∧P <2n}
communs :
Le hachage d'adresseJtest légèrement différent : il s'agit soit d'un
nonce :Une valeur scalaire égale au nombre de trans- hachage d'adresse de 20 octets, soit, dans le cas d'une transaction de
actions envoyées par l'expéditeur ; officiellementJn. prix du création de contrat (et donc formellement égal à∅),c'est
gaz :Une valeur scalaire égale au nombre de la série d'octets vide RLP et donc le membre deB0:
Wei à payer par unité degazpour tous les frais de {
calcul encourus du fait de l'exécution de cette B20 siJt6 =∅
(17) Jt∈
transaction ; officiellementJp. B0 sinon
1Notamment, ces « outils » pourraient finalement devenir si causalement éloignés de leur initiation basée sur l'homme - ou les humains peuvent devenir si causalement neutres - qu'il
pourrait y avoir un point où ils pourraient être considérés à juste titre comme des agents autonomes. par exemple, les contrats peuvent offrir des primes aux humains pour avoir envoyé
des transactions pour initier leur exécution.
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 5
(21) Rtu∈P∧Rb∈B256
difficulté:Une valeur scalaire correspondant à la différence
niveau de difficulté de ce bloc. Cela peut être calculé à partir Les entrées du journal,Rje, est une série d'entrées de journal, appelées,
du niveau de difficulté du bloc précédent et de l'horodatage; par exemple, (O0,O1, ...). Une entrée de journal,O, est un tuple de l'adresse
officiellementHd. d'un logger,Oun, une série de rubriques de journal de 32 octets,Ot
nombre:Une valeur scalaire égale au nombre d'an- et un certain nombre d'octets de données,Od:
blocs cestor. Le bloc de genèse a un nombre de zéro ;
(22) O≡(Oun,(Ot0,Ot1, ...),Od)
officiellementHje.
Limite de gaz :Une valeur scalaire égale à la limite actuelle
des dépenses de gaz par bloc ; officiellementHje. (23) Oun∈B20 ∧ ∀t∈Ot:t∈B32 ∧Od∈B
gazutilisé :Une valeur scalaire égale au gaz total utilisé
Nous définissons la fonction filtre Bloom,M, pour réduire une entrée de
dans les transactions de ce bloc ; officiellementHg.
journal en un seul hachage de 256 octets :
horodatage :Une valeur scalaire égale au raisonnable
sortie de time() d'Unix au début de ce bloc ; ∨( )
(24) M(O)≡ M3:2048(t)
officiellementHs.
t∈{Oun}∪Ot
extraData :Un tableau d'octets arbitraire contenant
données pertinentes pour ce bloc. Celui-ci doit être de 32 octets oùM3:2048est un filtre Bloom spécialisé qui définit trois bits sur
ou moins ; officiellementHX. 2048, étant donné une série d'octets arbitraires. Pour ce faire, il
mixHash :Un hachage de 256 bits qui s'avère combiné prend les 11 bits de poids faible de chacune des trois premières
du moment qu'une quantité suffisante de calcul a paires d'octets dans un hachage Keccak-256 de la série d'octets.
été effectuée sur ce bloc ; officiellement Hm. Officiellement:
nonce :Un hachage 64 bits qui s'avère combiné avec (25)M3:2048(x : x∈B) ≡ y : y∈B256 où:
le mix-hash qu'une quantité suffisante de calcul a (26) y = (0,0, ...,0) sauf:
été effectuée sur ce bloc ; officiellement Hn. (27) : Bm(X,je)(y) =1
∀je∈{0,2,4}
(28) m(X, je) ≡ KEC(X)[je, je+1] mod 2048
Les deux autres composants du bloc sont simplement une oùBest la fonction de référence du bit telle queBj(X) est égal au
liste d'en-têtes de bloc ommer (du même format que ci-dessus) et bit d'indexj(indexé à partir de 0) dans le tableau d'octets
une série de transactions. Formellement, on peut se référer à X.
2ommerest le terme non sexiste le plus courant (qui ne dit pas grand-chose) pour signifier « frère ou sœur du parent » ; voirhttp://nonbinary.org/wiki/
Gender_neutral_language#Family_Terms
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 6
4.4.2.Validité holistique.Nous pouvons affirmer la validité d'un 4.4.4.Validité de l'en-tête de bloc.Nous définissonsP(BH) pour être le
bloc si et seulement s'il satisfait plusieurs conditions : il doit bloc parent deB, formellement :
être cohérent en interne avec les hachages de bloc ommer et
(37) P(H)≡B′:KEC(RLP(B′ H)) =Hp
transaction et les transactions donnéesBJ(comme spécifié
dans la sec 11), lorsqu'il est exécuté dans l'ordre sur l'état de Le numéro de bloc est le numéro de bloc du parent
baseσ(dérivé de l'état final du bloc parent), résulte en un incrémenté de un :
nouvel état de l'identitéHr: (29)
(38) Hje≡P(H)Salut+1
C'est le fondement de la sécurité de la blockchain et c'est la ils exécuteront des transactions et les opérateurs seront
raison fondamentale pour laquelle un nœud malveillant ne peut libres de solliciter ces prix pour déterminer le prix du gaz à
pas propager des blocs nouvellement créés qui, autrement, offrir. Puisqu'il y aura une distribution (pondérée) des prix
écraseraient ("réécriraient") l'historique. Étant donné que le minimaux acceptables du gaz, les opérateurs auront
nonce doit satisfaire à cette exigence et que sa satisfaction nécessairement un compromis à faire entre la baisse du prix
dépend du contenu du bloc et, à son tour, de ses transactions du gaz et la maximisation des chances que leur transaction
composées, la création de nouveaux blocs valides est difficile et, soit exploitée en temps opportun.
au fil du temps, nécessite approximativement la puissance de
calcul totale de la partie fiable de les pairs miniers. 6.Exécution des transactions
Ainsi, nous sommes en mesure de définir la validité de l'en-tête de bloc
L'exécution d'une transaction est la partie la plus
fonctionV(H): complexe du protocole Ethereum : elle définit la fonction de
2256 transition d'état Υ. Il est supposé que toute transaction
(50)V(H)≡ n6 ∧ m=H m ∧ exécutée passe d'abord les tests initiaux de validité
Hd
(51) Hd=D(H) ∧ intrinsèque. Ceux-ci inclus:
(52) Hg≤Hje ∧ (1) La transaction est bien formée RLP, sans octets de fin
⌊ ⌋ supplémentaires ;
P(H)Hl
(53) Hje < P(H)Hl+ ∧ (2) la signature de la transaction est valide ;
1024
⌊ ⌋ (3) le nonce de la transaction est valide (équivalent au nonce
P(H)Hl actuel du compte de l'expéditeur) ;
(54) Hje>P(H)Hl− ∧
1024 (4) la limite de gaz n'est pas inférieure au gaz intrinsèque, g0,
(55) Hje>125000∧ utilisé par la transaction ;
(56) Hs>P(H)Hs ∧ (5) le solde du compte de l'expéditeur contient au moins
le coût,v0, requis en paiement initial.
(57) Hje=P(H)Salut+1 ‖HX ∧
Formellement, on considère la fonction Υ, avecJétant
(58) ‖ ≤32 une transaction etσl'état:
où (n,m) =PoW(Hn,Hn,d) (59) σ′= Υ(σ, T)
Notant en outre queextraDatadoit être au maximum de 32
octets. Ainsiσ′est l'état post-transactionnel. On définit aussi Υgpour évaluer
la quantité de gaz utilisée dans l'exécution d'une transaction et Υjepour
évaluer les éléments de journal accumulés de la transaction, les deux
5.Gaz et paiement
devant être formellement définis ultérieurement.
Afin d'éviter les problèmes d'abus de réseau et d'éviter les
questions inévitables découlant de l'exhaustivité de Turing, 6.1.Sous-état.Tout au long de l'exécution de la transaction, nous
tous les calculs programmables dans Ethereum sont soumis à accumulons certaines informations qui sont utilisées immédiatement
des frais. Le barème des frais est spécifié en unités de gaz( après la transaction. Nous appelons celasous-état de transaction, et le
voir l'annexe G pour les frais associés aux divers calculs). représenter commeUN, qui est un tuple :
Ainsi, tout fragment donné de calcul programmable (cela (60) UN≡(UNs,UNje,UNr)
inclut la création de contrats, les appels de messages,
Le contenu du tuple comprendUNs, l'ensemble suicide : un
l'utilisation et l'accès au stockage de compte et l'exécution
ensemble de comptes qui seront supprimés une fois la transaction
d'opérations sur la machine virtuelle) a un coût
terminée.UNjeest la série de journaux : il s'agit d'une série de "points
universellement convenu en termes de gaz.
de contrôle" archivés et indexables dans l'exécution du code VM qui
Chaque transaction est associée à une quantité spécifique de
permettent aux appels de contrat d'être facilement suivis par des
gaz :GasLimit.Il s'agit de la quantité de gaz qui est implicitement
spectateurs extérieurs au monde Ethereum (tels que les applications
achetée à partir du solde du compte de l'expéditeur. L'achat a lieu
frontales décentralisées). Enfin il y aUNr, le solde du remboursement,
au momentprix du gaz,également spécifié dans la transaction. La
augmenté grâce à l'utilisation duSTOREinstruction afin de réinitialiser
transaction est considérée comme invalide si le solde du compte
le stockage du contrat à zéro à partir d'une valeur non nulle. Bien qu'il
ne peut pas supporter un tel achat. Il s'appelleGasLimitpuisque
ne soit pas immédiatement remboursé, il est autorisé à compenser
tout gaz non utilisé à la fin de la transaction est remboursé (au
partiellement les coûts d'exécution totaux.
même tarif d'achat) sur le compte de l'expéditeur. Le gaz n'existe
Par souci de brièveté, nous définissons le sous-état videUN0pour ne pas avoir
pas en dehors de l'exécution d'une transaction. Ainsi, pour les
de suicides, pas de journaux et un solde de remboursement nul :
comptes associés à un code de confiance, une limite de gaz
relativement élevée peut être définie et laissée telle quelle. (61) UN0≡(∅,(),0)
oùJje, Tddésigne la série d'octets des données associées du comptoir de remboursement à l'expéditeur au tarif d'origine.
à la transaction et du code EVM d'initialisation, selon que ⌊Jg−g′⌋
la transaction concerne la création de contrat ou l'appel (72) g∗≡g′+min{ , UNr}
2
de message.gtxcreateest ajouté si la transaction crée un
Le montant total remboursable est le gaz légitimement
contrat, mais pas si un résultat de code EVM ou avant la
restantg′, ajouté àUNr, cette dernière composante étant
Transition de la ferme.gest entièrement défini à l'annexe
plafonnée à un maximum de la moitié (arrondi à l'inférieur)
G.
du montant total utiliséJg−g′.
Le coût initialv0est calculé comme suit :
L'Ether pour le gaz est remis au mineur, dont l'adresse
(65) v0≡JgJp+Jv est précisée comme bénéficiaire du présent bloc B. On
La validité est déterminée comme suit : définit donc l'état pré-finalσ∗en termes d'état provisoireσP:
le solde de l'expéditeur est également réduit de la valeur l'état est autorisé à persister. Ainsi formellement, nous pouvons
transmise. Ainsi l'état muté devientσ∗: spécifier l'état résultant, le gaz et le sous-état comme (σ′, g′,UN) où:
(83) σ∗≡σsauf:
(97)
( ( ))
(84) σ∗ [un]≡ 0, v+v′,TRIE(∅),KCE () -
-0 si σ∗∗=∅
(85) σ∗[s]b ≡ σ[s]b−v
g′≡g∗∗ si g∗∗<c∧ Hje<NH
oùv′est la valeur préexistante du compte, dans le cas où
--
g∗∗−c sinon
il existait auparavant :
{ (98)
0 siσ[un] =∅ -
(86) v′≡ -σ si σ∗∗=∅
σ[un]b sinon --σ∗∗ si g∗∗<c∧ Hje<NH
σ′≡
Enfin, le compte est initialisé par l'exécution du code EVM - sauf:
--σ∗∗
d'initialisationjeselon le modèle d'exécution (voir section 9). σ′[un]c=KEC(o) sinon
L'exécution du code peut affecter plusieurs événements qui
ne sont pas internes à l'état d'exécution : le stockage du L'exception dans la détermination deσ′dicte que
compte peut être modifié, d'autres comptes peuvent être o,la séquence d'octets résultante de l'exécution du code
créés et d'autres appels de message peuvent être effectués. d'initialisation, spécifie le code de corps final pour le compte
En tant que tel, la fonction d'exécution de code Ξ s'évalue à nouvellement créé.
un tuple de l'état résultantσ∗∗, gaz disponible restantg∗∗, le Notez que l'intention de blocNHÀ partir de (Propriété) est
sous-état accumuléUNet le code corps du compteo. que le résultat est soit un nouveau contrat créé avec succès
avec sa dotation, soit aucun nouveau contrat sans transfert
de valeur. AvantPropriété, s'il n'y a pas assez d'essence pour
(87) (σ∗∗, g∗∗,UN,o)≡Ξ(σ∗, g, je) payerc, un compte à l'adresse du nouveau contrat est créé,
oùjecontient les paramètres de l'environnement d'exécution tels avec tous les effets secondaires de l'initialisation, et la valeur
que définis à la section 9, c'est-à-dire : est transférée, mais aucun code de contrat n'est déployé.
Tout au long du présent travail, on suppose que si σ1[r] un paramètre,gaz, ce qui limite la quantité totale de
n'était pas défini à l'origine, il sera créé en tant que compte calculs effectués.
sans code ni état et sans solde ni nonce. Ainsi, l'équation
précédente doit être interprétée comme signifiant : 9.1.Bases.L'EVM est une architecture simple basée sur la pile. La taille
(101) σ1≡σ′ 1 sauf: de mot de la machine (et donc la taille de l'élément de pile) est de 256
bits. Cela a été choisi pour faciliter le schéma de hachage Keccak-256
(102) σ1[s]b≡σ′ s]b−v
1[ et les calculs de courbe elliptique. Le modèle de mémoire est un
simple tableau d'octets adressés par mot. La pile a une taille maximale
(103) etσ′ 1 ≡σsauf: de 1024. La machine dispose également d'un modèle de stockage
{ indépendant ; c'est un concept similaire à la mémoire mais plutôt
σ′1[r]≡(v,0,KEC(()),TRIE(∅)) siσ[r] =∅ qu'un tableau d'octets, c'est un tableau de mots adressables par mot.
(104)
σ′1[r]b≡σ[r]b+v sinon Contrairement à la mémoire, qui est volatile, le stockage est non
volatile et est maintenu dans le cadre de l'état du système. Tous les
Le code associé au compte (identifié comme le fragment dont le
emplacements dans le stockage et la mémoire sont bien définis
hachage Keccak estσ[c]c) est exécuté selon le modèle d'exécution (voir
initialement comme zéro.
section 9). Tout comme pour la création de contrat, si l'exécution
La machine ne suit pas l'architecture standard de von Neumann.
s'arrête de manière exceptionnelle (c'est-à-dire en raison d'une
Plutôt que de stocker le code de programme dans une mémoire ou un
alimentation en gaz épuisée, d'un débordement de pile, d'une
stockage généralement accessible, il est stocké séparément dans une
destination de saut invalide ou d'une instruction invalide), alors aucun
ROM virtuelle interagissant uniquement via une instruction
gaz n'est remboursé à l'appelant et l'état est rétabli au point
spécialisée.
immédiatement avant le transfert de solde (c'est-à-direσ).
La machine peut avoir une exécution exceptionnelle pour plusieurs
{ raisons, notamment des dépassements de capacité de pile et des
σ siσ∗∗=∅ instructions invalides. Comme l'exception hors gaz (OOG), ils ne
(105) σ′ ≡ σ∗∗ sinon laissent pas les changements d'état intacts. Au lieu de cela, la machine
- s'arrête immédiatement et signale le problème à l'agent d'exécution
-Ξ
-ECREC(σ1, g, je) si r=1 (soit le processeur de transaction, soit, de manière récursive,
--ΞSHA256(σ1, g, je) si r=2 l'environnement d'exécution de génération) qui le traitera
(106()σ∗∗, g′,s,o) ≡ Ξ (σ1, g, je)
-RIP160 si r=3 séparément.
--ΞIDENTIFIANT(σ1, g, je) si r=4
- 9.2.Aperçu des frais.Les redevances (libellées en gaz) sont
Ξ(σ1, g, je) sinon
facturées dans trois circonstances distinctes, toutes trois
(107) jeun ≡ r préalables à l'exécution d'une opération. Le premier et le plus
(108) jeo ≡ o courant est la redevance intrinsèque au calcul de l'opération
(109) jep ≡ p (voir annexe G). Deuxièmement, le gaz peut être déduit afin
de constituer le paiement d'un appel de message subordonné
(110) jed ≡ d
ou de la création d'un contrat ; cela fait partie du paiement
(111) jes ≡ s pourCRÉEZ, APPELEZetCODE D'APPEL.Enfin, le gaz peut être payé
(112) jev ≡ ṽ en raison d'une augmentation de l'utilisation de la mémoire.
(113) jee ≡ e
Au cours de l'exécution d'un compte, les frais totaux pour
(114) LaissezKEC(jeb) = σ[c]c
l'utilisation de la mémoire à payer sont proportionnels au plus petit
On suppose que le client aura stocké la paire (KEC(jeb), multiple de 32 octets requis de sorte que tous les indices de mémoire
JEb) à un moment donné afin de déterminerjebréalisable. (que ce soit pour la lecture ou l'écriture) sont inclus dans la plage. Ceci
est payé sur une base juste à temps; en tant que tel, référencer une
Comme on peut le voir, il existe quatre exceptions à zone de mémoire d'au moins 32 octets supérieure à toute mémoire
l'utilisation du cadre général d'exécution Ξ pour l'évaluation de précédemment indexée entraînera certainement des frais d'utilisation
l'appel de message : il s'agit de quatre contrats dits « précompilés de mémoire supplémentaires. En raison de ces frais, il est très peu
», entendus comme une architecture préliminaire pouvant probable que les adresses dépassent les limites de 32 bits. Cela dit, les
devenir ultérieurementextensions natives. Les quatre contrats implémentations doivent être capables de gérer cette éventualité.
aux adresses 1, 2, 3 et 4 exécutent respectivement la fonction de Les frais de stockage ont un comportement légèrement nuancé - pour
récupération de clé publique à courbe elliptique, le schéma de inciter à la minimisation de l'utilisation du stockage (qui correspond
hachage SHA2 256 bits, le schéma de hachage RIPEMD 160 bits et directement à une base de données d'état plus grande sur tous les nœuds),
la fonction d'identité. les frais d'exécution pour une opération qui efface une entrée dans le
Leur définition formelle complète se trouve à l'annexe E. stockage ne sont pas seulement annulés, un qualifié le remboursement est
accordé ; en fait, ce remboursement est effectivement payé à l'avance
9.Modèle d'exécution puisque l'utilisation initiale d'un emplacement de stockage coûte nettement
Le modèle d'exécution spécifie comment l'état du système est plus cher que l'utilisation normale.
modifié en fonction d'une série d'instructions de bytecode et d'un Voir l'annexe H pour une définition rigoureuse du coût du gaz
petit tuple de données environnementales. Ceci est spécifié via un EVM.
modèle formel d'une machine à états virtuelle, connue sous le
nom de machine virtuelle Ethereum (EVM). C'est unquasi-Machine 9.3.Environnement d'exécution.En plus de l'état du
complète de Turing ; lequasiqualification vient du fait que le calcul systèmeσ, et le gaz restant pour le calculg, plusieurs
est intrinsèquement borné par informations importantes sont utilisées dans
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 11
l'environnement d'exécution que l'agent d'exécution doit Notez que nous devons supprimer la quatrième valeur dans le
fournir ; ceux-ci sont contenus dans le tupleje: tuple renvoyé parXpour évaluer correctement Ξ, d'où l'indice
• jeun, l'adresse du compte propriétaire du code en X0,1,2,4.
cours d'exécution. Xest donc cyclé (récursivement ici, mais on s'attend
• jeo, l'adresse de l'expéditeur de la transaction à l'origine généralement à ce que les implémentations utilisent une simple
de cette exécution. boucle itérative) jusqu'à ce que soitZdevient vrai indiquant que
• jep, le prix du gaz dans la transaction à l'origine l'état actuel est exceptionnel et que la machine doit être arrêtée
de cette exécution. et toute modification ignorée ou jusqu'à ce queHdevient une série
• jed, le tableau d'octets qui est la donnée d'entrée de (plutôt que l'ensemble vide) indiquant que la machine a atteint un
cette exécution ; si l'agent d'exécution est une arrêt contrôlé.
transaction, il s'agirait des données de transaction.
• jes, l'adresse du compte qui a provoqué l'exécution 9.4.1.État de la machine.L'état des machinesµest défini comme le
du code ; si l'agent d'exécution est une transaction, tuple (g, pc,m, je,s)quels sont les gaz disponibles, le compteur de
ce serait l'expéditeur de la transaction. programmespc∈P256,le contenu de la mémoire, le nombre actif de
• jev, la valeur, en Wei, passée sur ce compte dans le mots en mémoire (en comptant en continu à partir de la position
cadre de la même procédure que l'exécution ; si 0) et le contenu de la pile. Le contenu de la mémoireµmsont une
l'agent d'exécution est une transaction, ce serait la suite de zéros de taille 2256.
valeur de la transaction. Pour faciliter la lecture, les mnémoniques d'instructions, écrits en
• jeb, le tableau d'octets qui est le code machine à petites majuscules (ex.AJOUTER),doivent être interprétés comme leurs
exécuter. équivalents numériques ; le tableau complet des consignes et leurs
• jeH, l'en-tête de bloc du bloc actuel. spécificités est donné en annexe H.
• jee, la profondeur de l'appel de message actuel ou de la Aux fins de définirZ,HetO, nous définissonsw
création de contrat (c'est-à-dire le nombre deAPPELs ou comme opération courante à exécuter :
CRÉERs en cours d'exécution actuellement).
{
jeb[µpc] siµpc<‖jeb‖
Le modèle d'exécution définit la fonction Ξ, qui peut (125) w≡
ARRÊT sinon
calculer l'état résultantσ′, le gaz restantg′, la liste des suicides
s,la série de journauxje,les remboursementsret la sortie qui Nous supposons également les montants fixes deδetα,
en résulte,o,étant donné ces définitions : spécifiant les éléments de pile supprimés et ajoutés, tous deux
(115) (σ′, g′,s,je, r,o)≡Ξ(σ, g, je) inscriptibles sur l'instruction et une fonction de coût d'instruction
C évaluer le coût total, en gaz, de l'exécution de l'instruction
9.4.Présentation de l'exécution.Il faut maintenant définir la donnée.
fonction Ξ. Dans la plupart des implémentations pratiques, cela
sera modélisé comme une progression itérative de la paire 9.4.2.Arrêt exceptionnel.La fonction d'arrêt exceptionnelleZ
comprenant l'état complet du système,σet l'état de la machine, µ.
Pour- est défini comme:
généralement, nous le définissons récursivement avec une Ce
fonctionX. utilise une fonction d'itérationO(qui définit le résultat (126) Z(σ,µ,je)≡µg<C(σ,µ,je)∨
d'un seul cycle de la machine d'état) ainsi que des fonctions Zqui δw=∅∨
détermine si l'état actuel est un état d'arrêt exceptionnel de la ‖µs‖ < δw ∨
machine etH, spécifiant les données de sortie de l'instruction si et (w∈ {SAUT,JUMPI} ∧
seulement si l'état actuel est un état d'arrêt normal de la µs[0]∈/ D(jeb))∨
machine. ‖µs‖− δw+αw>1024
La séquence vide, notée (), n'est pas égale à l'ensemble Ceci indique que l'exécution est dans un état d'arrêt
vide, noté∅ ;ceci est important lors de l'interprétation de la exceptionnel s'il n'y a pas suffisamment de gaz, si l'instruction est
sortie deH, qui s'évalue à∅lorsque l'exécution doit continuer invalide (et donc saδl'indice n'est pas défini), s'il n'y a pas
mais une série (potentiellement vide) lorsque l'exécution doit suffisamment d'éléments de pile, si unSAUT/SAUTdestination n'est
s'arrêter. pas valide ou la nouvelle taille de pile serait supérieure à 1024. Le
( )
(116) Ξ(σ, g, je) ≡ X0,1,2,4 (σ,µ,UN0, JE) lecteur avisé se rendra compte que cela implique qu'aucune
instruction ne peut, par son exécution, provoquer un arrêt
(117) µg ≡ g
exceptionnel.
(118) µpc ≡ 0
(119) µm ≡ (0,0, ...) 9.4.3.Validité de la destination de saut.Nous utilisions auparavantD
(120) µje ≡ 0 comme fonction pour déterminer l'ensemble de destinations de saut
valides compte tenu du code en cours d'exécution. Nous définissons
(121) µs ≡ ()
cela comme toute position dans le code occupée par unJUMPDEST
(122) instruction.
-( )
- , , JE,() si Z(σ,µ,je) Toutes ces positions doivent être sur des limites d'instruction
( ) -∅µ,UN0
X(σ,µ,un, je)≡ O(σ,µ,un, je)·o si o6=∅ valides, plutôt que de se trouver dans la partie données dePOUSSER
-( ) opérations et doit apparaître dans la partie explicitement définie
XO(σ,µ,un, je) sinon
du code (plutôt que dans la partie implicitement définie
où ARRÊTopérations qui le suivent).
où: arriver à la feuille. Cela s'apparente aux schémas existants, tels que
(128) - ceux utilisés dans les protocoles dérivés de Bitcoin.
-{} si je>|c| Puisqu'un en-tête de bloc inclut la difficulté, l'en-tête
DJ(c, je)≡ {je} ∪ D J(cN, (je,c [je])) si c[je] =JUMPDEST seul suffit à valider le calcul effectué. Tout bloc contribue
-- au calcul total oudifficulté totaled'une chaîne.
DJ(c,N(je,c[je])) sinon
oùNest la prochaine position d'instruction valide dans le code, en Ainsi nous définissons la difficulté totale du blocBrécursivement
sautant les données d'unPOUSSERinstruction, le cas échéant : (129) comme :
{ (141) Bt ≡ B′t+Bd
je+w-PUSH1 +2 je+1 siw∈[PUSH1,PUSH32]
N(je, w)≡ (142) B′ ≡ P(BH)
sinon
En tant que tel étant donné un blocB,Btest sa difficulté totale,B
9.4.4.Arrêt normal.La fonction d'arrêt normaleHest défini: ′est son bloc parent etBdest sa difficulté.
fonction spécialeHRETOUR, défini à l'annexe H. (4) vérifier (ou, si l'extraction, calculer un état valide) et
nonce.
9.5.Le cycle d'exécution.Les éléments de la pile sont ajoutés ou supprimés
de la partie la plus à gauche et la plus faiblement indexée du
11.1.Validation Ommer.La validation des en-têtes ommer
série; tous les autres éléments restent inchangés :
ne signifie rien de plus que de vérifier que chaque en-tête
( ) ommer est à la fois un en-tête valide et satisfait la relation
(131) O(σ,µ,un, je) ≡ (σ′,µ′,UN′, JE) deNommer de e génération au bloc actuel où
(132) ∆ ≡ αw− δw N≤6. Le maximum d'en-têtes ommer est de deux. Officiellement:
∧
(133) ‖µ′s‖ ≡ ‖µs‖+∆ (143) ‖Btu‖62 V(tu)∧k(EN HAUT(BH)H,6)
(134) ∀X∈[αw,‖µ′ s‖) :µ′ s[X] ≡ µs[X+∆] tu∈Btu
Le gaz est réduit du coût en gaz de l'instruction et pour la oùkdésigne la propriété "is-kin":
plupart des instructions, le compteur de programme (144) -
s'incrémente à chaque cycle, pour les trois exceptions, nous -FAUX sin=0
supposons une fonction J, indicé par l'une des deux instructions, k(U, H, n)≡ s(EUH)
qui s'évalue à la valeur correspondante : --
∨k(EN HAUT(H)H, n−1) sinon
(135) µ′g ≡ µg− C(σ,µ,je)
etsdénote la propriété « is-sibling » :
-
-JSAUT(µ) si w=SAUT (145)
(136) µ′pc ≡ J (µ)
-JUMPI si w=JUMPI s(EUH)≡(P(H) =P(tu)∧H6 =tu∧tu∈ /B(H)tu)
- oùB(H) est le bloc de l'en-tête correspondantH.
N(µpc,w) sinon
En général, nous supposons que la mémoire, la liste des suicides et l'état du 11.2.Validation des transactions.Le donnégazUtilisé
système ne changent pas : doivent correspondre fidèlement aux transactions
(137) µ′m ≡ répertoriées :BHg, le gaz total utilisé dans le bloc, doit être
µm
égal au gaz cumulé utilisé selon la transaction finale :
(138) µ′je ≡ µje
(146) BHg= (̀R)tu
(139) UN′ ≡ UN
(140) σ′ ≡ σ 11.3.Demande de récompense.L'application de récompenses à un bloc
consiste à augmenter le solde des comptes de l'adresse bénéficiaire
Cependant, les instructions modifient généralement un ou
du bloc et de chaque ommer d'un certain montant. Nous augmentons
plusieurs composants de ces valeurs. Les composants modifiés
le compte bénéficiaire du bloc enRb; pour chaque ommer, nous
répertoriés par instruction sont notés dans l'annexe H, à côté des
augmentons le bénéficiaire du bloc d'un montant supplémentaire1de
valeurs pour αetδet une description formelle des besoins en gaz.
la récompense de32bloc et le bénéficiaire de l'ommer est récompensé
même adresse de bénéficiaire ou un ommer avec la même adresse de 11.5.Preuve de travail minière.La preuve de travail minière (PoW)
bénéficiaire que le bloc actuel), les ajouts sont appliqués existe en tant que nonce cryptographiquement sécurisé qui
cumulativement. prouve au-delà de tout doute raisonnable qu'une quantité
Nous définissons la récompense de bloc comme 5 Ether : particulière de calcul a été dépensée dans la détermination d'une
certaine valeur de jetonn. Il est utilisé pour renforcer la sécurité
(150) LaisserRb=5×dix18
de la blockchain en donnant du sens et du crédit à la notion de
difficulté (et, par extension, de difficulté totale). Cependant, étant
11.4.Validation d'état et de nonce.Nous pouvons maintenant
donné que l'extraction de nouveaux blocs s'accompagne d'une
définir la fonction, Γ, qui cartographie un blocBà son état
récompense, la preuve de travail fonctionne non seulement
d'initiation : (151) {
comme une méthode garantissant que la blockchain restera
σ0 siP(BH) =∅ canonique à l'avenir, mais également comme un mécanisme de
Γ(B)≡
σje:TRIE(LS(σje)) =P(BH)Heure sinon répartition des richesses.
Pour ces deux raisons, la fonction de preuve de travail a deux
Ici,TRIE(LS(σje)) signifie le hachage du nœud racine d'un trie
objectifs importants ; premièrement, il doit être le plus accessible
d'étatσje; on suppose que les implémentations stockeront cela
possible au plus grand nombre. L'exigence ou la récompense de
dans la base de données d'état, trivial et efficace puisque le trie
matériel spécialisé et peu commun doit être minimisée. Cela rend
est par nature une structure de données immuable.
le modèle de distribution aussi ouvert que possible et,
Et enfin définir Φ, la fonction de transition de bloc, qui idéalement, fait de l'acte d'extraction un simple échange de
cartographie un bloc incompletBà un bloc complet B′: l'électricité vers l'éther à peu près au même rythme pour
n'importe qui dans le monde.
(152) Φ(B) ≡ B ′: B′=B∗ sauf: Deuxièmement, il ne devrait pas être possible de faire des
2256 profits super-linéaires, et surtout pas avec une barrière initiale
(153)B′ n = n: X6 élevée. Un tel mécanisme permet à un adversaire bien financé de
Hd
gagner une partie gênante de la puissance minière totale du
(154)B′ m =mavec (x,m) =PoW(Bn ∗,n,d)
réseau et, en tant que tel, lui donne une récompense super-
(155) B∗≡Bsauf:B∗ r=r(Π(Γ(B),B)) linéaire (faisant ainsi la distribution en sa faveur) tout en
réduisant la sécurité du réseau.
Avecdétant un jeu de données tel que spécifié dans l'annexe J.
L'un des fléaux du monde Bitcoin est les ASIC. Ce sont des pièces
Comme spécifié au début du présent travail, Π est la fonction
de matériel de calcul spécialisées qui n'existent que pour effectuer une
de transition d'état, qui est définie en termes de Ω, la fonction de
seule tâche. Dans le cas de Bitcoin, la tâche est la fonction de hachage
finalisation de bloc et Υ, la fonction d'évaluation de transaction,
SHA256. Alors que les ASIC existent pour une fonction de preuve de
toutes deux maintenant bien définies.
travail, les deux objectifs sont mis en péril. Pour cette raison, une
Comme détaillé précédemment,R[n]σ,R[n]jeetR[n]tusont les
fonction de preuve de travail résistante aux ASIC (c'est-à-dire difficile
nème états correspondants, logs et gaz cumulés consommés
ou économiquement inefficace à mettre en œuvre dans du matériel de
après chaque transaction (R[n]b, le quatrième composant du
calcul spécialisé) a été identifiée comme la solution miracle
tuple, a déjà été défini en termes de logs). Le premier est
proverbiale.
défini simplement comme l'état résultant de l'application de
Deux directions existent pour la résistance ASIC ; tout d'abord,
la transaction correspondante à l'état résultant de la
rendez-le séquentiel à mémoire dure, c'est-à-dire concevez la fonction
transaction précédente (ou l'état initial du bloc dans le cas de
de telle sorte que la détermination du nonce nécessite beaucoup de
la première de ces transactions) :
mémoire et de bande passante de sorte que la mémoire ne puisse pas
{
Γ(B) sin <0 être utilisée en parallèle pour découvrir plusieurs nonces
(156) R[n]σ= simultanément. La seconde consiste à rendre le type de calcul dont il
Υ(R[n−1]σ,BJ[n]) sinon
aurait besoin pour un usage général ; le sens de « matériel spécialisé »
Dans le cas dBR[n]tu, nous adoptons une approche similaire en pour un ensemble de tâches à usage général est, naturellement, du
définissant chaque élément comme le gaz utilisé pour évaluer la matériel à usage général et, en tant que tels, les ordinateurs de
transaction correspondante additionnée à l'élément précédent (ou bureau de base sont susceptibles d'être assez proches du « matériel
zéro, s'il s'agit du premier), nous donnant un total cumulé : spécialisé » pour la tâche. Pour Ethereum 1.0, nous avons choisi le
- premier chemin.
-0 sin <0 Plus formellement, la fonction de preuve de travail prend la forme
(157)R[n]tu= Υg(R[n−1] σ,BJ[n]) dePoW :
-- (160)
+ R[n−1]tu sinon 2256
m=Hm ∧n6 avec (m, n) =PoW(Hn,Hn,d)
PourR[n]je, on utilise le Υjefonction que nous avons commodément Hd
définie dans la fonction d'exécution de transaction.
OùHn est l'en-tête du nouveau bloc maissansles composants
(158) R[n]je= Υje(R[n−1]σ,BJ[n]) nonce et mix-hash ;Hnest le nonce de l'en-tête ;dest un grand
ensemble de données nécessaire pour calculer le mix-Hash etHd
Enfin, nous définissons Π comme le nouvel état compte tenu de la est la valeur de difficulté du nouveau bloc (c'est-à-dire la difficulté
fonction de récompense de bloc Ω appliquée à l'état résultant de la du bloc de la section 10).PoWest la fonction de preuve de travail
(̀BR)σ:
transaction finale, qui évalue à un tableau avec le premier élément étant le mixHash
et le deuxième élément étant un nombre pseudo-aléatoire
(159) Π(σ,B)≡Ω(B, `(R)σ)
cryptographiquement dépendant deHetd. L'algorithme sous-
Ainsi, le mécanisme complet de transition de bloc, moins PoW, jacent s'appelle Ethash et est décrit ci-dessous.
la fonction de preuve de travail est définie.
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 14
11.5.1.Éthash.Ethash est l'algorithme PoW prévu pour Ethereum une solution triviale serait d'ajouter une quantité constante et
1.0. Il s'agit de la dernière version de Dagger-Hashimoto, de hacher le résultat.
introduite par Buterin [2013b] et Dryja [2014], bien qu'elle ne
puisse plus être appelée de manière appropriée, car de 13.Directions futures
nombreuses caractéristiques originales des deux algorithmes ont
été radicalement modifiées au cours du dernier mois de La base de données d'état ne sera pas obligée de conserver toutes les
recherche. et développement. L'itinéraire général emprunté par structures de trie d'état passées dans le futur. Il doit maintenir un âge pour
l'algorithme est le suivant : chaque nœud et éventuellement supprimer les nœuds qui ne sont ni assez
Il existe une graine qui peut être calculée pour chaque bloc en récents ni les points de contrôle ; des points de contrôle, ou un ensemble de
parcourant les en-têtes de bloc jusqu'à ce point. A partir de la graine, nœuds dans la base de données qui permettent de traverser le trie d'état
on peut calculer un cache pseudo-aléatoire,Jcache initoctets en taille d'un bloc particulier, pourraient être utilisés pour imposer une limite
initiale. Les clients légers stockent le cache. A partir du cache, nous maximale à la quantité de calcul nécessaire pour récupérer n'importe quel
pouvons générer un jeu de données, Jdatasetinitoctets en taille initiale, état dans la blockchain.
avec la propriété que chaque élément de l'ensemble de données ne La consolidation de la blockchain pourrait être utilisée afin de
dépend que d'un petit nombre d'éléments du cache. Les clients réduire la quantité de blocs qu'un client devrait télécharger pour
complets et les mineurs stockent l'ensemble de données. L'ensemble agir comme un nœud minier complet. Une archive compressée
de données croît linéairement avec le temps. de la structure de trie à des moments donnés (peut-être un bloc
L'exploitation minière consiste à saisir des tranches aléatoires de sur 10 000) pourrait être conservée par le réseau de pairs,
l'ensemble de données et à les hacher ensemble. La vérification peut être refondant efficacement le bloc de genèse. Cela réduirait la
effectuée avec peu de mémoire en utilisant le cache pour régénérer les quantité à télécharger dans une seule archive plus une limite
éléments spécifiques de l'ensemble de données dont vous avez besoin, maximale stricte de blocs.
vous n'avez donc qu'à stocker le cache. Le grand ensemble de données est Enfin, la compression de la blockchain pourrait peut-être être
mis à jour une fois parJépoqueblocs, de sorte que la grande majorité des effectuée : les nœuds dans l'état trie qui n'ont pas envoyé/reçu une
efforts d'un mineur consistera à lire l'ensemble de données, et non à y transaction dans un nombre constant de blocs pourraient être rejetés,
apporter des modifications. Les paramètres mentionnés ainsi que réduisant à la fois les fuites d'Ether et la croissance de la base de
l'algorithme sont expliqués en détail dans l'annexe J. données d'état.
12.Mise en œuvre des contrats 13.1.Évolutivité.L'évolutivité reste une préoccupation éternelle. Avec
une fonction de transition d'état généralisée, il devient difficile de
Il existe plusieurs modèles d'ingénierie des contrats qui permettent des
partitionner et de paralléliser les transactions pour appliquer la
comportements utiles particuliers ; deux d'entre eux dont je parlerai
stratégie diviser pour mieux régner. Sans réponse, la plage de valeur
brièvement sont les flux de données et les nombres aléatoires.
dynamique du système reste essentiellement fixe et à mesure que la
12.1.Flux de données.Un contrat de flux de données est un valeur moyenne des transactions augmente, les moins précieuses
contrat qui fournit un service unique : il donne accès à des d'entre elles sont ignorées, étant économiquement inutiles à inclure
informations du monde extérieur au sein d'Ethereum. dans le grand livre principal. Cependant, plusieurs stratégies existent
L'exactitude et l'actualité de ces informations ne sont pas qui peuvent potentiellement être exploitées pour fournir un protocole
garanties et c'est la tâche d'un auteur de contrat secondaire - le considérablement plus évolutif.
contrat qui utilise le flux de données - de déterminer le degré de Une certaine forme de structure hiérarchique, obtenue soit en
confiance qui peut être accordé à un seul flux de données. consolidant de petites chaînes plus légères dans le bloc principal, soit
Le modèle général implique un contrat unique au sein en construisant le bloc principal par la combinaison et l'adhésion
d'Ethereum qui, lorsqu'il reçoit un appel de message, répond incrémentielles (par preuve de travail) d'ensembles de transactions
avec des informations opportunes concernant un plus petits, peut permettre la parallélisation de la combinaison de
phénomène externe. Un exemple pourrait être la transactions et de la construction de blocs . Le parallélisme pourrait
température locale de New York. Cela serait mis en œuvre également provenir d'un ensemble prioritaire de chaînes de blocs
sous la forme d'un contrat renvoyant la valeur d'un point de parallèles, consolidé chaque bloc et avec des transactions en double
stockage connu. Bien sûr, ce point de stockage doit être ou invalides rejetées en conséquence.
maintenu avec la bonne température, et donc la deuxième Enfin, le calcul vérifiable, s'il est rendu généralement disponible et
partie du modèle serait qu'un serveur externe exécute un suffisamment efficace, peut fournir une voie permettant à la preuve
nœud Ethereum, et immédiatement à la découverte d'un de travail d'être la vérification de l'état final.
nouveau bloc, crée une nouvelle transaction valide, envoyée
au contrat, mettant à jour ladite valeur en stockage. Le code 14.Conclusion
du contrat n'accepterait de telles mises à jour qu'à partir de
l'identité contenue sur ledit serveur. J'ai présenté, discuté et défini formellement le protocole
d'Ethereum. Grâce à ce protocole, le lecteur peut implémenter un
12.2.Nombres aléatoires.Fournir des nombres aléatoires dans un nœud sur le réseau Ethereum et en rejoindre d'autres dans un
système déterministe est, naturellement, une tâche impossible. système d'exploitation social sécurisé décentralisé. Des contrats
Cependant, nous pouvons approximer avec des nombres pseudo- peuvent être rédigés afin de spécifier de manière algorithmique
aléatoires en utilisant des données qui sont généralement et d'appliquer de manière autonome des règles d'interaction.
inconnues au moment de la transaction. Ces données peuvent
inclure le hachage du bloc, l'horodatage du bloc et l'adresse du
15.Remerciements
bénéficiaire du bloc. Afin de rendre difficile pour les mineurs
malveillants de contrôler ces valeurs, il faut utiliser leBLOCHASH Un grand merci à Aeron Buchanan pour l'auteur des révisions
opération afin d'utiliser les hachages des 256 blocs précédents comme de Homestead, Christoph Jentzsch pour l'auteur de l'algorithme
nombres pseudo-aléatoires. Pour une série de tels nombres, Ethash et Yoichi Hirai pour avoir fait la plupart des
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 15
Jacob Aron. Le logiciel BitCoin trouve une nouvelle vie.Nouvelle Scien- tions. 2014. URL {http://www.hashcash.org/papers/
tiste, 213(2847):20, 2012. memohash.pdf}.
Adam Retour. Hashcash - Amortissable Publiquement Auditable Marc Miller. L'avenir du droit. Danspapier remis au
Fonctions de coût. 2002. URL {http://www.hashcash. Conférence Extra 3 (9 août), 1997.
org/papers/amortizable.pdf}. Satoshi Nakamoto. Bitcoin : une monnaie électronique peer-to-peer
Roman Boutellier et Mareike Heinzen. Pirates, Pionniers, système.Consulté, 1:2012, 2008.
Innovateurs et imitateurs. DansCroissance par l'innovation, Meni Rosenfeld. Vue d'ensemble des pièces colorées. 2012. URL
pages 85–96. Springer, 2014. {https://bitcoil.co.il/BitcoinX.pdf}. Yonatan
Vitalik Buterin. Ethereum : une puce de nouvelle génération Sompolinsky et Aviv Zohar. Accél-
Plate-forme d'application contractuelle et décentralisée. erant le traitement des transactions de Bitcoin. Rapide
2013a. URL {http://ethereum.org/ethereum.html}. L'argent pousse sur les arbres, pas sur les chaînes, URL
Vitalik Buterin. Dagger : une mémoire difficile à calculer, 2013. {CryptologieePrintArchive,Report2013/881}.
Memory-Facile à vérifier Scrypt Alternative. 2013b. URL http://eprint.iacr.org/.
{http://vitalik.ca/ethereum/dagger.html}. Thaddée Simon Sprankel. Base technique des monnaies numériques,
Dryja. Hashimoto : preuve de travail liée aux E/S. 2013.
2014. URL {https://mirrorx.com/files/hashimoto. pdf}. Nick Szabo. Formaliser et sécuriser les relations sur
réseaux publics.Premier lundi, 2(9), 1997.
Cynthia Dwork et Moni Naor. Tarification via le traitement ou Vivek Vishnumurthy, Sangeeth Chandrakumar et
lutter contre le courrier indésirable. DansDans la 12e conférence Emin Gn Sirer. Karma : Un cadre économique sécurisé pour le
internationale annuelle sur la cryptologie, pages 139–147, 1992. partage de ressources entre pairs, 2003.
Phong Vo Glenn Fowler, Se poser sur Sec Noll. JR Willet. Spécification complète de MasterCoin. 2013. URL
Fonction de hachage FowlerNollVo. 1991. URL {https://github.com/mastercoin-MSC/spec}.
annexeUN.Terminologie
Acteur externe :Une personne ou une autre entité capable de s'interfacer avec un nœud Ethereum, mais extérieure au monde de
Ethereum. Il peut interagir avec Ethereum en déposant des transactions signées et en inspectant la blockchain et l'état
associé. A un (ou plusieurs) comptes intrinsèques.
Adresse:Un code de 160 bits utilisé pour identifier les comptes.
Compte:Les comptes ont un solde intrinsèque et un nombre de transactions maintenu dans le cadre de l'état Ethereum.
Ils ont également un code EVM (éventuellement vide) et un état de stockage (éventuellement vide) qui leur sont
associés. Bien qu'homogène, il est logique de distinguer deux types pratiques de comptes : ceux avec un code
EVM associé vide (ainsi le solde du compte est contrôlé, le cas échéant, par une entité externe) et ceux avec un
code EVM associé non vide (donc le compte représente un Objet Autonome). Chaque compte a une adresse
unique qui l'identifie.
Transaction:Une donnée, signée par un Acteur Externe. Il représente soit un Message soit une nouvelle Autonome
Objet. Les transactions sont enregistrées dans chaque bloc de la blockchain.
Objet Autonome :Un objet notionnel existant uniquement dans l'état hypothétique d'Ethereum. A une valeur intrinsèque
adresse et donc un compte associé ; le compte aura un code EVM associé non vide. Incorporé uniquement en
tant qu'état de stockage de ce compte.
État de stockage :Les informations propres à un compte donné qui sont conservées entre les moments où le
Le code EVM associé au compte s'exécute.
Message:Les données (sous la forme d'un ensemble d'octets) et la valeur (spécifiée comme Ether) qui sont transmises entre deux comptes, soit
par le fonctionnement déterministe d'un Objet Autonome ou la signature cryptographiquement sécurisée de la
Transaction.
Message d'appel :Action de transmettre un message d'un Compte à un autre. Si le compte de destination est associé
avec un code EVM non vide, alors la VM sera démarrée avec l'état dudit objet et le message traité. Si l'expéditeur
du message est un objet autonome, l'appel transmet toutes les données renvoyées par l'opération VM.
Gaz:L'unité de coût de réseau fondamentale. Payé exclusivement par Ether (à partir de PoC-4), qui est converti librement
vers et depuis le gaz selon les besoins. Le gaz n'existe pas en dehors du moteur de calcul interne d'Ethereum ; son prix est fixé
par la transaction et les mineurs sont libres d'ignorer les transactions dont le prix du gaz est trop bas.
Contracter:Terme informel utilisé pour désigner à la fois un morceau de code EVM qui peut être associé à un compte ou un
Objet autonome.
Objet:Synonyme d'objet autonome.
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 16
Application :Une application visible par l'utilisateur final hébergée dans le navigateur Ethereum.
Navigateur Ethereum : (alias Ethereum Reference Client) Une interface graphique multiplateforme d'une interface similaire à une interface simplifiée
navigateur (à la Chrome) capable d'héberger des applications en bac à sable dont le backend est purement sur le protocole
Ethereum.
Machine virtuelle Ethereum : (alias EVM) La machine virtuelle qui constitue la partie clé du modèle d'exécution
pour le code EVM associé à un compte.
Environnement d'exécution Ethereum : (alias ERE) L'environnement qui est fourni à un objet autonome
s'exécutant dans l'EVM. Inclut l'EVM mais aussi la structure de l'état mondial sur lequel l'EVM s'appuie pour
certaines instructions d'E/S, notamment CALL & CREATE.
Code EMV :Le bytecode que l'EVM peut exécuter nativement. Utilisé pour spécifier formellement le sens et les rami-
fications d'un message à un Compte.
Assemblage EVM :La forme lisible par l'homme du code EVM.
JE VAIS:Le langage de bas niveau de type Lisp, un langage inscriptible par l'homme utilisé pour la rédaction de contrats simples et généraux
boîte à outils de langage de bas niveau pour la trans-compilation vers.
(161) J ≡ L ∪B
(162) L ≡ {t : t = (t[0],t[1], ...)∧ ∀n<‖t‖t[n]∈J} {b : b = (b[0],
(163) B ≡ b[1], ...)∧ ∀n<‖b‖b[n]∈O}
OùOest l'ensemble des octets. AinsiBest l'ensemble de toutes les séquences d'octets (autrement appelés tableaux d'octets, et une feuille si elle est imaginée comme un
arbre),Lest l'ensemble de toutes les (sous-)structures arborescentes qui ne sont pas une seule feuille (un nœud de branche s'il est imaginé comme un arbre) etJest
l'ensemble de tous les tableaux d'octets et de telles séquences structurelles.
Nous définissons la fonction RLP commeRLPà travers deux sous-fonctions, la première gérant l'instance lorsque la valeur est un
tableau d'octets, le second lorsqu'il s'agit d'une séquence de valeurs supplémentaires :
{
Rb(X) siX∈B
(164) RLP(X)≡
Rje(X) sinon
Si la valeur à sérialiser est un tableau d'octets, la sérialisation RLP prend l'une des trois formes suivantes :
• Si le tableau d'octets ne contient qu'un seul octet et que cet octet est inférieur à 128, alors l'entrée est exactement égale
à la sortie.
• Si le tableau d'octets contient moins de 56 octets, alors la sortie est égale à l'entrée préfixée par l'octet égal à la
longueur du tableau d'octets plus 128.
• Sinon, la sortie est égale à l'entrée préfixée par le tableau d'octets de longueur minimale qui, lorsqu'il est interprété comme un
entier gros-boutien, est égal à la longueur du tableau d'octets d'entrée, qui est lui-même préfixé par le nombre d'octets requis
pour fidèlement encoder cette valeur de longueur plus 183.
Formellement, on définitRb:
-
-X si‖X‖=1∧X[0]<128 sinon
(165) Rb(X) ≡ (128 +‖X‖)·X si‖X‖ <56 sinon
-( ∥ ∥)
183 +∥ÊTRE(‖X‖)∥ · ÊTRE(‖X‖)·X
n<‖b
∑‖ bn·256‖b‖−1−n
(166) ÊTRE(X) ≡ (b0, b1, ...) :b06 = 0∧X=
n=0
(167) (un)·(avant JC)·(ré, é) = (un, b, c, ré, e)
AinsiÊTREest la fonction qui développe une valeur entière positive en un tableau d'octets gros-boutien de longueur minimale et l'opérateur
point effectue la concaténation de séquences.
Si au lieu de cela, la valeur à sérialiser est une séquence d'autres éléments, la sérialisation RLP prend l'une des deux formes suivantes :
• Si les sérialisations concaténées de chaque élément contenu ont une longueur inférieure à 56 octets, alors la sortie est égale à
cette concaténation préfixée par l'octet égal à la longueur de ce tableau d'octets plus 192.
• Sinon, la sortie est égale aux sérialisations concaténées préfixées par le tableau d'octets de longueur minimale qui, lorsqu'il est
interprété comme un entier gros boutien, est égal à la longueur du tableau d'octets de sérialisations concaténées, qui est lui-
même préfixé par le nombre d'octets requis pour coder fidèlement cette valeur de longueur plus 247.
Ainsi terminons-nous en définissant formellementRje:
{
(192 +‖s(X)‖)·s(X) ( si‖s(X)‖ <56
(168) Rje(X) ≡ ∥ ∥)
247 +∥ÊTRE(‖s(X)‖)∥ · ÊTRE(‖s(X)‖)·s(X) sinon
(169) s(X) ≡ RLP(X0)·RLP(X1)...
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 17
Si RLP est utilisé pour coder un scalaire, défini uniquement comme un entier positif (Pou n'importe lequelXpourPX), il doit être spécifié comme
le tableau d'octets le plus court de sorte que son interprétation gros-boutiste soit égale. Ainsi le RLP d'un entier positifjeest défini comme:
(170) RLP(je:je∈P)≡RLP(BE(je))
Lors de l'interprétation des données RLP, si un fragment attendu est décodé en tant que scalaire et que des zéros non significatifs sont trouvés dans la
séquence d'octets, les clients sont tenus de le considérer comme non canonique et de le traiter de la même manière que des données RLP autrement
invalides, en le rejetant complètement.
Il n'y a pas de format de codage canonique spécifique pour les valeurs signées ou à virgule flottante.
Le codage par préfixe hexadécimal est une méthode efficace pour coder un nombre arbitraire de quartets sous la forme d'un tableau d'octets. Il est
capable de stocker un indicateur supplémentaire qui, lorsqu'il est utilisé dans le contexte du trie (le seul contexte dans lequel il est utilisé), lève l'ambiguïté
entre les types de nœuds.
Elle est définie comme la fonctionCVqui cartographie à partir d'une séquence de quartets (représentés par l'ensembleY)avec une
valeur booléenne à une séquence d'octets (représentée par l'ensembleB):
{
(16F(t),16X[0] +X[1],16X[2] +X[3], ...) si‖X‖est même
(171) CV(X, t) :X∈Oui ≡
(16(F(t) + 1) +X[0],16X[1] +X[2],16X[3] +X[4], ...) autrement
{
2 sit6 = 0
(172) F(t) ≡
0 sinon
Ainsi, le quartet haut du premier octet contient deux drapeaux ; le bit le plus bas codant l'impair de la longueur et le deuxième bit le plus bas
codant le drapeaut. Le quartet de poids faible du premier octet est nul dans le cas d'un nombre pair de quartets et le premier quartet dans le cas
d'un nombre impair. Tous les quartets restants (maintenant un nombre pair) s'intègrent correctement dans les octets restants.
On suppose aussi une fonctionn, la fonction de limite de nœud du trie. Lors de la composition d'un nœud, nous utilisons RLP pour encoder la
structure. Afin de réduire la complexité du stockage, pour les nœuds dont le RLP composé est inférieur à 32 octets, nous stockons le RLP
directement ; pour les plus grands, nous affirmons la prescience du tableau d'octets dont le hachage Keccak s'évalue à notre référence.
Ainsi définissons-nous en termes dec, la fonction de composition de nœud :
-
-() si je =∅
(178) n(JE, je)≡ c(JE, je) si ‖c(JE, je)‖ <32
--
KEC(c(JE, je)) sinon
D'une manière similaire à un arbre de base, lorsque le trie est parcouru de la racine à la feuille, on peut construire une seule paire clé-valeur. La
clé est accumulée tout au long du parcours, en acquérant un seul quartet à partir de chaque nœud de branche (tout comme avec un arbre de
base). Contrairement à un arbre de base, dans le cas de plusieurs clés partageant le même préfixe ou dans le cas d'une seule clé ayant
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 18
un suffixe unique, deux nœuds d'optimisation sont fournis. Ainsi, lors de la traversée, on peut potentiellement acquérir plusieurs
quartets de chacun des deux autres types de nœuds, extension et feuille. Il existe trois types de nœuds dans le trie :
Feuille:Une structure à deux éléments dont le premier élément correspond aux quartets dans la clé non déjà pris en compte par le
accumulation de clés et de branches parcourues depuis la racine. La méthode de codage par préfixe hexadécimal est utilisée et
le deuxième paramètre de la fonction doit êtrevrai.
Extension:Une structure à deux éléments dont le premier élément correspond à une série de quartets de taille supérieure à un qui
sont partagées par au moins deux clés distinctes au-delà de l'accumulation de clés de quartets et de branches traversées à
partir de la racine. La méthode de codage par préfixe hexadécimal est utilisée et le deuxième paramètre de la fonction doit être
FAUX.
Bifurquer:Une structure de 17 éléments dont les seize premiers éléments correspondent à chacune des seize valeurs de quartet possibles pour
les clés à ce stade de leur parcours. Le 17e élément est utilisé dans le cas où il s'agit d'un nœud de terminaison et donc
d'une clé se terminant à ce stade de sa traversée.
Une branche n'est alors utilisée qu'en cas de nécessité ; aucun nœud de branche ne peut exister qui ne contienne qu'une seule entrée non nulle. Nous
pouvons définir formellement cette structure avec la fonction de composition structurellec:
(179) ))
- ((
-
-RLP CV(je0[je.. (‖je0‖−1)], vrai), JE1 si ‖je‖=1 où∃je:je∈je
- (( ))
--RPP HP(je0[je..(j-1)], FAUX), n(JE, j) ( si je6
=j oùj=arg maxX:∃l :‖je‖=X:∀je∈je:je0[0..(x−1)] =je
)
c(JE, je)≡ -RLP (tu(0), tu(1), ..., tu(15), v) sinon oùtu(j) ≡ n
{({JE:je∈je∧je0[je] =j}, je+1)
-
- je1 si∃je:je∈je∧‖je0‖=je
-- v =
() sinon
D.1.Essayez la base de données.Ainsi, aucune hypothèse explicite n'est faite concernant les données stockées et celles qui ne le sont pas, car il
s'agit d'une considération spécifique à la mise en œuvre ; nous définissons simplement la fonction d'identité mappant l'ensemble clé-valeurje à un
hachage de 32 octets et affirmer qu'un seul de ces hachages existe pour toutJE,qui, bien que non strictement vrai, est précis avec une précision
acceptable compte tenu de la résistance aux collisions du hachage Keccak. En réalité, une implémentation sensée ne recalculera pas entièrement
le hachage de racine de trie pour chaque ensemble.
Une implémentation raisonnable maintiendra une base de données de nœuds déterminée à partir du calcul de divers essais ou, plus
formellement, elle mémorisera la fonctionc. Cette stratégie utilise la nature du trie à la fois pour rappeler facilement le contenu de tout ensemble
de valeurs-clés précédent et pour stocker plusieurs de ces ensembles de manière très efficace. En raison de la relation de dépendance, les preuves
de Merkle peuvent être construites avec unO(enregistrerN) l'exigence d'espace qui peut démontrer qu'une feuille particulière doit exister dans un
trie d'un hachage racine donné.
annexeE.Contrats précompilés
Pour chaque contrat précompilé, nous utilisons une fonction modèle, ΞPRÉ, qui implémente la vérification du manque de gaz.
{
(∅,0,UN0,()) (σ, g sig < gr
(180) ΞPRÉ(σ, g, je)≡
− gr,UN0,o) sinon
Les contrats précompilés utilisent chacun ces définitions et fournissent des spécifications pour leso (les données de sortie) etgr, les
besoins en gaz.
Pour la courbe elliptique DSA récupérer la fonction d'exécution de VM, nous définissons égalementdêtre les données d'entrée, bien définies
pour une longueur infinie en ajoutant des zéros si nécessaire. Surtout dans le cas d'une signature invalide (ECDSARECOVER(h, v, r, s) = ∅),alors
nous n'avons pas de sortie.
Les deux fonctions de hachage, RIPEMD-160 et SHA2-256 sont plus trivialement définies comme une opération presque pass-through. Leur
consommation de gaz dépend de la taille des données d'entrée, un facteur arrondi au nombre de mots le plus proche.
annexeF.Signature de transactions
La méthode de signature des transactions est similaire aux « signatures de style Electrum » ; il utilise la courbe SECP-256k1 comme
décrit par Gura et al. [2004].
On suppose que l'expéditeur a une clé privée validepr, qui est un entier positif sélectionné au hasard (représenté par un tableau
d'octets de longueur 32 sous forme gros-boutiste) dans la plage [1,secp256k1n−1].
Nous affirmons les fonctionsECDSASIGN, ECDSARESTOREetECDSAPUBKEY.Celles-ci sont formellement définies dans la littérature.
Oùptuest la clé publique, supposée être un tableau d'octets de taille 64 (formé de la concaténation de deux entiers positifs chacun<2
256) etprest la clé privée, un tableau d'octets de taille 32 (ou un seul entier positif dans la plage susmentionnée). Il est entendu quevest
'l'identifiant de récupération', une valeur de 1 octet spécifiant le signe et la finitude du point de la courbe ; cette valeur est dans la gamme
de [27,30], cependant nous déclarons les deux possibilités supérieures, représentant des valeurs infinies, invalides.
Nous déclarons qu'une signature est invalide à moins que toutes les conditions suivantes ne soient remplies :
(( ))
(218) S(J)≡B96..255KEC ECDSARECOVER(h(J), Tw, Tr, Ts)
L'assertion selon laquelle l'expéditeur d'une transaction signée est égale à l'adresse du signataire devrait être évidente :
gjumpdest 1
gsset 20000 Payé pour unSTOREopération lorsque la valeur de stockage est définie sur une valeur différente de zéro à partir de zéro.
gsréinitialiser 5000 Payé pour unSTOREopération lorsque le zéro de la valeur de stockage reste inchangé ou est mis à zéro. Remboursement accordé
Rclair 15000 (ajouté au compteur de remboursement) lorsque la valeur de stockage est définie sur zéro à partir de non-zéro. Remboursement
Rsuicide 24000 accordé (ajouté au compteur de remboursement) pour avoir suicidé un compte.
gsuicide 5000 Quantité d'essence à payer pour unSUICIDEopération.
gcréer 32000 Payé pour unCRÉERopération.
gdépôt de code 200 Payé par octet pour unCRÉERopération pour réussir à placer le code dans l'état.
gappel 700 Payé pour unAPPELopération.
gvaleur d'appel 9000 Payé pour un transfert de valeur non nulle dans le cadre duAPPELopération.
gallocation d'appel 2300 Une allocation pour le contrat appelé soustraite degvaleur d'appelpour un transfert de valeur non
gnouveau compte 25000 nulle. Payé pour unAPPELouSUICIDEopération qui crée un compte. Paiement partiel d'unEXP
gexp dix opération.
gexpbyte dix Paiement partiel multiplié pardenregistrer256(exposant)epour leEXPopération. Payé pour
gmémoire 3 chaque mot supplémentaire lors de l'extension de la mémoire.
gtxcreate 32000 Payé par toutes les transactions créant un contrat après laTransition de la ferme. Payé
gtxdatazero 4 pour chaque zéro octet de données ou de code pour une transaction.
gtxdatanonzero 68 Payé pour chaque octet de données ou de code différent de zéro pour une transaction.
gtransaction 21000 Payé pour chaque transaction.
(220) -
-C STORE(σ,µ) si w= STORE
-
--gexp si w=EXP∧ µs[1] = 0 w=
-
-g exp + gexpbyte×(1 + b 256(µs[1])c ) si EXP∧ µs[1]>0
-
enregistrer
Notez le composant de coût de la mémoire, donné comme le produit degmémoireet le maximum de 0 & le plafond du nombre de mots
en taille que la mémoire doit avoir sur le nombre de mots courant,µjeafin que tous les accès référencent une mémoire valide que ce soit
en lecture ou en écriture. Ces accès doivent être pour un nombre d'octets non nul.
Référencer une plage de longueur nulle (par exemple en essayant de la transmettre comme plage d'entrée à un CALL) ne nécessite pas de mémoire
à étendre jusqu'au début de la gamme.µ′ jeest défini comme ce nouveau nombre maximum de mots de mémoire active ;
des cas particuliers sont donnés où ces deux ne sont pas égaux.
Notez également queCmemest la fonction de coût mémoire (la fonction d'expansion étant la différence entre le coût avant et
après). C'est un polynôme, avec le coefficient d'ordre supérieur divisé et plancher, et donc linéaire jusqu'à 724B de mémoire
utilisée, après quoi il coûte beaucoup plus cher.
Lors de la définition du jeu d'instructions, nous avons défini l'extension de mémoire pour la fonction de plage,M, ainsi:
{
s sije=0
(223) M(s, f, l)≡
max(s,d(F+je)÷32e) sinon
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 22
Une autre fonction utile est la fonction "tous sauf un 64ème"Ldéfini comme:
H.2.Jeu d'instructions.Comme précisé précédemment dans la section 9, ces définitions prennent place dans le contexte final ici.
En particulier nous supposonsOest la fonction de progression d'état EVM et définit les termes relatifs à l'état du cycle suivant (σ′
,µ′) tel que:
Voici les diverses exceptions aux règles de transition d'état données à la section 9 spécifiées pour chaque instruction, ainsi que les
définitions supplémentaires spécifiques à l'instruction deJetC. Pour chaque instruction, est également spécifiéα, les éléments
supplémentaires placés sur la pile etδ, les éléments retirés de la pile, tels que définis à la section 9.
0s : Opérations d'arrêt et arithmétiques
Toute arithmétique est modulo 2256sauf indication contraire.
1 siµs[0]je=0
∀je∈[0..255] :µ′ s[0]je≡
0 sinon
0x1a OCTET 2 1 Récupérer un seul octet de{ m mot.
µs[1](je+8µs[0]) sije <8∧ µs[0]<32
∀je∈[0..255] :µ′ s[0]je≡
0 sinon
Pour le Nième octet, on compte à partir de la gauche (c'est-à-dire que N=0 serait le plus significatif en big endian).
20s : SHA3
Valeur Mnémoniqueδ αDescription
0x20SHA3 21 Calculez le hachage Keccak-256.
µ′s[0]≡Keccak(µm[µs[0]. . .(µs[0] +µs[1]−1)])
µ′je≡M(µje,µs[0],µs[1])
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 24
µ′s[0]≡jes
Il s'agit de l'adresse du compte qui est directement responsable de cette exécution.
0x34 CALLVALUE 0 1 Obtenir la valeur déposée par l'instruction/transaction responsable de cette exécution.
µ′s[0]≡jev
0x35CALLDATALOAD1 1 Obtenir les données d'entrée de l'environnement actuel.
µ′s[0]≡jed[µs[0]. . .(µs[0] + 31)] avecjed[X] = 0 siX>‖jed‖
Cela concerne les données d'entrée transmises avec l'instruction ou la transaction d'appel de message.
0x37CALLDATACOPY3 0 Copier les données d'entrée dans l'environnement actuel vers la mémoire.
jed[µs[1] +je] siµs[1] +je <‖jed‖
∀je∈{0...µs[2]−1}µ′ µ
m[ s[0] +je]≡
0 sinon
µ′je≡M(µje,µs[0],µs[2])
Cela concerne les données d'entrée transmises avec l'instruction ou la transaction d'appel de message.
µs[0] siµs[1]6 = 0
JJUMPI(µ)≡
µpc+1 sinon
Cela a pour effet d'écrire ladite valeur àµpc. Voir rubrique 9.
0x58 PC 0 1 Obtenir la valeur du compteur de programmeavantà l'incrément
correspondant à cette instruction.
µ′s[0]≡µpc
0x59 MSIZE 0 1 Obtenir la taille de la mémoire active en octets.
µ′s[0]≡32µje
0x5a GAZ 0 1 Obtenez la quantité de gaz disponible, y compris la réduction correspondante
pour le coût de cette instruction.
µ′s[0]≡µg
0x5bJUMPDEST 0 0 Marquez une destination valide pour les sauts.
Cette opération n'a aucun effet sur l'état de la machine pendant l'exécution.
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 27
... ...
.. .. .. ...
... ...
.. . . . . ...
... ...
.. .. .. ...
Pour toutes les opérations de journalisation, le changement d'état consiste à ajouter une entrée de journal supplémentaire à la série de journaux du sous-état :
UN
je≡UN
′ je·(jeun,t,µm[µs[0]. . .(µs[0] +µs[1]−1)])
La série de sujets de l'entrée,t,diffère en
... ...
.. . . . . ...
0xf4APPEL DÉLÉGUÉ6 1 Message-appel dans ce compte avec un autre code de compte, mais persistant
les valeurs actuelles deexpéditeuretvaleur.
Comparé àAPPEL, DÉLÉGUÉAPPELprend un argument de moins. L'argument omis estµs
[2]. Par conséquent,µs[3],µs[4],µs[5] etµs[6] dans la définition deAPPEL
doivent respectivement être remplacés parµs[2],µs[3],µs[4] etµs[5].
Sinon exactement-y équivalent àAPPELsauf:
- Θ(σ∗, JEs, JEo, JEun, t,
sijev6σ[jeun]b∧jee<1024
(σ′, g′,UN+,o)≡ µs[0], JEp,0, JEv,je, JEe+1)
--
(σ, g,∅,o) sinon
Notez les modifications (en plus de celle du quatrième paramètre) des deuxième et
neuvième paramètres de l'appel Θ.
Cela signifie que le destinataire est en fait le même compte qu'actuellement, simplement
que le code est écraséetle contexte est presque entièrement identique.
0xffSUICIDE dix Arrêtez l'exécution et enregistrez le compte pour une suppression ultérieure.
UN
s≡UN
′ s∪{jeun}
σ′[µs[0] mod 2160]b≡σ[µs[0] mod 2160]b+σ[jeun]b
σ′[jeun]b≡0 {
Rsuicide sijeun∈ / UNs
UNr≡UN
′ r+
0 sinon
{
gnouveau compte siσ[µs[1] mode 2160] =∅ 0
CSUICIDE(σ,µ)≡gsuicide+
sinon
annexeJE.Bloc Genèse
Le bloc de genèse est de 15 items, et est spécifié ainsi :
(( ( ( )) ( )) )
(226) 0256,KEC RLP (),0160, étatRoot,0,0,02048,217,0,0,3141592, temps,0,0256,KCE (42) , (),()
Où 0256fait référence au hachage parent, un hachage de 256 bits composé uniquement de zéros ; 0160fait référence à l'adresse du bénéficiaire, un hachage de 160 bits
composé uniquement de zéros ; 02048fait référence à la floraison du journal, 2048 bits de tous les zéros ; 217fait référence à la difficulté; la racine de trie de transaction, la
racine de trie de réception, le gaz utilisé, le numéro de bloc et les données supplémentaires sont tous deux 0, étant équivalant au tableau d'octets vide.
Les séquences des ommers et des transactions sont vides et représentées par ().KCE (42) fait référence au hachage Keccak
( ( ))
d'un tableau d'octets de longueur un dont le premier et unique octet vaut 42, utilisé pour le nonce.KEC RLP () la valeur fait référence à
le hachage des listes ommer dans RLP, les deux listes vides.
La série de preuves de concept comprend une prémine de développement, ce qui confère au hachage de la racine d'état une certaine valeur
stateRoot. Aussi tempssera défini sur l'horodatage initial du bloc de genèse. La documentation la plus récente doit être consultée pour ces valeurs.
annexeJÉthash
J.1.Définitions.Nous employons les définitions suivantes :
Nom Valeur Description
J.2.Taille du jeu de données et du cache.La taille du cache d'Ethashc∈Bet jeu de donnéesd∈Bdépendent de l'époque, qui à son
tour dépend du numéro de bloc.
⌊ ⌋
Hje
(227) Eépoque(Hje) =
Jépoque
La taille de la croissance de l'ensemble de données parJcroissance du jeu de donnéesoctets, et la taille du cache parJcroissance du cacheoctets, chaque époque. Afin
d'éviter une régularité conduisant à un comportement cyclique, la taille doit être un nombre premier. La taille est donc réduite de
ETHEREUM : UN LIVRE DE TRANSACTIONS GÉNÉRALISÉ DÉCENTRALISÉ ET SÉCURISÉ RÉVISION EIP-150 31
un multiple deJmélange d'octets, pour le jeu de données, etJoctets de hachagepour le cache. Laisserdtaille=‖d‖être la taille de l'ensemble de données. Qui est
calculé à l'aide
J.3.Génération de jeux de données.Pour générer le jeu de données, nous avons besoin du cachec,qui est un tableau d'octets. Cela dépend de la
taille du cachectailleet le hachage de grainess∈B32.
J.3.1.Hachage de graines.Le hachage de graines est différent pour chaque époque. Pour la première époque, il s'agit du hachage Keccak-256 d'une série de 32
octets de zéros. Pour toutes les autres époques, il s'agit toujours du hachage Keccak-256 du hachage de graine précédent :
J.3.2.Cachette.Le processus de production de cache consiste à utiliser le hachage de départ pour d'abord remplir séquentiellementctaille
L'initiale
octets de mémoire, puis en effectuantJrondes de cachepasses de l'algorithme RandMemoHash créé par Lerner [2014]. cachec′, étant un
tableau de tableaux d'octets simples, sera construit comme suit.
On définit le tableaucje, composé de 64 octets simples, comme lejeème élément du cache initial :
{
KEC512(s) sije=0
(233) cje=
KEC512(cje-1) sinon
Doncc′peut être défini comme
(234) c′[je] =cje ∀ je <n
⌊ ⌋
ctaille
(235) n=
Joctets de hachage
Le cache est calculé en effectuantJrondes de cachetours de l'algorithme RandMemoHash dans le cache initialc′: (236)
c =Erondes de cache(c′, Jrondes de cache)
-
-X si y=0
(237) Erondes de cache(X, y) = ERMH(X) si y=1
--
Erondes de cache(ERMH(X), y −1) sinon
Où un seul tour modifie chaque sous-ensemble du cache comme suit :
( )
(238) ERMH(x) =Ermh(X,0),Ermh(X,1), ...,Ermh(X, n−1)
J.3.3.Calcul du jeu de données complet.Essentiellement, nous combinons les données deJparentsnœuds de cache sélectionnés de manière pseudo-aléatoire et hachage pour
calculer l'ensemble de données. L'ensemble de données complet est ensuite généré par un certain nombre d'éléments, chacunJoctets de hachageoctets dans
taille:
⌊ ⌋
dtaille
(240) d[je] =Eélément de jeu de données(c, je)∀je <
Joctets de hachage
Pour calculer l'élément unique, nous utilisons un algorithme inspiré du hachage FNV (Glenn Fowler [1991]) dans certains cas
comme substitut non associatif de XOR.
(241) EFNV(X,y) = (x·(0x01000193⊕y)) mod 232
L'élément unique de l'ensemble de données peut maintenant être calculé comme : (242)
{
KEC512(c[je modectaille e]⊕je) sip=0
(244) Emélanger(m,c, je, p) = ( )
EFNVm,c[EFNV(je⊕p,m[p modebJoctets de hachage/Jmotoctetsc]) modectaille] sinon
J.4.Fonction de preuve de travail.Essentiellement, nous maintenons un "mélange"Jmélange d'octetsoctets de large, et récupérer séquentiellement à plusieurs
reprises Jmélange d'octetsoctets de l'ensemble de données complet et utilisez leEFNVfonction pour le combiner avec le mélange.Jmélange d'octetsdes octets d'accès
séquentiel sont utilisés de sorte que chaque tour de l'algorithme récupère toujours une page complète de la RAM, minimisant les échecs de mémoire tampon
de recherche de traduction que les ASIC pourraient théoriquement éviter.
Si la sortie de cet algorithme est inférieure à la cible souhaitée, alors le nonce est valide. Notez que l'application supplémentaire de
KECà la fin s'assure qu'il existe un nonce intermédiaire qui peut être fourni pour prouver qu'au moins une petite quantité de travail a été
effectuée ; cette vérification PoW externe rapide peut être utilisée à des fins anti-DDoS. Il sert également à fournir l'assurance statistique
que le résultat est un nombre non biaisé de 256 bits.
La fonction PoW renvoie un tableau avec le mélange compressé comme premier élément et le hachage Keccak-256 de la
concaténation du mélange compressé avec le hachage de départ comme deuxième élément :
(245)
PoW(Hn,Hn,ré) ={mc(KEC(RLP(LH(Hn))),Hn,d),KEC(sh(KEC(RLP(LH(Hn))),Hn) +mc(KEC(RLP(LH(Hn))),Hn,d))}
AvecHn étant le hachage de l'en-tête sans le nonce. Le mélange compressémcest obtenu comme suit :
n∑
mélanger