Ищем крупные криптотранзакции и богатые кошельки на Solana с помощью Python
Отслеживание крупных транзакций в криптовалютах помогает видеть, как движутся средства по сети, куда уходят токены и кто их накапливает. В этой статье мы напишем простой скрипт на Python, который будет находить большие переводы в блокчейне Solana через публичный RPC-интерфейс.
python
Copy code
def get_recent_blocks(seconds=None):
current_slot = requests.post(SOLANA_RPC_URL, json={
"jsonrpc": "2.0", "id": 1, "method": "getSlot"
}).json()['result']
block_time = requests.post(SOLANA_RPC_URL, json={
"jsonrpc": "2.0", "id": 1, "method": "getBlockTime", "params": [current_slot]
}).json()['result']
start_time = int(datetime.datetime.utcnow().timestamp()) - seconds
past_slot = current_slot
while block_time and block_time > start_time:
past_slot -= 1
block_time = requests.post(SOLANA_RPC_URL, json={
"jsonrpc": "2.0", "id": 1, "method": "getBlockTime", "params": [past_slot]
}).json().get('result', None)
if block_time is None:
break
return list(range(past_slot, current_slot))
Что происходит:
- Узнаём текущий слот (его можно представить как номер блока).
- Смотрим, когда он был создан.
- Двигаемся назад по слотам, пока не дойдём до нужного времени (например, N секунд назад).
- Собираем список этих слотов, чтобы потом их проверить.
2. Извлекаем транзакции из блоков
2. Извлекаем транзакции из блоков
Теперь из полученных слотов достаём все транзакции и фильтруем их по объёму в USD.
python
Copy code
def get_transactions_from_blocks(blocks):
transactions_list = []
solusd_price = requests.get("https://api.coingecko.com/api/v3/simple/price?ids=solana&vs_currencies=usd").json()['solana']['usd']
for block in blocks:
response = requests.post(SOLANA_RPC_URL, json={
"jsonrpc": "2.0",
"id": 1,
"method": "getBlock",
"params": [block, {"encoding": "json", "transactionDetails": "full"}]
}).json()
if "result" in response:
for tx in response["result"]["transactions"]:
meta = tx.get("meta", {})
message = tx["transaction"]["message"]
account_keys = message["accountKeys"]
pre_balances = meta.get("preBalances", [])
post_balances = meta.get("postBalances", [])
block_time = response["result"]["blockTime"]
if len(account_keys) >= 2:
from_address = account_keys[0]
to_address = account_keys[1]
amount = round((post_balances[1] - pre_balances[1])/10**9*solusd_price, 4)
transactions_list.append({
"block_id": block,
"trans_id": tx["transaction"]["signatures"][0],
"time": datetime.datetime.utcfromtimestamp(block_time).isoformat() + "Z",
"from_address": from_address,
"to_address": to_address,
"amount": amount
})
return {"success": True, "data": transactions_list}
Объяснение:
- Сначала узнаём текущую цену SOL в долларах через CoinGecko.
- Потом для каждого блока вытаскиваем все транзакции.
- Смотрим, сколько SOL было до и после — и считаем разницу в USD.
- Сохраняем главное: кто отправил, кто получил, сколько и в какое время.
3. Фильтруем крупные транзакции
Теперь выбираем только те переводы, которые превышают заданный лимит (например, $100):
python
Copy code
blocks = get_recent_blocks(1000) # блоки за последние 1000 секунд
transactions = get_transactions_from_blocks(blocks)
transactions_list = []
for tx in transactions['data']:
if tx['amount'] > 100:
print('Найдена крупная транзакция: $', round(tx['amount'], 2), tx['trans_id'])
transactions_list.append(tx['trans_id'])
4. Получаем подробности по кошелькам
На этом шаге мы разбираем детали каждой транзакции: кто был отправителем, кто получил средства, сколько именно перевели и как изменился баланс кошелька после операции.
python
Copy code
def get_transaction_wallets(transaction_signature, solusd_price):
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": "getTransaction",
"params": [transaction_signature, {"encoding": "jsonParsed"}]
}
response = requests.post(SOLANA_RPC_URL, json=payload)
data = response.json()
transaction_data = data["result"]
meta = transaction_data.get("meta", {})
tx_info = transaction_data.get("transaction", {})
account_keys = tx_info.get("message", {}).get("accountKeys", [])
pre_balances = meta["preBalances"]
post_balances = meta["postBalances"]
rows = []
alerts = []
for i in range(len(account_keys)):
pubkey = account_keys[i]
change = (post_balances[i] - pre_balances[i]) / 1e9
percent_change = (change / pre_balances[i] * 100) if pre_balances[i] > 0 else 0
usd_change = round(change * solusd_price, 4)
row = {
"address": pubkey,
"pre_balance": pre_balances[i] / 1e9,
"post_balance": post_balances[i] / 1e9,
"change_amount": change,
"change_in_%": round(percent_change, 2),
"change_in_USD": usd_change
}
rows.append(row)
if percent_change > 100 and usd_change > 1000:
alert = f"⚠️ Кошелек {pubkey} увеличил баланс на {percent_change:.2f}% (${usd_change})"
print(alert)
alerts.append(alert)
return rows, alerts
5. Обрабатываем все найденные транзакции
Финальный шаг — пройтись по всем найденным крупным транзакциям и собрать информацию в таблицу:
python
Copy code
def get_multiple_transactions(transaction_signatures):
all_rows = []
all_alerts = []
for signature in transaction_signatures:
rows, alerts = get_transaction_wallets(signature, solusd_price)
all_rows.extend(rows)
all_alerts.extend(alerts)
time.sleep(3) # пауза для API
return pd.DataFrame(all_rows), all_alerts
Пример вывода
plaintext
Copy code
Найдена крупная транзакция: $ 1583.32 4VbfK3hzK...
⚠️ Кошелек GTe8... увеличил баланс на 350% ($1583.32)
Вывод
Этот скрипт помогает следить за крупными перемещениями в блокчейне Solana и находить необычные транзакции, которые могут указывать на действия китов или подозрительную активность. Все это мы делаем на Python, используя публичные RPC.
Что умеет скрипт:
- Отслеживать движения крупных сумм в блокчейне Solana.
- Замечать аномальные приросты баланса.
- Выделять адреса, за которыми стоит понаблюдать.
Как можно расширить:
- Добавить автоматические уведомления в Telegram.
- Искать взаимосвязи между кошельками.
- Сделать визуализацию в Plotly или Dash.
Код лежит в GitHub — не забудьте поставить звездочку и подписаться на профиль.