Traitement des paiements USDC dans Coinbase Commerce


Un sous-produit de l’usine qui implémente les redirecteurs est que nous pouvons maintenant calculer les adresses des redirecteurs avant de les implémenter dans la blockchain. Cela permet la même expérience utilisateur que le déploiement préventif d'un contrat de transfert pour chaque commerçant, sans entraîner de coût pour la mise en œuvre de ces contrats dans la blockchain.

Dans Ethereum, les adresses des contrats créés sont déterministes: elles peuvent être calculées à partir de l'adresse de l'expéditeur (c'est-à-dire le compte qui a créé le contrat, dans notre cas, la fabrique) et du nonce de l'expéditeur (un compteur qui en indique le nombre). les transactions proviennent de ce compte). Cependant, cela ne fonctionne pas bien dans la pratique car le nonce est un compteur global en croissance. Si un client paie à la centième adresse générée, nous devons toujours mettre en œuvre les 99 contrats initiaux afin de mettre en œuvre la centième expédition attendue, et nous devons le faire dans un certain ordre. Des lacunes telles que celles-ci, lorsque nous devons mettre en œuvre des contrats uniquement pour atteindre le niveau attendu, sont inévitables, car les clients peuvent créer une charge mais ne jamais la payer.

C’est un problème qui affecte la communauté Ethereum depuis longtemps et qui fait partie des souhaits de nombreux développeurs dapp. Heureusement, l'introduction du code d'opération create2 dans la mise à jour du réseau de Constantinople a résolu ce problème. Contrairement à create, qui utilise le nonce de l'expéditeur en croissance, create2 utilise un sel spécifié par l'argument. Cela permet une série de flux de travaux qui étaient auparavant impossibles ou irréalistes: nous pouvons maintenant simuler des flux de travaux complexes complètement en dehors de la chaîne; pas besoin de suivre tout état au-delà du sel auto-généré. Nous ne pouvons interagir en toute sécurité avec la blockchain que lorsque nous devons organiser la chaîne. Voici comment nous pouvons utiliser le code d'opération create2 pour implémenter un redirecteur.

create2 donne le contrôle sur les adresses des redirecteurs déployés. Les appelants peuvent maintenant calculer l’adresse de renvoi a priori, sans rien connaître de l’état actuel de la blockchain.

Notez que maintenant initForwarder prend du sel supplémentaire là où auparavant sa fonctionnalité était réalisée par le nonce implicite. Cela nous permet de décider explicitement des contrats à implémenter dans la blockchain. Ainsi, si le centième client paie mais pas le premier 99, nous pouvons implémenter le 100ème transitaire de la séquence sans mettre en œuvre au préalable le premier 99.

Il est informatif de voir le code qui calcule les adresses:

L'inclusion du code d'octet de contrat dans le calcul de l'adresse create2 est un élément de sécurité essentiel. Cela garantit que le contrat envisagé est le seul qui puisse être mis en œuvre à l'adresse calculée.

En plus de l'utilisation d'un sel, une caractéristique essentielle de la sécurité dans l'algorithme de génération d'adresses est l'utilisation de code octet. Avoir le code d'octet parmi les arguments garantit qu'il est impossible de mettre en œuvre le contrat "incorrect" à l'adresse indiquée. Pour notre exemple, cela implique qu’il existe exactement une combinaison de destination et de sel qui peut conduire à l’exécution d’un contrat dans une direction calculée. Il est impossible pour un attaquant malveillant de mettre en œuvre un contrat de sa propre logique ou de son destin dans une direction que nous avons déjà calculée. Par conséquent, nous pouvons présenter ces adresses non implémentées aux clients et faire en sorte qu'un attaquant ne puisse nous maîtriser en mettant en œuvre un contrat de leur choix à cette adresse particulière.

Cela permet de nouveaux flux de travail comme celui que nous utilisons dans Commerce. Il est maintenant possible de créer et de simuler des flux de travail immuables complètement en dehors de la chaîne, et de n’effectuer que l’étape "règlement" dans la blockchain, après que le client a déjà payé sa facture.