64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
import requests
|
|
import json
|
|
|
|
def get_block_by_number(endpoint, block_number):
|
|
hex_block_number = hex(block_number)
|
|
response = requests.post(
|
|
endpoint,
|
|
headers={"Content-Type": "application/json"},
|
|
data=json.dumps({"jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [hex_block_number, False], "id": 1})
|
|
)
|
|
response_data = response.json()
|
|
return response_data['result']
|
|
|
|
def find_highest_matching_block(endpoint1, endpoint2, start_block):
|
|
low = 0
|
|
high = start_block
|
|
highest_matching_block = None
|
|
highest_matching_hash = None
|
|
|
|
while low <= high:
|
|
mid = (low + high) // 2
|
|
|
|
block1 = get_block_by_number(endpoint1, mid)
|
|
block2 = get_block_by_number(endpoint2, mid)
|
|
|
|
if block1 is None or block2 is None:
|
|
print(f"Block {mid} not found in one of the endpoints")
|
|
high = mid - 1
|
|
continue
|
|
|
|
if block1['hash'] == block2['hash']:
|
|
highest_matching_block = mid
|
|
highest_matching_hash = block1['hash']
|
|
low = mid + 1
|
|
else:
|
|
high = mid - 1
|
|
|
|
if highest_matching_block is not None:
|
|
# Linear search upwards from the highest known matching block to find the highest matching block
|
|
while True:
|
|
next_block1 = get_block_by_number(endpoint1, highest_matching_block + 1)
|
|
next_block2 = get_block_by_number(endpoint2, highest_matching_block + 1)
|
|
if next_block1 is None or next_block2 is None or next_block1['hash'] != next_block2['hash']:
|
|
break
|
|
highest_matching_block += 1
|
|
highest_matching_hash = next_block1['hash']
|
|
|
|
print(f"Matching block found at height {highest_matching_block}")
|
|
print(f"Matching block hash: {highest_matching_hash}")
|
|
print("I did it!")
|
|
|
|
if next_block1 is not None and next_block2 is not None:
|
|
print(f"Following block number {highest_matching_block + 1} does not match")
|
|
print(f"Endpoint1 hash: {next_block1['hash']}")
|
|
print(f"Endpoint2 hash: {next_block2['hash']}")
|
|
else:
|
|
print("No matching blocks found")
|
|
|
|
if __name__ == "__main__":
|
|
endpoint1 = "https://rpc-de-15.stakesquid.eu/base"
|
|
endpoint2 = "https://mainnet.base.org"
|
|
start_block = 7945476
|
|
find_highest_matching_block(endpoint1, endpoint2, start_block)
|