Cryptomonnaie

Comment nous avons mis à l'échelle des méta-transactions à l'origine – Protocole d'origine

Comment nous avons mis à l'échelle des méta-transactions à l'origine - Protocole d'origine


0*gPrdmoKSX8ASUtQl - Comment nous avons mis à l'échelle des méta-transactions à l'origine - Protocole d'origine

Il y a quelques semaines, Nick a introduit le concept de méta-transaction. Pour résumer brièvement, les méta-transactions sont la façon dont nous pouvons sponsoriser les frais de transaction Ethereum pour nos utilisateurs. Notre relayeur est un élément clé du flux de méta-transactions, qui envoie des transactions pour le compte de nos utilisateurs à des contrats de proxy.

Relayer envoie des transactions au nom de nos utilisateurs DApp du marché

Les méta-transactions facilitent l'intégration des vendeurs et encouragent l'utilisation de notre plate-forme. Nous pensons que les méta-transactions représentent un grand pas en avant pour rendre notre application plus accessible, mais notre prototype initial de relance avait besoin d'améliorations avant de passer en production.

Avant tout, nous devions être en mesure de nous adapter pour prendre en charge un plus grand volume de transactions. Nous nous attendions à ce que notre relayer soit submergé lors de sa libération car il ne pouvait traiter qu'une transaction à la fois. Notre relayeur initial enverrait une transaction et attendrait que celle-ci soit exploitée avant de poursuivre le traitement.

Nous avions besoin d’une abstraction de compte permettant au relayer de traiter des transactions simultanément. Meet Purse, composant Open Source de notre relayer, fournit une couche d'abstraction permettant de lancer des transactions dans l'éther (ha). Notre relayer peut prendre un sous-ensemble d’une transaction ({to: "Le proxy d'Alice", valeur: 0, données: 0x1234}), donnez-le à Purse avec un rappel pour le moment où la transaction est minée, alors sac à main gérera tout le reste.

// "Regarde mon interface simple!" - sac à main
const result = wait purse.sendTx ({
à: proxy,
valeur: 0,
données: '0x01'
},
(reçu) => {
si (! reçu.status) {
console.error ('Oh non!')
}
})
console.log ('hachage tx:', result.txHash)

Étant donné que les contrats de procuration veillent uniquement à ce qu'une transaction soit signée par le propriétaire, et non au compte qui envoie réellement la transaction, vous pouvez envoyer à partir de tout compte disponible. Purse a été conçu pour pouvoir travailler avec un nombre quelconque de comptes. Vous pouvez le supporter avec 1 ou 1 000 expéditeurs. Il utilise l'implémentation de portefeuille déterministe hiérarchique «standard» (voir la discussion sur ERC 84) pour générer les comptes nécessaires à partir d'un seul mnémonique BIP39. Cela a fourni la flexibilité dont nous avons besoin pour pouvoir évoluer selon les besoins.

Le sac à main est un composant du relayer

Bien que la possibilité d'envoyer simultanément à partir de plusieurs comptes constitue une amélioration significative, nous pouvons aller encore plus loin avec un suivi de nonce interne. En effectuant le suivi de chaque compte, nous pouvons envoyer de manière fiable autant de transactions que nous le souhaitons sans attendre leur extraction. Le suivi du non-paiement est une exigence car, lorsque vous exécutez plusieurs transactions à l’aveuglette, les nœuds récepteurs peuvent ou non être informés de ces transactions en attente. Il est risqué de compter sur eth_getTransactionCount même avec le en attente puisque vous n’interagissez peut-être pas avec le même nœud à chaque requête. Le suivi Nonce offre un degré de fiabilité plus élevé et nécessite moins de confiance dans le fournisseur JSON-RPC.

Bien que nous puissions lancer plusieurs transactions à la fois, cela doit être dans les limites du pool de transactions de notre fournisseur JSON-RPC. Nous ne pouvons pas simplement envoyer un million de transactions à partir d’un seul compte à la fois. go-Ethereum par défaut à 16 Par compte, Parity utilise une logique légèrement plus complexe pour décider du moment opportun pour collecter les transactions en attente. Pour cela, nous venons d'ajouter une limite arbitraire que nous pouvons ajuster à notre guise. Il est plus facile et plus fiable d’évoluer avec plus de comptes que d’approfondir les transactions en attente.

