Difference between revisions of "Node Provider Onboarding"

From Internet Computer Wiki
Jump to: navigation, search
m
Line 13: Line 13:
 
* [https://shop.nitrokey.com/shop/product/nkhs2-nitrokey-hsm-2-7/ NitroKey HSM]
 
* [https://shop.nitrokey.com/shop/product/nkhs2-nitrokey-hsm-2-7/ NitroKey HSM]
 
* 11 ICP (10 of for proposal deposit)  
 
* 11 ICP (10 of for proposal deposit)  
 +
* Basic understanding of neurons, staking, and governance proposals. For instance, understanding what it means to stake a neuron for 8 years.
 +
* The technical knowledge to understand some minor steps that are not explicitly mentioned in these instructions. For instance, when to insert an HSM.
  
 
<span id="setup"></span>
 
<span id="setup"></span>
== Setup ==
 
  
<ol style="list-style-type: decimal;">
+
== Install ic-admin ==
<li><p>Install the required tools</p>
 
<ol style="list-style-type: decimal;">
 
<li><p><code>ic-admin</code> to enable you to create proposals</p>
 
<p>MacOS:</p>
 
<ol style="list-style-type: decimal;">
 
<li><p>Download ic-admin</p>
 
<syntaxhighlight lang="shell">$ curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/nix-release/x86_64-darwin/ic-admin.gz" -o - | gunzip > ./ic-admin
 
$ chmod +x ./ic-admin</syntaxhighlight></li>
 
<li><p>Verify the binary</p>
 
<syntaxhighlight lang="shell">$ diff <(sha256sum ./ic-admin | cut -d' ' -f1) <(echo c18d55b3961bcca6d0bfa0a7e7d9a4e6d4daf74ced64b0767db13d53c1f16cb4) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"</syntaxhighlight></li>
 
<li><p>Verify that the version is 1.0 or greater</p>
 
<syntaxhighlight lang="shell">$ ./ic-admin --version
 
  
ic-admin 1.0</syntaxhighlight></li></ol>
+
<code>ic-admin</code> is the tool used to create and submit NNS proposals.
  
<p>Linux:</p>
+
=== MacOS ===
<ol style="list-style-type: decimal;">
+
<syntaxhighlight lang="shell">
<li><p>Download ic-admin</p>
+
curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/nix-release/x86_64-darwin/ic-admin.gz" -o - | gunzip > ./ic-admin
<syntaxhighlight lang="shell">$ curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/release/ic-admin.gz" -o - | gunzip > ./ic-admin
+
chmod +x ./ic-admin
$ chmod +x ./ic-admin</syntaxhighlight></li>
+
</syntaxhighlight>
<li><p>Verify the binary</p>
+
 
<syntaxhighlight lang="shell">diff <(sha256sum ./ic-admin | cut -d' ' -f1) <(echo c4c93df7b015742ecadf62d44f8287ba3ee960f98832fc5a0c648bfd9acf834e) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"</syntaxhighlight></li>
+
Verify the binary
<li><p>Verify that the version is 1.0 or greater</p>
+
<syntaxhighlight lang="shell">
<syntaxhighlight lang="shell">$ ./ic-admin --version
+
diff <(shasum -a 256 ./ic-admin | cut -d' ' -f1) <(echo c18d55b3961bcca6d0bfa0a7e7d9a4e6d4daf74ced64b0767db13d53c1f16cb4) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"
 +
</syntaxhighlight>
 +
 
 +
Verify that the version is 1.0 or greater
 +
<syntaxhighlight lang="shell">
 +
./ic-admin --version
 +
ic-admin 1.0
 +
</syntaxhighlight>
 +
 
 +
=== Linux ===
 +
 
 +
NOTE: The instructions below have been tested with the Ubuntu 20.04 release.
 +
<syntaxhighlight lang="shell">
 +
curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/release/ic-admin.gz" -o - | gunzip > ./ic-admin
 +
$ chmod +x ./ic-admin
 +
</syntaxhighlight>
 +
 
 +
Verify the binary
 +
<syntaxhighlight lang="shell">
 +
diff <(shasum -a 256 ./ic-admin | cut -d' ' -f1) <(echo c4c93df7b015742ecadf62d44f8287ba3ee960f98832fc5a0c648bfd9acf834e) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"
 +
</syntaxhighlight>
 +
 
 +
Verify that the version is 1.0 or greater
 +
<syntaxhighlight lang="shell">
 +
./ic-admin --version
 +
ic-admin 1.0
 +
</syntaxhighlight>
 +
 
 +
== Install dfx ==
 +
 
 +
<code>dfx</code> allows generating a neuron hotkey, among other things
  
ic-admin 1.0</syntaxhighlight></li></ol>
+
<syntaxhighlight lang="shell">
</li>
+
$ sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"
<li><p><code>dfx</code> to enable you to generate a neuron hotkey</p>
+
</syntaxhighlight>
<ol style="list-style-type: decimal;">
 
<li><p>Install dfx</p>
 
<syntaxhighlight lang="shell">$ sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"</syntaxhighlight></li>
 
<li><p>Verify that the version is 0.8.1 or greater</p>
 
<syntaxhighlight lang="shell">$ dfx --version
 
  
dfx 0.8.1</syntaxhighlight></li></ol>
+
Verify that the version is 0.8.1 or greater
</li></ol>
+
<syntaxhighlight lang="shell">
</li>
+
$ dfx --version
<li><p>Create a wallet hotkey principal</p>
+
dfx 0.8.1
<syntaxhighlight lang="shell">$ dfx identity new node-provider-hotkey
+
</syntaxhighlight>
 +
 
 +
Create a wallet hotkey principal
 +
<syntaxhighlight lang="shell">
 +
$ dfx identity new node-provider-hotkey
  
 
Creating identity: "node-provider-hotkey".
 
Creating identity: "node-provider-hotkey".
 
Created identity: "node-provider-hotkey".
 
Created identity: "node-provider-hotkey".
  
$ dfx --identity node-provider-hotkey identity get-principal
+
$ NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
 +
$ echo $NODE_PROVIDER_PRINCIPAL
 +
fharn-5vyi2-4xb4a-64yyi-3jpmj-pga23-mxy25-d5uim-fqcro-eoefh-tae
 +
</syntaxhighlight>
  
wuyst-x5tpn-g5wri-mp3ps-vjtba-de3xs-w5xgb-crvek-tucbe-o5rqi-mae</syntaxhighlight></li>
+
== Create and Manage Neuron via NNS Frontend Dapp and Internet Identity ==
<li><p>Create and Manage Neuron via NNS Dapp and Internet Identity</p>
 
<ol style="list-style-type: decimal;">
 
<li>Setup your hardware wallet: https://medium.com/dfinity/integrating-ledger-nano-with-the-nns-front-end-dapp-user-manual-9c5600925e16</li>
 
<li>Send at least 11 ICPs to the hardware wallet address.</li>
 
<li>Create a neuron
 
<ol style="list-style-type: decimal;">
 
<li>Navigate to Neurons tab and create a Neuron by staking 11 ICP from your hardware wallet, and confirming the transaction on your hardware wallet.
 
[[File:-docs-stake_neuron_1.png|1024px|stake neuron]]</li>
 
  
<li>After the neuron has been created successfully, confirm to add NNS Dapp as hotkey in the dialogue and on your hardware wallet, and close the dialog after the action completes. [[File:-docs-stake_neuron_2.png|1024px|neuron id]]</li>
+
# Setup your hardware wallet: https://medium.com/dfinity/integrating-ledger-nano-with-the-nns-front-end-dapp-user-manual-9c5600925e16
<li>Set the dissolve delay to at least 6 months, and confirm the choice in the dialogue and on your hardware wallet. After the action completes, you can close the "Follow Neurons".<br>
+
# Send at least 11 ICPs to the hardware wallet address.
 +
# Navigate to Neurons tab and create a Neuron by staking 11 ICP from your hardware wallet, and confirming the transaction on your hardware wallet.
 +
#: [[File:-docs-stake_neuron_1.png|1024px|stake neuron]]
 +
#:
 +
# After the neuron has been created successfully, confirm to add NNS Dapp as hotkey in the dialogue and on your hardware wallet, and close the dialog after the action completes.
 +
#: [[File:-docs-stake_neuron_2.png|1024px|neuron id]]
 +
# Set the dissolve delay to at least 6 months, and confirm the choice in the dialogue and on your hardware wallet. After the action completes, you can close the "Follow Neurons".
 +
#:
 +
#: [[File:dissolve_delay.png|480px|neuron id]]
 +
# You will now see a neuron listed with its ID. You will need the neuron ID in the next steps to place the necessary proposals.
 +
#: [[File:Neuron id.png|1024px]]
  
[[File:dissolve_delay.png|480px|neuron id]]</li>
+
== Add a hotkey ==
<li>You will now see a neuron listed with its ID. You’ll need the neuron ID in the next steps to place the necessary proposals.
+
 
[[File:Neuron id.png|1024px]]
+
# Select the neuron you just created to open neuron management view and press “Add hotkey” button.
</li></ol>
+
#: [[File:Hotkey 1.png|800px]]
</li>
+
# A dialog will pop up where you can enter the principal you generated in step 2 (output from command <code>dfx --identity node-provider-hotkey identity get-principal</code>). Press the confirm button and confirm the transactions on your hardware wallet. <br>
<li>Add a hotkey
+
#: [[File:Hotkey 2.png|800px]]
<ol style="list-style-type: decimal;">
+
#:
<li>Select the neuron you just created to open neuron management view and press “Add hotkey” button.<br>
+
# Get the hardware principal id
[[File:Hotkey 1.png|800px]]
+
 
</li>
+
Navigate back to ICP page and select your hardware wallet account.
<li>A dialog will pop up where you can enter the principal you generated in step 2.2. Press the confirm button and confirm the transactions on your hardware wallet. <br>
 
[[File:Hotkey 2.png|800px]]
 
</li></ol>
 
</li>
 
<li>Get the hardware principal id
 
<ol style="list-style-type: decimal;">
 
<li>Navigate back to ICP page and select your hardware wallet account. <br>
 
 
[[File:Node provider principal 1.png|1024px]]
 
[[File:Node provider principal 1.png|1024px]]
</li>
+
 
<li>Here you can get your node provider principal by clicking on the copy icon after the principal id. You’ll need it in the next steps. <br>
+
Here you can get your node provider principal by clicking on the copy icon after the principal id. You'll need it in the next steps.
 
[[File:Node provider principal 2.png|800px]]
 
[[File:Node provider principal 2.png|800px]]
</li></ol>
 
</li></ol>
 
</li>
 
<li><p>Configure your HSM</p>
 
<ol style="list-style-type: decimal;">
 
<li><p>Install the necessary tools:</p>
 
<p>MacOS:</p>
 
<ol style="list-style-type: decimal;">
 
<li>Download this OpenSC binary: https://github.com/OpenSC/OpenSC/releases/download/0.22.0/OpenSC-0.22.0.dmg</li>
 
<li>Double click the DMG image that you downloaded and then double click the OpenSC PKG file.</li>
 
<li>If your system doesn’t allow the installation software from an unidentified developer please follow these steps or contact your system administrator:
 
<ol style="list-style-type: decimal;">
 
<li>Choose the Apple menu &gt; System Preferences &gt; click Security and Privacy.</li>
 
<li>Click the lock Icon to unlock it, then enter an administrator name and password.</li>
 
<li>Ensure that you’re on the tab named “General”.</li>
 
<li>You should see the OpenSC app and you should be able to enable its installation by choosing “Open anyway”.</li></ol>
 
</li>
 
<li>Click continue and install until the installation is complete.</li></ol>
 
  
<p>Linux:</p>
+
== Configure your HSM ==
<ol style="list-style-type: decimal;">
+
 
<li><p>Install pcscd and opensc</p>
+
It's first necessary to install the necessary tools.
<syntaxhighlight lang="shell">sudo apt install pcscd opensc</syntaxhighlight></li></ol>
+
 
</li>
+
=== MacOS ===
<li><p>Setup the HSM</p>
+
 
<ol style="list-style-type: decimal;">
+
# Download this OpenSC binary: https://github.com/OpenSC/OpenSC/releases/download/0.22.0/OpenSC-0.22.0.dmg
<li><p>Initialize the HSM</p>
+
# Double click the DMG image that you downloaded and then double click the OpenSC PKG file.
<syntaxhighlight lang="shell">sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 358138</syntaxhighlight></li>
+
# If your system doesn't allow the installation software from an unidentified developer please follow these steps or contact your system administrator:
<li><p>Change the HSM so pin</p>
+
#:: Choose the Apple menu &gt; System Preferences &gt; click Security and Privacy.
<syntaxhighlight lang="shell">pkcs11-tool --login --login-type so --so-pin 3537363231383830 --change-pin</syntaxhighlight></li>
+
#:: Click the lock Icon to unlock it, then enter an administrator name and password.
<li><p>Create a keypair on the HSM. Enter the default pin 358138 when prompted.</p>
+
#:: Ensure that you're on the tab named “General”.
<syntaxhighlight lang="shell">pkcs11-tool -k --key-type EC:prime256v1 --login -d 01</syntaxhighlight></li></ol>
+
#:: You should see the OpenSC app and you should be able to enable its installation by choosing “Open anyway”.
</li>
+
# Click continue and install until the installation is complete.
<li><p>Get the node operator principal</p>
+
 
<ol style="list-style-type: decimal;">
+
=== Linux ===
<li><p>Configure dfx identity (skip this step if you already configured it for an other HSM).</p>
+
 
<blockquote><p>Warning: Depending on your installation, the path to the <code>--hsm-pkcs11-lib-path</code> might be different. You can locate it with the following command:</p>
+
NOTE: The instructions below have been tested with the Ubuntu 20.04 release.
<syntaxhighlight lang="shell">find / -name opensc-pkcs11.so 2> /dev/null</syntaxhighlight></blockquote>
+
 
<p>MacOS:</p>
+
# Install pcscd and opensc
<syntaxhighlight lang="shell">dfx identity new hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /Library/OpenSC/lib/opensc-pkcs11.so</syntaxhighlight>
+
#: <syntaxhighlight lang="shell">
<p>Linux:</p>
+
sudo apt install pcscd opensc
<syntaxhighlight lang="shell">dfx identity new hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so</syntaxhighlight></li>
+
</syntaxhighlight>
<li><p>Get the principal. Enter the default pin 648219 when prompted.</p>
+
 
<syntaxhighlight lang="shell">$ echo -n PIN:; read -s DFX_HSM_PIN; export DFX_HSM_PIN; echo; dfx --identity hsm identity get-principal; unset DFX_HSM_PIN
+
== Setup the HSM ==
 +
 
 +
Initialize the HSM.
 +
<syntaxhighlight lang="shell">
 +
sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 358138
 +
</syntaxhighlight>
 +
 
 +
Change the HSM so pin.<br>
 +
'''WARNING:''' The new HSM so pin must have 16 hexadecimal digits. This is not very well known, and some HSM users have lost access to a Nitrokey HSM because they tried using regular characters and the command below accepted it.
 +
<syntaxhighlight lang="shell">
 +
pkcs11-tool --login --login-type so --so-pin 3537363231383830 --change-pin
 +
</syntaxhighlight>
 +
 
 +
Create a keypair on the HSM. Enter the default pin 358138 when prompted.<br>
 +
'''Note:''' Before initializing the HSM key please refer to the [https://docs.nitrokey.com/pro/openpgp.html Nitrokey HSM documentation] if you wish to create a backup. Creating a backup of the HSM device is NOT possible after the key has already been created.
 +
<syntaxhighlight lang="shell">
 +
pkcs11-tool -k --key-type EC:prime256v1 --login -d 01
 +
</syntaxhighlight>
 +
 
 +
=== Get the node operator principal from the HSM ===
 +
 
 +
Configure dfx identity (skip this step if you already configured it for an other HSM).
 +
 
 +
<br/>
 +
'''Note:''' Depending on your installation, the path to the <code>--hsm-pkcs11-lib-path</code> might be different on your platform.
 +
You can locate the correct path with the following command:
 +
<br/>
 +
<syntaxhighlight lang="shell">
 +
find / -name opensc-pkcs11.so 2> /dev/null
 +
</syntaxhighlight>
 +
 
 +
MacOS:
 +
<syntaxhighlight lang="shell">
 +
dfx identity new node-operator-hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /Library/OpenSC/lib/opensc-pkcs11.so
 +
</syntaxhighlight>
 +
 
 +
Linux:
 +
<syntaxhighlight lang="shell">
 +
dfx identity new node-operator-hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
 +
</syntaxhighlight>
 +
 
 +
<br/>
 +
Get the principal.
 +
<syntaxhighlight lang="shell">
 +
$ NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
 +
$ echo $NODE_OPERATOR_PRINCIPAL
 +
 
 +
uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe
 +
</syntaxhighlight>
 +
 
 +
== Register your NP principal to the network ==
  
PIN:
+
Replace the <code>--proposer</code> argument value with your neuron ID from the NNS Frontend Dapp, <code>--node-provider-pid</code> with your NP principal that you got from the command <code>dfx --identity node-provider-hotkey identity get-principal</code>, and "My Company", with the name of the entity that will provide the nodes.
uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe</syntaxhighlight></li></ol>
+
 
</li></ol>
+
<syntaxhighlight lang="shell">
</li>
+
NODE_PROVIDER_NAME="My Company"
<li><p>Register your NP principal to the network</p>
+
NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
<p>Replace the <code>--proposer</code> argument value with your neuron ID from step 3.1.3., <code>--node-provider-pid</code> with your NP principal from step 3.5.2, and ‘My Company’, with the name of the entity that will provide the nodes.</p>
+
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
<syntaxhighlight lang="shell">NODE_PROVIDER_NAME="My Company"
 
 
./ic-admin \
 
./ic-admin \
 
         --nns-url https://nns.ic0.app \
 
         --nns-url https://nns.ic0.app \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
     propose-to-add-or-remove-node-provider add \
 
     propose-to-add-or-remove-node-provider add \
         --proposer 13419667327548602649 \
+
         --proposer $NEURON_ID \
         --title "Register '${NODE_PROVIDER_NAME}' node provider" \
+
         --proposal-title "Register a node provider '${NODE_PROVIDER_NAME}'" \
         --summary "Register a node provider for '${NODE_PROVIDER_NAME}'" \
+
         --summary "Register a node provider '${NODE_PROVIDER_NAME}'" \
         --node-provider-pid "fharn-5vyi2-4xb4a-64yyi-3jpmj-pga23-mxy25-d5uim-fqcro-eoefh-tae"</syntaxhighlight>
+
         --node-provider-pid "$NODE_PROVIDER_PRINCIPAL"
<p>Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.</p></li>
+
</syntaxhighlight>
<li><p>Ensure that your datacenter is registered in the network</p>
+
 
<ol style="list-style-type: decimal;">
+
Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it is executed before proceeding to next step.
<li><p>Search for your data center on https://dashboard.internetcomputer.org/centers. If you found the datacenter that’s hosting your nodes, remember its ID, and skip to step 7. Otherwise, proceed to the next step. [[File:dc_id.png|1024px]]</p></li>
+
 
<li><p>Create a data center record</p>
+
Ensure that your datacenter is registered in the network
<p>Replace the <code>--proposer</code> argument value with your neuron ID from step 3.1.3. and JSON fields from –data-centers-to-add argument and their corresponding values in --summary with:</p>
+
 
<p> <code>&quot;id&quot;</code></p>
+
Search for your data center on https://dashboard.internetcomputer.org/centers. If you found the datacenter that is hosting your nodes, remember its ID, and skip the following section. Otherwise, proceed with the registrion of a new DC. [[File:dc_id.png|1024px]]
<p>The ID should be combination of two letters representing a city that your datacenter is in, and an incrementing number. Search data center IDs on https://dashboard.internetcomputer.org, and find a combination of two letters and a number that’s not yet registered. <br>
+
 
 +
=== Create a data center record ===
 +
 
 +
Replace the <code>--proposer</code> argument value with your neuron ID from the NNS Frontend Dapp. Replace the JSON fields from <code>–data-centers-to-add</code> argument and their corresponding values in <code>--summary</code> with: <code>&quot;id&quot;</code>
 +
 
 +
The ID should be combination of two letters representing a city that your datacenter is in, and an incrementing number. Search data center IDs on https://dashboard.internetcomputer.org, and find a combination of two letters and a number that’s not yet registered.
 
[[File:dc_id.png|1024px]]
 
[[File:dc_id.png|1024px]]
</p>
 
<p> Examples:</p>
 
<ul>
 
<li>dl1 (Dallas, no IDs with “dl” prefix)</li>
 
<li>zh10 (Zurich, numbers 0-9 are already registered)</li></ul>
 
  
<p> <code>&quot;region&quot;</code></p>
+
<br/>
<p>Region represents the local region of a datacenter and is formulated as a three-part string divided by commas. The three parts making the string are continent, country code, and region, in the given order. [[File:datacenter_region.png|1024px]]</p>
+
Examples:
<p> Examples:</p>
+
* dl1 (Dallas, no IDs with “dl” prefix)
<ul>
+
* zh10 (Zurich, numbers 0-9 are already registered)
<li>North America,US,Florida</li>
+
 
<li>Europe,DE,Bavaria</li>
+
<code>&quot;region&quot;</code>
<li>Asia,SG,Singapore</li></ul>
+
 
 +
Region represents the local region of a datacenter and is formulated as a three-part string divided by commas. The three parts making the string are continent, country code, and region, in the given order. [[File:datacenter_region.png|1024px]]
 +
 
 +
Examples:
 +
* North America,US,Florida
 +
* Europe,DE,Bavaria
 +
* Asia,SG,Singapore
 +
 
 +
<code>&quot;owner&quot;</code> The entity that provides your datacenter facilities. Search https://dashboard.internetcomputer.org for existing data center providers. If there’s match, make sure you use the same exact some name for your datacenter. Otherwise, name the data center owner to your best knowledge. [[File:datacenter_owner.png|1024px]]
 +
 
 +
<code>&quot;gps&quot;</code>
 +
Find your datacenter on https://www.google.com/maps/. Right click on location, and select the GPS coordinates (first item in the menu) in order to copy them.
  
<p> <code>&quot;owner&quot;</code> The entity that provides your datacenter facilities. Search https://dashboard.internetcomputer.org for existing data center providers. If there’s match, make sure you use the same exact some name for your datacenter. Otherwise, name the data center owner to your best knowledge. [[File:datacenter_owner.png|1024px]]</p>
 
<p> <code>&quot;gps&quot;</code></p>
 
<p>Find your datacenter on https://www.google.com/maps/. Right click on location, and select the GPS coordinates (first item in the menu) in order to copy them.</p>
 
 
[[File:maps.png|480px|alt=Getting GPS coordinates|Getting GPS coordinates]]
 
[[File:maps.png|480px|alt=Getting GPS coordinates|Getting GPS coordinates]]
  
<syntaxhighlight lang="shell">$ ./ic-admin \
+
<syntaxhighlight lang="shell">
 +
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
 +
$ ./ic-admin \
 
         --nns-url https://nns.ic0.app \
 
         --nns-url https://nns.ic0.app \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
Line 191: Line 248:
 
         --summary "Register a Flexential datacenter as dl1 in North America,US,Texas" \
 
         --summary "Register a Flexential datacenter as dl1 in North America,US,Texas" \
 
         --skip-confirmation \
 
         --skip-confirmation \
         --proposer 13419667327548602649 \
+
         --proposer $NEURON_ID \
 
         --data-centers-to-add '{
 
         --data-centers-to-add '{
 
             "id": "dl1",
 
             "id": "dl1",
Line 199: Line 256:
 
                 33.00803, -96.66614
 
                 33.00803, -96.66614
 
             ]
 
             ]
         }'</syntaxhighlight>
