## What's a network upgrade ? A network upgrade is a change or group of changes to the protocol consensus rules, which are activated at a defined block number. ## What to consider when introducing a consensus rule change in the code Every consensus rule change needs to be associated with a specific RSKIP (RSK improvement proposal) in the [RSKIPs github repository.](https://github.com/rsksmart/RSKIPs) Consensus rules changes are introduced as part of a group of changes called Network Upgrade. Network upgrades are released to the general public as part of a specific RSK node version (defined by a release code name and version number. e.g.: RSK Wasabi 1.0.0), and the consensus rule changes introduced are selected by the community. ## How to add a new consensus rule? 1. Set the release version (if not yet defined in the code). Define the new tag in `NetworkUpgrade` enum file. ```java public enum NetworkUpgrade { WASABI_100("wasabi100"), } ``` 2. Set the network upgrade block activation height in `[main||testnet||regtest||devnet].conf` files ```conf # IE for main.conf blockchain.config { name = main hardforkActivationHeights = { wasabi100 = 1591000, } } ``` > For local development you should ONLY need to edit `regtest.conf`. >`[main||testnet||devnet].conf` will only need to be edited before a NetworkUpgrade deploy, when the block activation height is already known. 3. Define the consensus rule RSKIP in `ConsensusRule` enum file. ```java public enum ConsensusRule { RSKIP106("rskip106"), } ``` 4. Associate the previous RSKIP with a specific Network Upgrade version in `reference.conf` file. ```conf blockchain = { config = { consensusRules = { rskip106 = wasabi100, } } } ``` ## Coding a consensus rule change for an RSK Network Upgrade When implementing a network upgrade you'll need to check if that change is active: ```java if (activations.isActive(ConsensusRule.RSKIP106) && address.equals(HD_WALLET_UTILS_ADDR_DW)) { return new HDWalletUtils(config.getActivationConfig(), HD_WALLET_UTILS_ADDR); } ``` ## Testing To run tests with specific consensus rules changes, you'll need to combine previously described methods at `ActivationConfigTest.BASE_CONFIG` ```java public class ActivationConfigTest { private static final Config BASE_CONFIG = ConfigFactory .parseString(String.join("\n", "hardforkActivationHeights: {", " wasabi100: 0", "},", "consensusRules: {", " rskip106: wasabi100,", "}" )); } ```