Skip to content

Commit

Permalink
Merge pull request #1189 from HathorNetwork/chore/update-checkpoints
Browse files Browse the repository at this point in the history
chore: update mainnet and testnet checkpoints and include helper script
  • Loading branch information
jansegre authored Nov 29, 2024
2 parents cf3fa8b + f2fb42a commit 5725e8e
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 0 deletions.
112 changes: 112 additions & 0 deletions extras/update_checkpoints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#!/usr/bin/env python
"""
Usage: update_checkpoints.py [-h] [-n NETWORK]
Helper script to update the config checkpoint list.
options:
-h, --help show this help message and exit
-n NETWORK, --network NETWORK
The network to update (default: mainnet)
For example:
$ ./extras/update_checkpoints.py
New checkpoints to add for mainnet:
4_800_000: 00000000000000000716b8d9e96591ba7cb2d02c3d2d1d98d514f41c240fdff7
4_900_000: 0000000000000000079b1c1ebf48d351a7d31dcc55c5b4cf79ade79089a20f5a
5_000_000: 000000000000000006c9167db1cc7e93fcf1c3014da6c6221390d03d1640c9b3
cp(4_800_000, bytes.fromhex('00000000000000000716b8d9e96591ba7cb2d02c3d2d1d98d514f41c240fdff7')),
cp(4_900_000, bytes.fromhex('0000000000000000079b1c1ebf48d351a7d31dcc55c5b4cf79ade79089a20f5a')),
cp(5_000_000, bytes.fromhex('000000000000000006c9167db1cc7e93fcf1c3014da6c6221390d03d1640c9b3')),
The output can then be copied and pasted into `hathor/conf/mainnet.yml` and `hathor/conf/mainnet.py`
"""

import requests
import yaml
import argparse

# Built-in network configurations
NETWORKS: dict[str, dict[str, str]] = {
'mainnet': {
'config_file': 'hathor/conf/mainnet.yml',
'node_url': 'https://node1.mainnet.hathor.network/v1a',
},
'testnet': {
'config_file': 'hathor/conf/testnet.yml',
'node_url': 'https://node1.golf.testnet.hathor.network/v1a',
},
# Add more networks as needed
}

CHECKPOINT_INTERVAL: int = 100_000


def get_latest_height(node_url: str) -> int:
"""Fetch the latest block height."""
response = requests.get(f'{node_url}/transaction?type=block&count=1')
response.raise_for_status()
return response.json()['transactions'][0]['height']


def get_hash_for_height(node_url: str, height: int) -> str:
"""Fetch the hash for a given block height."""
response = requests.get(f'{node_url}/block_at_height?height={height}')
response.raise_for_status()
return response.json()['block']['tx_id']


def load_checkpoints(config_file: str) -> dict[str, int]:
"""Load the checkpoints from the specified YAML config file."""
with open(config_file, 'r') as file:
data = yaml.safe_load(file)
return data.get('CHECKPOINTS', {})


def print_new_checkpoints(network_name: str) -> None:
"""Print new checkpoints for the specified network."""
if network_name not in NETWORKS:
print(f'Error: Unknown network {network_name}. Available networks: {", ".join(NETWORKS.keys())}')
return

# Get the network configuration
network_config = NETWORKS[network_name]
config_file = network_config['config_file']
node_url = network_config['node_url']

# Load existing checkpoints from the YAML file
current_checkpoints = load_checkpoints(config_file)

# Get the latest block height
latest_height = get_latest_height(node_url)

# Determine missing checkpoints
new_checkpoints = {}
for height in range(CHECKPOINT_INTERVAL, latest_height + 1, CHECKPOINT_INTERVAL):
if height not in current_checkpoints:
block_hash = get_hash_for_height(node_url, height)
new_checkpoints[height] = block_hash

# Print new checkpoints
if new_checkpoints:
print(f'New checkpoints to add for {network_name}:\n')
for height, block_hash in sorted(new_checkpoints.items()):
print(f' {height:_}: {block_hash}')
print()
for height, block_hash in sorted(new_checkpoints.items()):
print(f''' cp({height:_}, bytes.fromhex('{block_hash}')),''')
else:
print(f'No new checkpoints needed for {network_name}. All up to date.')


if __name__ == '__main__':
# Parse command-line arguments
parser = argparse.ArgumentParser(description='Helper script to update the config checkpoint list.')
parser.add_argument('-n', '--network', default='mainnet', help='The network to update (default: mainnet)')
args = parser.parse_args()

