Skip to content

How do I select a hard fork of my environment?

You may perform an update of your environment that adds new EIPs (hard fork) to your chain at a future block using either the UI or the API. All applicable hard fork EIPs will be applied.

Kaleido orchestrates the EIPs on all the running nodes in the chain by picking a future block with respect to the maximum block height among the nodes in the chain, at the time the hardfork request is issued.

Using UI:

Navigate to the Environment Settings. The Fork Upgrade section shows the details regarding the hard fork. If new EIPs are avaiable for hard fork, you'll see the list of EIPs that are available in the details sub-section.

Hard Fork Available EIPs

Click Apply, and then click Fork Upgrade to apply the new EIPs.

Hard Fork Apply

Once the new EIPs are applied, the Fork Upgrade section displays the details regarding the new EIPs and the block number at which they are forked.

Hard Fork Applied Details

Using API:

Alternatively, you can use the API to hard fork new EIPs. The request must specify an empty body.

To check the list of EIPs available to apply via a hard fork, refer to the optional_hardfork_eips section of environment status response.

The following are the steps involved in hard fork upgrading an environment using API:

Get the environment /status. The chain_config field is available from release 1.0.27. It lists the EIPs that are currently active in the environment, along with the block number from which they are active. The optional_hardfork_eips shows the list of EIPs that will automatically be added in a hard fork request.

The prereq_hardfork_eips field shows the target release has mandatory EIPs that the current environment is missing. If this list contains any entries, a hard fork must first be performed before the upgrade to the target release is allowed to proceed.

# replace the placeholders with the actual values for your Kaleido resources
curl -X GET -H "$HDR_AUTH" -H "$HDR_CT" "$APIURL/consortia/{consortia_id}/environments/{environment_id}/status" | jq

The following is a sample response. Here constantinopleBlock is the new EIP that is available to add to the environment.

{
    "state": "live",
    "node_list": [
        "zzmzk4tuil",
        "zznlavdexi"
    ],
    "service_list": [],
    "upgrade": {
        "available": true,
        "chain_config": {
            "chainId": 812882247,
            "homesteadBlock": 0,
            "eip150Block": 0,
            "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
            "eip155Block": 0,
            "eip158Block": 0,
            "byzantiumBlock": 0,
            "petersburgBlock": 0,
            "clique": {
                "period": 5,
                "epoch": 30000
            }
        },
        "prereq_hardfork_eips": [],
        "optional_hardfork_eips": [
            "constantinopleBlock"
        ],
        "current_release": {
            ...
        },
        "target_release": {
            ...
        }
    },
    "health": {
        "all_nodes_up": true,
        "nodes_up": 2,
        "nodes_down": 0,
        "nodes_stopped": 0,
        "highest_block_height": 10,
        "lowest_block_height": 10
    }
}

The following properties from the status response are now deprecated:

  • hard_fork: use the array optional_hardfork_eips instead to determine if a hardfork operation is available to the current environment
  • optional_chain_config: use the array optional_hardfork_eips instead to determine which EIPs will be applied if a hard fork operation is performed
  • missing_chain_config: use the array optional_hardfork_eips instead to determine which EIPs are missing in the current environment and will be applied if a hard fork operation is performed

Use the /hardfork api to perform the hard fork. Note that all the EIPs listed in the optional_hardfork_eips will be automatically applied.

# replace the placeholders with the actual values for your Kaleido resources
curl -X POST -H "$HDR_AUTH" -H "$HDR_CT" "$APIURL/consortia/{consortia_id}/environments/{environment_id}/hardfork" -d '{}' | jq

You'll get a 200 OK response with the environment state as upgrading. Once, the environment comes back to live state, you can check the environment /status and now since constantinopleBlock is added to the environment, you'll find that it is present in the chain_config section and removed from the optional_chain_config section. The following is a sample response:

{
    "state": "live",
    "node_list": [
        "zzmzk4tuil",
        "zznlavdexi"
    ],
    "service_list": [],
    "upgrade": {
        "available": false,
        "chain_config": {
            "chainId": 812882247,
            "homesteadBlock": 0,
            "eip150Block": 0,
            "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
            "eip155Block": 0,
            "eip158Block": 0,
            "byzantiumBlock": 0,
            "constantinopleBlock": 130,
            "petersburgBlock": 0,
            "clique": {
                "period": 5,
                "epoch": 30000
            }
        },
        "prereq_hardfork_eips": [],
        "optional_hardfork_eips": [],
        "current_release": {
            ...
        },
        "target_release": {
            ...
        }
    },
    "health": {
        "all_nodes_up": true,
        "nodes_up": 2,
        "nodes_down": 0,
        "nodes_stopped": 0,
        "highest_block_height": 15,
        "lowest_block_height": 15
    }
}

Note that constantinopleBlock has been set to a block that is further than the highest_block_height in the initial environment /status call, i.e, the new EIP is forked to your chain at a future block.