On Wednesday, September 25, block producers (BPs) on the EOS blockchain will execute a hard fork to the Spring v1.0 blockchain software, having upgraded their nodes and engaged in a go/no-go vote.
This new release includes the new Savanna consensus algorithm, which BPs will activate the same day, September 25.
It also introduces BLS finalizer keys, which all BPs must generate with spring-util
and, after September 25, register with the eosio regfinkey
action.
Upgrade Steps
All node operators must complete the following steps before September 25:
- Generate a snapshot
- Stop
nodeos
- Remove
shared_memory.bin
- Upgrade node software to Spring v1.0.0
- Remove the
producer-threads
option in each node configuration - Generate finalizer key(s) using
spring-util
- Configure finalizer keys. Each individual
nodeos
instance must have a new and unique set of finalizer keys defined usingsignature-provider
inconfig.ini
or in the command line.
- Configure finalizer keys. Each individual
- Restart the node from the snapshot
On September 25, the network is expected to sign a multisig transaction to activate BLS protocol features, allowing block producers to register their finalizer keys.
- After BLS protocol feature activation, register the first finalizer key using the
regfinkey
action in theeosio
contract- The first time it is performed, this action will also activate the finalizer key. Additional finalizer keys can be registered with
regfinkey
, and then later activated using theactfinkey
action in theeosio
contract.
- The first time it is performed, this action will also activate the finalizer key. Additional finalizer keys can be registered with
After these steps, the nodes are ready for Savanna consensus activation.
- Important note: improper finalizer key handling can lead to syncing issues with the network. You can find more details below, or in the official documentation.
- Nodes using State History will need to utilize an alternative means of log file compression, such as ZFS LZ4 compression, as SHiP log compression has been removed. However, SHiP log files from Leap 4 and above will continue to work with Spring 1.0, and do not need to be regenerated.
- Private networks will also need to upgrade system contracts to EOS System Contracts v3.6.0. Public networks will upgrade system contracts with a multisig transaction.
- Additionally, top BPs will need to upgrade the Contract Development Toolkit (CDT) in order to build EOS System Contracts v3.6.0 from source. Anyone building BLS-based smart contracts (like the System Contracts v3.6.0) from source will need to upgrade to CDT v4.1.0.
- The block log, state history logs, and trace logs from prior versions all remain compatible with Spring v1.
Savanna Activation
On September 25, block producers will perform a go/no-go vote to validate 15 of 21 finalizer keys. If the vote is a go, then BPs will sign a multisignature transaction to execute the switchtosvnn
action, activating the Savanna consensus algorithm on the EOS Network.
Spring v1.0 and the Savanna consensus algorithm represent a leap forward in blockchain technology. Savanna uses an upgraded validator architecture that allows Antelope networks to expand the set of active block producers without increasing time to finality. It also reduces the time to finality by over 95%, which is useful for all transactions. This speed profoundly transforms the utility of Antelope’s IBC protocol into a fully horizontally scalable network of networks.
Important Release Notes
Most new features of Spring 1.0 are related to the Savanna consensus algorithm, although some components have been removed or modified:
- Node operators must remove the
producer-threads
configuration option fromconfig.ini
, as the option has been removed from the software. Thenodeos
software will NOT start ifproducer-threads
is included in configuration options. - State history (SHiP) log file compression has been disabled. Node operators with state history will need to implement their own compression solutions. Some block producers currently use ZFS LZ4 compression for this purpose.
Spring 1.0 also includes changes relevant to many block producers and other node operators:
- The new configuration option
vote-threads
must be set to a positive number (1 or greater) on all intermediate peer/sentry nodes connected to BP nodes; otherwise, votes will NOT propagate through the network. The default value forvote-threads
is4
for Block Producer nodes, but may be set to0
for other configurations. You can find an example peering setup from EOS Nation, and learn more about peering in the official documentation. - The
get_block_header_state
endpoint now returns a different response, which contains all fields but with onlyblock_num
,id
,header
, andadditional_signatures
filled out. - For nodes running SHiP to support Inter-Blockchain Communication, the
finalizer-data-history
option MUST be set to true. - The
finalizer-dir
option allows node operators to optionally set the directory path for storing voting history. This is to avoid node syncing issues for setups that move or delete thedata
directory.
All Node Operators should take note of these details to prepare for the Spring 1.0 hard fork.
Upgrade Checklist
Some specific steps may vary based on node configuration, but these general steps work for most nodes.
Planning for the upgrade
- Do not test upgrades on your production node—use a test node first
- Ensure your Ubuntu build is up to date. Older versions of Ubuntu, such as 18.04, are NOT supported. The supported operating systems are:
- Ubuntu 22.04 Jammy (Recommended)
- Ubuntu 20.04 Focal
- Do NOT use deprecated plugins or options
producer-threads
- SHiP (State History) log file compression (use ZFS instead)
- Enable any new required plugins and options (see below)
- Make a backup of your node
Upgrading your node
- Download / build binaries.
- Spring 1.0.0
This is necessary for all nodes. - (some nodes) EOS System Contracts v3.6.0
These are necessary only for private networks. Public networks push out system contract updates via a multi-signature transaction approved by 15/21 top block producers. - (some nodes) CDT v4.1.0
This update is only needed for building system contract binaries or other contracts that use BLS functions.
- Spring 1.0.0
- Ensure that
producer_api_plugin
is enabled. This is required for taking a snapshot, and unless this plugin was already being used on the node, it’s recommended to disable it after taking a snapshot.- Pass
--plugin eosio::producer_api_plugin
on the command line, orplugin = eosio::producer_api_plugin
in the config file.
- Pass
- Make a snapshot using the
/v1/producer/create_snapshot
endpoint.- Use
curl -X POST http://127.0.0.1:8888/v1/producer/create_snapshot
. Wait until curl returns with a JSON response containing the filename of the newly created snapshot file.- This step requires nodeos to continue receiving blocks from the p2p network, otherwise the curl command will never return.
- Alternatively, you can download snapshots from top block producers like EOSphere, EOSUSA, Genereos, and EOS Nation. The snapshot produced from Leap v5.0 will be in v6 format. Spring 1.0 is compatible with v4, v6, and v7 snapshots.
- Use
- Stop your node.
- Remove old state data.
- The block log, state history logs, and trace logs from prior versions are all compatible with Spring v1. There is no need to remove these files when performing the upgrade procedure.
- Remove
/data/state/shared_memory.bin
. This file will be in$HOME/local/share/eosio/nodeos/data/state
, or in the directory set with thenodeos --data-dir
argument. - (Optional) remove the
protocol_features
directory.
- Remove
- The block log, state history logs, and trace logs from prior versions are all compatible with Spring v1. There is no need to remove these files when performing the upgrade procedure.
- Remove old configuration options and plugins and add any new ones.
Remove:
- The
producer-threads
option. - Some plugins or options were removed or deprecated in Leap v5.0.0. Ensure nodes are not using any of the following:
cpu-effort-percent
last-block-cpu-effort-percent
last-block-time-offset-us
produce-time-offset-us
max-nonprivileged-inline-action-size
max-scheduled-transaction-time-per-block-ms
disable-subjective-billing
- Actions that utilize deferred transactions
Find out more info on disabling these features in the 5.0 Upgrade Guide.
- Update your binaries.
Optionally, depending on your preference and setup:
- Add
finalizers-dir
to set a directory path for storing voting history. Most nodes can leave this as the default.- Scripts that move or delete the ‘data’ directory need to protect the finalizer safety file, or utilize this option to set another location for the finalizer
safety.dat
file.
- Scripts that move or delete the ‘data’ directory need to protect the finalizer safety file, or utilize this option to set another location for the finalizer
- Add
finality-data-history
for nodes running SHiP to support IBC. - Prepare to handle new responses to
get_block_header_state
API calls. - Nodes with state history turned on should use an alternate compression solution such as ZFS-LZ4 for SHiP (State History) log file compression. Find more details about ZFS compression on Antelope nodes here.
vote-threads
should generally be left unchanged at its default. BP nodes have this default set at 4, while other node types may have this default set at 0. The default values generally work, but intermediate nodes between BP nodes and peer nodes may need to set this value at 1 or greater. The intermediate node must have at least one vote thread in order to properly broadcast votes to the rest of the network.
- Generate multiple unique finalizer keys using
spring-util
and add tosignature-provider
inconfig.ini
. More details below. - Start your node.
Once a node has been updated to Spring 1.0, it can generate finalizer keys for later use. However, before finalizer key activation, the network must enable the BLS_PRIMITIVES2
protocol features, which will require a multisig transaction scheduled for September 25. Once BLS primitives are activated, you can register and activate finalizer keys.
Finalizer Key Safety
Note that each block production node must have its own new and unique finalizer key. This means if you have a primary BP node and a backup BP node, each one needs a list of unique finalizer keys, with no sharing keys between nodes. Reusing finalizer keys between nodes will desynchronize the producer with the rest of the chain.
An important note about the safety.dat
file: this file keeps a record of voting history for a given BLS finalizer key. Any mismatch in finalizer key voting history will result in the block producer voting on the wrong branch of the chain and losing sync with the network. This has several implications:
- DO NOT share BLS finalizer keys between hosts. Instead, activate a new key when switching from one active host to the other.
- DO NOT share the
safety.dat
file between hosts or block producers. - DO NOT backup and restore the
safety.dat
file. Instead, switch to a new BLS finalizer key.
These considerations are important because votes are submitted against a Merkle Tree Digest that is built incrementally off the previous Digest. Using an old voting history will use old Merkle Tree Digests to calculate a new digest, which will be incorrect. Once an incorrect digest is part of the calculation, all the future digests will be incorrect.
This is why best practice is to never reuse BLS finalizer keys, and always activate a new, unique finalizer key when switching nodes.
Switching to a new key starts fresh with no history. Starting with no history creates the Merkle Tree Digest from the existing information, preventing mismatches.
Find out more about finalizer safety and managing finalizer keys in the official documentation, or see an example finalizer key rotation.
Finalizer Key Details
To generate and activate your finalizer keys, follow these steps:
- Generate your key(s) using
spring-util
.
Example:
spring-util bls create key --to-console > producer-name.finalizer.key
This will generate a Private key
, a Public key
, and a proof_of_possession
.
Response:
Private key: PVT_BLS_9-9zi*******oiz-ZZz**************9BZ-o9*******ZU
Public key: PUB_BLS_SvL************ZZ-Zez****9Zb-Z9z****************************************iZZ9P_kzZ*****ezL-Z9z**************************zlZu-Gs*****9Z
Proof of Possession: SIG_BLS_ZPZ********************************99Z-9rZ******************************************************9zZrU-ZZu************ZbZ_yZ****Z-yZP****************************************ZZZzTtVZbcZ-Zck_ZZU********************************************VZ9zZZt_ZlZ************Z9-Z
- Add the
signature-provider
option and one or more keys inconfig.ini
.
First, add one or more of your generated keys to the signature-provider
configuration option in the config.ini
file of one nodeos
instance.
The format of the option is signature-provider = <PUBLIC_KEY>=KEY:<PRIVATE_KEY>
with additional keys on new lines. You may have to add the option if it is not already in the file.
The keys listed here should be different between nodes, and any key you plan to register and activate must be listed here before booting the node.
Example:
signature-provider = PUB_BLS_SvL**********zZZZ-Zezlrst9Zb-Z9zZ****************************************ZZ9P_kz******ezL-Z9zZ9zzZb9Z********************lZu-Gs*****9Z=KEY:PVT_BLS_9-9z*********iz-ZZz************aS9BZ-o9*******ZU
signature-provider = PUB_BLS_Zez****9Zb-Zaz*********************************ZZ-9UV*********************Uzf_GLt******Zz-vSZ9**************************zlZu-GZ****ZnZ=KEY:PVT_BLS_9-Zc********Zzz-Zo***************9u9-Zf*******nU
- Restart
nodeos
with the new configuration. - Register a key on-chain with the
regfinkey
action.
This action registers the key as a potentially active key. The first time a producer calls this action, the key is automatically activated.
It is recommended to register multiple finalizer keys, although each producer node can only activate one finalizer key at a time.
Example:
cleos push action eosio regfinkey '{"finalizer_name":"NewBlockProducer", \
"finalizer_key":"PUB_BLS_SvL************ZZ-Zez****9Zb-Z9z****************************************iZZ9P_kzZ*****ezL-Z9z*************************cZzlZu-Gs*****9Z", \
"proof_of_possession":"SIG_BLS_ZPZ******************************9V99Z-9rZ*******************************************************zZrU-ZZu************ZbZ_yZ***ZZ-yZP*********************************************tVZbcZ-Zck_ZZ**************************************************Zt_ZlZ**********a9Z9-Z"}' \
-p NewBlockProducer
- When switching to a new node, or whenever otherwise desired, activate a new pre-registered key on-chain with the
actfinkey
action.
After registration, a producer can safely activate any new and unique finalizer key at any time with the actfinkey
action. The key used must already exist in the configuration file under signature-provider
, and it must already be registered with the regfinkey
action.
Example:
cleos push action eosio actfinkey '{"finalizer_name":"NewBlockProducer", \
"finalizer_key":"PUB_BLS_SvL***********ZZZ-Zez****9Zb-Z9z****************************************iZZ9P_kzZ*****ezL-Z9z*************************cZzlZu-Gs*****9Z"}' \
-p NewBlockProducer
- If necessary, you can remove a finalizer key with the
delfinkey
action.
The finalizer_key
to be deleted must be a registered key in base64url format, and must not be active. The account removing the finalizer key must have the authority specified in the finalizer_name
field.
The delfinkey
option will successfully delete an active key if it was the most recently registered finalizer key. If deleting the last registered key, the BP will be removed from the top 21 actively validating BPs, and the next BP in line that has a registered finalizer key will step in.
Example:
cleos push action eosio delfinkey '{"finalizer_name":"NewBlockProducer", \
"finalizer_key":"PUB_BLS_SvL************ZZ-Ze*****9Zb-Z9z****************************************iZZ9P_kz*****tezL-Z9******************************Zu-GsZnZ9I9Z"}' \
-p NewBlockProducer
After registering and activating a new and unique finalizer key, with all nodes upgraded to the Spring 1.0 software, your infrastructure should be ready for the upgrade.
Make Every Node Savanna-Ready
The Savanna consensus algorithm is a leap forward in speed and decentralization for Antelope networks. Upgrading to Spring 1.0 and switching to Savanna involves a series of steps that will ensure a smooth transition.
BPs and others building system contracts from source should build & upgrade the Contract Development Toolkit to CDT v4.1.0.
Top block producers on the EOS network must complete the following steps by September 25:
- Build & upgrade node software to Spring v1.0.0
- Snapshot
- Stop node
- Remove old state file
shared_memory.bin
- Remove
producer-threads
fromconfig.ini
- Build and update binaries from source
- Restart node
- Generate finalizer key(s) using
spring-utils
.- Every
nodeos
instance should have a set of one or more unique finalizer keys, which are not present on any othernodeos
instance. Reusing finalizer keys will lead to the node voting on the wrong branch of the chain.
- Every
- After the system contract upgrade on September 25, register a finalizer key using the
regfinkey
action in theeosio
contract.- The first time a block producer registers a finalizer key, this action will also activate the finalizer key.
- Register additional finalizer keys with
regfinkey
. You must register a key before activating it. - Activate registered keys using the
actfinkey
action.
By following these steps, block producers can ensure a seamless transition to Savanna, and help unlock new capabilities of the EOS blockchain. For more information about finalizer keys, managing finalizer keys, switching to Savanna consensus, and upgrading to Spring 1.0, check out the migration guides in the official documentation. Upgrade now to spearhead a more powerful and decentralized EOS Network.