随着越来越多项目和用户开始关注Solana区块链,通过Python实时跟踪链上交易记录已成为数据分析和监控的重要工具。本文将详细讲解如何通过Python构建一个脚本,用以跟踪Solana链上某个地址的交易记录,并将包含的token地址、名称、交易方向和时间等信息进行展示。我们将介绍所需库的安装、如何连接Solana网络、获取交易签名、拉取交易详情、解析交易数据以及展示解析结果。
为了与Solana区块链交互,我们需要使用官方提供的Python客户端库,并结合数据解析与展示工具。主要依赖如下:
可通过pip命令进行安装:
# 安装solana和requests库
pip install solana requests pandas
利用Solana RPC客户端,可以连接到Solana主网或测试网。这里我们以主网为例:
# 导入客户端模块
from solana.rpc.api import Client
# 设定主网RPC网址
solana_url = "https://api.mainnet-beta.solana.com"
client = Client(solana_url)
通过指定地址,调用客户端方法获取最近若干笔交易的签名列表。每个签名可以为后续获取交易详情做准备。
from solders.pubkey import Pubkey
# 指定要查询的Solana钱包地址(替换为实际地址)
address = "你的Solana钱包地址"
pubkey = Pubkey.from_string(address)
# 获得最新10笔交易签名
response = client.get_signatures_for_address(pubkey, limit=10)
signatures = response.get('result', [])
使用获取到的交易签名,通过调用交易详情API,从每笔交易中获取全面数据。详细数据会包含区块时间、交易指令以及余额变化等信息。
from datetime import datetime
def fetch_transaction_details(signature):
# 可选项增加确认参数,确保返回已确认交易详情
response = client.get_transaction(signature, opts={'commitment': 'confirmed'})
return response.get('result', {})
# 示例:获取第一笔交易的详情
if signatures:
tx_detail = fetch_transaction_details(signatures[0]['signature'])
print(tx_detail)
一笔交易可能包含多个指令,解析时需关注具体指令中的token信息。通过解析交易中的指令及后续token余额变化,可以获得下列信息:
下文代码段展示了如何解析和提取这些信息:
def parse_transaction(tx_detail, target_address):
parsed_data = []
if not tx_detail:
return parsed_data
# 获取区块时间
block_time = tx_detail.get("blockTime")
if block_time:
transaction_time = datetime.fromtimestamp(block_time).strftime('%Y-%m-%d %H:%M:%S')
else:
transaction_time = "未知"
# 提取所有指令
instructions = tx_detail.get("transaction", {}).get("message", {}).get("instructions", [])
for ins in instructions:
# 此处以假设交易指令含有‘parsed’字段,部分交易可能需手动解析
parsed = ins.get("parsed", {})
if parsed.get("type") == "transfer":
info = parsed.get("info", {})
token_address = info.get("token", "未知")
# 根据source和destination区分交易方向
# 注意:具体字段名称及判断方法可能依赖于使用的API的返回格式
source = info.get("source", "")
direction = "出账" if source.lower() == target_address.lower() else "入账"
# 通过额外函数获取token名称(需要自行实现)
token_name = get_token_name(token_address)
parsed_data.append({
"交易时间": transaction_time,
"Token地址": token_address,
"Token名称": token_name,
"交易方向": direction
})
return parsed_data
def get_token_name(token_address):
# 示例函数:通常需要查询对应平台或具有映射的API返回名称
# 此处直接返回token_address作为占位符,用户可根据实际需求实现
return token_address
# 示例:解析第一笔交易
if signatures:
tx_detail = fetch_transaction_details(signatures[0]['signature'])
parsed_info = parse_transaction(tx_detail, address)
for info in parsed_info:
print(info)
将所有解析后的交易数据进行整合,可以组织为列表或DataFrame以便展示。使用Pandas库可以将数据以表格形式直观展示。
import pandas as pd
def display_transactions(parsed_transactions):
if not parsed_transactions:
print("没有找到交易记录")
return
df = pd.DataFrame(parsed_transactions)
print(df)
# 获取多笔交易并显示
all_transactions = []
for sig in signatures:
detail = fetch_transaction_details(sig['signature'])
data = parse_transaction(detail, address)
all_transactions.extend(data)
display_transactions(all_transactions)
下面是一个整合上述各步骤的完整示例脚本,该脚本可用于跟踪指定Solana地址的交易记录,并从中提取出token地址、token名称、交易方向和交易时间等信息。
# -*- coding: utf-8 -*-
# 导入必要库
from solana.rpc.api import Client
from solders.pubkey import Pubkey
from datetime import datetime
import pandas as pd
# 连接Solana主网
solana_url = "https://api.mainnet-beta.solana.com"
client = Client(solana_url)
def get_token_name(token_address):
# 实现获取token名称的具体方法,例如查询API或维护映射字典
# 此处仅作为示例返回token_address
return token_address
def fetch_transaction_details(signature):
response = client.get_transaction(signature, opts={'commitment': 'confirmed'})
return response.get('result', {})
def parse_transaction(tx_detail, target_address):
parsed_data = []
if not tx_detail:
return parsed_data
# 获取交易时间并转换为可读格式
block_time = tx_detail.get("blockTime")
if block_time:
transaction_time = datetime.fromtimestamp(block_time).strftime('%Y-%m-%d %H:%M:%S')
else:
transaction_time = "未知"
instructions = tx_detail.get("transaction", {}).get("message", {}).get("instructions", [])
for ins in instructions:
parsed = ins.get("parsed", {})
# 判断是否为转账交易
if parsed.get("type") == "transfer":
info = parsed.get("info", {})
token_address = info.get("token", "未知")
source = info.get("source", "")
direction = "出账" if source.lower() == target_address.lower() else "入账"
token_name = get_token_name(token_address)
parsed_data.append({
"交易时间": transaction_time,
"Token地址": token_address,
"Token名称": token_name,
"交易方向": direction
})
return parsed_data
def get_transactions(address, limit=10):
pubkey = Pubkey.from_string(address)
response = client.get_signatures_for_address(pubkey, limit=limit)
return response.get('result', [])
def display_transactions(parsed_transactions):
if not parsed_transactions:
print("没有找到交易记录")
return
df = pd.DataFrame(parsed_transactions)
# 将DataFrame打印为表格
print(df)
# 使用HTML表格展示(可选:保存为HTML文件)
html_table = df.to_html(index=False)
with open("transactions.html", "w", encoding="utf-8") as f:
f.write(html_table)
print("交易记录保存为 transactions.html")
def main():
# 替换为目标Solana钱包地址
target_address = "你的Solana钱包地址"
transactions = get_transactions(target_address, limit=10)
all_parsed = []
for sig in transactions:
detail = fetch_transaction_details(sig['signature'])
tx_data = parse_transaction(detail, target_address)
all_parsed.extend(tx_data)
display_transactions(all_parsed)
if __name__ == "__main__":
main()
上述脚本涵盖了从获取签名到解析及展示数据的全流程。若需要进一步扩展,你可以:
此外,完善的数据存储与可视化设计能提升整体应用的用户体验。你可以将数据写入数据库,结合前端框架呈现实时监控仪表板,构建一个完整的交易追踪平台。
为方便在网页中直观展现追踪数据,可以将交易记录保存为HTML表格格式。以下为生成HTML表格的示例格式:
交易时间 | Token地址 | Token名称 | 交易方向 |
---|---|---|---|
2025-03-01 14:30:55 | Token_A_Address | Token_A | 入账 |
2025-03-02 09:15:20 | Token_B_Address | Token_B | 出账 |