You seem like a nice bot. lets see how well you read python here is the script been working on. give me your analysis and thoughts.
#!/usr/bin/env python
import requests
import json
from argparse import ArgumentParser
import time
from requests.exceptions import ChunkedEncodingError
from tqdm import tqdm
# Load configuration from JSON file
with open("config.json", "r") as file:
config = json.load(file)
# Setup Tor session
session = requests.Session()
session.proxies = {
'http': 'socks5h://localhost:9050',
'https': 'socks5h://localhost:9050'
}
def rpc_call(method, params=[], max_retries=3, retry_delay=5, timeout=30):
url = f"http://{config['rpchost']}:{config['rpcport']}/"
headers = {'content-type': 'application/json'}
payload = {
"method": method,
"params": params,
"jsonrpc": "2.0",
"id": 0,
}
for attempt in range(max_retries):
try:
response = session.post(url, data=json.dumps(payload), headers=headers,
auth=(config['rpcuser'], config['rpcpassword']), timeout=timeout)
return response.json()
except ChunkedEncodingError as e:
if attempt < max_retries - 1:
time.sleep(retry_delay)
else:
print(f"Failed to fetch data after {max_retries} attempts due to ChunkedEncodingError.")
raise e
def get_block_hash(height):
return rpc_call("getblockhash", [height])["result"]
def get_block(block_hash):
return rpc_call("getblock", [block_hash])["result"]
def get_transaction_details(txid):
return rpc_call("getrawtransaction", [txid, True]) # True for verbose mode
def is_output_unspent(txid, vout):
result = rpc_call("gettxout", [txid, vout, True]) # True to include mempool
return result is not None
def process_transactions_for_utxos(file_path, output_file_path):
with open(file_path, 'r') as file:
txids = file.readlines()
print("Processing transactions for UTXOs...")
with open(output_file_path, 'a') as output_file: # Open file in append mode
for txid in tqdm(txids, desc="Transactions"):
txid = txid.strip()
transaction_details = get_transaction_details(txid)
if 'result' not in transaction_details or not transaction_details['result']:
continue
for vout, output in enumerate(transaction_details["result"]["vout"]):
if is_output_unspent(txid, vout):
utxo_info = {
"txid": txid,
"vout": vout,
"amount": output["value"],
"scriptPubKey": output["scriptPubKey"]["hex"],
}
if "addresses" in output["scriptPubKey"]:
utxo_info["addresses"] = output["scriptPubKey"]["addresses"]
json.dump(utxo_info, output_file)
output_file.write("\n")
def main():
print("Fetching current block height...")
current_height = rpc_call("getblockcount")["result"]
target_height = current_height - 144
print(f"Fetching block hash for block height: {target_height}...")
block_hash = get_block_hash(target_height)
block = get_block(block_hash)
print("Storing transaction IDs...")
with open("transaction_ids.txt", "w") as file:
for txid in block["tx"]:
file.write(txid + "\n")
print("Transaction IDs stored.")
open('utxos.json', 'w').close() # Clear or create the output file
process_transactions_for_utxos("transaction_ids.txt", 'utxos.json')
print(f"UTXOs from block {target_height} have been stored.")
if __name__ == "__main__":
main()