# A guide how to add validators to the network ## Key generation The validator should generate and insert aura, grandpa and node keys with the [generate_validator_keys.sh script](https://g.g6.network/g6-chain/Scripts/-/tree/main/keys) Keep all the private keys safe. They should remain secret and only the owner should have access to them. You should see a generated folder and file structure similar to this: ```shell data % tree . ├── aura-sr25519.json ├── chains │   └── gen6 │   ├── keystore │   │   ├── 6175726108fd5c07440953c6b8d920e196d4a02fbbfdd2fa2668b6c16aabb8a2280b7f24 │   │   └── 6772616e134dad80895e7ea54c99c1d673a177450674de2a95ad35d1f833734bfcc97bbb │   └── network │   └── secret_ed25519 ├── grandpa-ed25519.json ├── node-key-ed25519.json └── peer-id.txt 5 directories, 7 files ``` ## Extrinsic calls ### Sudo calls This step could only be done by the owner of the sud keys of the blockchain. Sudo should add the aura ss58Address to the validator set through the extrinsic `sudo.sudo( substrateValidatorSet.addValidator( ) )` ### Validator key Calls This step is done by the owner of the validator keys. The owner of tha validator keys should add his aura keys to a wallet extension of his choice in order to sign the message later. The owner of tha validator keys should call the extrinsic substrateValidatorSet.start. Aura "publicKey" and grandpa "publicKey" should be submitted as parameters to the extrinsic and the transaction should be signed the previously added **aura** keys Validator aura key calls `substrateValidatorSet.start(auraPublicKey, grandpaPublicKey)` ![validator.substrateValidatorSet.start.png](pictures/validator.substrateValidatorSet.start.png) ![validator.substrateValidatorSet.start_3.png](pictures/validator.substrateValidatorSet.start_3.png) ![validator.substrateValidatorSet.start_2.png](pictures/validator.substrateValidatorSet.start_2.png)