Les contrats précompilés sont une méthode de compromis utilisée dans EVM pour fournir des fonctions de bibliothèque plus complexes (généralement utilisées pour des opérations complexes telles que le chiffrement et le hachage). Il peut également être compris comme un contrat spécial, et ces fonctions ne conviennent pas à l'écriture d'opcodes. Ils conviennent aux contrats simples mais fréquemment invoqués, ou aux contrats logiquement fixes mais gourmands en calculs. Les contrats précompilés sont implémentés à l'aide du code client du nœud et, comme ils ne nécessitent pas d'EVM, ils s'exécutent rapidement. C'est aussi moins coûteux pour le développeur que d'utiliser des fonctions qui s'exécutent directement dans l'EVM.
Comme on peut le voir dans le code suivant, la fonction run dans le contrat evm.go a deux branches : la première branche est d'instancier le paramètre d'index via l'index précompilé pour spécifier le contrat précompilé, et la seconde branche est de spécifier le précompilé contract s'il ne s'agit pas d'un contrat précompilé Cet evm sera appelé.
// run exécute le contrat donné et s'occupe de l'exécution des précompilations avec un retour à l'interpréteur de byte code.
func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) {
si contrat.CodeAddr != nil {
precompiles := PrecompiledContractsHomestead
si evm.ChainConfig().IsByzantium(evm.BlockNumber) {
precompiles = PrecompiledContractsByzantium
}
if p := precompile[*contract.CodeAddr] ; p != nul {
retourner RunPrecompiledContract(p, input, contract)
}
}
for _, interpreter := range evm.interpreters {
si interprète.CanRun(contract.Code) {
if evm.interpreter != interprète {
// Assurez-vous que le pointeur de l'interpréteur est en retrait
// à sa valeur actuelle lors du retour.
defer func(i Interpreter) {
evm.interpreter = i
}(evm.interpréteur)
evm.interpreter = interprète
}
return interpreter.Run(contract, input, readOnly)
}
}
renvoie nil, ErrNoCompatibleInterpreter
}
Si elle est exprimée graphiquement, la logique spécifique est la suivante :
Où est donc le goulot d'étranglement du contrat précompilé ?
Ethereum a actuellement huit contrats précompilés :
ECRecover - Récupérer l'adresse correspondante grâce à la signature
SHA256 - Calculer le hachage SHA256
RIPEMD160 - Calculer le hachage RIPEMD160
Identité - renvoie la valeur d'origine des données d'entrée
ModExp - Effectue l'exponentiation modulo
ECAdd - Addition de points de courbe elliptique
ECMul - Multiplication de points de courbe elliptique
ECPairing - opération d'appariement, vérification des points de la courbe elliptique
Vous pouvez voir que les premier à quatrième contrats précompilés fournissent des fonctions de base de signature, de hachage et de chiffrement, et que les cinquième à huitième fournissent des opérations de courbe elliptique, qui sont liées à zk-snark.
La question est donc de savoir pourquoi la précompilation Ethereum ne prend en charge que huit contrats précompilés ? Les contrats précompilés ne réduisent-ils pas la consommation de gaz ? Et pourquoi ne pas implanter directement ECS (le cadre de tout le jeu de la chaîne) dans le contrat pré-compilé Ethereum ?
En fait, il y a trois raisons principales :
Un recours excessif à des contrats précompilés réduira le degré de décentralisation de l'ensemble de la plateforme :
Tout d'abord, le code du contrat précompilé doit être intégré dans le code du nœud client, ce qui augmente la complexité du client. Deuxièmement, les nœuds de vérification peuvent filtrer le calcul des contrats précompilés pour des raisons de sécurité, de sorte que la plupart des demandes de contrats précompilés sont complétées par des nœuds complets.Actuellement, il n'y a que 4000 à 6000 nœuds complets Ethereum dans le monde, et il y a 500 000 vérifications nœuds, ce qui est en effet beaucoup plus centralisé que les contrats non précompilés.
L'ajout et la modification de contrats précompilés nécessitent des mises à niveau de hard fork, qui ne sont pas faciles à faire évoluer de manière flexible.
Le support des contrats précompilés nécessite le processus EIP Par exemple : EIP-196 ajoute deux contrats précompilés, ECADD() et ECMUL(), sur la courbe alt_bn128. EIP-197 ajoute la fonction Pairing sur la courbe alt_bn128. Fondamentalement, il s'agit de rendre la confidentialité disponible sur Ethereum pour le support, et l'ensemble du processus EIP est long et élégant, et attendre que l'EIP passe n'est pas un problème réaliste.
Il est difficile d'interagir et de combiner des contrats précompilés, et l'évolutivité est médiocre.
Ce n'est pas grand chose à expliquer, c'est très intuitif.
Quel rôle le contrat précompilé joue-t-il dans l'ensemble du jeu de la chaîne ?
Les contrats précompilés ignorent l'EVM et s'exécutent directement via les nœuds, ce qui peut améliorer l'efficacité informatique, mais en même temps réduire le degré de décentralisation de l'ensemble de la chaîne. La précompilation de la logique de base des jeux fréquemment utilisés peut optimiser les performances de ces jeux. Différents types de jeux ont des logiques de touches différentes. Par conséquent, pour la chaîne dédiée d'un certain type de jeu, sa conception pré-compilée peut optimiser fortement les besoins de ce type de jeu. Au cours du processus d'itération du jeu, la combinaison de contrats précompilés la plus efficace sera progressivement optimisée.
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
Full Chain Game 101 : Contrats précompilés
**Qu'est-ce qu'un contrat précompilé ? **
Les contrats précompilés sont une méthode de compromis utilisée dans EVM pour fournir des fonctions de bibliothèque plus complexes (généralement utilisées pour des opérations complexes telles que le chiffrement et le hachage). Il peut également être compris comme un contrat spécial, et ces fonctions ne conviennent pas à l'écriture d'opcodes. Ils conviennent aux contrats simples mais fréquemment invoqués, ou aux contrats logiquement fixes mais gourmands en calculs. Les contrats précompilés sont implémentés à l'aide du code client du nœud et, comme ils ne nécessitent pas d'EVM, ils s'exécutent rapidement. C'est aussi moins coûteux pour le développeur que d'utiliser des fonctions qui s'exécutent directement dans l'EVM.
Comme on peut le voir dans le code suivant, la fonction run dans le contrat evm.go a deux branches : la première branche est d'instancier le paramètre d'index via l'index précompilé pour spécifier le contrat précompilé, et la seconde branche est de spécifier le précompilé contract s'il ne s'agit pas d'un contrat précompilé Cet evm sera appelé.
// run exécute le contrat donné et s'occupe de l'exécution des précompilations avec un retour à l'interpréteur de byte code. func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) { si contrat.CodeAddr != nil { precompiles := PrecompiledContractsHomestead si evm.ChainConfig().IsByzantium(evm.BlockNumber) { precompiles = PrecompiledContractsByzantium } if p := precompile[*contract.CodeAddr] ; p != nul { retourner RunPrecompiledContract(p, input, contract) } } for _, interpreter := range evm.interpreters { si interprète.CanRun(contract.Code) { if evm.interpreter != interprète { // Assurez-vous que le pointeur de l'interpréteur est en retrait // à sa valeur actuelle lors du retour. defer func(i Interpreter) { evm.interpreter = i }(evm.interpréteur) evm.interpreter = interprète } return interpreter.Run(contract, input, readOnly) } } renvoie nil, ErrNoCompatibleInterpreter }
Si elle est exprimée graphiquement, la logique spécifique est la suivante :
Où est donc le goulot d'étranglement du contrat précompilé ?
Ethereum a actuellement huit contrats précompilés :
Vous pouvez voir que les premier à quatrième contrats précompilés fournissent des fonctions de base de signature, de hachage et de chiffrement, et que les cinquième à huitième fournissent des opérations de courbe elliptique, qui sont liées à zk-snark.
La question est donc de savoir pourquoi la précompilation Ethereum ne prend en charge que huit contrats précompilés ? Les contrats précompilés ne réduisent-ils pas la consommation de gaz ? Et pourquoi ne pas implanter directement ECS (le cadre de tout le jeu de la chaîne) dans le contrat pré-compilé Ethereum ?
En fait, il y a trois raisons principales :
Tout d'abord, le code du contrat précompilé doit être intégré dans le code du nœud client, ce qui augmente la complexité du client. Deuxièmement, les nœuds de vérification peuvent filtrer le calcul des contrats précompilés pour des raisons de sécurité, de sorte que la plupart des demandes de contrats précompilés sont complétées par des nœuds complets.Actuellement, il n'y a que 4000 à 6000 nœuds complets Ethereum dans le monde, et il y a 500 000 vérifications nœuds, ce qui est en effet beaucoup plus centralisé que les contrats non précompilés.
Le support des contrats précompilés nécessite le processus EIP Par exemple : EIP-196 ajoute deux contrats précompilés, ECADD() et ECMUL(), sur la courbe alt_bn128. EIP-197 ajoute la fonction Pairing sur la courbe alt_bn128. Fondamentalement, il s'agit de rendre la confidentialité disponible sur Ethereum pour le support, et l'ensemble du processus EIP est long et élégant, et attendre que l'EIP passe n'est pas un problème réaliste.
Ce n'est pas grand chose à expliquer, c'est très intuitif.
Quel rôle le contrat précompilé joue-t-il dans l'ensemble du jeu de la chaîne ?
Les contrats précompilés ignorent l'EVM et s'exécutent directement via les nœuds, ce qui peut améliorer l'efficacité informatique, mais en même temps réduire le degré de décentralisation de l'ensemble de la chaîne. La précompilation de la logique de base des jeux fréquemment utilisés peut optimiser les performances de ces jeux. Différents types de jeux ont des logiques de touches différentes. Par conséquent, pour la chaîne dédiée d'un certain type de jeu, sa conception pré-compilée peut optimiser fortement les besoins de ce type de jeu. Au cours du processus d'itération du jeu, la combinaison de contrats précompilés la plus efficace sera progressivement optimisée.