Copiez et déployez un contrat intelligent à partir d'opcodes sans code source
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
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.