# Print new checkpoints for the specified network
print_new_checkpoints(args.network)
14 changes: 14 additions & 0 deletions hathor/conf/mainnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@
cp(3_400_000, bytes.fromhex('000000000000000077242c961a0c6f708bc671a8372eb8b095311f091fddc6c3')),
cp(3_500_000, bytes.fromhex('000000000000000a34ba20552c3cae9549b9c5ca07f644cf005328c948aa54d8')),
cp(3_600_000, bytes.fromhex('000000000000000011031d9ff030cd9e6fe8a3766bbeda6f6337c40dd30fa65f')),
cp(3_700_000, bytes.fromhex('0000000000000006c6e7295efcf0929173cc47ece41afc652410b72f36cbeeda')),
cp(3_800_000, bytes.fromhex('00000000000000122f57d59c7f6736a83483dcf71c34978102d7e04ce4dc9a5d')),
cp(3_900_000, bytes.fromhex('00000000000000069edf3300d6c41451485d7aabdbea34425a2411b880e8a976')),
cp(4_000_000, bytes.fromhex('00000000000000043b11a6c86c3cdaf773a5183737f136e196e816f862e1e3ba')),
cp(4_100_000, bytes.fromhex('0000000000000020822d529b6fcd8611f5a174b1f44a6c478a2fec64a80233ad')),
cp(4_200_000, bytes.fromhex('00000000000000052ffc34875fab4e545bc9dc76f1212c4fdafab3b6d7a026cd')),
cp(4_300_000, bytes.fromhex('000000000000000e1ea2af0e25087c0977e944dd0ffdae5fdff54dda85ed95be')),
cp(4_400_000, bytes.fromhex('0000000000000000020dab883c57e21829b590ef61ff5230f5fdc9d572300945')),
cp(4_500_000, bytes.fromhex('00000000000000034d5ddf802a8ac8fbf17cf50747041e433d28d9f2bcb6ef02')),
cp(4_600_000, bytes.fromhex('000000000000000055bb4e5b6d942da13cb631f318cfdc292793f28ef8a338ca')),
cp(4_700_000, bytes.fromhex('000000000000000002ae1d75811b1050fc98ee7ef30c48cde117ebbb42f47e22')),
cp(4_800_000, bytes.fromhex('00000000000000000716b8d9e96591ba7cb2d02c3d2d1d98d514f41c240fdff7')),
cp(4_900_000, bytes.fromhex('0000000000000000079b1c1ebf48d351a7d31dcc55c5b4cf79ade79089a20f5a')),
cp(5_000_000, bytes.fromhex('000000000000000006c9167db1cc7e93fcf1c3014da6c6221390d03d1640c9b3')),
],
SOFT_VOIDED_TX_IDS=list(map(bytes.fromhex, [
'0000000012a922a6887497bed9c41e5ed7dc7213cae107db295602168266cd02',
Expand Down
14 changes: 14 additions & 0 deletions hathor/conf/mainnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,20 @@ CHECKPOINTS:
3_400_000: 000000000000000077242c961a0c6f708bc671a8372eb8b095311f091fddc6c3
3_500_000: 000000000000000a34ba20552c3cae9549b9c5ca07f644cf005328c948aa54d8
3_600_000: 000000000000000011031d9ff030cd9e6fe8a3766bbeda6f6337c40dd30fa65f
3_700_000: 0000000000000006c6e7295efcf0929173cc47ece41afc652410b72f36cbeeda
3_800_000: 00000000000000122f57d59c7f6736a83483dcf71c34978102d7e04ce4dc9a5d
3_900_000: 00000000000000069edf3300d6c41451485d7aabdbea34425a2411b880e8a976
4_000_000: 00000000000000043b11a6c86c3cdaf773a5183737f136e196e816f862e1e3ba
4_100_000: 0000000000000020822d529b6fcd8611f5a174b1f44a6c478a2fec64a80233ad
4_200_000: 00000000000000052ffc34875fab4e545bc9dc76f1212c4fdafab3b6d7a026cd
4_300_000: 000000000000000e1ea2af0e25087c0977e944dd0ffdae5fdff54dda85ed95be
4_400_000: 0000000000000000020dab883c57e21829b590ef61ff5230f5fdc9d572300945
4_500_000: 00000000000000034d5ddf802a8ac8fbf17cf50747041e433d28d9f2bcb6ef02
4_600_000: 000000000000000055bb4e5b6d942da13cb631f318cfdc292793f28ef8a338ca
4_700_000: 000000000000000002ae1d75811b1050fc98ee7ef30c48cde117ebbb42f47e22
4_800_000: 00000000000000000716b8d9e96591ba7cb2d02c3d2d1d98d514f41c240fdff7
4_900_000: 0000000000000000079b1c1ebf48d351a7d31dcc55c5b4cf79ade79089a20f5a
5_000_000: 000000000000000006c9167db1cc7e93fcf1c3014da6c6221390d03d1640c9b3

SOFT_VOIDED_TX_IDS:
- 0000000012a922a6887497bed9c41e5ed7dc7213cae107db295602168266cd02
Expand Down
27 changes: 27 additions & 0 deletions hathor/conf/testnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,33 @@
cp(1_400_000, bytes.fromhex('000000000df9cb786c68a643a52a67c22ab54e8b8e41cbe9b761133f6c8abbfe')),
cp(1_500_000, bytes.fromhex('000000000c3591805f4748480b59ac1788f754fc004930985a487580e2b5de8f')),
cp(1_600_000, bytes.fromhex('00000000060adfdfd7d488d4d510b5779cf35a3c50df7bcff941fbb6957be4d2')),
cp(1_700_000, bytes.fromhex('0000000007afc04aebad15b14fcd93c1b5193dc503b190433f55be8c218b6d12')),
cp(1_800_000, bytes.fromhex('00000000126f16af2ba934a60cf8f2da32d3ed2688c56ce8ff477e483a3ffc42')),
cp(1_900_000, bytes.fromhex('0000000005d2a2ba2231663187b460396189af0ffca7b2e93fccc85cde04cbdc')),
cp(2_000_000, bytes.fromhex('000000000009a8451ff2d5ec54951d717da2766aedb3131485466cc993879ee1')),
cp(2_100_000, bytes.fromhex('0000000009f961804cd7f43da05f08a94a2fa09f82c7d605afc5982ab242a7e4')),
cp(2_200_000, bytes.fromhex('0000000002e260b970846a89c23e754a763e7c5f1578b6ec4e67bdb94c667997')),
cp(2_300_000, bytes.fromhex('0000000006e0894c8f7fd029fe446a42433875647759183ba3fbb0ff0b7ceb64')),
cp(2_400_000, bytes.fromhex('0000000011ab28f3be17e3a098307fa73750cc8d74f1f60cfb44b524a60c94ec')),
cp(2_500_000, bytes.fromhex('00000000045d2bcc10c896bfc7d1f28788e3530a81f50ee096f386eec772634f')),
cp(2_600_000, bytes.fromhex('000000000766b9ac25e2ece5685effa834e61284e38f368c841210606bb1fdfc')),
cp(2_700_000, bytes.fromhex('0000000005d0ee31d0f47f6ff9aa570b9f25b9d44a8a59cea0e0f8a1729b9c90')),
cp(2_800_000, bytes.fromhex('000000000a5bd4f266fa13d2c0594cabf6465758f7f5814bde626032706b81e5')),
cp(2_900_000, bytes.fromhex('000000000b11b0a09ff0d7c2cfd9228f31c53008e700532e439d3a3d9c63fb8e')),
cp(3_000_000, bytes.fromhex('00000000013289569569cd51580183a2c870dfe5a395adaa00ae66fefe51af3d')),
cp(3_100_000, bytes.fromhex('00000000170c55e6ec207400bfc42786c1e0c32fe045a1d815f930daf2bf3020')),
cp(3_200_000, bytes.fromhex('00000000149986cb99c202136bd388fb2a7fcba4bdfd6ac049069ac5e08a587f')),
cp(3_300_000, bytes.fromhex('000000000e16f87ac7133639cb52a99574944b8457939396e7faf1615fcfdb0f')),
cp(3_400_000, bytes.fromhex('000000000f551f6224a459904436072f5ff10fd3db17f2d7e25b1ef9b149c121')),
cp(3_500_000, bytes.fromhex('0000000006572b8cf41130e88776adf8583e970905df2afe593ca31c91ab0c4c')),
cp(3_600_000, bytes.fromhex('000000000215fcc7018cc31bbfb943ca43c6297529fa008bf34665f3ac64d340')),
cp(3_700_000, bytes.fromhex('000000000dbf5e8ab4f90f2187db6db429c9d0cb8169051ce8a9e79b810509d7')),
cp(3_800_000, bytes.fromhex('00000000030411ec36c7f5386a94e147460d86592f85459e0eadd5cd0e3da7b4')),
cp(3_900_000, bytes.fromhex('000000000bc2c7078a3c59d878196f1491aad45a0df9d312909d85482ac8d714')),
cp(4_000_000, bytes.fromhex('000000000eba0dae3ec27cf5596ef49731744edebadb9fbae42160b6aa2e2461')),
cp(4_100_000, bytes.fromhex('00000000052aa77fd8db71d5306257f9fe068c3401d95b17fcedcccfc9b76c82')),
cp(4_200_000, bytes.fromhex('00000000010a8dae043c84fcb2cef6a2b42a28279b95af20ab5a098acf2a3565')),
cp(4_300_000, bytes.fromhex('000000000019da781ef75fa5f59c5537d8ed18b64c589c3e036109cfb1d84f7d')),
],
FEATURE_ACTIVATION=FeatureActivationSettings(
default_threshold=15_120, # 15120 = 75% of evaluation_interval (20160)
Expand Down
27 changes: 27 additions & 0 deletions hathor/conf/testnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,33 @@ CHECKPOINTS:
1_400_000: 000000000df9cb786c68a643a52a67c22ab54e8b8e41cbe9b761133f6c8abbfe
1_500_000: 000000000c3591805f4748480b59ac1788f754fc004930985a487580e2b5de8f
1_600_000: 00000000060adfdfd7d488d4d510b5779cf35a3c50df7bcff941fbb6957be4d2
1_700_000: 0000000007afc04aebad15b14fcd93c1b5193dc503b190433f55be8c218b6d12
1_800_000: 00000000126f16af2ba934a60cf8f2da32d3ed2688c56ce8ff477e483a3ffc42
1_900_000: 0000000005d2a2ba2231663187b460396189af0ffca7b2e93fccc85cde04cbdc
2_000_000: 000000000009a8451ff2d5ec54951d717da2766aedb3131485466cc993879ee1
2_100_000: 0000000009f961804cd7f43da05f08a94a2fa09f82c7d605afc5982ab242a7e4
2_200_000: 0000000002e260b970846a89c23e754a763e7c5f1578b6ec4e67bdb94c667997
2_300_000: 0000000006e0894c8f7fd029fe446a42433875647759183ba3fbb0ff0b7ceb64
2_400_000: 0000000011ab28f3be17e3a098307fa73750cc8d74f1f60cfb44b524a60c94ec
2_500_000: 00000000045d2bcc10c896bfc7d1f28788e3530a81f50ee096f386eec772634f
2_600_000: 000000000766b9ac25e2ece5685effa834e61284e38f368c841210606bb1fdfc
2_700_000: 0000000005d0ee31d0f47f6ff9aa570b9f25b9d44a8a59cea0e0f8a1729b9c90
2_800_000: 000000000a5bd4f266fa13d2c0594cabf6465758f7f5814bde626032706b81e5
2_900_000: 000000000b11b0a09ff0d7c2cfd9228f31c53008e700532e439d3a3d9c63fb8e
3_000_000: 00000000013289569569cd51580183a2c870dfe5a395adaa00ae66fefe51af3d
3_100_000: 00000000170c55e6ec207400bfc42786c1e0c32fe045a1d815f930daf2bf3020
3_200_000: 00000000149986cb99c202136bd388fb2a7fcba4bdfd6ac049069ac5e08a587f
3_300_000: 000000000e16f87ac7133639cb52a99574944b8457939396e7faf1615fcfdb0f
3_400_000: 000000000f551f6224a459904436072f5ff10fd3db17f2d7e25b1ef9b149c121
3_500_000: 0000000006572b8cf41130e88776adf8583e970905df2afe593ca31c91ab0c4c
3_600_000: 000000000215fcc7018cc31bbfb943ca43c6297529fa008bf34665f3ac64d340
3_700_000: 000000000dbf5e8ab4f90f2187db6db429c9d0cb8169051ce8a9e79b810509d7
3_800_000: 00000000030411ec36c7f5386a94e147460d86592f85459e0eadd5cd0e3da7b4
3_900_000: 000000000bc2c7078a3c59d878196f1491aad45a0df9d312909d85482ac8d714
4_000_000: 000000000eba0dae3ec27cf5596ef49731744edebadb9fbae42160b6aa2e2461
4_100_000: 00000000052aa77fd8db71d5306257f9fe068c3401d95b17fcedcccfc9b76c82
4_200_000: 00000000010a8dae043c84fcb2cef6a2b42a28279b95af20ab5a098acf2a3565
4_300_000: 000000000019da781ef75fa5f59c5537d8ed18b64c589c3e036109cfb1d84f7d

FEATURE_ACTIVATION:
default_threshold: 15_120 # 15120 = 75% of evaluation_interval (20160)
Expand Down

0 comments on commit 5725e8e

Please sign in to comment.