Purse avait également pour objectif de simplifier et d’automatiser le processus de financement des comptes enfants. Les comptes enfants doivent être financés afin qu'ils puissent payer le coût du gaz lors de l'envoi de transactions au réseau Ethereum. Nous ne voulions pas avoir à envoyer manuellement Ether à tous les comptes dérivés. Cela aurait été un fardeau opérationnel pour notre équipe et un processus potentiellement sujet aux erreurs. Purse prend des fonds dans un compte principal et finance tous les enfants dérivés sans aucune intervention manuelle. En interne, Purse suit les soldes en cours pour ces comptes enfants et les finance automatiquement lorsque cela est nécessaire.

L'un des plus grands défis était de remédier au manque de fiabilité des fournisseurs JSON-RPC. Même les meilleurs fournisseurs ont parfois des problèmes qui pourraient (et ont pu) paralyser le relayeur ou placer Purse dans un état indésirable. Nous devions être en mesure de gérer les transactions perdues, 500 erreurs, les délais de connexion et même les bogues dans Purse. Notre première tâche consistait à mettre en place une surveillance et une journalisation fiables sur lesquelles nous pouvions compter pour détecter tout problème. Nous avons consigné les détails des transactions et les états dans une PostgresDB et avons instrumenté le code avec des métriques enregistrées dans Prometheus. Nous avons ensuite créé un ensemble de tableaux de bord opérationnels à Grafana, ainsi qu’un tableau de bord d’entreprise utilisant Metabase afin d’avoir une visibilité sur le comportement du système. Cela nous a permis de détecter et de diagnostiquer rapidement les bugs liés aux cas délicats lors de la mise en production de Purse.

Essayer d'obtenir des prix de l'essence favorables constituait également un défi. Pour aider à la gestion des erreurs et aux prix de l’essence, nous avons mis en place notre propre fournisseur web3.js, @ origin / web3-provider construit sur moteur web3 fournisseur mais cela peut être un sujet pour un autre article. La gestion des erreurs JSON-RPC est un défi permanent, mais la fiabilité s’améliore.

Le suivi du nonce s'est également avéré nécessiter une attention particulière. Surtout quand un pod Kubernetes peut être détruit et recréé à la minute. Purse garde la trace du nonce en mémoire, dans Redis, et peut, en dernier recours, référencer le fournisseur JSON-RPC si tout le reste échoue.

Nous devions également garder un œil sur les transactions abandonnées en raison de pics de gaz temporaires ou du ramassage des déchets du pool de transactions basé sur le temps. Plus précisément, nous vérifions si le fournisseur est au courant de la transaction ( eth_getTransaction), sinon, nous le soumettrons de nouveau au fournisseur. Cela n'arrive pas souvent, mais ce problème semble particulièrement répandu chez certains prestataires.

Après une période de bêta, Purse est désormais un composant stable de la plate-forme Origin. À ce jour, notre relayer a traité plus de 9 000 transactions, avec une moyenne de 4 demandes par utilisateur, créé plus de 2 500 contrats de procuration, 213 inscriptions, consommé 1 069 786 764 gaz et économisé près de 11 Ether en frais de réseau.

Nous continuerons à renforcer le relayer pour améliorer la fiabilité et l'expérience de nos utilisateurs à mesure que nous aurons plus de données d'utilisation et que nous découvrirons plus de cas marginaux.

Nous voulons également continuer à améliorer Purse pour s’adapter à mesure que la plate-forme se développe. Actuellement, le nombre de comptes enfants créés par Purse et le nombre de transactions en attente autorisées par compte sont configurés. Plus nous grandissons, plus la charge sur le relayer augmentera. Nous aurons besoin d'améliorations telles que la mise à l'échelle automatique des comptes, de sorte que Purse puisse créer un nouveau compte, le financer, puis l'utiliser chaque fois que la charge devient trop lourde. Nous pouvons également mettre en place plusieurs instances du relayer avec différents comptes principaux. Il y a beaucoup de potentiel pour faire évoluer ce composant de notre infrastructure.

Si vous souhaitez vous impliquer dans l'amélioration de la plate-forme Origin Protocol, rejoignez-nous et saluez #ing engineering in our Discord. Nous sommes toujours à la recherche de contributeurs talentueux pour nous aider à réaliser notre mission consistant à créer une plateforme de commerce open source et véritablement peer-to-peer pour tous!

En savoir plus sur Origin:

Afficher plus

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Articles similaires

Laisser un commentaire

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

Bouton retour en haut de la page
Fermer