Python, Web3 : Déterminer si un contrat contient une fonction donnée

Fonction Python qui renverra True si une fonction donnée est présente dans un contrat (adapter RPC_URL) :

from eth_hash.auto import keccak
from web3 import HTTPProvider, Web3

W3 = Web3(HTTPProvider("RPC_URL"))


def has_function(contract_addr: str, signature: str) -> bool:
    code = W3.eth.get_code(contract_addr).hex()
    fn_hash = keccak(signature.encode()).hex()
    fn_hash = f"63{fn_hash[:8]}"  # 0x63 is PUSH4
    return fn_hash in code

Utilisation :

>>> contract_addr = "0x00e1656e45f18ec6747F5a8496Fd39B50b38396D"  # random
>>> has_function(contract_addr, "transfer(address,uint256)")
True
>>> has_function(contract_addr, "rugMeDaddy(address)")
False

Version anglaise très courte.


📜 Historique

2024-01-27

Déplacement de l’article depuis le blog.

2022-04-23

Code plus rapide et supportant Web3.py v6+ :

+from eth_hash.auto import keccak
+
 def has_function(contract_addr: str, signature: str) -> bool:
     code = w3.eth.get_code(contract_addr).hex()
-    fn_hash = w3.keccak(signature.encode()).hex()
-    fn_hash = f"63{fn_hash[2:10]}"  # 0x63 is PUSH4
+    fn_hash = keccak(signature.encode()).hex()
+    fn_hash = f"63{fn_hash[:8]}"  # 0x63 is PUSH4
     return fn_hash in code
  • Avant : 0,0677 sec

  • Après : 0,0256 sec (- 62,2 %)

2022-03-11

Premier jet.