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()