Skip to content

Instantly share code, notes, and snippets.

@portlandhodl
Created August 27, 2024 22:56
Show Gist options
  • Save portlandhodl/b0bdf88dbd69b2d89bc28ba8c692fe7e to your computer and use it in GitHub Desktop.
Save portlandhodl/b0bdf88dbd69b2d89bc28ba8c692fe7e to your computer and use it in GitHub Desktop.
Plotting MTP vs Timestamp Over 10000 Blocks.
import requests
import csv
from datetime import datetime
import time
import matplotlib.pyplot as plt
import pandas as pd
# Bitcoin node RPC connection details
rpc_user = 'your_rpc_username'
rpc_password = 'your_rpc_password'
rpc_url = 'http://localhost:8332'
def rpc_call(method, params=[]):
headers = {'content-type': 'application/json'}
payload = {
"jsonrpc": "1.0",
"id": "curltest",
"method": method,
"params": params
}
response = requests.post(rpc_url, json=payload, headers=headers, auth=(rpc_user, rpc_password))
return response.json()['result']
def get_and_write_block_data(start_height, end_height, filename):
with open(filename, 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['height', 'block_timestamp', 'mediantime'])
for height in range(start_height, end_height + 1):
block_hash = rpc_call('getblockhash', [height])
block = rpc_call('getblock', [block_hash])
writer.writerow([height, block['time'], block['mediantime']])
if height % 100 == 0:
print(f"Processed block {height}")
def plot_data(csv_filename):
df = pd.read_csv(csv_filename)
df['block_timestamp'] = pd.to_datetime(df['block_timestamp'], unit='s')
df['mediantime'] = pd.to_datetime(df['mediantime'], unit='s')
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), sharex=True)
ax1.plot(df['height'], df['block_timestamp'])
ax1.set_title('Block Timestamp Over Height')
ax1.set_ylabel('Block Timestamp')
ax1.grid(True)
ax2.plot(df['height'], df['mediantime'])
ax2.set_title('MTP Value Over Height')
ax2.set_xlabel('Block Height')
ax2.set_ylabel('MTP Value')
ax2.grid(True)
plt.tight_layout()
plt.savefig('bitcoin_timestamps_and_mtp.png')
plt.close()
print("Plot saved as 'bitcoin_timestamps_and_mtp.png'")
def main():
current_height = rpc_call('getblockcount')
start_height = max(0, current_height - 10000)
filename = f'bitcoin_data_{int(time.time())}.csv'
get_and_write_block_data(start_height, current_height, filename)
print(f"Data saved to {filename}")
plot_data(filename)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment