获取以太坊上的智能合约代码

1,获取智能合约地址

http://​https://etherscan.io/contractsVerified?filter=opensourcelicense​中下载CSV文件,其中包含有智能合约地址, export-verified-contractaddress-opensource-license.csv

需要修改文件路径

CSV_FILE_PATH ='D:\\Grade Two\\a\\dataset\\export-verified-contractaddress-opensource-license (1).csv' 

ADDRESS_FILE_PATH = 'D:\\GradeTwo\\a\\dataset\\generate\\address\\address.txt'
import csv
​
CSV_FILE_PATH = 'D:\\Grade Two\\a\\dataset\\export-verified-contractaddress-opensource-license (1).csv'
ADDRESS_FILE_PATH = 'D:\\Grade Two\\a\\dataset\\generate\\address\\address.txt'
​
def extract_contract_addresses(csv_file):
    addresses = []
    with open(csv_file, newline='', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            if len(row) >= 2:  # 确保每行至少有两列数据
                contract_address = row[1].strip()  # 第二列是合约地址
                addresses.append(contract_address)
    return addresses
​
def save_addresses_to_file(addresses, file_path):
    with open(file_path, 'w', encoding='utf-8') as file:
        for address in addresses:
            file.write(address + '\n')
​
def main():
    addresses = extract_contract_addresses(CSV_FILE_PATH)
    save_addresses_to_file(addresses, ADDRESS_FILE_PATH)
    print(f"成功从 '{CSV_FILE_PATH}' 中提取并保存了 {len(addresses)} 个智能合约地址到 '{ADDRESS_FILE_PATH}'")
​
if __name__ == "__main__":
    main()

2,根据合约地址获取智能合约代码

以下代码将会实现保存智能合约代码,只需修改下面的路径和替换为你的Etherscan API密钥即可。

import requests
import os
import time

ETHERSCAN_API_KEY = 'Your_api'  # 替换为你的Etherscan API密钥
ADDRESS_FILE_PATH = 'D:\\Grade Two\\a\\dataset\\generate\\address\\address.txt'
CODE_SAVE_PATH = 'D:\\Grade Two\\a\\dataset\\generate\\address\\code\\'

def printtime():
    print(time.strftime("%Y-%m-%d %H:%M:%S:", time.localtime()), end=' ')
    return 0

def get_contract_code(address):
    url = f'https://api.etherscan.io/api?module=contract&action=getsourcecode&address={address}&apikey={ETHERSCAN_API_KEY}'
    try:
        response = requests.get(url)
        response_json = response.json()
        if response_json['status'] == '1':
            return response_json['result'][0]['SourceCode']
        else:
            printtime()
            print(f"无法获取合约代码: {response_json['message']}")
            return None
    except requests.exceptions.RequestException as e:
        printtime()
        print(f"请求错误: {e}")
        return None

def save_contract_code(address, code):
    if not os.path.exists(CODE_SAVE_PATH):
        os.makedirs(CODE_SAVE_PATH)
    filename = f"{address}.sol"
    file_path = os.path.join(CODE_SAVE_PATH, filename)
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(code)
    printtime()
    print(f"{filename} 已保存!")

def main():
    try:
        with open(ADDRESS_FILE_PATH, 'r') as address_file:
            addresses = address_file.readlines()
            for address in addresses:
                address = address.strip()
                printtime()
                print(f"正在获取合约代码: {address}")
                code = get_contract_code(address)
                if code:
                    save_contract_code(address, code)
                time.sleep(1)  # 避免触发API速率限制
    except FileNotFoundError:
        printtime()
        print(f"地址文件未找到: {ADDRESS_FILE_PATH}")

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值