Copiez et déployez un contrat intelligent à partir d'opcodes sans code source

Oct 09 2020

J'ai extrait des opcodes d'un contrat intelligent déjà existant et déployé et j'aimerais savoir s'il est possible de déployer une copie exacte de ce contrat à partir de ses opcodes?

Mes opcodes extraits ressemblent à ceci:

0x0, push1, 0x80
0x2, push1, 0x40
0x4, mstore, 
0x5, push1, 0x4
0x7, calldatasize, 
0x8, lt, 
0x9, push2, 0x7f
0xc, jumpi, 
0xd, push1, 0x0
0xf, calldataload, 
0x10, push1, 0xe0
0x12, shr, 
0x13, dup1, 
...

Je ne cherche pas une alternative (par exemple, déployer du bytecode ou du reverse engineering vers le code source) mais vraiment déployer à partir de ces opcodes. Est-ce que c'est possible? Ou le niveau le plus bas possible est l'assemblage en ligne avec Yul?

Je suppose qu'il n'y a pas de constructeur dans le code source. Si je parviens à déployer ce code et à lui envoyer les bonnes données (fonctions et paramètres, disons que j'ai l'ABI), se comportera-t-il exactement comme le contrat déjà déployé dont j'ai obtenu ces opcodes?

Merci

Réponses

Ismael Oct 10 2020 at 01:39

Oui, cela devrait être possible. Mais ce n'est pas aussi facile qu'il y paraît. Un contrat est composé de deux éléments: le bytecode d'exécution et l'état interne.

  • Runtime: Il n'est pas si difficile de dupliquer le bytecode d'exécution, avec quelques connaissances en assemblage EVM. Peut-être que quelqu'un l'a déjà fait dans github.

  • État: En revanche, c'est plus compliqué car cela dépend du constructeur du contrat. Il est possible de tracer une création de contrat et d'obtenir la transaction qui exécute le constructeur.

Le problème avec le déploiement d'un tel contrat est que vous faites aveuglément confiance aux bytecodes. Si cela fait autre chose, comme autoriser un accès complet à un tiers, vous abandonnez les mêmes privilèges sur votre instance.