+
         }'
<p>Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.</p></li></ol>
+
</syntaxhighlight>
</li>
+
 
<li><p>Create a node operator record</p>
+
Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it's executed before proceeding to next step.
<p> Replace the <code>PROPOSER</code> variable value with your neuron ID from step 3.1.4., <code>DC_ID</code> variable value with id of your datacenter from step 6, <code>NODE_ALLOWANCE</code> variable value with number of nodes you're providing, <code>NODE_OPERATOR_PRINCIPAL</code> variable value with the principal from step 4.3.2, <code>NODE_PROVIDER_PRINCIPAL</code> variable value with your node provider principal from step 3.5.2., and <code>NODE_PROVIDER_NAME</code> variable value with the name of the entity that will provide the nodes.</p>
+
 
<syntaxhighlight lang="shell">PROPOSER=13419667327548602649
+
 
NODE_OPERATOR_PRINCIPAL=uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe
+
== Create a node operator record ==
NODE_PROVIDER_PRINCIPAL=fharn-5vyi2-4xb4a-64yyi-3jpmj-pga23-mxy25-d5uim-fqcro-eoefh-tae
+
 
 +
Replace the <code>NEURON_ID</code> variable value with your neuron ID obtained from the NNS frontend dapp.<br>
 +
Replace the <code>DC_ID</code> variable value with id of your datacenter.<br>
 +
Replace the <code>NODE_ALLOWANCE</code> variable value with number of nodes you are providing.<br>
 +
 
 +
<syntaxhighlight lang="shell">
 +
NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
 +
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
 +
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
 
NODE_PROVIDER_NAME="My Company"
 
NODE_PROVIDER_NAME="My Company"
 
NODE_ALLOWANCE=28
 
NODE_ALLOWANCE=28
Line 217: Line 282:
 
         $NODE_PROVIDER_PRINCIPAL \
 
         $NODE_PROVIDER_PRINCIPAL \
 
         --summary "Node provider '$NODE_PROVIDER_NAME' is adding $NODE_ALLOWANCE nodes in the $DC_ID data center" \
 
         --summary "Node provider '$NODE_PROVIDER_NAME' is adding $NODE_ALLOWANCE nodes in the $DC_ID data center" \
         --proposer $PROPOSER \
+
         --proposer $NEURON_ID \
 
         --node-operator-principal-id $NODE_OPERATOR_PRINCIPAL \
 
         --node-operator-principal-id $NODE_OPERATOR_PRINCIPAL \
 
         --node-allowance $NODE_ALLOWANCE \
 
         --node-allowance $NODE_ALLOWANCE \
Line 223: Line 288:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<p>Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.</p></li>
+
Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it's executed before proceeding to next step.
<li><p>Configure firewall rules</p>
+
 
<p>Replace the <code>PROPOSER</code> variable value with your neuron ID from step 3.1.3., <code>NODES_IPV6_PREFIX</code> variable value with IPv6 prefix of the network of your nodes, <code>NODE_OPERATOR_PRINCIPAL</code> variable value with the principal from step 4.3.2.</p>
+
== Configure firewall rules ==
<syntaxhighlight lang="shell">PROPOSER=13419667327548602649
+
 
 +
'''Note:''' Until we provide a better way to configure the firewall rules, feel free to reach out to us e.g. on the public forum and ask for assistance in submitting proposal for the firewall configuration.
 +
 
 +
Replace the <code>NEURON_ID</code> variable value with your neuron ID obtained from the NNS frontend dapp.<br>
 +
Replace the <code>NODES_IPV6_PREFIX</code> variable value with IPv6 prefix of the network of your nodes.<br>  
 +
 
 +
<syntaxhighlight lang="shell">
 +
NEURON_ID=13419667327548602649 # Coming from the NNS FE dapp https://nns.ic0.app/
 
NODES_IPV6_PREFIX=2001:4d78:700:10a::/64
 
NODES_IPV6_PREFIX=2001:4d78:700:10a::/64
NODE_OPERATOR_PRINCIPAL=uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe
+
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
  
 
NFTABLES=$(./ic-admin --nns-url "https://nns.ic0.app" get-firewall-config | grep "firewall_config" | cut -d':' -f2 | cut -c2- | rev | cut -c2- | rev | xargs printf)
 
NFTABLES=$(./ic-admin --nns-url "https://nns.ic0.app" get-firewall-config | grep "firewall_config" | cut -d':' -f2 | cut -c2- | rev | cut -c2- | rev | xargs printf)
Line 237: Line 309:
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
     propose-to-set-firewall-config \
 
     propose-to-set-firewall-config \
         --proposer $PROPOSER \
+
         --proposer $NEURON_ID \
 
         --summary "Set the firewall rules for node operator ${NODE_OPERATOR_PRINCIPAL}" \
 
         --summary "Set the firewall rules for node operator ${NODE_OPERATOR_PRINCIPAL}" \
 
         <(echo $NFTABLES) \
 
         <(echo $NFTABLES) \
 
         - \
 
         - \
         $IPV6_PREFIXES</syntaxhighlight>
+
         $IPV6_PREFIXES
<p>Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.</p></li>
+
</syntaxhighlight>
<li><p>Onboard nodes</p>
+
 
<ol style="list-style-type: decimal;">
+
Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.
<li><p>Follow the instructions to onboard new nodes.</p></li>
+
 
<ol style="list-style-type: decimal;">
+
== Onboard nodes ==
<li><p>[https://wiki.internetcomputer.org/wiki/IC_OS_Installation_Runbook_-_PowerEdge_R6525 For Dell Servers]</p></li>
+
 
<li><p>[https://wiki.internetcomputer.org/wiki/IC_OS_Installation_Runbook_-_Supermicro For Supermicro Servers]</p></li>
+
Follow the instructions to onboard new nodes.
</ol>
+
* [https://wiki.internetcomputer.org/wiki/IC_OS_Installation_Runbook_-_PowerEdge_R6525 For Dell Servers]
<li><p>Verify that all the nodes were successfully onboarded by checking their status on the dashboard is set to either “Up” or “Unassigned”. You can find all your nodes by entering your node provider principal from step 3.5.2. in the search bar. [[File:onboarded_nodes.png|1024px|onboarded nodes]]</p></li></ol>
+
* [https://wiki.internetcomputer.org/wiki/IC_OS_Installation_Runbook_-_Supermicro For Supermicro Servers]
</li>
+
 
<li><p>Set the reward configuration for your nodes</p>
+
Verify that all the nodes were successfully onboarded by checking their status on the dashboard is set to either “Up” or “Unassigned”, or by checking the output from <code>ic-admin get-topology</code> command.
<p>Replace the <code>--proposer</code> argument value with your neuron ID from step 3.1.3., <code>--node-operator-id</code> argument with the principal from step 4.3.2, <code>&lt;NODE_X_PRINCIPAL&gt;</code> placeholders with your node principals from step 9.2., and <code>&lt;number-of-nodes&gt;</code> placeholder with the number of nodes you listed. Note: The current maximum number of nodes per node operator are 28.</p>
+
 
<pre>$ ./ic-admin \
+
The internal dashboard can be searched by your provider principal.
 +
 
 +
[[File:onboarded_nodes.png|1024px|onboarded nodes]]
 +
 
 +
 
 +
== Set the reward configuration for your nodes ==
 +
 
 +
Replace the <code>NEURON_ID</code> variable value with your neuron ID obtained from the NNS frontend dapp.<br>
 +
Replace the <code><NODE_X_PRINCIPAL></code> placeholders with your node principals.<br>
 +
Replace the <code><number-of-nodes></code> placeholder with the number of nodes you listed.
 +
 
 +
Note: The current maximum number of nodes per node operator are 28.</p>
 +
 
 +
<syntaxhighlight lang="shell">
 +
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
 +
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
 +
 
 +
./ic-admin \
 
         --nns-url https://nns.ic0.app \
 
         --nns-url https://nns.ic0.app \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
         -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
 
     propose-to-update-node-operator-config \
 
     propose-to-update-node-operator-config \
         --proposer 13419667327548602649 \
+
         --proposer $NEURON_ID \
         --summary &quot;Set rewards for the following nodes:
+
         --summary "Set rewards for the following nodes:
  
         * &lt;NODE_1_PRINCIPAL&gt;
+
         * <NODE_1_PRINCIPAL>
         * &lt;NODE_2_PRINCIPAL&gt;
+
         * <NODE_2_PRINCIPAL>
 
         * ...
 
         * ...
         &quot; \
+
         " \
         --node-operator-id uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe \
+
         --node-operator-id $NODE_OPERATOR_PRINCIPAL \
         --rewardable-nodes '{&quot;type0&quot;: &lt;number-of-nodes&gt;}'</pre></li></ol>
+
         --rewardable-nodes '{"type0": <number-of-nodes>}'
 +
</syntaxhighlight>

Revision as of 20:10, 9 May 2022

Becoming a Node Provider

To participate in the Internet Computer network as a Node Provider and receive the rewards for supporting the network.

Requirements

  • Node Hardware
  • Rack space with a 10GB connectivity, RJ45 terminated on the nodes
  • Public /29 IPv4 range and /64 IPv6 range
  • Hardware wallet
  • NitroKey HSM
  • 11 ICP (10 of for proposal deposit)
  • Basic understanding of neurons, staking, and governance proposals. For instance, understanding what it means to stake a neuron for 8 years.
  • The technical knowledge to understand some minor steps that are not explicitly mentioned in these instructions. For instance, when to insert an HSM.

Install ic-admin

ic-admin is the tool used to create and submit NNS proposals.

MacOS

curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/nix-release/x86_64-darwin/ic-admin.gz" -o - | gunzip > ./ic-admin
chmod +x ./ic-admin

Verify the binary

diff <(shasum -a 256 ./ic-admin | cut -d' ' -f1) <(echo c18d55b3961bcca6d0bfa0a7e7d9a4e6d4daf74ced64b0767db13d53c1f16cb4) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"

Verify that the version is 1.0 or greater

./ic-admin --version
ic-admin 1.0

Linux

NOTE: The instructions below have been tested with the Ubuntu 20.04 release.

curl "https://download.dfinity.systems/blessed/ic/0ef2aebde4ff735a1a93efa342dcf966b6df5061/release/ic-admin.gz" -o - | gunzip > ./ic-admin
$ chmod +x ./ic-admin

Verify the binary

diff <(shasum -a 256 ./ic-admin | cut -d' ' -f1) <(echo c4c93df7b015742ecadf62d44f8287ba3ee960f98832fc5a0c648bfd9acf834e) && echo "ic-admin checksum matches" || echo "***ERROR***: ic-admin checksum does not match"

Verify that the version is 1.0 or greater

./ic-admin --version
ic-admin 1.0

Install dfx

dfx allows generating a neuron hotkey, among other things

$ sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"

Verify that the version is 0.8.1 or greater

$ dfx --version
dfx 0.8.1

Create a wallet hotkey principal

$ dfx identity new node-provider-hotkey

Creating identity: "node-provider-hotkey".
Created identity: "node-provider-hotkey".

$ NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
$ echo $NODE_PROVIDER_PRINCIPAL
fharn-5vyi2-4xb4a-64yyi-3jpmj-pga23-mxy25-d5uim-fqcro-eoefh-tae

Create and Manage Neuron via NNS Frontend Dapp and Internet Identity

  1. Setup your hardware wallet: https://medium.com/dfinity/integrating-ledger-nano-with-the-nns-front-end-dapp-user-manual-9c5600925e16
  2. Send at least 11 ICPs to the hardware wallet address.
  3. Navigate to Neurons tab and create a Neuron by staking 11 ICP from your hardware wallet, and confirming the transaction on your hardware wallet.
    stake neuron
  4. After the neuron has been created successfully, confirm to add NNS Dapp as hotkey in the dialogue and on your hardware wallet, and close the dialog after the action completes.
    neuron id
  5. Set the dissolve delay to at least 6 months, and confirm the choice in the dialogue and on your hardware wallet. After the action completes, you can close the "Follow Neurons".
    neuron id
  6. You will now see a neuron listed with its ID. You will need the neuron ID in the next steps to place the necessary proposals.
    Neuron id.png

Add a hotkey

  1. Select the neuron you just created to open neuron management view and press “Add hotkey” button.
    Hotkey 1.png
  2. A dialog will pop up where you can enter the principal you generated in step 2 (output from command dfx --identity node-provider-hotkey identity get-principal). Press the confirm button and confirm the transactions on your hardware wallet.
    Hotkey 2.png
  3. Get the hardware principal id

Navigate back to ICP page and select your hardware wallet account. Node provider principal 1.png

Here you can get your node provider principal by clicking on the copy icon after the principal id. You'll need it in the next steps. Node provider principal 2.png

Configure your HSM

It's first necessary to install the necessary tools.

MacOS

  1. Download this OpenSC binary: https://github.com/OpenSC/OpenSC/releases/download/0.22.0/OpenSC-0.22.0.dmg
  2. Double click the DMG image that you downloaded and then double click the OpenSC PKG file.
  3. If your system doesn't allow the installation software from an unidentified developer please follow these steps or contact your system administrator:
    Choose the Apple menu > System Preferences > click Security and Privacy.
    Click the lock Icon to unlock it, then enter an administrator name and password.
    Ensure that you're on the tab named “General”.
    You should see the OpenSC app and you should be able to enable its installation by choosing “Open anyway”.
  4. Click continue and install until the installation is complete.

Linux

NOTE: The instructions below have been tested with the Ubuntu 20.04 release.

  1. Install pcscd and opensc
    sudo apt install pcscd opensc
    

Setup the HSM

Initialize the HSM.

sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 358138

Change the HSM so pin.
WARNING: The new HSM so pin must have 16 hexadecimal digits. This is not very well known, and some HSM users have lost access to a Nitrokey HSM because they tried using regular characters and the command below accepted it.

pkcs11-tool --login --login-type so --so-pin 3537363231383830 --change-pin

Create a keypair on the HSM. Enter the default pin 358138 when prompted.
Note: Before initializing the HSM key please refer to the Nitrokey HSM documentation if you wish to create a backup. Creating a backup of the HSM device is NOT possible after the key has already been created.

pkcs11-tool -k --key-type EC:prime256v1 --login -d 01

Get the node operator principal from the HSM

Configure dfx identity (skip this step if you already configured it for an other HSM).


Note: Depending on your installation, the path to the --hsm-pkcs11-lib-path might be different on your platform. You can locate the correct path with the following command:

find / -name opensc-pkcs11.so 2> /dev/null

MacOS:

dfx identity new node-operator-hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /Library/OpenSC/lib/opensc-pkcs11.so

Linux:

dfx identity new node-operator-hsm --hsm-key-id 01 --hsm-pkcs11-lib-path /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so


Get the principal.

$ NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
$ echo $NODE_OPERATOR_PRINCIPAL

uqquy-76uhn-2mys5-xa3j3-oynfv-rrorc-pygn7-dldbd-4dr6n-lbhz7-zqe

Register your NP principal to the network

Replace the --proposer argument value with your neuron ID from the NNS Frontend Dapp, --node-provider-pid with your NP principal that you got from the command dfx --identity node-provider-hotkey identity get-principal, and "My Company", with the name of the entity that will provide the nodes.

NODE_PROVIDER_NAME="My Company"
NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
./ic-admin \
        --nns-url https://nns.ic0.app \
        -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
    propose-to-add-or-remove-node-provider add \
        --proposer $NEURON_ID \
        --proposal-title "Register a node provider '${NODE_PROVIDER_NAME}'" \
        --summary "Register a node provider '${NODE_PROVIDER_NAME}'" \
        --node-provider-pid "$NODE_PROVIDER_PRINCIPAL"

Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it is executed before proceeding to next step.

Ensure that your datacenter is registered in the network

Search for your data center on https://dashboard.internetcomputer.org/centers. If you found the datacenter that is hosting your nodes, remember its ID, and skip the following section. Otherwise, proceed with the registrion of a new DC. Dc id.png

Create a data center record

Replace the --proposer argument value with your neuron ID from the NNS Frontend Dapp. Replace the JSON fields from –data-centers-to-add argument and their corresponding values in --summary with: "id"

The ID should be combination of two letters representing a city that your datacenter is in, and an incrementing number. Search data center IDs on https://dashboard.internetcomputer.org, and find a combination of two letters and a number that’s not yet registered. Dc id.png


Examples:

  • dl1 (Dallas, no IDs with “dl” prefix)
  • zh10 (Zurich, numbers 0-9 are already registered)

"region"

Region represents the local region of a datacenter and is formulated as a three-part string divided by commas. The three parts making the string are continent, country code, and region, in the given order. Datacenter region.png

Examples:

  • North America,US,Florida
  • Europe,DE,Bavaria
  • Asia,SG,Singapore

"owner" The entity that provides your datacenter facilities. Search https://dashboard.internetcomputer.org for existing data center providers. If there’s match, make sure you use the same exact some name for your datacenter. Otherwise, name the data center owner to your best knowledge. Datacenter owner.png

"gps" Find your datacenter on https://www.google.com/maps/. Right click on location, and select the GPS coordinates (first item in the menu) in order to copy them.

Getting GPS coordinates

NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
$ ./ic-admin \
        --nns-url https://nns.ic0.app \
        -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
    propose-to-add-or-remove-data-centers \
        --summary "Register a Flexential datacenter as dl1 in North America,US,Texas" \
        --skip-confirmation \
        --proposer $NEURON_ID \
        --data-centers-to-add '{
            "id": "dl1",
            "region": "North America,US,Texas",
            "owner": "Flexential",
            "gps": [
                33.00803, -96.66614
            ]
        }'

Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it's executed before proceeding to next step.


Create a node operator record

Replace the NEURON_ID variable value with your neuron ID obtained from the NNS frontend dapp.
Replace the DC_ID variable value with id of your datacenter.
Replace the NODE_ALLOWANCE variable value with number of nodes you are providing.

NODE_PROVIDER_PRINCIPAL=$(dfx --identity node-provider-hotkey identity get-principal)
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)
NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
NODE_PROVIDER_NAME="My Company"
NODE_ALLOWANCE=28
DC_ID=dl1

./ic-admin \
        --nns-url https://nns.ic0.app \
        -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
    propose-to-add-node-operator \
        $NODE_PROVIDER_PRINCIPAL \
        --summary "Node provider '$NODE_PROVIDER_NAME' is adding $NODE_ALLOWANCE nodes in the $DC_ID data center" \
        --proposer $NEURON_ID \
        --node-operator-principal-id $NODE_OPERATOR_PRINCIPAL \
        --node-allowance $NODE_ALLOWANCE \
        --dc-id $DC_ID

Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it's executed before proceeding to next step.

Configure firewall rules

Note: Until we provide a better way to configure the firewall rules, feel free to reach out to us e.g. on the public forum and ask for assistance in submitting proposal for the firewall configuration.

Replace the NEURON_ID variable value with your neuron ID obtained from the NNS frontend dapp.
Replace the NODES_IPV6_PREFIX variable value with IPv6 prefix of the network of your nodes.

NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
NODES_IPV6_PREFIX=2001:4d78:700:10a::/64
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)

NFTABLES=$(./ic-admin --nns-url "https://nns.ic0.app" get-firewall-config | grep "firewall_config" | cut -d':' -f2 | cut -c2- | rev | cut -c2- | rev | xargs printf)
IPV6_PREFIXES=$(./ic-admin --nns-url "https://nns.ic0.app" get-firewall-config | tr -d '\n' | grep -oE 'ipv6_prefixes: \[[^]]+' | cut -d'[' -f2 | tr -d '"' | tr -d ' ' | tr -d '\n'; echo $NODES_IPV6_PREFIX)

./ic-admin \
        --nns-url https://nns.ic0.app \
        -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
    propose-to-set-firewall-config \
        --proposer $NEURON_ID \
        --summary "Set the firewall rules for node operator ${NODE_OPERATOR_PRINCIPAL}" \
        <(echo $NFTABLES) \
        - \
        $IPV6_PREFIXES

Find the proposal on https://dashboard.internetcomputer.org/governance and wait until it’s executed before proceeding to next step.

Onboard nodes

Follow the instructions to onboard new nodes.

Verify that all the nodes were successfully onboarded by checking their status on the dashboard is set to either “Up” or “Unassigned”, or by checking the output from ic-admin get-topology command.

The internal dashboard can be searched by your provider principal.

onboarded nodes


Set the reward configuration for your nodes

Replace the NEURON_ID variable value with your neuron ID obtained from the NNS frontend dapp.
Replace the <NODE_X_PRINCIPAL> placeholders with your node principals.
Replace the <number-of-nodes> placeholder with the number of nodes you listed.

Note: The current maximum number of nodes per node operator are 28.

NEURON_ID=13419667327548602649  # Coming from the NNS FE dapp https://nns.ic0.app/
NODE_OPERATOR_PRINCIPAL=$(DFX_HSM_PIN=358138 dfx --identity node-operator-hsm identity get-principal)

./ic-admin \
        --nns-url https://nns.ic0.app \
        -s ~/.config/dfx/identity/node-provider-hotkey/identity.pem \
    propose-to-update-node-operator-config \
        --proposer $NEURON_ID \
        --summary "Set rewards for the following nodes:

        * <NODE_1_PRINCIPAL>
        * <NODE_2_PRINCIPAL>
        * ...
        " \
        --node-operator-id $NODE_OPERATOR_PRINCIPAL \
        --rewardable-nodes '{"type0": <number-of-nodes>}'