<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ruediger.birkner</id>
	<title>Internet Computer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ruediger.birkner"/>
	<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/wiki/Special:Contributions/Ruediger.birkner"/>
	<updated>2026-05-01T12:22:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Manual_Node_Recovery_Guide&amp;diff=8686</id>
		<title>Manual Node Recovery Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Manual_Node_Recovery_Guide&amp;diff=8686"/>
		<updated>2026-01-05T09:14:10Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook describes what steps node providers need to take during a manual node recovery. &lt;br /&gt;
&lt;br /&gt;
=== Security warning ===&lt;br /&gt;
⚠️⚠️⚠️ Don’t get tricked into compromising your nodes. Only complete a manual node recovery if all of the following conditions are met: &lt;br /&gt;
&lt;br /&gt;
* A subnet recovery is announced on the Internet Computer Status Page&lt;br /&gt;
* The DFINITY team reached out on the dedicated Matrix channel #ic-node-providers-incident-response:matrix.org. &lt;br /&gt;
** Only the DFINITY team is able to send messages on this channel. In case of an incident, permissions are adapted so that everyone can send messages. &lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
* The recovery coordinator should have communicated with you the following:&lt;br /&gt;
** The recovery input parameters (used in the &amp;quot;Input recovery parameters&amp;quot; step):&lt;br /&gt;
*** The &amp;lt;code&amp;gt;VERSION&amp;lt;/code&amp;gt;: the 40-character commit ID of the recovery-GuestOS update image&lt;br /&gt;
***The &amp;lt;code&amp;gt;RECOVERY-HASH-PREFIX&amp;lt;/code&amp;gt;: the 6-character hash-prefix of the recovery artifacts&lt;br /&gt;
** The recovery full-hashes (used in the &amp;quot;Confirm calculated full-hashes&amp;quot; step)&lt;br /&gt;
*** The &amp;lt;code&amp;gt;VERSION-HASH&amp;lt;/code&amp;gt;: 64-character hash of the recovery-GuestOS update image&lt;br /&gt;
*** The &amp;lt;code&amp;gt;RECOVERY-HASH&amp;lt;/code&amp;gt;: 64-character hash of the recovery artifacts&lt;br /&gt;
** The node(s): which specific nodes managed by the NP/NO are part of the target subnet.&lt;br /&gt;
&lt;br /&gt;
*Obtain console access to all nodes you run that are part of the target subnet.&lt;br /&gt;
**Note that the recovery can be completed from a physical console &#039;&#039;&#039;or from the node&#039;s remote BMC virtual console view.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Recovery Steps==&lt;br /&gt;
For each node to recover, you should perform the following process.&lt;br /&gt;
&lt;br /&gt;
===Obtain console access===&lt;br /&gt;
Again, note that the recovery can be completed from a physical console &#039;&#039;&#039;or from the node&#039;s remote BMC virtual console view.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Manual recovery .png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
You should see the &amp;lt;code&amp;gt;limited-console&amp;gt;&amp;lt;/code&amp;gt; prompt. Type &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt; to see the full list of limited-console commands.&lt;br /&gt;
&lt;br /&gt;
===Initiate manual recovery TUI===&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;manual-recovery&amp;lt;/code&amp;gt; to initiate the manual recovery TUI.&lt;br /&gt;
&lt;br /&gt;
[[File:Manual recovery 1.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
You should then be taken to the manual recovery text-user-interface:&lt;br /&gt;
&lt;br /&gt;
[[File:New-manual-recovery-console-1.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
If you fail to enter the Manual Recovery TUI, see the [[Manual Node Recovery Guide#.E2.9A.A0.EF.B8.8F_Manual_Recovery_Fallback_.E2.9A.A0.EF.B8.8F|Manual Recovery Fallback]]&lt;br /&gt;
&lt;br /&gt;
===Input recovery parameters===&lt;br /&gt;
&lt;br /&gt;
[[File:Recovery-TUI-1.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Input the &amp;lt;code&amp;gt;VERSION&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RECOVERY-HASH-PREFIX&amp;lt;/code&amp;gt; provided by the recovery coordinator&lt;br /&gt;
&lt;br /&gt;
Please take great care to type in the characters precisely. If a single character is wrong, the recovery will not succeed and you will have to restart. &lt;br /&gt;
&lt;br /&gt;
Note: certain BMCs offer a Virtual Clipboard within the Console Controls to paste text to the console, which you may find useful.&lt;br /&gt;
&lt;br /&gt;
[[File:Recovery-TUI-2.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===Confirm calculated full-hashes===&lt;br /&gt;
&lt;br /&gt;
[[File:Recovery TUI confirm parameters.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
⚠️⚠️⚠️ The Manual Recovery TUI will then calculate and display the &amp;lt;code&amp;gt;VERSION-HASH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RECOVERY-HASH&amp;lt;/code&amp;gt; full-hashes from the downloaded artifacts. Please verify that these calculated full-hashes hashes &#039;&#039;&#039;exactly&#039;&#039;&#039; match those provided by the recovery coordinator. &lt;br /&gt;
&lt;br /&gt;
===Monitor the recovery process===&lt;br /&gt;
&lt;br /&gt;
Once you have initiated the recovery process, monitor the recovery logs. &lt;br /&gt;
&lt;br /&gt;
[[File:Manual recovery 6.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
After ~30 seconds, you should see the log:&lt;br /&gt;
&lt;br /&gt;
 ========================================================================&lt;br /&gt;
 SUCCESS: Recovery completed successfully!&lt;br /&gt;
 ========================================================================&lt;br /&gt;
&lt;br /&gt;
[[File:Manual recovery 7.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
The system should then output standard boot logs:&lt;br /&gt;
&lt;br /&gt;
[[File:Manual recovery 8.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have successfully completed the manual node recovery!&lt;br /&gt;
&lt;br /&gt;
Note that if you reach the following recovery error page, this is almost certainly a result of incorrectly inputting the recovery parameters:&lt;br /&gt;
&lt;br /&gt;
[[File:Recovery-TUI-3.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
If you reach the recovery error page, do not worry. Hit &amp;lt;code&amp;gt;enter&amp;lt;/code&amp;gt; and return to the “Initiate manual recovery” step and try again. If errors still persist, please contact the recovery coordinator in the Matrix channel and post a screenshot of your recovery error page&lt;br /&gt;
&lt;br /&gt;
===Notify of a successful recovery===&lt;br /&gt;
&lt;br /&gt;
Send a message in the Matrix channel confirming that you have successfully completed recovery.&lt;br /&gt;
&lt;br /&gt;
==Wait for recovery confirmation==&lt;br /&gt;
&lt;br /&gt;
Once the recovery process on your node is complete and you have notified the Matrix channel, continue to monitor the Matrix until the subnet is back online and the recovery is complete.&lt;br /&gt;
&lt;br /&gt;
==⚠️ Manual Recovery Fallback ⚠️==&lt;br /&gt;
A manual recovery fallback is available if the manual recovery TUI fails to render.&lt;br /&gt;
&lt;br /&gt;
=== Enter the rbash-console ===&lt;br /&gt;
Type &amp;lt;code&amp;gt;rbash-console&amp;lt;/code&amp;gt; to enter the rbash-console&lt;br /&gt;
&lt;br /&gt;
[[File:Rbash-console.png|680px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===Run the manual recovery fallback command:===&lt;br /&gt;
&amp;lt;code&amp;gt;sudo /opt/ic/bin/guestos-recovery-launcher.sh mode=run version=&amp;lt;VERSION&amp;gt; recovery-hash-prefix=&amp;lt;RECOVERY-HASH-PREFIX&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may then resume the recovery instructions from the [[Manual Node Recovery Guide#Monitor_the_recovery_process|Monitor the recovery process]] step.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Provider_Node_Swapping_Guide&amp;diff=8653</id>
		<title>Node Provider Node Swapping Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Provider_Node_Swapping_Guide&amp;diff=8653"/>
		<updated>2025-12-01T18:39:38Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Fixed some typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===🚧 &#039;&#039;&#039;Node swapping will be enabled starting from 01.12.2025. for all operators on non-system subnets&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
Node providers run nodes on the Internet Computer and receive rewards depending on how well their nodes perform. Only nodes that contribute to the overall performance of the node provider are the nodes that are part of a subnet. Those nodes are called &#039;&#039;assigned&#039;&#039;. All other nodes that are not  part of any subnet and are not utilized don&#039;t contribute to the overall performance of the node provider. Those nodes are called &#039;&#039;unassigned&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
It is in the node providers best interest to keep the &#039;&#039;assigned&#039;&#039; nodes as well maintained and as operational as possible since that is how they can maximize their rewards. To achieve that over time, the node providers can utilize the &#039;&#039;&#039;node swapping&#039;&#039;&#039; feature.  &lt;br /&gt;
&lt;br /&gt;
==Node swapping==&lt;br /&gt;
Node swapping feature is used to &#039;&#039;swap&#039;&#039; an &#039;&#039;assigned&#039;&#039; node for an &#039;&#039;unassigned&#039;&#039; node owned by the same &#039;&#039;node operator&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
A node provider notices that one of his nodes is performing poorly. In order to maximize their rewards, they want to act quickly and remove the &#039;&#039;assigned&#039;&#039; node from a subnet for a different &#039;&#039;unassigned&#039;&#039; node &#039;&#039;&#039;within the same data center&#039;&#039;&#039;. They use the &#039;&#039;&#039;node swapping feature&#039;&#039;&#039; to do that without &#039;&#039;&#039;any proposals or governance&#039;&#039;&#039;. After performing the swap they can perform maintenance on the node and see why it failed in the first place. &lt;br /&gt;
&lt;br /&gt;
==Performing a node swap==&lt;br /&gt;
To perform a node swap one has to follow the following steps:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT&#039;&#039;&#039;: if the node is turned off before it gracefully leaves the subnet it will appear as malicious to the consensus which can result in rewards penalty!&lt;br /&gt;
&lt;br /&gt;
#Find the principal ID of an &#039;&#039;assigned&#039;&#039; node that should be removed from a subnet. To do that one can use various tools, but for the sake of this example we will show examples from [https://dashboard.internetcomputer.org/ the public dashboard].[[File:Node provider dead node part of a subnet.png|left|frameless|1000x1000px|Degraded node with its node ID and health status]]&lt;br /&gt;
#Find the principal ID of an &#039;&#039;unassigned&#039;&#039; node that should be added to a subnet in place of an &#039;&#039;assigned&#039;&#039; node picked in the previous step.  To do that one can click on the data center (below the &#039;&#039;&#039;DC ID&#039;&#039;&#039; &amp;quot;to1&amp;quot; for this example) of the node from the previous step which will take them to the view which contains all the node machines from the same data center. From there, pick the one that isn&#039;t &#039;&#039;assigned&#039;&#039; to any subnet (the &#039;&#039;&#039;subnet ID&#039;&#039;&#039; column should contain a &#039;-&#039;).[[File:Unassigned nodes in the same data center.png|left|frameless|1111x1111px]]&lt;br /&gt;
#Using ic-admin utility to perform a node swap:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Uncomment this if the node operator identity is behind a private key file&lt;br /&gt;
#AUTH=(&lt;br /&gt;
# &amp;quot;--secret-key-pem&amp;quot;&lt;br /&gt;
# &amp;lt;path-to-key-pem&amp;gt;&lt;br /&gt;
#)&lt;br /&gt;
&lt;br /&gt;
# Uncomment this if node operator identity is behind an hsm&lt;br /&gt;
#AUTH=(&lt;br /&gt;
# &amp;quot;--use-hsm&amp;quot;&lt;br /&gt;
# &amp;quot;--slot&amp;quot;&lt;br /&gt;
# &amp;lt;hsm-key-slot&amp;gt;&lt;br /&gt;
# &amp;quot;--key-id&amp;quot;&lt;br /&gt;
# &amp;lt;hsm-key-id&amp;gt;&lt;br /&gt;
# &amp;quot;--pin&amp;quot;&lt;br /&gt;
# &amp;lt;hsm-pin&amp;gt;&lt;br /&gt;
#)&lt;br /&gt;
&lt;br /&gt;
ic-admin --nns-urls https://ic0.app ${AUTH[@]} swap-node-in-subnet-directly \&lt;br /&gt;
    --old-node-id &amp;lt;principal-from-step-1&amp;gt; \&lt;br /&gt;
    --new-node-id &amp;lt;principal-from-step-2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#After the response from the call is successful the node doesn&#039;t leave the subnet immediately. There is &#039;&#039;&#039;graceful leaving period&#039;&#039;&#039; that needs to be awaited. It takes around 15-20 minutes depending on the subnet. If the logs of the node are observed through the BMC console there are two messages that need to show in order for the node to completely leave the subnet &#039;&#039;gracefully&#039;&#039;. The first log that indicates that the node noticed that the swapping was requested looks like the following:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Node started leaving subnet &amp;lt;subnet-id&amp;gt;.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After some time the node will show the following log which indicates it left the subnet:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Node gracefully left a subnet &amp;lt;subnet-id&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#After the second log appears it is safe to turn off the node and proceed to do maintenance.&lt;br /&gt;
&lt;br /&gt;
== Limitations and constraints==&lt;br /&gt;
To ensure fair and safe use of the swapping feature there are some limitations and constraints about the usage of the feature that need to be shared. &lt;br /&gt;
&lt;br /&gt;
=====Ownership and locality constraints =====&lt;br /&gt;
A node provider &#039;&#039;&#039;can&#039;&#039;&#039; only perform a swap of two nodes if and only if the following &#039;&#039;locality&#039;&#039; constraints are met:&lt;br /&gt;
&lt;br /&gt;
#The &#039;&#039;old node&#039;&#039; is an &#039;&#039;assigned&#039;&#039; node (it is a part of a subnet) and the &#039;&#039;new node&#039;&#039; is an &#039;&#039;unassigned&#039;&#039; node (it isn&#039;t a part of any subnet).&lt;br /&gt;
#Both &#039;&#039;old&#039;&#039; and &#039;&#039;new&#039;&#039; nodes are owned by the same &#039;&#039;&#039;node provider&#039;&#039;&#039; and are located in the same &#039;&#039;&#039;data center&#039;&#039;&#039;. Furthermore they have to be owned by the same &#039;&#039;&#039;node operator.&#039;&#039;&#039; This is needed to ensure that the &#039;&#039;decentralization&#039;&#039; doesn&#039;t change when the swaps are performed.&lt;br /&gt;
&lt;br /&gt;
=====Rate limiting constraints=====&lt;br /&gt;
A node provider &#039;&#039;&#039;can&#039;&#039;&#039; only perform a swap of two nodes if and only if the following &#039;&#039;rate limiting&#039;&#039; constraints are met:&lt;br /&gt;
&lt;br /&gt;
# The &#039;&#039;&#039;subnet&#039;&#039;&#039; which the &#039;&#039;old&#039;&#039; node is a part of hasn&#039;t had a swap in the last &#039;&#039;&#039;4 hours&#039;&#039;&#039; - this limit is here to protect the subnet from losing its state from too many swaps happening at the same time.&lt;br /&gt;
#The &#039;&#039;&#039;node provider&#039;&#039;&#039; performing the swap hasn&#039;t made a swap on the &#039;&#039;&#039;subnet&#039;&#039;&#039; which the &#039;&#039;old&#039;&#039; node is a part of in the last &#039;&#039;&#039;24 hours&#039;&#039;&#039; - this limit is here to protect other node providers from being unable to swap nodes because one node provider is constantly swapping nodes within the &#039;&#039;&#039;2 hour&#039;&#039;&#039; limit of the 1st constraint.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=8630</id>
		<title>Node Deployment Guide (with an HSM)</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=8630"/>
		<updated>2025-10-09T10:47:48Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS) using the legacy NitroKey HSM instructions. To use the non-HSM onboarding instructions, follow the [[IC-OS Installation Runbook]].&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, follow the [[IC-OS Installation Runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
** Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The NitroKey HSM for your data center.&lt;br /&gt;
*[Optional] A USB hub&lt;br /&gt;
** This is helpful at some data centers for simultaneously connecting keyboard, mouse, Nitrokey, etc.&lt;br /&gt;
*It is recommended that each server has a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step using the version of the release (commit hash) from the previous step.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open Powershell and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
$RELEASE_VERSION = &amp;quot;&amp;lt;SET IT&amp;gt;&amp;quot;&lt;br /&gt;
Invoke-WebRequest -Uri &amp;quot;https://raw.githubusercontent.com/dfinity/ic/$RELEASE_VERSION/ci/scripts/repro-check&amp;quot; -UseBasicParsing | ForEach-Object {&lt;br /&gt;
    python3 - -c $RELEASE_VERSION --setupos&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open Powershell and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==6. Create Bootable USB Stick==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
#The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration ==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu. &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition.&lt;br /&gt;
#Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
#Select any letter from the drop-down list. &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
# Click OK.&lt;br /&gt;
# You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file. &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
#:&lt;br /&gt;
#Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:*Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 8. Connect Crash Cart==&lt;br /&gt;
# In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
#Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu ==&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
==10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#Once you get asked to insert the HSM, please remove the keyboard and instead insert the HSM USB device. &lt;br /&gt;
#:[[File:37-sm.png|580px|screenshot]]&lt;br /&gt;
# If the installation finished successfully, it will initiate a reboot. 🚨 &#039;&#039;&#039;Please do not unplug the USB stick or HSM USB&#039;&#039;&#039; device at this point. 🚨 &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the HSM USB device, USB stick and VGA/Video.&lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 12. Verify node onboarding==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#*The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
#If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8629</id>
		<title>Node Deployment Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8629"/>
		<updated>2025-10-09T10:47:07Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS).&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs. no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], follow the [[NitroKey HSM installation runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements ==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
**Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; for your data center (Acquired from [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]])&lt;br /&gt;
* It is recommended that each server have a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step using the version of the release (commit hash) from the previous step.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
:Run the reproducibility check and locally compute the checksum of the downloaded release. Open Powershell and type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
$RELEASE_VERSION = &amp;quot;&amp;lt;SET IT&amp;gt;&amp;quot;&lt;br /&gt;
Invoke-WebRequest -Uri &amp;quot;https://raw.githubusercontent.com/dfinity/ic/$RELEASE_VERSION/ci/scripts/repro-check&amp;quot; -UseBasicParsing | ForEach-Object {&lt;br /&gt;
    python3 - -c $RELEASE_VERSION --setupos&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
:Then, open Powershell and type to obtain the checksum of the downloaded file: &lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
:🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==6. Create Bootable USB Stick ==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
# Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
# The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition&lt;br /&gt;
# Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
# Select any letter from the drop-down list &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
#Click OK.&lt;br /&gt;
#You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
# Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:* Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===C. Copy Node Operator private key to config partition===&lt;br /&gt;
&lt;br /&gt;
#Copy &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; (created in [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]]) to the &amp;lt;code&amp;gt;CONFIG&amp;lt;/code&amp;gt; partition. This file should have the name &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt;, and sit next to &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt;, NOT inside the &amp;lt;code&amp;gt;ssh_authorized_keys&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==8. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
# Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that server date/time is set to UTC (Universal Time Coordinated) &lt;br /&gt;
&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
== 10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the USB stick and VGA/Video. &lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==12. Verify node onboarding ==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#* The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
# If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8628</id>
		<title>Node Deployment Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8628"/>
		<updated>2025-10-09T10:44:17Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS).&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs. no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], follow the [[NitroKey HSM installation runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements ==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
**Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; for your data center (Acquired from [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]])&lt;br /&gt;
* It is recommended that each server have a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step using the version of the release (commit hash) from the previous step.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open Powershell and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
$RELEASE_VERSION = &amp;quot;&amp;lt;SET IT&amp;gt;&amp;quot;&lt;br /&gt;
Invoke-WebRequest -Uri &amp;quot;https://raw.githubusercontent.com/dfinity/ic/$RELEASE_VERSION/ci/scripts/repro-check&amp;quot; -UseBasicParsing | ForEach-Object {&lt;br /&gt;
    python3 - -c $RELEASE_VERSION --setupos&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open Powershell and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==6. Create Bootable USB Stick ==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
# Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
# The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition&lt;br /&gt;
# Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
# Select any letter from the drop-down list &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
#Click OK.&lt;br /&gt;
#You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
# Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:* Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===C. Copy Node Operator private key to config partition===&lt;br /&gt;
&lt;br /&gt;
#Copy &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; (created in [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]]) to the &amp;lt;code&amp;gt;CONFIG&amp;lt;/code&amp;gt; partition. This file should have the name &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt;, and sit next to &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt;, NOT inside the &amp;lt;code&amp;gt;ssh_authorized_keys&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==8. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
# Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that server date/time is set to UTC (Universal Time Coordinated) &lt;br /&gt;
&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
== 10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the USB stick and VGA/Video. &lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==12. Verify node onboarding ==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#* The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
# If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8627</id>
		<title>Node Deployment Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8627"/>
		<updated>2025-10-09T10:43:51Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS).&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs. no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], follow the [[NitroKey HSM installation runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements ==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
**Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; for your data center (Acquired from [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]])&lt;br /&gt;
* It is recommended that each server have a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step using the version of the release (commit hash) from the previous step.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open the Terminal and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open the Terminal and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Run the reproducibility check and locally compute the checksum of the downloaded release. Open Powershell and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
$RELEASE_VERSION = &amp;quot;&amp;lt;SET IT&amp;gt;&amp;quot;&lt;br /&gt;
Invoke-WebRequest -Uri &amp;quot;https://raw.githubusercontent.com/dfinity/ic/$RELEASE_VERSION/ci/scripts/repro-check&amp;quot; -UseBasicParsing | ForEach-Object {&lt;br /&gt;
    python3 - -c $RELEASE_VERSION --setupos&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Then, open Powershell and type to obtain the checksum of the downloaded file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file. &lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==6. Create Bootable USB Stick ==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
# Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
# The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition&lt;br /&gt;
# Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
# Select any letter from the drop-down list &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
#Click OK.&lt;br /&gt;
#You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
# Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:* Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===C. Copy Node Operator private key to config partition===&lt;br /&gt;
&lt;br /&gt;
#Copy &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; (created in [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]]) to the &amp;lt;code&amp;gt;CONFIG&amp;lt;/code&amp;gt; partition. This file should have the name &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt;, and sit next to &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt;, NOT inside the &amp;lt;code&amp;gt;ssh_authorized_keys&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==8. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
# Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that server date/time is set to UTC (Universal Time Coordinated) &lt;br /&gt;
&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
== 10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the USB stick and VGA/Video. &lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==12. Verify node onboarding ==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#* The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
# If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8626</id>
		<title>Node Deployment Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=8626"/>
		<updated>2025-10-09T09:52:45Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS).&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs. no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], follow the [[NitroKey HSM installation runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements ==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
**Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; for your data center (Acquired from [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]])&lt;br /&gt;
* It is recommended that each server have a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify downloaded &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step by running the reproducibility check:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file:&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sha256sum ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important: Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==6. Create Bootable USB Stick ==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
# Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
# The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition&lt;br /&gt;
# Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
# Select any letter from the drop-down list &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
#Click OK.&lt;br /&gt;
#You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
# Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:* Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
===C. Copy Node Operator private key to config partition===&lt;br /&gt;
&lt;br /&gt;
#Copy &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; (created in [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]]) to the &amp;lt;code&amp;gt;CONFIG&amp;lt;/code&amp;gt; partition. This file should have the name &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt;, and sit next to &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt;, NOT inside the &amp;lt;code&amp;gt;ssh_authorized_keys&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==8. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
# Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that server date/time is set to UTC (Universal Time Coordinated) &lt;br /&gt;
&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
== 10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the USB stick and VGA/Video. &lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==12. Verify node onboarding ==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#* The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
# If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=8625</id>
		<title>Node Deployment Guide (with an HSM)</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=8625"/>
		<updated>2025-10-09T09:49:32Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Ask for true checksum verification instead of comparing the two downloaded files.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS) using the legacy NitroKey HSM instructions. To use the non-HSM onboarding instructions, follow the [[IC-OS Installation Runbook]].&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues during any of these steps, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
&lt;br /&gt;
⚠️ DFINITY does &#039;&#039;&#039;not&#039;&#039;&#039; offer live support for Node Providers attempting to deploy nodes.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039; The IC-OS installer will completely wipe the disk. Back up any critical data before continuing.&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, follow the [[IC-OS Installation Runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
** Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The NitroKey HSM for your data center.&lt;br /&gt;
*[Optional] A USB hub&lt;br /&gt;
** This is helpful at some data centers for simultaneously connecting keyboard, mouse, Nitrokey, etc.&lt;br /&gt;
*It is recommended that each server has a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. Take a note of the version of the release. &lt;br /&gt;
*&#039;&#039;&#039;Note that you should always use a release from the last 6 weeks (newer is better) in order to ensure that your node can correctly connect to the network.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum==&lt;br /&gt;
Verify downloaded &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; downloaded in the previous step by running the reproducibility check:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;RELEASE_VERSION=&amp;lt;SET IT&amp;gt;&lt;br /&gt;
curl -fsSL https://raw.githubusercontent.com/dfinity/ic/${RELEASE_VERSION}/ci/scripts/repro-check | python3 - -c ${RELEASE_VERSION} --setupos&amp;lt;/syntaxhighlight&amp;gt;The reproducibility check takes around 20 minutes to run (depending on your hardware). At the end, it displays the locally computed checksum and the remote one. &lt;br /&gt;
&lt;br /&gt;
Compare the locally computed checksum with the checksum of the downloaded file:&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sha256sum ~/Downloads/disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.zst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important: Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. Unarchive file ==&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
:Open PowerShell and type:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.zst&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==6. Create Bootable USB Stick==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo umount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. Additionally, replace the path to your downloaded IC-OS &#039;&#039;disk.img&#039;&#039; file. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive.  &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/home/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M status=progress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
#The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==7. Add configuration ==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu. &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition.&lt;br /&gt;
#Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
#Select any letter from the drop-down list. &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
# Click OK.&lt;br /&gt;
# You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file. &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
Edit the config.ini file to add your network configuration.&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;all Node Providers are requested to deploy two nodes with IPv4 and a domain name for every data center they operate in&#039;&#039;&#039;. Node Providers should deploy IPv4 to the &#039;&#039;&#039;first two nodes in their first rack&#039;&#039;&#039;.&lt;br /&gt;
# Set the appropriate value for the node_reward_type.&lt;br /&gt;
#:[[File:Pasted Graphic 7.png|780px|screenshot]]&lt;br /&gt;
#:You can find the value to set by following [[Node Deployment config.ini]]&lt;br /&gt;
#:&lt;br /&gt;
#Insert your IPv6 prefix and gateway.&lt;br /&gt;
#:[[File:Pasted Graphic 8.png|780px|screenshot]]&lt;br /&gt;
#:* The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:200&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#[Optional] Insert your IPv4 info and domain name.&lt;br /&gt;
#:[[File:Pasted Graphic 9.png|780px|screenshot]]&lt;br /&gt;
#:*Configuring your node with IPv4 settings is optional, but if you do configure your node with IPv4 settings, you must also define the domain name for your node.&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**Please note that you &#039;&#039;&#039;must use a unique IPv4 address for each node you deploy&#039;&#039;&#039;. This means that you cannot use a single IC-OS installation image to deploy multiple nodes (like you are able to do when just configuring IPv6 nodes).  &#039;&#039;&#039;After each IPv4 node deployment, you must plug your IC-OS Installation USB stick back into your laptop and return to [[Node Deployment Guide#6. Add configuration|step 6]] in the node deployment guide to reconfigure your installation image.&#039;&#039;&#039;&lt;br /&gt;
#:**You can add, remove, or update your node’s IPv4 address and domain name after completing node deployment using dfx commands. See [[Updating your node&#039;s IPv4 and domain name|here]] for details.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 8. Connect Crash Cart==&lt;br /&gt;
# In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
#Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==9. UEFI Setup and Boot Menu ==&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
==10. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#Once you get asked to insert the HSM, please remove the keyboard and instead insert the HSM USB device. &lt;br /&gt;
#:[[File:37-sm.png|580px|screenshot]]&lt;br /&gt;
# If the installation finished successfully, it will initiate a reboot. 🚨 &#039;&#039;&#039;Please do not unplug the USB stick or HSM USB&#039;&#039;&#039; device at this point. 🚨 &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==11. First Boot==&lt;br /&gt;
Please remember to check the [[Troubleshooting Node Deployment Errors]] page if you encounter any errors.&lt;br /&gt;
&lt;br /&gt;
# After the IC-OS installation is complete, the machine reboots. Then, please &#039;&#039;&#039;IGNORE&#039;&#039;&#039; the grub menu. You do NOT need to input anything. This menu will go away after a 15-second timeout:&lt;br /&gt;
#*[[File:Host grub boot menu.png|400px|screenshot]]&lt;br /&gt;
#The node will then boot-up, and then, after a few minutes, you should see the following log:&lt;br /&gt;
#*[[File:Hostos console log.png|600x600px]]&lt;br /&gt;
#*This log does &#039;&#039;&#039;NOT yet signify a successful onboarding.&#039;&#039;&#039; Please wait at least 10 minutes for a &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; log signifying a successful onboarding.&lt;br /&gt;
#*If after 10 minutes, you don&#039;t see anything else logged to the screen, please &#039;&#039;&#039;leave your node running&#039;&#039;&#039; and post a message in the Matrix channel with a screenshot of you console and the additional [https://wiki.internetcomputer.org/wiki/Troubleshooting_Node_Deployment_Errors#Support_request_information_requirements Support request information requirements]&lt;br /&gt;
#Once you see the &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you may unplug the HSM USB device, USB stick and VGA/Video.&lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that if you do NOT see a &amp;quot;Join request successful&amp;quot; message, your node may still have successfully onboarded. Continue to the next step to attempt to verify node onboarding.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 12. Verify node onboarding==&lt;br /&gt;
&lt;br /&gt;
#Obtain your Node ID&lt;br /&gt;
#*Your Node ID should have been outputted in the previous step. If it wasn&#039;t, &#039;&#039;&#039;please wait at least 10 minutes to see if the node ID is logged to the console.&#039;&#039;&#039;&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] &lt;br /&gt;
#*The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node.&lt;br /&gt;
#*If the status of your node is either “Awaiting Subnet” or “Active in Subnet,” &#039;&#039;&#039;congratulations! Your machine successfully joined the Internet Computer!&#039;&#039;&#039;&lt;br /&gt;
#*If the status of your node is NOT either “Awaiting Subnet” or “Active in Subnet”, or if it is NOT listed under your Node Provider principal, you should consult the [[Troubleshooting Node Deployment Errors]] page.&lt;br /&gt;
#*:[[File:Node onboarding verification.png|680px|screenshot]]&lt;br /&gt;
#If deploying with IPv4, verify that IPv4 was successfully configured&lt;br /&gt;
#*Ten minutes after the initial &amp;lt;code&amp;gt;Join request successful!&amp;lt;/code&amp;gt; message, you should see another log indicating a successful IPv4 deployment:&lt;br /&gt;
#*:[[File:IPv4 log.jpg|680px|screenshot]]&lt;br /&gt;
#*If your log says &amp;lt;code&amp;gt;IPv4: none configured&amp;lt;/code&amp;gt;, then your IPv4 deployment failed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are failing to verify your node onboarding, consult the [[Troubleshooting Node Deployment Errors]] page.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_config.ini&amp;diff=8609</id>
		<title>Node Deployment config.ini</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_config.ini&amp;diff=8609"/>
		<updated>2025-09-26T09:38:48Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: fixed command to fetch node rewards table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= node_reward_type Documentation =&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;node_reward_type&#039;&#039;&#039; parameter in the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; file indicates the specific node type for which the node operator expects to receive rewards. This value must correspond to a recognized and community-approved node type defined in the Network Nervous System (NNS).&lt;br /&gt;
&lt;br /&gt;
== What is node_reward_type? ==&lt;br /&gt;
* It specifies the node’s reward category.&lt;br /&gt;
* The chosen type must be compatible with the configurations listed in the NNS node rewards table.&lt;br /&gt;
* Common examples include: &amp;lt;code&amp;gt;type1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;type1.1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;type3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;type3.1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
== How to determine your node_reward_type ==&lt;br /&gt;
1. Use the &amp;lt;code&amp;gt;ic-admin&amp;lt;/code&amp;gt; CLI tool to inspect your node operator configuration. For example:&lt;br /&gt;
   &amp;lt;pre&amp;gt;ic-admin --nns-url https://ic0.app get-node-operator &amp;amp;lt;your_node_operator_id&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
2. In the output, look for the `rewardable_nodes` field. It might look like:&lt;br /&gt;
   &amp;lt;pre&amp;gt;rewardable_nodes: {&amp;quot;type1&amp;quot;: 28}&amp;lt;/pre&amp;gt;&lt;br /&gt;
This means &amp;lt;code&amp;gt;type1&amp;lt;/code&amp;gt; is a valid and approved node type for your account.&lt;br /&gt;
&lt;br /&gt;
3. If multiple types are listed, select the one that best matches your node’s intended reward category.&lt;br /&gt;
&lt;br /&gt;
Example invocation with &amp;lt;code&amp;gt;ic-admin&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
❯ ic-admin --nns-url https://ic0.app get-node-operator c5ssg-eh22p-pmsn6-fpjzj-k5nql-mx5mc-7gb4a-4klco-c4f37-ydnfp-bae&lt;br /&gt;
Using NNS URLs: [&amp;quot;https://ic0.app/&amp;quot;]&lt;br /&gt;
Fetching the most recent value for key: node_operator_record_c5ssg-eh22p-pmsn6-fpjzj-k5nql-mx5mc-7gb4a-4klco-c4f37-ydnfp-bae&lt;br /&gt;
Most recent version is 44799. Value:&lt;br /&gt;
NodeOperator { node_operator_principal_id: c5ssg-eh22p-pmsn6-fpjzj-k5nql-mx5mc-7gb4a-4klco-c4f37-ydnfp-bae, node_allowance: 3, node_provider_principal_id: i7dto-bgkj2-xo5dx-cyrb7-zkk5y-q46eh-gz6iq-qkgyc-w4qte-scgtb-6ae, dc_id: &amp;quot;bu1&amp;quot;, rewardable_nodes: {&amp;quot;type0&amp;quot;: 0, &amp;quot;type1&amp;quot;: 28}, ipv6: None }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can obtain the node_reward_type that is already set in the registry for the particular DC by using the [https://dfinity.github.io/dre/getting-started.html dre tool]. For instance:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dre registry --filter=dc_id=&amp;lt;dc_id&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; to get the node operator record associated with the DC. Please replace `&amp;lt;dc_id&amp;gt;` with your DC, e.g. `bu1`.&lt;br /&gt;
&lt;br /&gt;
== Possible values ==&lt;br /&gt;
The NNS Registry configuration determines which types are valid. Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;node_reward_type=type1&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;node_reward_type=type1.1&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;node_reward_type=type3&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;node_reward_type=type3.1&amp;lt;/code&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
The set of valid types may change as the community updates NNS configurations. You may get the entire latest reward table list by running:&lt;br /&gt;
&lt;br /&gt;
  ic-admin --nns-urls https://ic0.app get-node-rewards-table&lt;br /&gt;
&lt;br /&gt;
Or for the particular Node Operator record with:&lt;br /&gt;
&lt;br /&gt;
  ic-admin --nns-url https://ic0.app get-node-operator &amp;lt;node-operator-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== When should I start setting the node_reward_type? ==&lt;br /&gt;
You should start setting the  &amp;lt;code&amp;gt;node_reward_type&amp;lt;/code&amp;gt;  for ALL nodes you redeploy ALREADY NOW. This does not impact rewards yet, and failure to set the  &amp;lt;code&amp;gt;node_reward_type&amp;lt;/code&amp;gt; will likely result in failing node registrations in the near future.&lt;br /&gt;
&lt;br /&gt;
== If you do not set node_reward_type ==&lt;br /&gt;
If &amp;lt;code&amp;gt;node_reward_type&amp;lt;/code&amp;gt; is empty, you should not expect to get rewards for the node, after March 2025.&lt;br /&gt;
&lt;br /&gt;
There is no need to redeploy already existing nodes in order to set this value on them. All existing nodes should get the value automatically set.&lt;br /&gt;
&lt;br /&gt;
== Default value ==&lt;br /&gt;
If left unset or set to an invalid value, the node registration may fail or may succeed but you may not get rewards for the node.&lt;br /&gt;
&lt;br /&gt;
== How to check ==&lt;br /&gt;
Check the node reward type at any time by invoking:&lt;br /&gt;
&lt;br /&gt;
  ic-admin --nns-url https://ic0.app get-node &amp;lt;node-id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example node record:&lt;br /&gt;
&lt;br /&gt;
  Using NNS URLs: [&amp;quot;https://ic0.app/&amp;quot;]&lt;br /&gt;
  Fetching the most recent value for key: node_record_fvy7i-ux7is-cuvfm-2n2zh-5lpb4-oe2vz-bfnhz-oi5s5-jkzhk-phlj2-gqe&lt;br /&gt;
  Most recent version is 44039. Value:&lt;br /&gt;
  Node { xnet: Some(&amp;quot;[2800:c20:0:29:6801:29ff:fe18:1f08]:2497&amp;quot;), http: Some(&amp;quot;[2800:c20:0:29:6801:29ff:fe18:1f08]:8080&amp;quot;), &lt;br /&gt;
  node_operator_id: eqv2i-6dtlf-bhbjd-2popw-vvavp-7xzci-6gdd7-qxgox-wdw5w-l3a4w-eae, chip_id: None, hostos_version_id: &lt;br /&gt;
  Some(&amp;quot;2e269c77aa2f6b2353ddad6a4ac3d5ddcac196b1&amp;quot;), public_ipv4_config: None, domain: None, node_reward_type: None }&lt;br /&gt;
&lt;br /&gt;
In this case the &amp;lt;code&amp;gt;node_reward_type&amp;lt;/code&amp;gt; for the node is set to None, which means that the node will not get any rewards. The quickest way to resolve this problem is to make changes in the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; and redeploy the node.&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Ensure &amp;lt;code&amp;gt;node_reward_type&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; matches a type listed under &amp;lt;code&amp;gt;rewardable_nodes&amp;lt;/code&amp;gt; for your operator ID.&lt;br /&gt;
* Check the node reward settings for the node operator and for the node in case of any problems&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=8377</id>
		<title>HTTP asset certification</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=8377"/>
		<updated>2025-06-23T17:59:15Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Removed content and replaced it with links where the information resides today.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This content has moved to the learn hub ([https://learn.internetcomputer.org/hc/en-us/articles/34276431179412-Asset-Certification Asset Certification] and [https://learn.internetcomputer.org/hc/en-us/articles/34211943471892-HTTP-Gateway-Protocol HTTP Gateway Protocol]) and the [https://internetcomputer.org/docs/references/http-gateway-protocol-spec HTTP Gateway Protocol Specification].&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=8376</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=8376"/>
		<updated>2025-06-23T17:55:31Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Removed the page and added a comment that all BN-related information is now in the learn hub.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This content has moved to the learn hub: https://learn.internetcomputer.org/hc/en-us/articles/34212818609684-ICP-Edge-Infrastructure&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=The_Internet_Computer_for_Ethereum_Developers&amp;diff=7056</id>
		<title>The Internet Computer for Ethereum Developers</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=The_Internet_Computer_for_Ethereum_Developers&amp;diff=7056"/>
		<updated>2024-01-25T10:20:45Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Removed the mention of the service worker as it is not being used anymore.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt;For many developers, the first contact with a smart contract platform is through Ethereum. Hence, when developers later encounter the Internet Computer (IC) they have many preconceptions about how things ought to work and this does not always map to the way the Internet Computer works.&lt;br /&gt;
&lt;br /&gt;
In this article, we’ll try to explain the differences that most developers will encounter and present the differentiating capabilities. Since the language of Ethereum and the Internet Computer slightly differ, this page mostly talks in terms common to Ethereum developers and provide a little dictionary in the end. This page is a living article which gets updated by the community over time to provide a comprehensive reference for new developers coming across the IC.&lt;br /&gt;
&lt;br /&gt;
===A very brief introduction to the Internet Computer===&lt;br /&gt;
&lt;br /&gt;
Before diving into a list of specific differences, we’ll give a brief description of the IC as a whole. The IC is a network of mostly independent subnet blockchains, but contracts can interact transparently across subnets. This allows horizontal scaling of the IC by continuously adding subnets. The subnets are managed by the [https://dfinity.org/howitworks/network-nervous-system-nns Network Nervous System (NNS)], essentially a Decentralized Autonomous Organization (DAO), running on the first subnet itself. The IC has a main utility token - ICP - which can be staked in the NNS to participate in governance and has to be converted to cycles in order to pay for resource consumption on the IC. Contracts on the IC are called canisters and contain [https://webassembly.org/ WASM] byte code. This allows to create contracts in a range of programming languages. In addition, there’s [https://dfinity.org/howitworks/motoko Motoko], a programming language that has been purposefully designed to write canisters in the actor model for the IC.&lt;br /&gt;
&lt;br /&gt;
If you want to dig deeper into mechanics of the Internet Computer have a look at the following resources:&lt;br /&gt;
&lt;br /&gt;
* [https://dfinity.org/whitepaper.pdf The Internet Computer for Geeks]&lt;br /&gt;
* The Internet Computer [https://dfinity.org/howitworks/ “How it works”] series with many in depth articles and videos&lt;br /&gt;
* The official [https://smartcontracts.org/ Developer Documentation]&lt;br /&gt;
* [https://smartcontracts.org/docs/current/references/ic-interface-spec The Internet Computer Interface Specification]&lt;br /&gt;
* The [https://forum.dfinity.org/ Developer Forum] and [https://discord.com/invite/cA7y6ezyE2 Discord]&lt;br /&gt;
&lt;br /&gt;
===Differences between Ethereum and the Internet Computer===&lt;br /&gt;
&lt;br /&gt;
So without further ado, we’ll dive into some of notable differences between Ethereum and the IC. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====User Experience====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====External accounts don’t have to pay for gas=====&lt;br /&gt;
&lt;br /&gt;
The IC implements a “reverse gas” model, where contracts have to pay for their resources in cycles. Hence, a user of a dapp doesn’t need a wallet or tokens to interact with the dapp. Nevertheless, users can still be strongly authenticated to dapps using [https://medium.com/dfinity/internet-identity-the-end-of-usernames-and-passwords-ff45e4861bf7 ID or fingerprint scanner]. Internet Identity which is based on the [https://www.w3.org/TR/webauthn-2/ Web Authentication] standard.&lt;br /&gt;
&lt;br /&gt;
If you wonder how canisters pay for their resources. Every canister has a cycle balance and the balance can be topped up by any other canister. Of course, you can also require users to pay a fee in ICP and then let your canister convert the ICP to cycles, essentially imitating the gas model of Ethereum. Hence, the IC allows for much more flexibility.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Users can interact with the IC safely from their browsers=====&lt;br /&gt;
&lt;br /&gt;
The interaction between a user and an application on Ethereum usually looks like the following:&lt;br /&gt;
# A user points her browser to the domain of the application.&lt;br /&gt;
# The front end of the application is served by a traditional hosting provider.&lt;br /&gt;
# Dynamic data from the blockchain is typically proxied by either a centralized backend provided by the application provider or by a service provider like [https://infura.io/ Infura].&lt;br /&gt;
# The user connects to the application with her wallet.&lt;br /&gt;
# The front end drafts a transaction and asks the wallet to sign and submit the transaction. Even in the case of a non-financial application the user needs to have ETH in her wallet to pay for gas fees.&lt;br /&gt;
# The user approves using the wallet and the wallet submits the signed transaction.&lt;br /&gt;
# The user waits - depending on the current usage of the network and the provided fees - from 10s of seconds to minutes until the transaction is confirmed. (See [https://ethgasstation.info/ ETH Gas Station] for current costs and waiting times)&lt;br /&gt;
&lt;br /&gt;
The synergy of a few key innovations allows a user to safely interact with an application on the IC without setting up a wallet, without buying cryptocurrency, and without having to rely on any intermediaries.&lt;br /&gt;
&lt;br /&gt;
# Chain-key technology and subnets allow for lightweight verification and lower costs because of lower replication and horizontal scaling.&lt;br /&gt;
# The reverse gas model allows contracts to be pre-loaded with gas to simplify user onboarding&lt;br /&gt;
# Internet Identity allows privacy-preserving authentication to services on the IC using [https://webauthn.guide/ WebAuthentication] and a delegation mechanism. Cryptographic secrets are managed with secure hardware.&lt;br /&gt;
# Boundary nodes and [https://dfinity.org/howitworks/response-certification certified asset] contracts allow [[Web Serving|serving the front end]] directly from a contract.&lt;br /&gt;
&lt;br /&gt;
So how does interaction with a dapp on the IC look like?&lt;br /&gt;
&lt;br /&gt;
# A user points her browser to the domain of the application which is either a &#039;&#039;ic0.app&#039;&#039; domain directly or the browser will be redirected to an &#039;&#039;ic0.app&#039;&#039; domain.&lt;br /&gt;
# The user is asked to login with Internet Identity or another authentication method. &lt;br /&gt;
# The user can interact with the dapp without paying fees. State-changing updates take seconds and can mostly be hidden from the user by utilizing optimistic ui patterns.&lt;br /&gt;
&lt;br /&gt;
The best is to try it yourself. Head over to [https://internetcomputer.org/ecosystem our ecosystem page] for example and try a few of the popular apps on the IC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====Developer Experience====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Contracts are upgradable by default=====&lt;br /&gt;
&lt;br /&gt;
On Ethereum, contracts are immutable. If there is a bug in a contract, there is little a developer can do. This led to clever workarounds like [https://docs.openzeppelin.com/learn/upgrading-smart-contracts proxy contracts] which lead to additional complexity and risks for users. On the IC, contracts are mutable by default. Each contract has an associated list of controllers, which are authorized to upgrade contracts. By setting the controllers an empty list or a black hole contract, you can make your contract immutable. But in the IC community, there is the vision that most contracts will be governed by Decentralized Autonomous Organizations (DAOs) just like the IC itself. The DFINITY foundation is working on the [https://medium.com/dfinity/how-the-service-nervous-system-sns-will-bring-tokenized-governance-to-on-chain-dapps-b74fb8364a5c#:~:text=An%20SNS%20would%20derive%20from,%2C%20permissionless%2C%20and%20decentralized%20manner. Service Nervous System], a customizable turn-key solution to govern services on the IC, inspired by [https://dfinity.org/howitworks/network-nervous-system-nns Network Nervous System] which governs the IC.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Inter-contract calls are asynchronous and not atomic=====&lt;br /&gt;
&lt;br /&gt;
The EVM is synchronous and transactions are atomic. This means if a user sends a transaction the transaction is either executed completely or the state is rolled back - only consuming the gas attached to the transaction. This is true independently of the number of contracts involved in the transaction. This property has led to interesting innovations such as Flashloans but severely limits scalability since the entire Ethereum network acts as a single process. On the IC inter-contract calls are asynchronous. Every time you use `await` the state is committed. In case a function traps, the state is only rolled back to the last occurrence of await. You can read more about this [https://smartcontracts.org/docs/current/developer-docs/build/languages/motoko/actors-async/#traps-and-commit-points here] in the documentation. There’s also a [https://forum.dfinity.org/t/we-need-a-defi-subnet/11388/32#world-computers-and-real-world-computers-for-defi-1 great forum post about the different models concerning DeFi].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Contracts will be deleted when they are running out of gas =====&lt;br /&gt;
&lt;br /&gt;
On Ethereum contracts are permanent. While this has some advantages (peace of mind for developers and users), it also has considerable disadvantages (limited scalability). The state of Ethereum is growing without bounds, and there is little incentive for developers to free space in the state. Hence, there are still all those tokens from 2017 in the Ethereum state, although many projects have long been abandoned. On the IC, contracts consume cycles according to their actual resource consumption. Even if contracts won’t be called they consume some cycles, although very little. This is important for the sustainability of the platform. When coming from Ethereum to the IC, developers often are anxious about the cycle consumption and that their contracts will be deleted suddenly. However, there are two effective guards built into the IC.&lt;br /&gt;
&lt;br /&gt;
# There’s an [https://smartcontracts.org/docs/current/references/ic-interface-spec/#system-api-inspect-message &#039;&#039;inspect_message&#039;&#039; functionality] that lets contracts introspect ingress messages (i.e. messages originating from outside the IC) and decide if they want to process the message. This introspection is not charged.&lt;br /&gt;
# The IC can freeze a canister such that it automatically rejects all calls and only the base maintenance has to be paid for. Each canister has a [https://smartcontracts.org/docs/current/references/ic-interface-spec/#ic-create_canister &#039;&#039;freezing_threshold&#039;&#039;] which can be set as a period in seconds and essentially guarantees that the IC will freeze the canister such that the canister has a balance to afford the maintenance cost for this period. The default &#039;&#039;freezing_threshold&#039;&#039; is approximately 30 days and should give developers or users ample time to top up the canister before it is garbage collected.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Gas fees are predictable=====&lt;br /&gt;
&lt;br /&gt;
In the Ethereum Virtual Machine (EVM), specific operations (Opcodes) have a defined cost in gas, but the exchange rate between ETH and gas is entirely defined by the market. The user can define a &#039;&#039;maxFeePerGas&#039;&#039; that she is willing to pay in a transaction and the individual miner decides if it deems this offer acceptable or not. Since the throughput of Ethereum is highly limited, the price of gas can fluctuate wildly with demand. In addition, the actual price in USD or EUR is even more unpredictable due to the current market price of ETH.&lt;br /&gt;
&lt;br /&gt;
Similar (but more extensive) to gas in Ethereum, the IC has a set of [https://internetcomputer.org/docs/current/developer-docs/gas-cost fixed prices in cycles for various resources]. The main difference however is that the price of cycles is pegged to the XDR, which is based on a basket of the world’s main currencies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;1 XDR = 1 Trillion cycles&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The exchange rate between XDR and ICP is managed by the NNS. Hence, the actual cost of running a canister is relatively stable and predictable, and independent of the current market price of ICP.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====The ICP Token is not part of the system but is implemented as a contract=====&lt;br /&gt;
The ICP token has two important roles in the IC:&lt;br /&gt;
&lt;br /&gt;
# It can be burned to create cycles that are needed to pay for resources on the IC&lt;br /&gt;
# It can be locked in neurons to participate in the governance of the IC&lt;br /&gt;
&lt;br /&gt;
However, ICP does not appear in the system state but is built as a contract running on the NNS subnet. You can find more information about the Ledger canister [https://smartcontracts.org/docs/current/references/ledger here] or [https://www.youtube.com/watch?v=im5HBRd3mqo here].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====Scalability and Costs====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====96-bytes are enough to verify the state of the IC=====&lt;br /&gt;
&lt;br /&gt;
Verifying the EVM state is a resource-intensive process by which a node has to verify the whole blockchain from genesis. It is possible to have light nodes, that verify only the header chain (which is nevertheless growing forever), in addition to relevant parts of the current state, but the infrastructure is not built yet. Hence, most users rely on centralized APIs to access the Ethereum state, most notably [https://infura.io/ Infura]. The Internet Computer in contrast allows clients to verify the state with a constant 96-byte BLS public key. This public key could be hardcoded into software such as browsers or even hardware like Internet of Things devices to let them interact securely with contracts on the IC.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====The Internet Computer can scale horizontally=====&lt;br /&gt;
&lt;br /&gt;
The IC is a network of subnets where contracts can interact transparently across subnets. With increasing demand of the Internet Computer additional subnets can be added by proposals to the NNS.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====Contract storage is orders of magnitudes cheaper=====&lt;br /&gt;
&lt;br /&gt;
Ethereum does not yet implement sharding and every node in the network needs to store and execute every contract and every transaction. On the IC only the nodes in a particular subnet replicate execution and state. While this might decrease security in contrast to Ethereum, it is still much more secure than traditional web services with comparable costs. While storing 1 GB on Ethereum is on the order of hundreds of millions of dollars, it is only a few dollars per year on the IC. This allows hosting entire web applications, music, and even videos on the IC, instead of only stripped backend logic. For an overview of common costs on the IC have look at the [https://smartcontracts.org/docs/current/developer-docs/deploy/computation-and-storage-costs Computation and Storage Cost documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====There is in general no need to keep track of old blocks=====&lt;br /&gt;
&lt;br /&gt;
Chain-key technology allows a new (validator) node to quickly sync the state and join the validator set using [https://eprint.iacr.org/2021/339 non-interactive distributed key resharing] instead of syncing and validating the blockchain from genesis. Hence, nodes can safely prune the chain every few minutes. For some applications, however, it’s not enough to only be sure that all state transitions have been authorized by at least 2/3 of the nodes, but an audit trail is required. Examples are the ICP ledger and the NNS. In this case, the audit trail is implemented on the application i.e. contract layer. Thereby, in contrast to Ethereum, contracts have access to the audit trails, and not only outside observers.&lt;br /&gt;
&lt;br /&gt;
However, in the future there will be two types of subnets. Private and public subnets. For public subnets, it will be possible for an observer to get the raw block data. The first public subnet will be Nervous Network System subnet itself.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====Privacy====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====External accounts are not (directly) part of the global state=====&lt;br /&gt;
&lt;br /&gt;
The world state of Ethereum consists of external accounts (users) and internal accounts (contracts). Each account has an associated ether balance. On the IC only canister principals are part of the state. Each canister principal has an associated cycle balance which is not public by default. This has privacy advantages since a user can interact with canisters on the IC in an authenticated manner without disclosing its principal in the public state. The disadvantage is that user principals can’t hold cycles directly, but need a canister like the cycles wallet.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====The global state is not public, but only parts=====&lt;br /&gt;
&lt;br /&gt;
On Ethereum, everyone can run a full node, and therefore everything is public. Privacy can only be achieved by keeping data off-chain or by using cryptography. On the IC, nodes are permissioned by the NNS and only parts of the IC are public. Besides the API a contract developer defines for the contract itself, the following data is public&lt;br /&gt;
&lt;br /&gt;
* The subnet of the contract&lt;br /&gt;
* The name of the contract&lt;br /&gt;
* The hash of the [https://webassembly.org/ WASM] module of the contract&lt;br /&gt;
* The controllers of the contract&lt;br /&gt;
&lt;br /&gt;
In particular, neither the actual byte code nor the (cycles) balance of a contract is public. However, as mentioned earlier, the IC will support public subnets in the future. These subnets will make the raw IC block data available.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====Differentiating Capabilities====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====Contracts can trigger themselves=====&lt;br /&gt;
&lt;br /&gt;
On Ethereum, every state change has to be triggered by an external account. On the IC, however, a canister can use the [https://smartcontracts.org/docs/current/developer-docs/build/languages/motoko/heartbeats &#039;&#039;heartbeat&#039;&#039; functionality] or [https://internetcomputer.org/docs/current/motoko/main/timers timers] to be triggered by the IC. This opens up a lot of new possibilities. A simple example would be a cron service, which allows other canisters to register themselves to be called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====Contracts have access to cryptographic randomness=====&lt;br /&gt;
&lt;br /&gt;
The unique consensus algorithm of the IC can be used as a source of cryptographic randomness. This randomness is [https://smartcontracts.org/docs/current/references/motoko-ref/random/ accessible to contracts] and can be used in applications like lotteries or games.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====Contracts can hold private keys and sign messages=====&lt;br /&gt;
&lt;br /&gt;
On Ethereum every contract is public. This means a contract can’t hold private information and hence can’t sign messages because there’s no way to securely store a private key. The consensus mechanism of the IC uses a mechanism known as threshold signing where the validator nodes collaborate to create a (BLS) signature without the entire private key existing at all. In the new [https://dfinity.org/howitworks/threshold-ecdsa-signing chain-key ECDSA signing feature] a similar mechanism has been made available for contracts to order the IC to generate threshold ECDSA signatures. These signatures will be verifiable outside the IC just like regular ECDSA signatures — they are 100% conforming to the standard. This means you can sign Ethereum or Bitcoin transactions with a contract on the IC or you can create JWTs, verifiable credentials, or x.509 certificates.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=====Contracts can call web services=====&lt;br /&gt;
&lt;br /&gt;
If you need data from the outside world on Ethereum you need oracles that feed this information into a contract on Ethereum. On the IC it is possible to call web services from inside a contract. You can read more about this feature on the [https://internetcomputer.org/https-outcalls Web page], the [https://internetcomputer.org/docs/current/developer-docs/integrations/http_requests/ docs] or [https://forum.dfinity.org/t/enable-canisters-to-make-http-s-requests/9670 forum], or watch the [https://www.youtube.com/watch?v=n_LFCc0ws6o community conversations].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===Dictionary===&lt;br /&gt;
contract → canister&lt;br /&gt;
&lt;br /&gt;
gas → cycles&lt;br /&gt;
&lt;br /&gt;
shard → subnet (Not entirely true, since Ethereum currently only considers data shards)&lt;br /&gt;
&lt;br /&gt;
(validator) nodes → replicas&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=7055</id>
		<title>HTTP asset certification</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=7055"/>
		<updated>2024-01-25T09:00:56Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Update the text to reflect the removal of the Service Worker.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Motivation == &lt;br /&gt;
A user interacting with the Internet Computer needs to be able to confirm that the responses they receive are actually coming from the Internet Computer and have not been tampered with. Traditionally, on the Internet, this problem is solved using public-key cryptography. The server running the service has a secret key and uses that to sign all its responses. A user can then verify the signature on the response using the server’s public key.&lt;br /&gt;
&lt;br /&gt;
Just like a web server in Web2 maintains a public-key/secret-key pair, the Internet Computer blockchain as a whole maintains a public-key/secret-key pair. Additionally, each individual subnet in the Internet Computer also maintains its own public-key/secret-key pair. When a new subnet is formed, the NNS issues a certificate for the subnet which contains a signature of the subnet&#039;s public key with the Internet Computer&#039;s public key. When the subnet responds to a user&#039;s message, the response contains a certificate chain, which includes a signature on the response by the subnet&#039;s public key and the certificate issued by the NNS to the subnet. The user can verify the certificate chain using the Internet Computer&#039;s public key similar to verifying a certificate chain in Web2.&lt;br /&gt;
&lt;br /&gt;
Each blockchain node shares only a piece of its subnet secret key. As a result, each node is incapable of signing a message by itself. But if at least 2/3rd of the nodes of a subnet agree on a message, they together can combine their secret key pieces to sign the message. The signed message can be verified easily using the subnet&#039;s public key. If the verification succeeds, it means that at least 2/3rd of the blockchain nodes running the canister agreed to deliver that message. The technology used by the Internet Computer to generate and maintain the secret key shares, and sign messages using the secret key shares is called [https://eprint.iacr.org/2021/339.pdf chain-key technology].&lt;br /&gt;
&lt;br /&gt;
The Internet Computer supports two types of messages: Query calls and Update calls. Query calls are similar to HTTP GET requests and do not modify the state of the Internet Computer. The query calls do not go through the [https://wiki.internetcomputer.org/wiki/IC_consensus_layer consensus protocol]. The user can make a query call to any blockchain node in the subnet, and only that (possibly malicious) blockchain node answers the query. As generating a certificate requires consensus from at least 2/3rd of the nodes of the subnet, the Internet Computer doesn&#039;t issue a certificate when responding to query calls.&lt;br /&gt;
&lt;br /&gt;
As the query calls have low [https://wiki.internetcomputer.org/wiki/Query_and_update_call_latency latency], the canisters deliver web pages to the client via query calls. However, as the client needs to verify the received content, the Internet Computer introduces the notion of [https://smartcontracts.org/docs/interface-spec/index.html#system-api-certified-data Certified Variables/Certified Data]. In a nutshell, a canister can a-priori choose to create a certificate for a piece of data and store it in the replicated state. Any user can later access the data along with its certificate via query calls. The user can use the IC public key to authenticate the body of the response. The notion of certified data can be used to certify all the assets (HTML, CSS, Javascript files, images, videos, etc.) of an app a-priori. &lt;br /&gt;
&lt;br /&gt;
When a canister issues a response along with its certificate, a [https://wiki.internetcomputer.org/wiki/Boundary_Nodes#HTTP_Gateway HTTP Gateway] can be used to verify the certificate before passing on the response to the client.&lt;br /&gt;
&lt;br /&gt;
== Certified Data == &lt;br /&gt;
In every round of the Internet Computer Protocol, the message routing layer generates a new [https://wiki.internetcomputer.org/wiki/Replicated_state_structure per-round system tree]. This tree is then [https://wiki.internetcomputer.org/wiki/IC_state_manager#State_Hash_Tree Merkelized] and the root hash is computed. The nodes in the subnet then engage in a protocol to create a certificate for the root hash of the system tree. This per-round system tree amongst other information also contains the &amp;quot;certified data&amp;quot; of each canister. The system tree looks as follows.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*root*&lt;br /&gt;
└── canisters&lt;br /&gt;
    ├── &amp;lt;canister id&amp;gt;&lt;br /&gt;
              ├── metadata&lt;br /&gt;
              ├── module_hash&lt;br /&gt;
              ├── controllers&lt;br /&gt;
              └── certified_data&lt;br /&gt;
                          └── &amp;lt;blob data&amp;gt;&lt;br /&gt;
    ├── &amp;lt;canister id&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The above image highlights the path of the certified data in the system state tree. The leaf storing certified data of a canister can be at most 32 bytes long. In case the canister would like to certify more than 32 bytes of information, then the canister has to hash the data before certifying it. &lt;br /&gt;
&lt;br /&gt;
A canister can manipulate its certified data by calling the below System API methods. Please look at the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#system-api-certified-data interface spec] for more details.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ic0.certified_data_set : (src: i32, size : i32) -&amp;gt; ()&lt;br /&gt;
ic0.data_certificate_present : () -&amp;gt; i32&lt;br /&gt;
ic0.data_certificate_size : () -&amp;gt; i32&lt;br /&gt;
ic0.data_certificate_copy : (dst: i32, offset: i32, size: i32) -&amp;gt; ()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Motoko base library includes a module called &amp;lt;code&amp;gt;CertifiedData&amp;lt;/code&amp;gt; ([https://internetcomputer.org/docs/current/references/motoko-ref/CertifiedData documentation]) which contains the below wrappers for the System API methods. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let set : (data : Blob) -&amp;gt; ()&lt;br /&gt;
let getCertificate : () -&amp;gt; ?Blob&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rust Canister Development Kit &amp;lt;code&amp;gt;ic-cdk&amp;lt;/code&amp;gt; provides the below wrappers for the System API methods. Please refer to [https://github.com/dfinity/cdk-rs/blob/main/src/ic-cdk/src/api/mod.rs github] for more details on their implementation.  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub fn set_certified_data(data: &amp;amp;[u8])&lt;br /&gt;
pub fn data_certificate() -&amp;gt; Option&amp;lt;Vec&amp;lt;u8&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A certificate for the certified data consists of &lt;br /&gt;
* Certificate for the root hash of the system tree. &lt;br /&gt;
* Witness/Merkle proof to prove that the certified data belongs to a tree that hashes to the above root hash. &lt;br /&gt;
If the certified data is a hash of a few assets, then the certificate for a particular asset additionally contains a Merkle proof that the asset belongs to a tree that hashes to the certified data. &lt;br /&gt;
Refer to [[#IC-Certificate header]] for more details. &lt;br /&gt;
&lt;br /&gt;
== Canister protocol ==&lt;br /&gt;
&lt;br /&gt;
A canister must follow the following protocol to certify assets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Construct a [https://smartcontracts.org/docs/interface-spec/index.html#_certificate hash tree] that maps paths of HTTP resources to SHA-256 hashes of their bodies.&lt;br /&gt;
An example of such a tree:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*root*&lt;br /&gt;
└── http_assets&lt;br /&gt;
    ├── index.html -&amp;gt; SHA256(body)&lt;br /&gt;
    ├── ...&lt;br /&gt;
    └── /css/styles.css -&amp;gt; SHA256(body)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Compute the root hash of the tree and call [https://smartcontracts.org/docs/interface-spec/index.html#system-api-imports &amp;lt;code&amp;gt;ic0.certified_data_set&amp;lt;/code&amp;gt;] with the bytes of the hash as the argument.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Add a [[#IC-Certificate header]] to each certified HTTP response.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Certifying Assets ====&lt;br /&gt;
A canister developer can certify the assets in the following 2 ways. &lt;br /&gt;
* The canister developer can explicitly write code to manage and certify all the assets. In this case, the developer need to construct a tree containing all the assets, merkelize the tree and compute its root hash. To certify the root hash, &lt;br /&gt;
**In Rust, the &amp;lt;code&amp;gt;set_certified_data&amp;lt;/code&amp;gt; method provided by &amp;lt;code&amp;gt;ic-cdk&amp;lt;/code&amp;gt; library needs to be called with the root hash as input. &lt;br /&gt;
**In Motoko, the &amp;lt;code&amp;gt;CertifiedData.set&amp;lt;/code&amp;gt; method needs to be called with the root hash as input (example on [https://github.com/nomeata/motoko-certified-http/blob/master/main.mo github]). &lt;br /&gt;
The developer can also take the help of &amp;lt;code&amp;gt;ic-certified-assets&amp;lt;/code&amp;gt; library ([https://github.com/dfinity/sdk/tree/master/src/canisters/frontend/ic-certified-assets github]) which contains many methods to maintain a tree and certify it.&lt;br /&gt;
&lt;br /&gt;
* The canister developer can alternately create an &amp;quot;asset canister&amp;quot;, by creating a canister with type set to &amp;quot;asset&amp;quot; and specifying the folder containing all the assets. The asset canister is a regular canister, except that the boilerplate code for managing and certifying all the assets is taken care of for us. For example, refer to &amp;lt;code&amp;gt;dfx.json&amp;lt;/code&amp;gt; file of the Hello World project ([https://github.com/dfinity/examples/tree/master/motoko/hello github]). The developer can use this method to host even large web projects coded in frameworks such as React, Angular and Svelte on the Internet Computer with very little code. The developer just have to create an asset canister and specify the source folder of the web project. All the assets will be automatically uploaded to the Internet Computer and certified. &lt;br /&gt;
&lt;br /&gt;
==== Generating a HTTP Response ====&lt;br /&gt;
The Internet Computer supports a built-in &amp;quot;query&amp;quot; method called &amp;lt;code&amp;gt;http_request&amp;lt;/code&amp;gt;. The method takes the information related to a HTTP Request as input and outputs a HTTP Response. Specifically, the output contains status, headers and body. If a developer wants his canister to serve HTTP Requests, he should implement this method appropriately. When a client makes a HTTP Request to a canister, the boundary node (&amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;) converts the HTTP Request to a canister call to the &amp;lt;code&amp;gt;http_request&amp;lt;/code&amp;gt; method and returns the canister&#039;s response. Please refer to [https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request interface spec] for more details. &lt;br /&gt;
&lt;br /&gt;
When the canister would like to return a certified asset, the response body should contain the asset and the response headers should include a header with name &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; and value equal to the certificate of the asset (example on [https://github.com/nomeata/motoko-certified-http/blob/master/main.mo github]). &lt;br /&gt;
&lt;br /&gt;
== Validator protocol ==&lt;br /&gt;
&lt;br /&gt;
The validator follows the following steps to validate the certificate of resource at path &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; served by canister &amp;lt;code&amp;gt;CANISTER_ID&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Hash the body of the HTTP response, obtaining hash &amp;lt;code&amp;gt;DATA_HASH&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Check that the response contains the &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header.&lt;br /&gt;
* Decode the &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; from the value of the &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header.&lt;br /&gt;
* Check the validity of the certificate as described in the [https://smartcontracts.org/docs/interface-spec/index.html#certification Interface Specification: Certification]. This step requires knowing the IC root key.&lt;br /&gt;
* Check that &amp;lt;code&amp;gt;lookup(/http_assets/PATH, tree) = Found(DATA_HASH)&amp;lt;/code&amp;gt;. This check verifies that the path &amp;lt;code&amp;gt;/http_assets/PATH&amp;lt;/code&amp;gt; in tree &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; contains a leaf with value &amp;lt;code&amp;gt;DATA_HASH&amp;lt;/code&amp;gt;. In other words, this check verifies that the asset (with hash equals &amp;lt;code&amp;gt;DATA_HASH&amp;lt;/code&amp;gt;) is part of the tree specified in the certificate. &lt;br /&gt;
* Check that &amp;lt;code&amp;gt;lookup(/canister/CANISTER_ID/certified_data, certificate.tree) = Found(reconstruct(tree))&amp;lt;/code&amp;gt;. This check verifies that the path &amp;lt;code&amp;gt;/canister/CANISTER_ID/certified_data&amp;lt;/code&amp;gt; in tree &amp;lt;code&amp;gt;certificate.tree&amp;lt;/code&amp;gt; contains a leaf with value &amp;lt;code&amp;gt;reconstruct(tree)&amp;lt;/code&amp;gt;. In other words, this check verifies that the root hash of the asset tree is certified.&lt;br /&gt;
&lt;br /&gt;
== IC-Certificate header ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header is a Structure Header (as per [https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-header-structure RFC proposal]) is a dictionary with members &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt;, both of which are Byte Sequences:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IC-Certificate: certificate=:&amp;lt;base64(c)&amp;gt;:, tree=:&amp;lt;base64(t)&amp;gt;:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is the CBOR-encoded certificate (see [https://smartcontracts.org/docs/interface-spec/index.html#certification-encoding Interface Specification: Encoding of certificates]).&lt;br /&gt;
* &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; is a Hash Tree, CBOR-encoded according the CDDL &amp;lt;code&amp;gt;#6.55799(hash-tree)&amp;lt;/code&amp;gt; where &amp;lt;code&amp;gt;hash-tree&amp;lt;/code&amp;gt; is the corresponding [https://smartcontracts.org/docs/interface-spec/index.html#api-cddl CDDL production in the Interface Specification].&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; must be a valid [https://smartcontracts.org/docs/interface-spec/index.html#_certificate Internet Specification: Certificate] with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lookup(/canister/&amp;lt;canister_id&amp;gt;/certified_data, certificate.tree)&lt;br /&gt;
    = Found (reconstruct(tree))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; exposes the relevant nodes in the &amp;lt;code&amp;gt;/http_assets&amp;lt;/code&amp;gt; subtree to allow the client to lookup the request path to get the expected body hash.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
For this example, &amp;lt;code&amp;gt;/index.html&amp;lt;/code&amp;gt; of the Internet Identity canister (canister id &amp;lt;code&amp;gt;rdmx6-jaaaa-aaaaa-aaadq-cai&amp;lt;/code&amp;gt;) available at https://rdmx6-jaaaa-aaaaa-aaadq-cai.raw.ic0.app/index.html was fetched.&lt;br /&gt;
The SHA-256 hash of the resource at the moment of fetching is &amp;lt;code&amp;gt;478afb8206ca0b566a7f138e623accd169fa822602d2f6d717fb67d1045f4f0d&amp;lt;/code&amp;gt;.&lt;br /&gt;
The response contained the following header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IC-Certificate: certificate=:2dn3omR0cmVlgwGDAYMBgwJIY2FuaXN0ZXKDAYMBggRYIIudikoDwH1gRK637olblUhMUX3HlE0Dihj8MTACxGzHgwGCBFggyCRYc8M/ugt8G7C8RPYayn+l4sdBj8gvFotzJELnQ32DAYIEWCA1/+UHZ9SF67w4ssjOi+Jv3ch7WQNzezGmhtuvB+RDpYMCSgAAAAAAAAAHAQGDAYMBgwJOY2VydGlmaWVkX2RhdGGCA1ggWUt10wjWinx0aAWyrNEi/0R7VeuhalDMjGDErzIbZzqCBFgg/VtZRZdYyK/sr3KF2jWeS1rblF+4ajwfDv2ZbCGpaTiCBFggSoI5JS0pCusHP4nh6h780ebr961E0lVnFkFwzF5pZaeCBFggcKidPEGiPoFMPYfEyNGsDRYWmry1iGX0HNUEoKhIATeCBFggR0zdKUZOMcm5EHNl5Tee3XWqbq1gArwUGzZ2FH4rWtmCBFggTkwJcNrh0eJ9FutJcn6th9eCbM2KXnloxed0acxmQNeDAYIEWCA6SNH8IT1JMHEDEE99csK1kw7bqHh7kGMfNDs6popfCoMCRHRpbWWCA0nFnbXrts/65xZpc2lnbmF0dXJlWDCkXN2tcvH5b+xFCzfkuJMqrZDcplfW8vDziJwzx08WOPI4rh2TIGYZ3R6dgQTF0CA=:, tree=:2dn3gwGDAktodHRwX2Fzc2V0c4MBggRYIDgtAGcz5VvevwiEwwZB9zpkt17C9LE6o/O37bEwQUawgwGDAksvaW5kZXguaHRtbIIDWCBHivuCBsoLVmp/E45iOszRafqCJgLS9tcX+2fRBF9PDYIEWCCx2L8SfJwOydBkUxjc8tKXDVUeoiw8qEYI+8b+HRWIWYIEWCAqZ+3yoFSA9s+jbLFbtcVz+wi0HF9x51Kx38qPcBhiDA==:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following data can be extracted from the header value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ROOT HASH: 0b2d843df534ac8ed2331fe2782deb71d23a08d9b4019a8fa695ec7fde93de36&lt;br /&gt;
TREE HASH: 594b75d308d68a7c746805b2acd122ff447b55eba16a50cc8c60c4af321b673a&lt;br /&gt;
SIGNATURE: a45cddad72f1f96fec450b37e4b8932aad90dca657d6f2f0f3889c33c74f1638f238ae1d93206619dd1e9d8104c5d020&lt;br /&gt;
CERTIFICATE TIME: 2022-02-02T08:23:24.851277509+00:00&lt;br /&gt;
CERTIFICATE TREE:&lt;br /&gt;
HashTree {&lt;br /&gt;
    root: Fork(&lt;br /&gt;
        Fork(&lt;br /&gt;
            Fork(&lt;br /&gt;
                Label(&amp;quot;canister&amp;quot;, Fork(&lt;br /&gt;
                    Fork(&lt;br /&gt;
                        Pruned(8b9d8a4a03c07d6044aeb7ee895b95484c517dc7944d038a18fc313002c46cc7),&lt;br /&gt;
                        Fork(&lt;br /&gt;
                            Pruned(c8245873c33fba0b7c1bb0bc44f61aca7fa5e2c7418fc82f168b732442e7437d),&lt;br /&gt;
                            Fork(&lt;br /&gt;
                                Pruned(35ffe50767d485ebbc38b2c8ce8be26fddc87b5903737b31a686dbaf07e443a5),&lt;br /&gt;
                                Label(0x00000000000000070101, Fork(&lt;br /&gt;
                                    Fork(&lt;br /&gt;
                                        Label(&amp;quot;certified_data&amp;quot;, Leaf(0x594b75d308d68a7c746805b2acd122ff447b55eba16a50cc8c60c4af321b673a)),&lt;br /&gt;
                                        Pruned(fd5b59459758c8afecaf7285da359e4b5adb945fb86a3c1f0efd996c21a96938),&lt;br /&gt;
                                    ),&lt;br /&gt;
                                    Pruned(4a8239252d290aeb073f89e1ea1efcd1e6ebf7ad44d25567164170cc5e6965a7),&lt;br /&gt;
                                )),&lt;br /&gt;
                            ),&lt;br /&gt;
                        ),&lt;br /&gt;
                    ),&lt;br /&gt;
                    Pruned(70a89d3c41a23e814c3d87c4c8d1ac0d16169abcb58865f41cd504a0a8480137),&lt;br /&gt;
                )),&lt;br /&gt;
                Pruned(474cdd29464e31c9b9107365e5379edd75aa6ead6002bc141b3676147e2b5ad9),&lt;br /&gt;
            ),&lt;br /&gt;
            Pruned(4e4c0970dae1d1e27d16eb49727ead87d7826ccd8a5e7968c5e77469cc6640d7),&lt;br /&gt;
        ),&lt;br /&gt;
        Fork(&lt;br /&gt;
            Pruned(3a48d1fc213d49307103104f7d72c2b5930edba8787b90631f343b3aa68a5f0a),&lt;br /&gt;
            Label(&amp;quot;time&amp;quot;, Leaf(0xc59db5ebb6cffae716)),&lt;br /&gt;
        ),&lt;br /&gt;
    ),&lt;br /&gt;
}&lt;br /&gt;
TREE:&lt;br /&gt;
HashTree {&lt;br /&gt;
    root: Fork(&lt;br /&gt;
        Label(&amp;quot;http_assets&amp;quot;, Fork(&lt;br /&gt;
            Pruned(382d006733e55bdebf0884c30641f73a64b75ec2f4b13aa3f3b7edb1304146b0),&lt;br /&gt;
            Fork(&lt;br /&gt;
                Label(&amp;quot;/index.html&amp;quot;, Leaf(0x478afb8206ca0b566a7f138e623accd169fa822602d2f6d717fb67d1045f4f0d)),&lt;br /&gt;
                Pruned(b1d8bf127c9c0ec9d0645318dcf2d2970d551ea22c3ca84608fbc6fe1d158859),&lt;br /&gt;
            ),&lt;br /&gt;
        )),&lt;br /&gt;
        Pruned(2a67edf2a05480f6cfa36cb15bb5c573fb08b41c5f71e752b1dfca8f7018620c),&lt;br /&gt;
    ),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* The protocol supports only one resource per path. This does not work well with content negotiation protocol.&lt;br /&gt;
* The protocol does not support certification of HTTP statuses and headers. Only resource bodies can be certified.&lt;br /&gt;
&lt;br /&gt;
== Serving HTTP Requests Dynamically ==&lt;br /&gt;
This wiki article describes how a canister can a-priori create certificates for assets and then serve these assets to the user. What if a canister has to dynamically generate a HTTP response based on the input of &amp;lt;code&amp;gt;http_request&amp;lt;/code&amp;gt; method? In this case, the HTTP response doesn&#039;t include a certificate and cannot be trusted. To improve the trust in this case, a HTTP response includes an &amp;lt;code&amp;gt;upgrade&amp;lt;/code&amp;gt; tag. If this tag is set, then the HTTP gateway processing the HTTP response would send the request again to an &amp;quot;update&amp;quot; method called &amp;lt;code&amp;gt;http_request_update&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;http_request_update&amp;lt;/code&amp;gt; method is a built-in method that also serves HTTP requests. As the responses to update calls are certified by the Internet Computer, this mechanism can be used to serve HTTP requests dynamically in a trustworthy way. &lt;br /&gt;
&lt;br /&gt;
More details of the protocol in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway interface spec].&lt;br /&gt;
&lt;br /&gt;
== Canisters using HTTP asset certification ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/dfinity/internet-identity/blob/7ff3dd51dd98c7b1b43d83950c9f31ea7159103d/src/internet_identity/src/main.rs#L775 Internet Identity canister]&lt;br /&gt;
* [https://github.com/dfinity/nns-dapp/blob/49126394df77b9583e508277fc736eda51de47be/rs/src/assets.rs#L123 NNS frontend]&lt;br /&gt;
* [https://github.com/dfinity/certified-assets Certified assets canister]&lt;br /&gt;
&lt;br /&gt;
== Validators ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/dfinity/icx-proxy/blob/b0de0437fe6806a96d942465e5ee284c23b812e8/src/main.rs#L470 ICX proxy]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=7054</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=7054"/>
		<updated>2024-01-25T08:58:05Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Updated all descriptions to reflect the removal of the service worker.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), and allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
[[File:Boundary Node Diagrams - BN Internals.png|alt=|center|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;icp-api.io/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to a replica node on the correct subnet in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists only of rate-limiting. The rate-limits are in place to protect the IC from being overwhelmed with external accesses.&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
The HTTP endpoint is served through two main domains: &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;icp0.io&amp;lt;/code&amp;gt;. In the following, we use for simplicity only &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt;, even though both domains could be used equally.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, browsers don&#039;t natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by providing a mechanism to translate HTTP requests into API canister calls allowing a client to interact with canisters. A gateway can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide with &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; one implementation of the HTTP gateway protocol, which runs directly on the boundary node and  operates in two different modes:&lt;br /&gt;
&lt;br /&gt;
* Enforcing response verification under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Permissive response verification under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
However, before serving any HTTP request, the HTTP Gateway first passes the incoming request through a filter, which can be used to implement content filtering allowing operators to comply with local legal frameworks (e.g., blocking gambling services in a particular geography). To learn more about content filtering see [[Content_Filtering_via_Boundary_Nodes|Content Filtering via The Boundary Nodes]].&lt;br /&gt;
&lt;br /&gt;
Then, the requests are passed on to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, which translates the HTTP requests into API canister calls. These API canister calls are passed onto the API endpoint of the boundary node, which forwards it to a replica in the IC.&lt;br /&gt;
&lt;br /&gt;
Upon receiving the response, &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; checks certificate of the response and constructs an HTTP response back to the client. In &#039;&#039;enforcing mode&#039;&#039;, &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; only sends the response to the client if it is correctly certified and an error otherwise. In &#039;&#039;permissive mode&#039;&#039;, icx-proxy only checks the certificate if there is one. The permissive mode is mainly required for legacy canisters that do not implement response verification or for dynamic responses that cannot easily be certified.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
The HTTP gateway on the boundary nodes allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response for HTTP assets. Responses to requests are cached for 10s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;br /&gt;
* [[Content Filtering via Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=File:Boundary_Node_Diagrams_-_BN_Internals.png&amp;diff=7053</id>
		<title>File:Boundary Node Diagrams - BN Internals.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=File:Boundary_Node_Diagrams_-_BN_Internals.png&amp;diff=7053"/>
		<updated>2024-01-25T08:27:40Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are made up of an API node and an HTTP gateway. The API node serves all Internet Computer API requests (i.e., status, query, update, and read state), while the HTTP gateway handles all standard HTTP requests.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=ICP_custody_options&amp;diff=6686</id>
		<title>ICP custody options</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=ICP_custody_options&amp;diff=6686"/>
		<updated>2023-11-20T07:37:48Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Do you want maximum control of your keys?==&lt;br /&gt;
&lt;br /&gt;
===No? Then, use third party custody solutions:===&lt;br /&gt;
&lt;br /&gt;
Third party custody solutions allow you to trade-off ease-of-use for control. The trade-off is simple: if you do not feel comfortable managing your own keys and are willing to have a third party to have access to your keys for the sake of being hand-held through the process, then third party solutions can be the right choice for you.&lt;br /&gt;
&lt;br /&gt;
Here are some examples:&lt;br /&gt;
&lt;br /&gt;
* [https://airgap.it/ AirGap]&lt;br /&gt;
* [https://www.coinbase.com/custody Coinbase]&lt;br /&gt;
* [https://plugwallet.ooo/ Plug wallet]&lt;br /&gt;
* [https://www.stoicwallet.com/ Stoic wallet]&lt;br /&gt;
* [https://www.sygnum.com/ Sygnum]&lt;br /&gt;
&lt;br /&gt;
===Yes? Then, use self-custody:===&lt;br /&gt;
* [[ICP custody with NNS frontend dapp]] &lt;br /&gt;
* [[ICP custody with Ledger Nano]]&lt;br /&gt;
* ICP Custody with [https://github.com/dfinity/quill Quill] (Minimalistic ledger and governance toolkit for cold wallets) Networked computer&lt;br /&gt;
* [[ICP custody with seed phrase and air-gapped machine]]&lt;br /&gt;
&lt;br /&gt;
==Self-custody: Maximum ease option ==&lt;br /&gt;
&lt;br /&gt;
If you choose self-custody, the simplest option to consider is: [[ICP Custody with NNS frontend dapp]].&lt;br /&gt;
&lt;br /&gt;
It consists of using an [https://identity.ic0.app/ Internet Identity] with the [https://nns.ic0.app/ NNS frontend dapp].&lt;br /&gt;
&lt;br /&gt;
===Traits===&lt;br /&gt;
* It&#039;s the most convenient, entirely web-based, with no need to download or install anything.&lt;br /&gt;
* The [https://nns.ic0.app/ NNS frontend dapp] has all the functionality you need.&lt;br /&gt;
* This is a very common method.&lt;br /&gt;
* This method is ideal for people who want the easiest path to control their ICP.&lt;br /&gt;
* This custody solution has staking and voting built-in if you want to participate in governance.&lt;br /&gt;
&lt;br /&gt;
==Self-custody: Maximum control option==&lt;br /&gt;
&lt;br /&gt;
If you choose self-custody, the options which maximize control are: &lt;br /&gt;
&lt;br /&gt;
* [[ICP custody with seed phrase and air-gapped machine]]&lt;br /&gt;
* [[ICP custody with Ledger Nano]]&lt;br /&gt;
&lt;br /&gt;
===Traits===&lt;br /&gt;
&lt;br /&gt;
* This option requires more technical understanding.&lt;br /&gt;
* This is the &#039;&#039;safest&#039;&#039; option from a software point of view because the user relies on less software surface area, but it is the &#039;&#039;riskiest&#039;&#039; from a human point of view in that it puts the risk of the user&#039;s [[seed phrase]] and [[private key]] custody on them.&lt;br /&gt;
* Ideal for people who want as much control over their ICP as possible.&lt;br /&gt;
* This custody solution has staking built-in if you want to stake as well.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Tutorials for acquiring, managing, and staking ICP]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Troubleshooting_Node_Deployment_Errors&amp;diff=6684</id>
		<title>Troubleshooting Node Deployment Errors</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Troubleshooting_Node_Deployment_Errors&amp;diff=6684"/>
		<updated>2023-11-20T07:28:46Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has some error codes that may display as you are onboarding your nodes. Please review the examples, causes, and proposed solutions before reaching out on the IC Node Provider Matrix channel. &lt;br /&gt;
&lt;br /&gt;
If you need Dell to service your machine, then these links will assist in [[Retrieving a Dell TSR Log|retrieving a Dell TSR Log]] and in resetting the iDRAC password.&lt;br /&gt;
&lt;br /&gt;
If you encounter an error not listed here, please capture a screenshot and detail when it happened, which stage in onboarding you were at, the status of any lights on the server, and any other relevant details. Post your issue and accompanying screenshots in the [https://app.element.io/#/room/#ic-node-providers:matrix.org IC Node Provider Matrix channel].&lt;br /&gt;
&lt;br /&gt;
== Orchestrator Started ==&lt;br /&gt;
This message is not an error, nor is it confirmation that the node is running properly. &lt;br /&gt;
&lt;br /&gt;
* Check [https://dashboard.internetcomputer.org/ the dashboard] to check the status of that particular node. (Status explanations are [[Node Provider Troubleshooting#Node%20Status%20on%20the%20Dashboard|here]].) Use the principal ID that was assigned to the node when it was onboarded to identify it.&lt;br /&gt;
* If the node is not visible on the dashboard then it has not registered with the Internet Computer. &lt;br /&gt;
** If you have recently installed a current IC-OS image, then you can try inserting the HSM and/or a reboot to see if it joins. This would work if the IC-OS installation was successful and only the registration and joining was interrupted. &lt;br /&gt;
** If you have &#039;&#039;not&#039;&#039; recently installed a current IC-OS image, then do &#039;&#039;not&#039;&#039; insert the HSM. You do not want the node to rejoin with an old IC-OS image, as it will only fail again. Instead, you should consider [[Updating Firmware|upgrading the firmware]] if it is running on old versions, and then redeploy the node with [[Node Provider Documentation|a fresh/current IC-OS image]] (which will assign a new principal to the node so that you can identify it in the dashboard.)&lt;br /&gt;
&lt;br /&gt;
== General Troubleshooting ==&lt;br /&gt;
During the IC-OS installation, you may hit enter to obtain console access to troubleshoot any issues you are encountering. You can also hit enter at the error page in order to access the console.&lt;br /&gt;
&lt;br /&gt;
Once you have console access, in order to stop the IC-OS installation service, enter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;$ systemctl stop setupos&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Missing Drives ==&lt;br /&gt;
==== Example Error ====&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                       INTERNET COMPUTER - SETUP - FAILED&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Please contact the Node Provider Matrix channel for support.&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Not enough drives found. Are all drives correctly installed?&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another version of it might say  &amp;quot;Aggregate Disk size does not meet requirements&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Common Causes ====&lt;br /&gt;
This error means that the IC-OS installation medium could not detect all required drives. This is a common issue, even if you believe that all drives are installed correctly. Some of them may not be functioning properly, or may not be fully seated into the chassis.&lt;br /&gt;
&lt;br /&gt;
==== Suggested Solutions ====&lt;br /&gt;
Check that all drives are fully seated and installed correctly, or install the required number of drives. You may be able to check the drives for indication LEDs to see which may not be installed or functioning correctly.&lt;br /&gt;
&lt;br /&gt;
== Invalid CPU Configuration ==&lt;br /&gt;
==== Example Error ====&lt;br /&gt;
&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                       INTERNET COMPUTER - SETUP - FAILED&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Please contact the Node Provider Matrix channel for support.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Number of threads (16/32) does NOT meet system requirements.&lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Common Causes ====&lt;br /&gt;
Issues related to CPU capability usually mean that the CPUs are not configured correctly in the system BIOS.&lt;br /&gt;
&lt;br /&gt;
==== Suggested Solutions ====&lt;br /&gt;
Please check that BIOS settings are configured correctly. It may be helpful to reset all settings to factory defaults, and go through the BIOS configuration again.&lt;br /&gt;
== Unable to Reach Internet ==&lt;br /&gt;
==== Example Error ====&lt;br /&gt;
&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                       INTERNET COMPUTER - SETUP - FAILED&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Please contact the Node Provider Matrix channel for support.&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  Unable to ping IPv6 gateway.&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
==== Common Causes ====&lt;br /&gt;
This error means that the node is not able to communicate with the network properly. This can be due to a misconfigured network configuration, or due to issues somewhere between the node and the rest of the internet.&lt;br /&gt;
&lt;br /&gt;
==== Suggested Solutions ====&lt;br /&gt;
Please try to capture any output that is displayed before this error shows. For example:&lt;br /&gt;
 * Printing user defined network settings...&lt;br /&gt;
  IPv6 Prefix : XXX&lt;br /&gt;
  IPv6 Subnet : XXX&lt;br /&gt;
  IPv6 Gateway: XXX&lt;br /&gt;
  &lt;br /&gt;
 * Printing system&#039;s network settings...&lt;br /&gt;
  IPv6 Prefix : XXX&lt;br /&gt;
  IPv6 Subnet : XXX&lt;br /&gt;
  IPv6 Gateway: XXX&lt;br /&gt;
  &lt;br /&gt;
 * Printing IPv6 addresses...&lt;br /&gt;
  SetupOS: XXX&lt;br /&gt;
  HostOS : XXX&lt;br /&gt;
  GuestOS: XXX&lt;br /&gt;
&lt;br /&gt;
Please compare this, and the initial configuration, to what you expect. If this configuration does not match, please update the initial configuration, and try again.&lt;br /&gt;
&lt;br /&gt;
If this does match the expected configuration, please attempt to diagnose any machines between this node and the rest of the internet. This could be due to improper firewall configuration, or an issue with the data center’s network. If all configuration looks correct, please attempt to reboot any machines between this node and the rest of the Internet. In most cases, this would be a firewall. Rebooting the firewall - even if it seems to be operating correctly - has resolved this issue many times.&lt;br /&gt;
&lt;br /&gt;
== Unable to setup PV ==&lt;br /&gt;
==== Example Error ====&lt;br /&gt;
&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                       INTERNET COMPUTER - SETUP - FAILED&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Please contact the Node Provider Matrix channel for support.&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  Unable to setup PV on drive &#039;/dev/nvme8n1&#039;.&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
                                     ERROR&lt;br /&gt;
 --------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
==== Common Causes ====&lt;br /&gt;
This error means that the node is able to recognize that a drive is installed, but is unable to write to it. This could indicate that there is a hardware issue with the drive.&lt;br /&gt;
&lt;br /&gt;
==== Suggested Solutions ====&lt;br /&gt;
Please try to remove and re-install all drives, before attempting to install the node again. It may be helpful to independently verify that each drive is functioning correctly.&lt;br /&gt;
== Long Wait on Node Join ==&lt;br /&gt;
==== Example Error ====&lt;br /&gt;
 Orchestrator started.&lt;br /&gt;
 Starting node registration.&lt;br /&gt;
 Attaching HSM.&lt;br /&gt;
 Sending add_node request.&lt;br /&gt;
&lt;br /&gt;
But not:&lt;br /&gt;
 Join request successful!&lt;br /&gt;
 You may now safely remove the HSM.&lt;br /&gt;
&lt;br /&gt;
==== Common Causes ====&lt;br /&gt;
The node has installed and launched successfully, but is unable to join the network. This could be due to an out-of-date IC-OS installation image, trouble contacting the NNS, or node installation limits on the network.&lt;br /&gt;
&lt;br /&gt;
==== Suggested Solutions ====&lt;br /&gt;
Please verify that a recent [https://dashboard.internetcomputer.org/releases IC-OS installation] image version is being used, and check https://dashboard.internetcomputer.org/ to see how many nodes are currently registered under your Node Provider. If there are more nodes listed than expected, or if there are multiple nodes overlapping, please have any extra nodes removed from the network before attempting to install again. This can be caused if multiple installations have been performed on the same hardware, without cleaning up the records from the network.&lt;br /&gt;
&lt;br /&gt;
* [[Internet Computer wiki|Return to Wiki Home]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=6683</id>
		<title>Node Deployment Guide (with an HSM)</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide_(with_an_HSM)&amp;diff=6683"/>
		<updated>2023-11-20T07:21:42Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS) using the legacy NitroKey HSM instructions. To use the non-HSM onboarding instructions, follow the [[IC-OS Installation Runbook]].&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to be physically present in the data center your machine(s) reside(s). Once you successfully onboard your first node, you can bring up the others in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues through any of these steps, check the [[Node Provider Troubleshooting]] page. If that does not solve your problem, you are encouraged to ask for assistance in the [[Node Provider Matrix channel]].&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, follow the [[IC-OS Installation Runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
** Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The NitroKey HSM for your data center.&lt;br /&gt;
*[Optional] A USB hub&lt;br /&gt;
** This is helpful at some data centers for simultaneously connecting keyboard, mouse, Nitrokey, etc.&lt;br /&gt;
*It is recommended that each server has a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
==3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; and the &#039;&#039;&#039;corresponding checksum&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. &lt;br /&gt;
*Note that you should always use a release that is less than 6 weeks old in order to ensure that your node can keep up with the blockchain.&lt;br /&gt;
&lt;br /&gt;
==4. Verify checksum and unarchive file==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sha256sum ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Open PowerShell and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open PowerShell and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==5. Create Bootable USB Stick==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#The file path is an example. Use the absolute path to the downloaded image. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong device. &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive. &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=~/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
#The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==6. Add configuration ==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu. &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition.&lt;br /&gt;
#Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
#Select any letter from the drop-down list. &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
# Click OK.&lt;br /&gt;
# You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file. &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
#Insert your IPv6 prefix, subnet and gateway.&lt;br /&gt;
#:[[File:Edit config ini.png|580px|screenshot]]&lt;br /&gt;
#:*The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:* For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:100&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:** The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the  prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. The &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used. Even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:*If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:*If you need help, please do not hesitate to post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==7. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
#Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==8. UEFI Setup and Boot Menu==&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
==9. IC-OS Installation ==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Possible Node Onboarding Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#Once you get asked to insert the HSM, please remove the keyboard and instead insert the HSM USB device. &lt;br /&gt;
#:[[File:37-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &#039;&#039;&#039;Please do not unplug the USB stick or HSM USB&#039;&#039;&#039; device at this point.&lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==10. First Boot==&lt;br /&gt;
Please remember to check the [[Possible Node Onboarding Errors]] page if you encounter any errors onboarding.&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;Do NOT re-try the IC-OS installation after completing this section, as this can cause duplication within the registry.&#039;&#039;&#039;&lt;br /&gt;
#The first boot of the IC-OS still requires the HSM USB device. Please wait until further instructions. This step can take up to 2 minutes.&lt;br /&gt;
#:[[File:39-sm.png|580px|screenshot]]&lt;br /&gt;
#Once you see this message, you may unplug the HSM USB device, USB stick and VGA/Video. Your machine successfully joined the Internet Computer! **&#039;&#039;&#039;Label the server with the node ID for easy future identification in the dashboard (at least the first 10 characters). ***&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
🚨 Again: Once you reach this stage and see this message, &#039;&#039;&#039;do not attempt to restart the onboarding process.&#039;&#039;&#039; Doing so may cause duplicate entries in the registry.&lt;br /&gt;
==11. Verify node onboarding ==&lt;br /&gt;
&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] is set to either “Awaiting Subnet” or “Active in Subnet”. &lt;br /&gt;
#*The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node (Node ID outputted in step 10).&lt;br /&gt;
#*If the status of your node is not either “Awaiting Subnet” or “Active in Subnet”, or if it is not listed under your Node Provider principal, you should contact the [[Node Provider Matrix channel]] for assistance.&lt;br /&gt;
#*:[[File:Dashboard-node-verification.png|thumb|998x998px]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=6682</id>
		<title>Node Deployment Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Node_Deployment_Guide&amp;diff=6682"/>
		<updated>2023-11-19T20:59:00Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This runbook covers all steps necessary to install the Internet Computer Operating System (IC-OS).&lt;br /&gt;
&lt;br /&gt;
The physical machine is expected to be racked and stacked according to its respective manual.&lt;br /&gt;
&lt;br /&gt;
To complete these steps, you are expected to by physically present with your machine(s). Once you successfully onboarded your first node, you can bring up the other nodes in parallel.&lt;br /&gt;
&lt;br /&gt;
If you encounter issues through any of these steps, check the [[Node Provider Troubleshooting]] page. If that does not solve your problem, you are encouraged to ask for assistance in the [[Node Provider Matrix channel]].&lt;br /&gt;
&lt;br /&gt;
==1. Choose onboarding path (HSM vs. no HSM)==&lt;br /&gt;
If you chose the [[Node Provider Onboarding#5. Choose onboarding path .28HSM vs no HSM.29|HSM Node Provider Onboarding Path]], follow the [[NitroKey HSM installation runbook]] to onboard your nodes.&lt;br /&gt;
&lt;br /&gt;
If you chose to onboard &#039;&#039;&#039;without&#039;&#039;&#039; a Nitrokey HSM, &#039;&#039;&#039;continue to the next step.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==2. Obtain requirements ==&lt;br /&gt;
*A USB (3.0 speed that can hold at least 4GB) to put the image file on.&lt;br /&gt;
**Faster USBs will allow the process to go much faster.&lt;br /&gt;
*The &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; for your data center (Acquired from [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]])&lt;br /&gt;
* It is recommended that each server have a label with the BMC&#039;s MAC address for ease of identification in future dashboard upgrades.&lt;br /&gt;
&lt;br /&gt;
== 3. Download installation image==&lt;br /&gt;
Download the latest release of the &#039;&#039;&#039;IC-OS USB Installer Image&#039;&#039;&#039; and the &#039;&#039;&#039;corresponding checksum&#039;&#039;&#039; from the [https://dashboard.internetcomputer.org/releases Internet Computer Dashboard Releases]. &lt;br /&gt;
*Note that you should always use a release that is less than 6 weeks old in order to ensure that your node can keep up with the blockchain.&lt;br /&gt;
&lt;br /&gt;
== 4. Verify checksum and unarchive file==&lt;br /&gt;
===Mac OS X ===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;shasum -a 256 ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sha256sum ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open the Terminal and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf ~/Downloads/disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Open PowerShell and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Get-FileHash -Algorithm SHA256 .\Downloads\disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Compare the calculated checksum with the &#039;&#039;&#039;IC-OS installation image checksum&#039;&#039;&#039; file downloaded in the previous step. &#039;&#039;&#039;Warning:&#039;&#039;&#039; Only continue if they are identical, otherwise please post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:Open PowerShell and type: &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tar xzvf .\Downloads\disk-img.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==5. Create Bootable USB Stick ==&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
# Open the Terminal and type: &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;diskutil list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/disk4s1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#The file path is an example. Use the absolute path to the downloaded image. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong device. &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=/Users/YOUR_USER_NAME/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M&amp;lt;/syntaxhighlight&amp;gt;If you get a “device is busy” error from the dd command, you can try running the following command to unmount all of the partitions on the disk, then re-run the dd command:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmountDisk /dev/YOUR_USB_DEVICE # E.g. /dev/disk4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Ubuntu===&lt;br /&gt;
#Open the Terminal and type &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;blkid&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# All available drives should be shown. Identify which device corresponds to your USB stick. You may need to unmount the USB drive:&lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo diskutil unmount /dev/YOUR_USB_DEVICE_MOUNTED_PARTITION # E.g. /dev/sdb1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Replace &#039;&#039;/dev/YOUR_USB_DEVICE&#039;&#039; with the device that corresponds to your USB stick. &#039;&#039;&#039;Warning:&#039;&#039;&#039; You risk losing your own data if you specify a wrong drive. &lt;br /&gt;
#:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;sudo dd if=~/Downloads/disk.img of=/dev/YOUR_USB_DEVICE bs=1M&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
#Download and install [https://rufus.ie/en/ Rufus Portable]&lt;br /&gt;
#Start Rufus&lt;br /&gt;
#Select the USB stick under device and select the previously downloaded IC-OS disk image and press start &lt;br /&gt;
#:[[File:05.png|480px|screenshot]]&lt;br /&gt;
#You may see some warnings. Make sure you don&#039;t have any other USBs in your computer and chose OK&lt;br /&gt;
#:[[File:06.png|480px|screenshot]]&lt;br /&gt;
#:[[File:07.png|480px|screenshot]]&lt;br /&gt;
# The &amp;quot;Ready&amp;quot; bar will go from left to right as it completes.&lt;br /&gt;
&lt;br /&gt;
==6. Add configuration==&lt;br /&gt;
&lt;br /&gt;
===A. Open Config.ini in a text editor===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Mac OS X&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open Finder. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:mac_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in TextEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Linux&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the File Manager. You should now be able to see the CONFIG partition. If it&#039;s not visible, remove the USB and insert it again.&lt;br /&gt;
#:[[File:linux_01.png|580px|screenshot]]&lt;br /&gt;
#Double-click &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; to open it in KWrite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Windows&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
#Open the Disk Management utility with a right click on the Start menu &lt;br /&gt;
#:[[File:09-b.png|300px|screenshot]]#:&lt;br /&gt;
#Right click the CONFIG partition&lt;br /&gt;
# Select Change drive letter or paths...&lt;br /&gt;
#:[[File:10-b.png|780px|screenshot]]&lt;br /&gt;
# Select any letter from the drop-down list &lt;br /&gt;
#:[[File:11-b.png|480px|screenshot]]&lt;br /&gt;
#Click OK.&lt;br /&gt;
#You should now be able to see the CONFIG partition in your Windows Explorer. Select the &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; configuration file &lt;br /&gt;
#:[[File:12-b.png|780px|screenshot]]&lt;br /&gt;
#Click on Edit to open it.&lt;br /&gt;
&lt;br /&gt;
===B. Edit Config.ini===&lt;br /&gt;
&lt;br /&gt;
#Insert your IPv6 prefix, subnet and gateway.&lt;br /&gt;
#:[[File:Edit config ini.png|580px|screenshot]]&lt;br /&gt;
#:*The IPv6 prefix should consist of four groups of hexadecimal digits, separated by colons (&#039;:&#039;). Each group can contain up to four hex digits.&lt;br /&gt;
#:*For example, a valid prefix could look like this: &amp;lt;code&amp;gt;2a00:fb01:400:100&amp;lt;/code&amp;gt;&lt;br /&gt;
#:*&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
#:**The prefix should not have a trailing &#039;:&#039;&lt;br /&gt;
#:**IPv6 CIDR notation allows for a double colon (&#039;::&#039;) to represent consecutive groups of zeroes in an address. However, the prefix configuration in this context does &#039;&#039;&#039;not&#039;&#039;&#039; support &#039;::&#039;. Hence, the &#039;::&#039; shorthand should &#039;&#039;&#039;not&#039;&#039;&#039; be used: even if some groups are all zeros, they must be explicitly written out.&lt;br /&gt;
#Save the changes. &lt;br /&gt;
#:* If you have trouble saving this file directly, you may need to save to a known location first, then copy the file into place.&lt;br /&gt;
#:* If you need help, please do not hesitate to post your issue in the [[Node Provider Matrix channel]].&lt;br /&gt;
#:*:[[File:mac_03.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== C. Copy Node Operator private key to config partition===&lt;br /&gt;
&lt;br /&gt;
#Copy &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt; (created in [[Node Provider Onboarding#6. Setup the Node Operator keys|Node Provider Onboarding step 6]]) to the &amp;lt;code&amp;gt;CONFIG&amp;lt;/code&amp;gt; partition. This file should have the name &amp;lt;code&amp;gt;node_operator_private_key.pem&amp;lt;/code&amp;gt;, and sit next to &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt;, NOT inside the &amp;lt;code&amp;gt;ssh_authorized_keys&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==7. Connect Crash Cart==&lt;br /&gt;
#In order to configure the UEFI and initiate the installation of the IC-OS, please connect a crash cart to the physical machine.&lt;br /&gt;
#Plug-in the VGA/Video, keyboard and IC-OS USB stick&lt;br /&gt;
#:[[File:08.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
==8. UEFI Setup and Boot Menu==&lt;br /&gt;
Use the related page below to set up the BIOS/UEFI according to your hardware vendor.&lt;br /&gt;
&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 2 Node Machine requirements|Gen2 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 Dell]]&lt;br /&gt;
** [[IC-OS Installation - UEFI Configuration - Gen2 Supermicro]]&lt;br /&gt;
** [[IC-OS Installation - UEFI Configuration - Gen2 Gigabyte]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen2 ASUS]]&lt;br /&gt;
*[[Node Provider Machine Hardware Guide#Gen 1 Node Machine requirements|Gen1 hardware]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Dell|IC-OS Installation - UEFI Configuration - Gen1 Dell (Poweredge R6525)]]&lt;br /&gt;
**[[IC-OS Installation - UEFI Configuration - Gen1 Supermicro]]&lt;br /&gt;
***&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Do NOT enable the RAID bios setting. Doing so will cause issues with the IC-OS installation.&lt;br /&gt;
&lt;br /&gt;
Resume from this point when you are finished configuring the BIOS.&lt;br /&gt;
&lt;br /&gt;
==9. IC-OS Installation==&lt;br /&gt;
#Please wait while the USB Installer is booting up. This process can take up to 3 minutes.&lt;br /&gt;
#:[[File:35-sm.png|580px|screenshot]]&lt;br /&gt;
#The IC-OS installation starts. Please keep an eye on the progress. This part can take up to 10 minutes. Please remember to check the [[Possible Node Onboarding Errors]] page if you encounter any errors.&lt;br /&gt;
#:[[File:36-sm.png|580px|screenshot]]&lt;br /&gt;
#If the installation finished successfully, it will initiate a reboot. &lt;br /&gt;
#:[[File:38-sm.png|580px|screenshot]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==10. First Boot==&lt;br /&gt;
Please remember to check the [[Possible Node Onboarding Errors]] page if you encounter any errors onboarding.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🚨 Do NOT re-try the IC-OS installation after completing this section, as this can cause duplication within the registry.&#039;&#039;&#039;&lt;br /&gt;
#Once you see this message, you may unplug the USB stick and VGA/Video. &lt;br /&gt;
#:[[File:Node join message.png|580px|screenshot]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Your machine successfully joined the Internet Computer! The machine has joined the IC and the Node Provider will start receiving rewards!&lt;br /&gt;
&lt;br /&gt;
🚨 Again: Once you reach this stage and see this message, &#039;&#039;&#039;do not attempt to restart the onboarding process.&#039;&#039;&#039; Doing so may cause duplicate entries in the registry. &lt;br /&gt;
&lt;br /&gt;
==11. Verify node onboarding==&lt;br /&gt;
&lt;br /&gt;
#Verify that your node was successfully onboarded by checking its status on the [https://dashboard.internetcomputer.org/ dashboard] is set to either “Awaiting Subnet” or “Active in Subnet”. &lt;br /&gt;
#*The dashboard can be searched by your Node Provider principal. There, you should see the Node ID of your node (Node ID is outputted in step 10).&lt;br /&gt;
#*If the status of your node is not either “Awaiting Subnet” or “Active in Subnet”, or if it is not listed under your Node Provider principal, you should contact the [[Node Provider Matrix channel]] for assistance.&lt;br /&gt;
#*:[[File:Dashboard-node-verification.png|thumb|998x998px]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Data_center&amp;diff=6681</id>
		<title>Data center</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Data_center&amp;diff=6681"/>
		<updated>2023-11-18T18:18:26Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;A data center is a place designed specifically to host computing systems, such as server computers and data storage arrays. Many data centers are run as services, which allow customers to rent [[rack space]] that they can use to install computing hardware that they own, which is known as co-location.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Asile in data center.jpg|thumb|Data center aisle]]&lt;br /&gt;
&lt;br /&gt;
Data centers are built with features designed that help ensure the continuous operation of the computing hardware installed inside. These typically include redundant power circuits and local backup power generators, air conditioning to keep equipment cool, fire suppression systems, connectivity from multiple internet backbone providers, remote hands services and secure entry systems.&lt;br /&gt;
&lt;br /&gt;
A large data center can contain thousands of computing devices, and consume as much electricity as a small town. Whereas there are only a handful of large [[cloud computing]] services, such as [[Amazon Web Services]], there are thousands of independent data centers around the world where you can install your own computing equipment.&lt;br /&gt;
&lt;br /&gt;
The Internet Computer protocol is hosted by dedicated [[node machines]] installed in data centers operated by independent node providers. This means that it has a [[sovereign network]], whereas most blockchains run in the public cloud.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=WebAssembly&amp;diff=6680</id>
		<title>WebAssembly</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=WebAssembly&amp;diff=6680"/>
		<updated>2023-11-18T18:09:00Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Canister smart contracts should be run efficiently and fast by the Internet Computer (IC). They are running WebAssembly (Wasm) code, which is a highly portable code format widely used for web-based applications as well as client-server and blockchain applications. Wasm is open-source, built for high-performance and efficiency and takes advantage of a wide community effort. Canister Wasm code is created by compiling software written in high-level programming languages such as Rust and Motoko. Because it’s faster, more efficient, and more portable than alternatives, Wasm is key to building efficient applications on the IC.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Portability &amp;amp; High-performance ==&lt;br /&gt;
WebAssembly has quickly established itself as one of the Internet’s favorite code formats due to its portability, efficiency and wide-range community support. Most high-level languages can be compiled down to efficient and portable Wasm code. Wasm code can either be executed internally by browsers or run under virtual machines (VMs) with minimal overhead compared to native execution. For example, Cloudflare uses it to provide &amp;quot;cloud worker&amp;quot; functionality, and advanced blockchains can use it to run high performance smart contracts.&lt;br /&gt;
&lt;br /&gt;
== Target of Many High-level Languages ==&lt;br /&gt;
Most high level languages can nowadays be compiled down to Wasm. In addition to LLVM being able to target Wasm, popular languages such as C, C++, Rust, .NET are now efficiently compiled to Wasm as well. Andreas Rossberg, co-designer of WebAssembly, who joined the DFINITY Foundation in 2017, also led the effort to design the Motoko programming language, which is designed to take full advantage of WebAssembly features, and adapt them to reap special Internet Computer features such as actor model smart contracts and orthogonal persistence.&lt;br /&gt;
&lt;br /&gt;
== Execution of WebAssembly ==&lt;br /&gt;
WebAssembly is platform independent and can execute on (m)any hardware and software platforms. Wasm code is intended to run on a stack-based virtual machine. There are many runtimes and virtual machines that enable Wasm execution either through a browser or as a separate sandboxed process. For the Internet Computer, the Wasmtime project is used to run user-defined canister smart contracts, which provides good performance. An important feature for the IC software stack is enforcing deterministic smart contract execution (to enable state machine replication). For Wasm, this is achieved through removing floating point and SIMD operations. &lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
The execution of Wasm code can easily be sandboxed and isolated from the operation of other smart contracts and processes on the IC nodes. The IC protects against attacks using OS process isolation and sandboxing. Each canister is compiled and executed in its own sandboxed process that communicates only with the main replica process via security-audited IPC. Sandboxes are given the minimal set of permissions needed to execute using object-based access control (SELinux). Furthermore, Wasm code can be formally verified.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
In summary, there are several features of WebAssembly that enable it to be the code format for canister smart contracts on the Internet Computer:&lt;br /&gt;
*It is formally specified, which increases its security.&lt;br /&gt;
*It provides near-native performance, greatly improving smart contract efficiency.&lt;br /&gt;
*It is targeted by LLVM, which means large numbers of programming languages can easily be used for smart contract creation.&lt;br /&gt;
*It has been very widely adopted as the new standard for computation on the Web, and consequently a massive decentralized R&amp;amp;D effort constantly evolves and improves the standard, and a large variety of virtual machine implementations have been created. 	&lt;br /&gt;
*Its execution can be made deterministic by not allowing floating point and SIMD operations.&lt;br /&gt;
*Its execution is memory-safe and sandboxed.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=IDRAC_access_and_TSR_logs&amp;diff=6679</id>
		<title>IDRAC access and TSR logs</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=IDRAC_access_and_TSR_logs&amp;diff=6679"/>
		<updated>2023-11-18T18:03:33Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When Dell is called to service a server, they will ask for the service tag. This is the serial number of the server, which is listed on the pull-out tag on the server. &lt;br /&gt;
&lt;br /&gt;
If they require you to update the firmware, please follow the steps outlined in [[Updating Firmware]].&lt;br /&gt;
&lt;br /&gt;
They will also frequently ask for a TSR log. Here are several sets of directions that may be needed, depending on the situation: &lt;br /&gt;
&lt;br /&gt;
* For most Dell servers, the IP address for the IPMI is not publicly accessible. However, many servers have another method of accessing the iDRAC locally. Information from Dell is available here: [https://www.dell.com/support/kbdoc/en-us/000130077/poweredge-how-to-use-the-idrac-direct-feature?lwp=rt How to Use the iDRAC Direct Feature]&lt;br /&gt;
* How to [https://www.dell.com/support/kbdoc/en-us/000126308/export-a-supportassist-collection-via-idrac9 Export a SupportAssist collection via iDRAC9]&lt;br /&gt;
* How to [https://www.dell.com/support/kbdoc/en-us/000177787/how-to-change-the-default-login-password-of-the-idrac-9 Change the Integrated Dell Remote Access Controller 9 (iDRAC9) default login password] &lt;br /&gt;
** [https://www.dell.com/community/PowerEdge-Hardware-General/Reset-Dell-R630-iDRAC-Password/m-p/5007028 This information] from Dell may also be helpful if you need to reset it with KVM connected.&lt;br /&gt;
* If the faulty server is not allowing access to the iDRAC, then the Lifecycle Controller can be used to pull a TSR log and export it to a USB using [https://www.dell.com/support/kbdoc/en-us/000130772/export-support-assist-collection-and-raid-controller-log-through-poweredge-lifecycle-controller these directions] from Dell.&lt;br /&gt;
** Note that if this is the first time the lifecycle controller has been launched, you will be greeted with a 5-step setup wizard. One of the steps includes network configuration. For this, everything must be left blank, but they are forced to choose a NIC interface in a dropdown menu. In that dropdown menu, please have them select a NIC interface that is unused.&lt;br /&gt;
* Use Dell&#039;s directions to access the network settings of the iDRAC through the BIOS using a crash cart: &lt;br /&gt;
** https://www.dell.com/support/kbdoc/en-us/000177212/dell-poweredge-how-to-configure-the-idrac9-and-the-lifecycle-controller-network-ip&lt;br /&gt;
** The settings you would be looking to change are the IPv4 settings.&lt;br /&gt;
** After you have set the IP of the iDRAC, you can connect your laptop directly to the iDRAC port. &lt;br /&gt;
** Once connected you can go into your laptop network settings and change your IP to something that is within the same network space of the iDRAC. &lt;br /&gt;
** Once complete, you should be able to open a browser and go to the IP that you set the iDRAC.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Maturity_modulation&amp;diff=6678</id>
		<title>Maturity modulation</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Maturity_modulation&amp;diff=6678"/>
		<updated>2023-11-18T17:59:18Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Background and goal ==&lt;br /&gt;
&lt;br /&gt;
* Maturity is an attribute of a neuron; it is not a tradable asset. The decentralized governance of the Internet Computer can change the treatment of maturity at any time. &lt;br /&gt;
* To generate income from maturity, a user needs to trigger a non-deterministic process:&lt;br /&gt;
** NNS: Burn maturity to create new ICP via spawning a neuron.&lt;br /&gt;
** SNS: Disburse maturity to create new SNS tokens. &lt;br /&gt;
* The maturity modulation function introduces uncertainty in the creation of tokens from maturity. This article explains how the maturity modulation function works.&lt;br /&gt;
* &#039;&#039;Please note:&#039;&#039; The maturity modulation applies both to NNS neurons and SNS neurons. In both scenarios, the function of maturity modulation will be influenced by the ICP/cycles conversion rate.&lt;br /&gt;
&lt;br /&gt;
== Spawning maturity via the maturity modulation function ==&lt;br /&gt;
* The user triggers spawn maturity. A new neuron will be immediately spawned; however, this newly spawned neuron will have no ICP at start, only maturity.&lt;br /&gt;
* Spawned neurons will have a dissolve delay of 7 days and will be set to dissolving at the time of spawning.&lt;br /&gt;
* After 7 days when the neuron is dissolved, the amount of ICP, modulated by the function introduced below, will be minted from the neuron&#039;s maturity and be available to the user.&lt;br /&gt;
&lt;br /&gt;
== Description of the maturity modulation function == &lt;br /&gt;
 &lt;br /&gt;
* At the day of modulation, for each of the last 29 days determine the 30-day moving average ICP/Cycles conversion rate, which is displayed on the Internet Computer dashboard. Label these a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; through a&amp;lt;sub&amp;gt;29&amp;lt;/sub&amp;gt;, where a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; denotes the average rate on the previous day, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; denotes the rate two days ago and so on. The 30-day moving average conversion rates are used because they exhibit less variance than day-to-day conversion rates. &lt;br /&gt;
* Compute the relative 7-day return for each of the last four weeks. Thus, &lt;br /&gt;
** w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = (a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; - a&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt;) / a&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt;,&lt;br /&gt;
** w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = (a&amp;lt;sub&amp;gt;8&amp;lt;/sub&amp;gt; - a&amp;lt;sub&amp;gt;15&amp;lt;/sub&amp;gt;) / a&amp;lt;sub&amp;gt;15&amp;lt;/sub&amp;gt;,&lt;br /&gt;
** w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; = (a&amp;lt;sub&amp;gt;15&amp;lt;/sub&amp;gt; - a&amp;lt;sub&amp;gt;22&amp;lt;/sub&amp;gt;) / a&amp;lt;sub&amp;gt;22&amp;lt;/sub&amp;gt;,&lt;br /&gt;
** w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; = (a&amp;lt;sub&amp;gt;22&amp;lt;/sub&amp;gt; - a&amp;lt;sub&amp;gt;29&amp;lt;/sub&amp;gt;) / a&amp;lt;sub&amp;gt;29&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* The values w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;and w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; are bounded from -0.05 to 0.05 by clipping values to the limits of this range, i.e., capping by 0.05 and flooring by -0.05. &lt;br /&gt;
* Take the average w = (w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; + w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; + w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; + w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;) / 4. &lt;br /&gt;
* The resulting value w is a number between -5% and 5% that determines modulation. &lt;br /&gt;
* The maturity amount x is converted to x * (1+w) units of ICP. &lt;br /&gt;
* The maturity modulation function is updated once a day.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
* On Feb 1, 2022, the modulation function is 0.73% which is the average of the relative weekly returns w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = -4.59%,  w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; =-0.63%,  w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;=5.00%, w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; = 3.13%.&lt;br /&gt;
* If a user disburses on that day (day of transfer) 100 maturity, then this will result in 100.73 ICP.&lt;br /&gt;
&lt;br /&gt;
== Motivation and analysis ==  &lt;br /&gt;
* Evidently, this process introduces a certain amount of uncertainty for the conversion from maturity to ICP.&lt;br /&gt;
* However this uncertainty is limited in two ways.&lt;br /&gt;
* The modulation value w is between -5% and +5%. This implies that, e.g., 100 maturity will be converted into an ICP amount in the range of 95 and 105. This kind of volatility is well in the range of daily conversion rate fluctuations of ICP. &lt;br /&gt;
* The modulation value w is calculated at the day of modulation as w = (w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+ w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;+ w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; + w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;) / 4. At the day of initiation (7 days prior), the user can already determine (w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;+ w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; + w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;)/4. The missing value w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; can affect the modulation value at most by 1.25% (5%/4) up or down. &lt;br /&gt;
* The modulation value can change by at most 2.5% from one week to the next, as one week drops out of the window and one week enters the calculation window. &lt;br /&gt;
* The modulation function gives an incentive for users to disburse maturity when the ICP/Cycles conversion rate has been increasing over time and to hold back when the ICP has been decreasing recently. For example if the ICP/Cycles conversion rate was monotonically increasing, then w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; are positive and thus also w, incentivizing users to convert a maturity amount x to x * (1+w) units of ICP.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Staking_for_dummies&amp;diff=6677</id>
		<title>Staking for dummies</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Staking_for_dummies&amp;diff=6677"/>
		<updated>2023-11-18T17:53:29Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
There are many different options for staking. The following instructions describe one way to stake that is considered to be among the easiest.&lt;br /&gt;
&lt;br /&gt;
[https://support.dfinity.org/hc/en-us/articles/6646999699860-How-do-I-stake-ICP-utility-tokens- Link] to Video &lt;br /&gt;
&lt;br /&gt;
1. [[Tutorials_for_acquiring,_managing,_and_staking_ICP#Acquire_ICP|Acquiring ICP]]&lt;br /&gt;
&lt;br /&gt;
2. [[How_to_create_an_Internet_Identity |Create an Internet Identity]]&lt;br /&gt;
&lt;br /&gt;
3. [[ICP_custody_with_NNS_frontend_dapp|Custody with NNS frontend dapp]]&lt;br /&gt;
&lt;br /&gt;
4. [[ICP_staking_with_NNS_frontend_dapp|Staking with NNS frontend dapp]]&lt;br /&gt;
&lt;br /&gt;
5. [[ICP_voting_with_NNS_frontend_dapp|Voting with NNS frontend dapp]]&lt;br /&gt;
&lt;br /&gt;
6. [[ICP voting with NNS frontend dapp]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Tutorials_for_acquiring,_managing,_and_staking_ICP | Go back]] to tutorials.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=IC-OS_Installation_-_UEFI_Configuration_-_Gen2_Supermicro&amp;diff=6676</id>
		<title>IC-OS Installation - UEFI Configuration - Gen2 Supermicro</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=IC-OS_Installation_-_UEFI_Configuration_-_Gen2_Supermicro&amp;diff=6676"/>
		<updated>2023-11-18T17:50:43Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: . everywhere for consistency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. UEFI - Enter Setup ==&lt;br /&gt;
&lt;br /&gt;
# Reboot or power on the server.&lt;br /&gt;
# Watch for the screen with the Supermicro logo and boot options underneath it. Press DEL (delete) a couple of times, once the options are listed.&lt;br /&gt;
#: [[File:UEFI_Gen2_Supermicro_Post_Screen.png|580px]]&lt;br /&gt;
# If your option is recognized by the system, it will say: &amp;quot;Entering Setup…&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2. UEFI - Check Version ==&lt;br /&gt;
&lt;br /&gt;
# Check the version number at the bottom of the screen. Ensure the UEFI/BIOS version is &#039;&#039;&#039;2.21.1280&#039;&#039;&#039; or higher. This version was tested and found to support features required for IC-OS.&lt;br /&gt;
#* Is your version lower than &#039;&#039;&#039;2.21.1280&#039;&#039;&#039;? Download the latest version and follow the included instructions at the [https://www.supermicro.com/en/support/resources/downloadcenter/swdownload Supermicro support site]&lt;br /&gt;
&lt;br /&gt;
== 3. UEFI - Advanced Settings ==&lt;br /&gt;
&lt;br /&gt;
# Change to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; menu. Then, select &#039;&#039;&#039;Boot Feature&#039;&#039;&#039; and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Menu_Boot_Feature_Highlighted.jpg|580px]]&lt;br /&gt;
# Set &#039;&#039;&#039;Wait For &amp;quot;F1&amp;quot; If Error&#039;&#039;&#039; to &#039;&#039;&#039;Disabled&#039;&#039;&#039;; press ESC (escape) to return to previous menu.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Boot_Feature_Menu_Wait_For_F1.jpg|580px]]&lt;br /&gt;
# Select &#039;&#039;&#039;ACPI Settings&#039;&#039;&#039; and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Menu_ACPI_Highlighted.jpg|580px]]&lt;br /&gt;
# Set &#039;&#039;&#039;PCI AER Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;; set &#039;&#039;&#039;NUMA Nodes Per Socket&#039;&#039;&#039; to &#039;&#039;&#039;NPS0&#039;&#039;&#039;; press ESC (escape) to return to previous menu.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_ACPI_Menu_ACPI_SRAT_L3_Cache.jpg|580px]]&lt;br /&gt;
# Select &#039;&#039;&#039;CPU Configuration&#039;&#039;&#039; and press enter. &lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Menu_CPU_Configuration_Highlighted.jpg|580px]]&lt;br /&gt;
# Set &#039;&#039;&#039;SMT Control&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SMEE&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SEV ASID Count&#039;&#039;&#039; to &#039;&#039;&#039;253 ASIDs&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SEV-ES ASID Space Limit Control&#039;&#039;&#039; to &#039;&#039;&#039;Manual&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SEV-ES ASID Space Limit&#039;&#039;&#039; to &#039;&#039;&#039;100&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SNP Memory (RMP Table) Coverage&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
# Set &#039;&#039;&#039;SVM Mode&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:SPM bios CPU Config.png|580px]]&lt;br /&gt;
# Press ESC (escape) to return to previous menu.&lt;br /&gt;
# Select &#039;&#039;&#039;NB Configuration&#039;&#039;&#039; and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Menu_NB_Configuration_Highlighted.jpg|580px]]&lt;br /&gt;
# Set &#039;&#039;&#039;SEV-SNP Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_North_Bridge_Configuration_Menu_SEV-SNP_Support.jpg|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;xGMI Configuration&#039;&#039;&#039; and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_North_Bridge_Configuration_Menu_xGMI_Highlighted.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;xGMI Max Speed&#039;&#039;&#039; to &#039;&#039;&#039;22Gbps&#039;&#039;&#039;; press escape to return to the previous menu.&lt;br /&gt;
#:[[File:Screenshot 2023-08-04 at 9.55.32 AM.png|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Memory Configuration&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.19.46 PM.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;TSME&#039;&#039;&#039; to &#039;&#039;&#039;Disabled&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.20.27 PM.png|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;ESC&#039;&#039;&#039; twice (escape) to return to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;PCIe/PCI/PnP Configuration&#039;&#039;&#039; and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_Menu_PCIe_Configuration_Highlighted.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;SR-IOV Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Advanced_PCIe_Menu_SR-IOV_Support.jpg|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Trusted Computing&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:UEFI Menu Supermicro TPM Settings.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;Security Device Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#Set &#039;&#039;&#039;SHA256 PCR Bank&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#Set &#039;&#039;&#039;Platform Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#Set &#039;&#039;&#039;Storage Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#Set &#039;&#039;&#039;Endorsement Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:UEFI Menu Supermicro Advanced TrustedComputing.png|580px]]&lt;br /&gt;
&lt;br /&gt;
==4. UEFI - Boot Menu==&lt;br /&gt;
&lt;br /&gt;
#Change to the &#039;&#039;&#039;Boot&#039;&#039;&#039; menu; Set &#039;&#039;&#039;Boot Mode Select&#039;&#039;&#039; to &#039;&#039;&#039;UEFI&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Boot_Menu_Boot_Mode_Select.jpg|580px]]&lt;br /&gt;
#Change to &#039;&#039;&#039;Save &amp;amp; Exit&#039;&#039;&#039; menu, then select &#039;&#039;&#039;Save Changes and Reset&#039;&#039;&#039; and press enter.&lt;br /&gt;
#Select &#039;&#039;&#039;Yes&#039;&#039;&#039; at the prompt and press enter.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Save_And_Exit_Prompt.jpg|580px]]&lt;br /&gt;
The system will now reboot. Please do not unplug the IC-OS USB stick at this point.&lt;br /&gt;
&lt;br /&gt;
== 5. Boot the IC-OS USB image==&lt;br /&gt;
# Watch for the screen with the Supermicro logo and boot options underneath it. Press F11 a couple of times, once the options are listed.&lt;br /&gt;
#:[[File:UEFI_Gen2_Supermicro_Post_Screen.png|580px]]&lt;br /&gt;
#If the keypress was recognized by the system, it will print &#039;&#039;&#039;Invoking Boot Menu&#039;&#039;&#039;.&lt;br /&gt;
#:[[File:SM-33.png]]&lt;br /&gt;
#In the boot menu, select the &#039;&#039;first partition on the USB device&#039;&#039; and press enter, e.g.:&lt;br /&gt;
#:[[File:SM-35.png|580px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Return to the Installation Runbook==&lt;br /&gt;
&lt;br /&gt;
*If using the &#039;&#039;&#039;non-HSM&#039;&#039;&#039; onboarding procedure, return to the [[IC-OS Installation Runbook#8. UEFI Setup and Boot Menu|IC-OS Installation Runbook]].&lt;br /&gt;
&lt;br /&gt;
*If using the &#039;&#039;&#039;legacy, HSM&#039;&#039;&#039; onboarding procedure, return to the [[NitroKey HSM installation runbook#8. UEFI Setup and Boot Menu|NitroKey HSM installation runbook.]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=IC-OS_Installation_-_UEFI_Configuration_-_Gen2_Gigabyte&amp;diff=6675</id>
		<title>IC-OS Installation - UEFI Configuration - Gen2 Gigabyte</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=IC-OS_Installation_-_UEFI_Configuration_-_Gen2_Gigabyte&amp;diff=6675"/>
		<updated>2023-11-18T17:43:33Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Removed a comma&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. UEFI - Enter Setup ==&lt;br /&gt;
&lt;br /&gt;
# Reboot or power on the server.&lt;br /&gt;
# Watch for the screen with the Gigabyte logo and boot options underneath it. Press DEL (delete) a couple of times, once the options are listed to enter setup.&lt;br /&gt;
#:[[File:Gigabyte loading screen.jpg|580px]]&lt;br /&gt;
&lt;br /&gt;
==2. UEFI - Check Version==&lt;br /&gt;
&lt;br /&gt;
#Check the version number at the bottom of the screen. Ensure the UEFI/BIOS version is &#039;&#039;&#039;2.21.1279&#039;&#039;&#039; or higher. This version was tested and found to support features required for IC-OS.&lt;br /&gt;
#*Is your version lower than &#039;&#039;&#039;2.21.1279&#039;&#039;&#039;? Download the latest version and follow the included instructions at the [https://www.gigabyte.com/Support Gigabyte support site]&lt;br /&gt;
==3. UEFI - Advanced Settings==&lt;br /&gt;
&lt;br /&gt;
#Change to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; menu.&lt;br /&gt;
#Select &#039;&#039;&#039;Trusted Computing&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 17.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;Security Device Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;SHA256 PCR Bank&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;Platform Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
# Set &#039;&#039;&#039;Storage Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;Endorsement Hierarchy&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 2.jpg|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; to return to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;CPU Configuration&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios CPU configuration.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;SVM Mode&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios SVM.png|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; to return to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;PCI Subsystem Settings&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 15.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;SR-IOV Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039; (scroll to bottom of page to find setting)&lt;br /&gt;
#:[[File:Gigabyte bios 16.jpg|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; to return to the &#039;&#039;&#039;Advanced&#039;&#039;&#039; main menu.&lt;br /&gt;
&lt;br /&gt;
== 4. UEFI - AMD CBS==&lt;br /&gt;
&lt;br /&gt;
#Change to the &#039;&#039;&#039;AMD CBS&#039;&#039;&#039; menu. Then select &#039;&#039;&#039;CPU Common Options&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios CPU common options.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;SEV ASID Count&#039;&#039;&#039; to &#039;&#039;&#039;253 ASIDs&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;SEV-ES ASID Space Limit Control&#039;&#039;&#039; to &#039;&#039;&#039;Manual&#039;&#039;&#039;&lt;br /&gt;
# Set &#039;&#039;&#039;SEV-ES ASID Space Limit&#039;&#039;&#039; to &#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;SNP Memory (RMP Table) Coverage&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;SMEE&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga AMD CBS.png|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Performance&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios performance.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;SMT Control&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios SMT.jpg|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; twice to return to the &#039;&#039;&#039;AMD CBS&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;DF Common Options&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios DF.png|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Memory Addressing&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios memory addressing.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;NUMA nodes per socket&#039;&#039;&#039; to &#039;&#039;&#039;NPS0&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Giga bios NUMA.jpg|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; twice to return to the &#039;&#039;&#039;AMD CBS&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;UMC Common Options&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.02.37 PM.png|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;DDR4 Common Options&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.02.55 PM.png|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Security&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.03.12 PM.png|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;TSME&#039;&#039;&#039; to &#039;&#039;&#039;Disabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Screenshot 2023-08-03 at 5.03.41 PM.png|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; three times to return to the &#039;&#039;&#039;AMD CBS&#039;&#039;&#039; main menu.&lt;br /&gt;
#Select &#039;&#039;&#039;NBIO Common Options&#039;&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 13.jpg|580px]]&lt;br /&gt;
#Set &#039;&#039;&#039;Enable AER Cap&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#Set &#039;&#039;&#039;SEV-SNP Support&#039;&#039;&#039; to &#039;&#039;&#039;Enabled&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Screenshot 2023-08-04 at 10.06.52 AM.png|580px]]&lt;br /&gt;
#Press &#039;&#039;&#039;escape&#039;&#039;&#039; to return to the &#039;&#039;&#039;AMD CBS&#039;&#039;&#039; main menu.&lt;br /&gt;
&lt;br /&gt;
==5. UEFI - Boot Menu==&lt;br /&gt;
&lt;br /&gt;
#Change to the &#039;&#039;&#039;Boot&#039;&#039;&#039; menu. Then set &#039;&#039;&#039;Boot Mode Select&#039;&#039;&#039; to &#039;&#039;&#039;UEFI&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 19.jpg|580px]]&lt;br /&gt;
#Select &#039;&#039;&#039;Save Changes and Exit&#039;&#039;&#039;, then &#039;&#039;&#039;select&#039;&#039;&#039; &amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;Yes&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039; &#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;at &#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;the prompt and &#039;&#039;&#039;press enter.&#039;&#039;&#039;&lt;br /&gt;
#:[[File:Gigabyte bios 21.jpg|580px]]&lt;br /&gt;
The system will now reboot. Please do not unplug the IC-OS USB stick at this point.&lt;br /&gt;
&lt;br /&gt;
== 6. Boot the IC-OS USB image==&lt;br /&gt;
#Watch for the screen with the Gigabyte logo and boot options underneath it. Press F10 a couple of times, once the options are listed.&lt;br /&gt;
#:[[File:Gigabyte loading screen.jpg|580px]]&lt;br /&gt;
#In the boot menu, select the &#039;&#039;first partition on the USB device&#039;&#039; and press &#039;&#039;&#039;enter&#039;&#039;&#039;, e.g.:&lt;br /&gt;
#:[[File:SM-35.png|580px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Return to the Installation Runbook==&lt;br /&gt;
&lt;br /&gt;
*If using the &#039;&#039;&#039;non-HSM&#039;&#039;&#039; onboarding procedure, return to the [[IC-OS Installation Runbook#8. UEFI Setup and Boot Menu|IC-OS Installation Runbook]].&lt;br /&gt;
&lt;br /&gt;
*If using the &#039;&#039;&#039;legacy HSM&#039;&#039;&#039; onboarding procedure, return to the [[NitroKey HSM installation runbook#8. UEFI Setup and Boot Menu|NitroKey HSM installation runbook]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4857</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4857"/>
		<updated>2023-04-13T15:45:40Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: /* HTTP Gateway */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), and allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;icp-api.io/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to a replica node on the correct subnet in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists only of rate-limiting. The rate-limits are in place to protect the IC from being overwhelmed with external accesses.&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
The HTTP endpoint is served through two main domains: &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;icp0.io&amp;lt;/code&amp;gt;. In the following, we use for simplicity only &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt;, even though both domains could be used equally.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, browsers don&#039;t natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by providing a mechanism to translate HTTP requests into API canister calls allowing a client to interact with canisters. A gateway can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
Before serving any HTTP request, the HTTP Gateway passes the incoming request through a filter, which can be used to implement content filtering allowing operators to comply with local legal frameworks (e.g., blocking gambling services in a particular geography). To learn more about content filtering see [[Content_Filtering_via_Boundary_Nodes|Content Filtering via The Boundary Nodes]].&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the certificate of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, do not support service workers. In order for them to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; their requests are internally redirected to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;br /&gt;
* [[Content Filtering via Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4856</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4856"/>
		<updated>2023-04-13T15:41:47Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), and allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;icp-api.io/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to a replica node on the correct subnet in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists only of rate-limiting. The rate-limits are in place to protect the IC from being overwhelmed with external accesses.&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
Unfortunately, browsers don&#039;t natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by providing a mechanism to translate HTTP requests into API canister calls allowing a client to interact with canisters. A gateway can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
Before serving any HTTP request, the HTTP Gateway passes the incoming request through a filter, which can be used to implement content filtering allowing operators to comply with local legal frameworks (e.g., blocking gambling services in a particular geography). To learn more about content filtering see [[Content_Filtering_via_Boundary_Nodes|Content Filtering via The Boundary Nodes]].&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the certificate of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, do not support service workers. In order for them to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; their requests are internally redirected to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;br /&gt;
* [[Content Filtering via Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4855</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4855"/>
		<updated>2023-04-13T15:36:20Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), and allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;ic0.app/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to a replica node on the correct subnet in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists only of rate-limiting. The rate-limits are in place to protect the IC from being overwhelmed with external accesses.&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
Unfortunately, browsers don&#039;t natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by providing a mechanism to translate HTTP requests into API canister calls allowing a client to interact with canisters. A gateway can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
Before serving any HTTP request, the HTTP Gateway passes the incoming request through a filter, which can be used to implement content filtering allowing operators to comply with local legal frameworks (e.g., blocking gambling services in a particular geography). To learn more about content filtering see [[Content_Filtering_via_Boundary_Nodes|Content Filtering via The Boundary Nodes]].&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the certificate of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, do not support service workers. In order for them to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; their requests are internally redirected to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;br /&gt;
* [[Content Filtering via Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4854</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=4854"/>
		<updated>2023-04-13T15:34:01Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), and allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;ic0.app/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to a replica node on the correct subnet in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists only of rate-limiting. The rate-limits are in place to protect the IC from being overwhelmed with external accesses.&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
Unfortunately, browsers don&#039;t natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by providing a mechanism to translate HTTP requests into API canister calls allowing a client to interact with canisters. A gateway can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
HTTP Gateways can be used to implement content filtering which allows operators to comply with local legal frameworks (e.g., blocking gambling services in a particular geography) by refusing to make translate HTTP requests to api calls for certain canisters. To learn more about content filtering see [[Content_Filtering_via_Boundary_Nodes|Content Filtering via The Boundary Nodes]].&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the certificate of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, do not support service workers. In order for them to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; their requests are internally redirected to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* &#039;&#039;&#039;The Internet Computer project website (hosted on the IC): [https://internetcomputer.org/ internetcomputer.org]&#039;&#039;&#039;&lt;br /&gt;
* [[Content Filtering via Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=L1_comparison&amp;diff=4078</id>
		<title>L1 comparison</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=L1_comparison&amp;diff=4078"/>
		<updated>2023-01-06T14:27:35Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The promise of a [[World Computer]] and the emergence of a [[Blockchain Singularity]] has far reaching consequences in technology, sociology, economics, politics, communication, entertainment, and most aspects of our digital lives. As the industry is one of rapid innovation and progress, and as projects constantly and dynamically change, it&#039;s important to take stock, every now and then, to note how we&#039;re doing, and to check if we&#039;re on track to achieve the goals of decentralization, scalability, usability, and functionality. &lt;br /&gt;
&lt;br /&gt;
The industry is now moving out of its infancy, which is seen by the increasing number of smart contract developers, rather than core protocol developers, and users wanting to fully engage with a platform, rather than simply sending transactions back and forth. The shift away from simple payment systems, towards Web3 is well on its way, and it&#039;s within this scope that we attempt to map the blockchain landscape on this page.&lt;br /&gt;
&lt;br /&gt;
We compare top performing blockchain projects across a number of metrics that we expect to yield a &#039;good&#039; Web3 experience under the categories of core protocol, developer experience, and user experience.&lt;br /&gt;
&lt;br /&gt;
Unless otherwise stated, all data is correct as of December 9th 2022. Metrics are explained and references are given below.&lt;br /&gt;
&lt;br /&gt;
== Base comparisons == &lt;br /&gt;
Here we compare standard metrics that are used to measure performance of the core protocol of popular blockchain projects. Note that these metrics should not always be taken at face value. While references are listed below to note where the figures can be found, it&#039;s not always clear how these figures are computed. Additionally, parts of different projects may have the same name, but often are constructed differently (most notably, transactions), and so should not be compared blindly like-for-like. The [https://a16zcrypto.com/why-blockchain-performance-is-hard-to-measure/ a16z blog] has a nice article describing how the industry should think about metrics.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metrics / L1 !! ICP !! Cardano !! Avalanche !! Algorand !! Ethereum !! Near !! Solana&lt;br /&gt;
|-&lt;br /&gt;
| Average TPS || 5&#039;382 (update calls) || 2.37 || 49.52 || 15.5 || 11.1 || 8.25 || 286 (non-voting calls)&lt;br /&gt;
|-&lt;br /&gt;
| Average finality || 1.4secs || || 2.3secs || 3.5secs || 15mins || 3.3secs ||&lt;br /&gt;
|-&lt;br /&gt;
| Average tx Cost || $0.0000022 || $0.1 || $0.0066 (C-Chain only)|| $0.00025 || $2.39 || $0.0031 || $0.000026&lt;br /&gt;
|-&lt;br /&gt;
| Average energy consumption wh/tx || 0.008 || 51.59 || 4.76 || 2.7 || 6.29 || || 0.166&lt;br /&gt;
|-&lt;br /&gt;
| Size of network (nodes) || 823 || 1050 || 1195 || 1530 || || 798 || 1872&lt;br /&gt;
|-&lt;br /&gt;
| On-Chain storage  || $5 (3.95T cycles x 1XDR) || $17,035 - $113,507 (53,236 – 354708ADA) || $206,875 (15,62 5AVAX)|| || $15,494,409 (12,643.75 ETH) || || $48,625 (3,477.69 SOL)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Average TPS&#039;&#039;&#039; measures the transactions processed per second - note that the interval over which these are measured does vary across chains. The dollar amounts are computed by converting the native token cost cycles/gas/fee needed per transaction, to USD given the exchange rate on December 9th 2022.&lt;br /&gt;
* &#039;&#039;&#039;Average finality&#039;&#039;&#039; refers to the amount of time that passes between the proposal of a new valid block containing transactions until the block has been finalized and its content is guaranteed to not be reversed or modified (for some blockchains, e.g., Bitcoin, this guarantee can only be probabilistic).&lt;br /&gt;
* &#039;&#039;&#039;Average tx Cost&#039;&#039;&#039; measures the cost of a transaction. Note that the definition of &#039;transaction&#039; varies widely across chains, where some are described below. The dollar amounts are computed by converting the native token cost cycles/gas/fee needed per transaction, to USD given the exchange rate on December 9th 2022. (Cardano and Ethereum figures found in [https://messari.io/asset/cardano/chart/txn-fee-avg Messari dashboard].) &lt;br /&gt;
* &#039;&#039;&#039;Average energy Consumption&#039;&#039;&#039; measures the network energy consumption to process a transaction (measured in watt hours)&lt;br /&gt;
* &#039;&#039;&#039;Size of network (nodes)&#039;&#039;&#039; notes the number of nodes currently making up the network&lt;br /&gt;
* &#039;&#039;&#039;On-chain Storage&#039;&#039;&#039; gives the dollar cost and the native token cost of storing 1GB of data on chain.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comparing developer experience ==&lt;br /&gt;
Whether they were writing games, operating systems or text editing applications, in the 70s, 80s and early 90s, developers always had to face limitations imposed by hardware. Applications were constrained to accessing a few kilobytes of memory through small stacks and heaps, using limited (and constantly changing) instruction sets, and using significant amounts of power to run instructions. The history repeats itself in the blockchain landscape these days. Application developers are limited to stack sizes of a few kilobytes to several megabytes at best. Persistent storage is expensive and limited. Programmers are bound to using cumbersome APIs that make hidden assumptions in terms of numbers of executed instructions. And, moreover, most chains operate inefficiently, burning too much power per executed transaction. This not only limits the types of applications that can be deployed on chain, but also increases development and testing time (and cost).&lt;br /&gt;
&lt;br /&gt;
As opposed to all existing blockchains, the IC brings modern programming to on-chain developers, allowing them to use time for creativity rather than fixing memory packing issues or spreading computation in small iterations that do not hit instruction limits. The IC programming model offers orthogonal persistence, large stack and heap spaces (4GB), stable storage of 48GB (with plans for increase) in mainstream languages, such as Rust, or even Python.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metrics / L1 !! ICP !! Cardano !! Avalanche !! Algorand !! Ethereum !! Near !! Solana&lt;br /&gt;
|-&lt;br /&gt;
| Fixed tx cost || ✅ || ❌ || ❌ || ❌ || ❌ || ❌ || ❌&lt;br /&gt;
|-&lt;br /&gt;
| HTTPs outcalls || ✅ || ❌ || ❌ || ❌ || ❌ || ❌ || ❌&lt;br /&gt;
|-&lt;br /&gt;
| Smart contract language support || Motoko (native), Rust, TypeScript, Python || Plutus (native), Haskell || Solidity || Teal (native), Python ||Solidity (native), Vyper, Yul, FE || Rust, Javascript || Rust C, C++&lt;br /&gt;
|-&lt;br /&gt;
| Max stack size || 4 GiB ||  ||  || 4 MB || 32 KiB || 256 KiB ||&lt;br /&gt;
|-&lt;br /&gt;
| Max persisted memory (per smart-contract) || 52 GiB ||  ||  || 1 MB || 2^261 B (however, 15,494,409$ per GiB)  || 32 KiB ||&lt;br /&gt;
|-&lt;br /&gt;
| On-Chain storage || $5 (3.95T cycles x 1XDR) || $17,035 - $113,507 (53,236 – 354708ADA) || $206,875 (15,62 5AVAX) || || $15,494,409 (12,643.75 ETH) || || $48,625 (3,477.69 SOL)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039; Fixed tx cost&#039;&#039;&#039; provides the ability to have predictable costs for computation. &lt;br /&gt;
* &#039;&#039;&#039; HTTPs Outcalls&#039;&#039;&#039; is the ability to communitcate with Web2 services (outside of the network)&lt;br /&gt;
* &#039;&#039;&#039;Max stack size&#039;&#039;&#039; is the maximum size the stack can grow for smart contracts and serves as a measure for the complexity of code that is supported by each platform&lt;br /&gt;
* &#039;&#039;&#039;Max persisted memory&#039;&#039;&#039; is the maximum size of persisted memory supported by each platform. Persisted memory is preserved across individual function calls&lt;br /&gt;
* &#039;&#039;&#039;On-Chain Storage&#039;&#039;&#039; measures the cost of storing data on-chain&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comparing user experience == &lt;br /&gt;
It is widely accepted that the Web3 user experience needs massive development before mainstream adoption is likely. In this section we start to map out key metrics for Web3 usability. First and foremost is privacy, identity management and authentication. On many projects, every interaction that a user ever makes can be traced and monitored. While transparency is good for some things, we argue that this is a severe hindrance to adoption. Financial privacy and the freedom to interact should be paramount. &lt;br /&gt;
We also note the tools needed to interact with a project. We see this as a measure of accessability and openness to onboarding. &lt;br /&gt;
Finally, we include metrics about participation in the network. A large draw of Web3 is the fact that users can become owners and drivers of the platform. Here we include the percentage of native tokens staked as a measure of user confidence and participation in the project. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metrics / L1 !! ICP !! Cardano !! Avalanche !! Algorand !! Ethereum !! Near !! Solana&lt;br /&gt;
|-&lt;br /&gt;
| Privacy-preserving identity management || ✅ || ❌ || ❌ || ❌ || ❌ || ❌ || ❌&lt;br /&gt;
|-&lt;br /&gt;
| Prerequisites to use || Browser || Browser, browser extension, tokens || Browser, browser extension, tokens || Browser, browser extension, tokens || Browser, browser extension, tokens || ||&lt;br /&gt;
|- &lt;br /&gt;
| Staking ratio || 73.89% || 71.58% || 61.78% || 51.17% || 13.57% || 43.19% || 68.59%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Privacy-preserving identity management&#039;&#039;&#039; notes whether a project allows privacy-preserving interactions with the blockchain.&lt;br /&gt;
* &#039;&#039;&#039;Prerequisites to use&#039;&#039;&#039; lists what is needed to interact with the project&lt;br /&gt;
* &#039;&#039;&#039;Staking ratio&#039;&#039;&#039; gives the percentage of native tokens that are staked in the protocol. The staking ratio metrics are from [https://www.stakingrewards.com/cryptoassets/ Staking Rewards] and are correct as of 19.12.2022&lt;br /&gt;
&lt;br /&gt;
=== A note about average transactions cost === &lt;br /&gt;
* Algorand: https://metrics.algorand.org/#/protocol/, explanation: Average transaction fee of all transactions in the selected time period. [https://developer.algorand.org/docs/get-details/transactions/#fees Algorand fees]&lt;br /&gt;
* Cardano: [https://docs.cardano.org/explore-cardano/fee-structure Cardano fees] Fees are constructed around two constants (a and b). The formula for calculating minimal fees for a transaction (tx) is &#039;&#039;&#039;a&#039;&#039;&#039; times &#039;&#039;&#039;size(tx) + b&#039;&#039;&#039;, where:&lt;br /&gt;
** a/b are protocol parameters&lt;br /&gt;
** size(tx) is the transaction size in bytes&lt;br /&gt;
* Solana: [https://docs.solana.com/transaction_fees Solana fees]&lt;br /&gt;
&lt;br /&gt;
=== A note about finality === &lt;br /&gt;
It is sometimes unclear what exactly different projects mean by finality, so we note our references here and describe how the above figures are computed. &lt;br /&gt;
* For ICP, finality calculated as described in the [https://internetcomputer.org/whitepaper.pdf whitepaper] in section 5.11.6. &lt;br /&gt;
* For Near, we use the fact finalization occurs after 3 blocks (as stated in the [https://docs.near.org/concepts/advanced/near-indexer-framework#limitations docs]) and use the current block time of 1.1 seconds from the [https://explorer.near.org/ explorer].&lt;br /&gt;
* All other finality figures for now come from the finality section [https://newsbtc.com/all/assessing-the-top-performing-layer-1-blockchain-protocols/ here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References == &lt;br /&gt;
* &#039;&#039;&#039;ICP&#039;&#039;&#039; : [https://dashboard.internetcomputer.org IC Dashboard]&lt;br /&gt;
* &#039;&#039;&#039;ADA&#039;&#039;&#039; : [https://explorer.cardano.org/en Cardano explorer] and [https://cexplorer.io/ cexplorer]&lt;br /&gt;
* &#039;&#039;&#039;AVAX&#039;&#039;&#039; : [https://snowtrace.io/ Snowtrace] and [https://subnets.avax.network/ Avalanche explorer]&lt;br /&gt;
* &#039;&#039;&#039;ALGO&#039;&#039;&#039; : [https://www.algorand.com/ Algorand website] and [https://metrics.algorand.org/ Algorand metrics site]&lt;br /&gt;
* &#039;&#039;&#039;ETH&#039;&#039;&#039; : [https://etherscan.io/ Etherscan]&lt;br /&gt;
* &#039;&#039;&#039;NEAR&#039;&#039;&#039; : [https://explorer.near.org/ Near explorer] and [https://docs.near.org/ Near docs]&lt;br /&gt;
* &#039;&#039;&#039;SOL&#039;&#039;&#039; : [https://solana.com/ Solana website] and [https://solanabeach.io/ Solana beach]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Glossary&amp;diff=3554</id>
		<title>Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Glossary&amp;diff=3554"/>
		<updated>2022-11-15T11:01:02Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==A==&lt;br /&gt;
&lt;br /&gt;
===== account =====&lt;br /&gt;
A ledger &#039;&#039;&#039;account&#039;&#039;&#039; is a set of entries in the [[#ledger canister| ledger canister]], which is a smart contract that mimics the guise and behavior of a regular banking account, whose unit of measure is [[#ICP| ICP]] (Internet Computer Protocol) utility tokens. Ledger accounts are owned by [[#principals| principals]], and their ownerships do not change over time. Every account on the ledger has a positive [[#balance| balance]] measured in ICP with a precision of eight decimals. &lt;br /&gt;
&lt;br /&gt;
===== address =====&lt;br /&gt;
In the context of [[#transaction|transactions]] on the ledger, &#039;&#039;&#039;address&#039;&#039;&#039; is synonymous with [[#account| account]].&lt;br /&gt;
&lt;br /&gt;
===== actor =====&lt;br /&gt;
An &#039;&#039;&#039;actor&#039;&#039;&#039; is a primitive in the [https://en.wikipedia.org/wiki/Actor_model Actor Model]. It is a process with encapsulated state that communicates with other concurrently running actors through asynchronous messages that are received sequentially. The Actor Model is relevant to the [[#Internet Computer (IC)|IC]] because [[#canister|canisters]] on the IC (a type of smart contract) follow the Actor Model for concurrent and asynchronous computation.&lt;br /&gt;
&lt;br /&gt;
===== API canister call =====&lt;br /&gt;
API to interact with canisters hosted on the Internet Computer as defined in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface Interface Specification].&lt;br /&gt;
&lt;br /&gt;
==B==&lt;br /&gt;
&lt;br /&gt;
===== balance =====&lt;br /&gt;
The &#039;&#039;&#039;balance&#039;&#039;&#039; of an [[#account| account]] on the ledger is the sum of all deposits minus the sum of all withdrawals. As a degenerate case, it is sometimes useful to say that an account which is not present in the ledger has a balance of zero.&lt;br /&gt;
&lt;br /&gt;
The balance of a ledger account is denominated in ICP and is represented with eight decimals. Thus, the minimum positive balance of an account is 0.00000001 or 10^-8 [[#ICP| ICP]]; this amount is sometimes referred to as one &#039;&#039;&#039;e8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===== batch =====&lt;br /&gt;
A &#039;&#039;&#039;batch&#039;&#039;&#039; is a collection of [[#messages| messages]] whose order is agreed upon by [[#consensus| consensus]].&lt;br /&gt;
&lt;br /&gt;
===== beneficiary =====&lt;br /&gt;
The &#039;&#039;&#039;beneficiary&#039;&#039;&#039; of an [[#account| account]] is the [[#principal| principal]] who owns the [[#balance| balance]] of the account. The beneficiary of an account cannot be changed. The beneficiary of an account may or may not be allowed to make [[#transaction|transactions]] on the account (see [[#fiduciary| fiduciary]]).&lt;br /&gt;
&lt;br /&gt;
===== blockchain =====&lt;br /&gt;
A &#039;&#039;&#039;blockchain&#039;&#039;&#039; is a growing list of cryptographically linked blocks, agreed upon by [[#consensus| consensus]]. On the [[#Internet computer| Internet Computer]] every [[#subnet| subnet]] is a blockchain and these blockchains interact using [[#chain key| chain key cryptography]].&lt;br /&gt;
&lt;br /&gt;
===== boundary node =====&lt;br /&gt;
&lt;br /&gt;
All accesses to the Internet Computer go through one of the globally-distributed &#039;&#039;&#039;boundary nodes&#039;&#039;&#039;. They route incoming [[#API canister call| API canister calls]] to the right subnet and replica, serve the [[#service worker|service worker]] and translate HTTP requests to API calls ([[#icx-proxy|&amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
===== burning transaction =====&lt;br /&gt;
A &#039;&#039;&#039;burning transaction&#039;&#039;&#039; is the process of &amp;quot;burning&amp;quot; [[#ICP| ICP]], whereby a certain amount of ICP are destroyed. The main use case is that of purchasing [[#cycles| cycles]], through which ICP are destroyed while at the same time a corresponding amount of cycles is created, using the current exchange rate between ICP and ([[#SDR| SDR]]), in such a way that one SDR corresponds to one trillion (10E12) cycles. It is represented as a [[#transaction| transaction]] from the source [[#account| account]] to the [[#ICP supply account| ICP supply account]].&lt;br /&gt;
&lt;br /&gt;
==C==&lt;br /&gt;
&lt;br /&gt;
===== Candid =====&lt;br /&gt;
&#039;&#039;&#039;Candid&#039;&#039;&#039; is an IDL crafted specifically for the Internet Computer, providing a common language for application interfaces to facilitate communication between services that are written in different programming languages&lt;br /&gt;
&lt;br /&gt;
===== canister =====&lt;br /&gt;
A &#039;&#039;&#039;canister&#039;&#039;&#039; is a type of smart contract that bundles &#039;&#039;code&#039;&#039; and &#039;&#039;state&#039;&#039;. A canister can be deployed as a [[#smart contract| smart contract]] on the [[#Internet Computer| Internet Computer]] and accessed over the Internet.&lt;br /&gt;
&lt;br /&gt;
===== canister account =====&lt;br /&gt;
A &#039;&#039;&#039;canister account&#039;&#039;&#039; is a ledger account owned by a [[#canister | canister]] (i.e. whose [[#fiduciary|fiduciary]] is a canister). A non-canister account is a ledger account whose fiduciary is a non-canister [[#principal |principal]].&lt;br /&gt;
&lt;br /&gt;
===== canister identifier =====&lt;br /&gt;
The &#039;&#039;&#039;canister identifier&#039;&#039;&#039; or &#039;&#039;&#039;canister ID&#039;&#039;&#039; is a globally-unique identifier that identifies a [[#canister| canister]] and can be used to interact with it.&lt;br /&gt;
&lt;br /&gt;
===== canister signature =====&lt;br /&gt;
A &#039;&#039;&#039;canister signature&#039;&#039;&#039; uses a signature scheme based on [[#certified variables| certified variables]]. Public “keys” include a [[#canister identifier|canister id]] plus a seed (so that every [[#canister|canister]] has many public keys); signatures are certificates that prove that the canister has put the signed message at a specific place in its state tree. Details in the [https://smartcontracts.org/docs/interface-spec/#canister-signatures The Internet Computer Interface Specification].&lt;br /&gt;
&lt;br /&gt;
===== canister state =====&lt;br /&gt;
A &#039;&#039;&#039;canister state&#039;&#039;&#039; is the entire state of a [[#canister|canister]] at a given point in time. A canister’s state is divided into &#039;&#039;user state&#039;&#039; and &#039;&#039;system state&#039;&#039;. The user state is a [[#WebAssembly|WebAssembly]] module instance and the system state is the auxiliary state maintained by the [[#Internet Computer|Internet Computer]] on behalf of the canister, such as its compute allocation, balance of [[#cycles|cycles]], input and output queues, and other metadata. A canister interacts with its own system state either implicitly, such as when consuming cycles, or through the System API, such as when sending messages.&lt;br /&gt;
&lt;br /&gt;
===== catch-up package (CUP) =====&lt;br /&gt;
A &#039;&#039;&#039;catch-up package&#039;&#039;&#039; is a data bundle that contains everything needed to bootstrap a [[#subnet|subnet]] [[#replica|replica]].&lt;br /&gt;
&lt;br /&gt;
===== certified query =====&lt;br /&gt;
A &#039;&#039;&#039;certified query&#039;&#039;&#039; is a query call for which the response is certified.&lt;br /&gt;
&lt;br /&gt;
===== certified variable =====&lt;br /&gt;
A piece of data that a [[#canister|canister]] can store in its [[#subnet|subnet]]’s canonical state in the processing of an update call (or inter-canister call), so that during the handling of a [[#query|query]] call, the canister can return a certificate to the user that proves that it really committed to that value.&lt;br /&gt;
&lt;br /&gt;
===== chain key =====&lt;br /&gt;
&#039;&#039;&#039;Chain key&#039;&#039;&#039; cryptography consists of a set of cryptographic protocols that orchestrate the [[#node|nodes]] that make up the [[#Internet Computer|Internet Computer]]. The most visible innovation of chain key cryptography is that the Internet Computer has a single public key. This is a huge advantage as it allows any device, including smart watches and mobile phones, to verify the authenticity of artifacts from the Internet Computer.&lt;br /&gt;
&lt;br /&gt;
===== consensus =====&lt;br /&gt;
In distributed computing, &#039;&#039;&#039;consensus&#039;&#039;&#039; is a fault tolerant mechanism by means of which a number of [[#node|nodes]] can reach agreement about a value or state.&lt;br /&gt;
&lt;br /&gt;
Consensus is a core component of the [[#replica|replica]] software. The consensus layer selects [[#messages|messages]] from the peer-to-peer artifact pool and pulls messages from the cross-network streams of other [[#subnet|subnets]] and organizes them into a [[#batch|batch]], which is delivered to the [[#message routing|message routing]] layer.&lt;br /&gt;
&lt;br /&gt;
===== controller =====&lt;br /&gt;
A &#039;&#039;&#039;controller&#039;&#039;&#039; of a [[#canister|canister]] is a person, organization, or other canister that has administrative rights over the canister. Controllers are identified by their [[#principal|principals]]. For example, a controller of a canister can upgrade the [[#WebAssembly|WebAssembly]] code of the canister or delete the canister.&lt;br /&gt;
&lt;br /&gt;
===== cycle =====&lt;br /&gt;
On the [[#Internet Computer|Internet Computer]], a &#039;&#039;&#039;cycle&#039;&#039;&#039; is the unit of measurement for resources consumed in the form of processing, memory, storage, and network bandwidth. Every canister has a cycles account to which resources consumed by the canister are charged. The Internet Computer’s utility token ([[#ICP|ICP]]) can be converted to cycles and transferred to a canister. Cycles can also be transferred between canisters by attaching them to an [inter-canister] message.&lt;br /&gt;
&lt;br /&gt;
ICP can always be converted to cycles using the current price of ICP measured in [SDR] using the convention that one trillion cycles correspond to one SDR.&lt;br /&gt;
&lt;br /&gt;
==D==&lt;br /&gt;
===== dapp =====&lt;br /&gt;
A &#039;&#039;&#039;dapp&#039;&#039;&#039;, or decentralised application is a [[#canister|canister]] running on the [[#Internet Computer|Internet Computer]].&lt;br /&gt;
&lt;br /&gt;
===== data center =====&lt;br /&gt;
A &#039;&#039;&#039;data center&#039;&#039;&#039; (DC) is a physical site that hosts [[#node|nodes]] which contribute to the [[#Internet Computer|Internet Computer]]. It includes the hardware and software infrastructure required for node deployment. A DC is identified on the Internet Computer by a unique identifier.&lt;br /&gt;
&lt;br /&gt;
===== dissolve delay =====&lt;br /&gt;
The &#039;&#039;&#039;dissolve delay&#039;&#039;&#039; is the amount of time that [[#neuron|neurons]] must spend [[#dissolving state| dissolving]] before becoming [[#dissolved state| disolved]].&lt;br /&gt;
&lt;br /&gt;
===== dissolved state =====&lt;br /&gt;
The &#039;&#039;&#039;dissolved state&#039;&#039;&#039; is a [[#neuron|neuron]] state characterized by a [[#dissolve delay|dissolve delay]] equal to zero. (It is conventionally said that a neuron in this state does not &amp;quot;have&amp;quot; a dissolve delay.) It is in this state that a neuron can be &amp;quot;disbursed,&amp;quot; hence its stake moved elsewhere, and its corresponding [[#neuron account|neuron account]] closed. The [[#neuron age|age]] of a dissolved neuron is considered to be zero.&lt;br /&gt;
&lt;br /&gt;
===== dissolving state =====&lt;br /&gt;
A &#039;&#039;&#039;dissolving state&#039;&#039;&#039; is a [[#neuron|neuron]] state that follows immediately after its owner issues a &amp;quot;start dissolving&amp;quot; command, and continues until a &amp;quot;stop dissolving&amp;quot; command is issued, or until the dissolve delay timer runs out. The [[#neuron age|age of a dissolving neuron]] is considered to be zero.&lt;br /&gt;
&lt;br /&gt;
==E==&lt;br /&gt;
===== execution environment =====&lt;br /&gt;
The &#039;&#039;&#039;execution environment&#039;&#039;&#039; is one of the core layers of the [[#replica|replica]] software.&lt;br /&gt;
&lt;br /&gt;
==F==&lt;br /&gt;
===== fiduciary =====&lt;br /&gt;
The &#039;&#039;&#039;fiduciary&#039;&#039;&#039; of an [[#account|account]] is the [[#principal|principal]] allowed to make [[#transaction|transactions]] on the account; as such, it may be useful to think of it as the &#039;&#039;owner&#039;&#039; of the account, with the caveat that it may or may not be the [[#beneficiary|beneficiary]] of the account. The [[#neuron account|neuron account]] is a prominent example of an account for which the beneficiary and fiduciary do not coincide (the fiduciary is the [[#governance canister|governance canister]] while the beneficiary is the neuron holder). The fiduciary of a (ledger) account does not change over time.&lt;br /&gt;
&lt;br /&gt;
The distinction between fiduciary and beneficiary is also important for DeFi dapps (canisters) that interact with the IC ledger: in this case, the fiduciary is the DeFi canister while the beneficiary is the individual or organisation ([[#principal|principal) that uses the DeFi canister’s services.&lt;br /&gt;
&lt;br /&gt;
==G==&lt;br /&gt;
===== governance canister =====&lt;br /&gt;
The &#039;&#039;&#039;governance canister&#039;&#039;&#039; is a [[#system canister|system canister]] that implements the [[#network nervous system (NNS)|NNS]] governance system, i.e., among others, stores and manages [[#neuron|neurons]] and [[#proposal|proposals]], and implements the NNS [[#voting|voting]] environment.&lt;br /&gt;
&lt;br /&gt;
==H==&lt;br /&gt;
===== HTTP gateway protocol =====&lt;br /&gt;
A protocol allowing canisters to handle conventional HTTP requests. Multiple implementations of the HTTP gateway protocol exist (e.g., [[#service worker|service worker]] and [[#icx-proxy|&amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;]]). It is defined in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway IC&#039;s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
==I==&lt;br /&gt;
===== ICP =====&lt;br /&gt;
The &#039;&#039;&#039;Internet Computer Protocol&#039;&#039;&#039; token (ticker &amp;quot;ICP&amp;quot;) is the utility token of the [[#Internet Computer|Internet Computer]]. ICP allows the broader internet community to participate in the governance of the Internet Computer blockchain network by locking ICP in [[#neuron|neurons]]. ICP can also be converted into [[#cycles|cycles]], which are then used to power [[#canister|canisters]].&lt;br /&gt;
&lt;br /&gt;
===== ICP supply account =====&lt;br /&gt;
The &#039;&#039;&#039;ICP supply account&#039;&#039;&#039; is a quasi-fictitious ledger [[#account|account]] whose balance is always zero. It has a central role in [[#ICP|ICP]] [[#burning|burning]] and [[#minting|minting]] operations.&lt;br /&gt;
&lt;br /&gt;
===== icx-proxy =====&lt;br /&gt;
Command line tool implementing the [[#HTTP gateway protocol|HTTP gateway protocol]] to communicate with Internet Computer replicas.&lt;br /&gt;
&lt;br /&gt;
===== identity =====&lt;br /&gt;
An &#039;&#039;&#039;identity&#039;&#039;&#039; is a byte string that is used to identify an entity, such as a [[#principal|principal]], that interacts with the [[#Internet Computer|Internet Computer]]. For users, the identity is the SHA-224 hash of the DER-encoded public key of the user. [https://smartcontracts.org/docs/interface-spec/ The Internet Computer Interface Specification] has more detail.&lt;br /&gt;
&lt;br /&gt;
===== Internet Identity =====&lt;br /&gt;
&#039;&#039;&#039;Internet Identity&#039;&#039;&#039; is an anonymizing blockchain authentication system running on the [[#Internet Computer|Internet Computer]].&lt;br /&gt;
&lt;br /&gt;
===== induction pool =====&lt;br /&gt;
The &#039;&#039;&#039;induction pool&#039;&#039;&#039; of a [[#subnet|subnet]] blockchain is the collection of all [[#input queue|input queues]] of all [[#canister|canisters]] residing on the subnet.&lt;br /&gt;
&lt;br /&gt;
===== ingress message =====&lt;br /&gt;
An &#039;&#039;&#039;ingress message&#039;&#039;&#039; is a [[#message|message]] sent by an end-user to a [[#canister|canister]] running on a [[#subnet|subnet]] blockchain. The message is signed by the secret key corresponding to the end-user’s [[#identity|identity]] and sent to one of the [[#replica|replicas]] that participate in the subnet.&lt;br /&gt;
&lt;br /&gt;
===== ingress message history =====&lt;br /&gt;
The &#039;&#039;&#039;ingress message history&#039;&#039;&#039; records the current status of every [[#ingress message|Ingress message]] processed by a [[#replica|replica]] and keeps track of whether messages were successfully included in the [[#induction pool|induction pool]] and the responses of executed messages.&lt;br /&gt;
&lt;br /&gt;
===== input queue =====&lt;br /&gt;
The &#039;&#039;&#039;input queue&#039;&#039;&#039; of a [[#canister|canister]] contains all [[#message|messages]] bound for the canister. See also [[#induction pool|induction pool]]. When the canister is scheduled for execution, messages from its input queue will be executed.&lt;br /&gt;
&lt;br /&gt;
===== inter-canister message =====&lt;br /&gt;
An &#039;&#039;&#039;inter-canister message&#039;&#039;&#039; is a [[#message|message]] sent from one [[#canister|canister]] to another. Inter-canister messages are different from user-initiated [[#ingress message |ingress messages]].&lt;br /&gt;
&lt;br /&gt;
===== Internet Computer (IC) =====&lt;br /&gt;
The &#039;&#039;&#039;Internet Computer&#039;&#039;&#039; (IC) is a decentralized blockchain that provides scalable compute capacity for running [[#canister|canisters]] through independent [[#node provider|node providers]] running [[#node|nodes]] in geographically distributed [[#data center|data centers]].&lt;br /&gt;
&lt;br /&gt;
==L==&lt;br /&gt;
===== ledger canister =====&lt;br /&gt;
The &#039;&#039;&#039;ledger canister&#039;&#039;&#039; is a [[#system canister|system canister]] whose main role is to store [[#account|accounts]] and their corresponding [[#transaction|transactions]].&lt;br /&gt;
&lt;br /&gt;
==M==&lt;br /&gt;
===== message =====&lt;br /&gt;
A &#039;&#039;&#039;message&#039;&#039;&#039; is data sent from one [[#canister|canister]] to another or from a user to a canister.&lt;br /&gt;
&lt;br /&gt;
===== message routing =====&lt;br /&gt;
The &#039;&#039;&#039;message routing&#039;&#039;&#039; layer receives [[#batch|batches]] from the [[#consensus|consensus]] layer and inducts them into the [[#induction pool|induction pool]]. Message routing then schedules a set of [[#canister|canisters]] to execute messages from their [[#input queue|input queues]].&lt;br /&gt;
&lt;br /&gt;
After [[#message|messages]] have been executed, the message routing layer takes any messages produced in the execution round from the output queues and puts those messages into the outgoing streams to be consumed by canisters on other [[#subnet|subnets]].&lt;br /&gt;
&lt;br /&gt;
===== minting transaction =====&lt;br /&gt;
A &#039;&#039;&#039;minting transaction&#039;&#039;&#039; is the process of &amp;quot;minting&amp;quot; [[#ICP|ICP]], whereby a certain amount of ICP comes into existence. ICP is minted in order to reward [[#neuron|neurons]] for [[#voting|voting]], and reward [[#node provider|node providers]] for participating in the [[#Internet Computer (IC)|IC]] by providing compute capacity through the running of [[#node|nodes]]. A minting transaction is represented as a [[#transaction|transaction]] from the [[#ICP supply account|ICP supply account]] to a destination [[#account|account]].&lt;br /&gt;
&lt;br /&gt;
===== Motoko =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Motoko&#039;&#039;&#039; is a programming language designed to directly support the programming model of the [[#Internet Computer|Internet Computer]], making it easier to efficiently build applications and take advantage of some of the more unusual features of this platform, including the Actor Model for smart contracts and compilation to WebAssembly.&lt;br /&gt;
&lt;br /&gt;
==N==&lt;br /&gt;
===== non-dissolving state =====&lt;br /&gt;
A [[#neuron|neuron]] that is not [[#dissolved state|dissolved]] or [[#dissolving state| dissolving]] is said to be in a &#039;&#039;&#039;non-dissolving state&#039;&#039;&#039; (or &amp;quot;aging&amp;quot;). Non-dissolving neurons thus accrue &amp;quot;age&amp;quot;, with the caveat that beginning to dissolve at any time reduces this age back to zero. The dissolve delay parameter of a non-dissolving (aka &amp;quot;aging&amp;quot;) neuron cannot be zero, because such a neuron would have to already be dissolved.&lt;br /&gt;
&lt;br /&gt;
===== network nervous system (NNS) =====&lt;br /&gt;
The &#039;&#039;&#039;network nervous system&#039;&#039;&#039; (NNS) is a collection of [[#system canister|system canisters]] (aka &amp;quot;NNS canisters&amp;quot;) assembled into a system that governs all aspects of the [[#Internet Computer|Internet Computer]].&lt;br /&gt;
&lt;br /&gt;
===== neuron =====&lt;br /&gt;
A &#039;&#039;&#039;neuron&#039;&#039;&#039; is an [[#Internet Computer (IC)|IC]] entity that can make [[#proposal|proposals]] and vote on proposals related to the governance of the [[#Internet Computer|Internet Computer]] platform.&lt;br /&gt;
&lt;br /&gt;
To provide the stability required for responsible governance, neurons need to store (&amp;quot;stake&amp;quot;) a certain amount of [[#ICP|ICP]] in order to be able to make and vote on proposals. This [[#non-dissolving state|locks]] the tokens for a period of time, after which it starts [[#dissolving state| dissolving]]. The ICP stake of a neuron is stored in a [[#neuron account|neuron account]].&lt;br /&gt;
The neuron owner has the right to propose and vote on governance issues, and is granted rewards for [[#voting|voting]] in proportion to the amount of ICP staked, and the duration of the [[#non-dissolving state|dissolve period]].&lt;br /&gt;
&lt;br /&gt;
===== neuron account =====&lt;br /&gt;
A &#039;&#039;&#039;neuron account&#039;&#039;&#039; is a [[#canister account|canister account]] whose [[#beneficiary|beneficiary]] is a [[#neuron|neuron]] (or the neuron’s owner). The [[#governance canister|governance canister]] is the [[#fiduciary|fiduciary]] of all neuron accounts.&lt;br /&gt;
&lt;br /&gt;
===== neuron age =====&lt;br /&gt;
The &#039;&#039;&#039;neuron age&#039;&#039;&#039; is a [[#neuron|neuron]] parameter roughly indicative of the time that has passed since its creation or since when it last entered into a [[#non-dissolving state|non-dissolving state]]. Calculation of a neuron’s age needs to take into account whether the neuron has spent time [[#dissolving state| dissolving]] or [[#dissolved state|dissolved]], both of which reset this parameter.&lt;br /&gt;
&lt;br /&gt;
===== node =====&lt;br /&gt;
A &#039;&#039;&#039;node&#039;&#039;&#039; is a physical or virtual network endpoint that hosts all the hardware, [[#replica|replica]] software, and configuration settings required to participate in the [[#Internet Computer|Internet Computer]].&lt;br /&gt;
&lt;br /&gt;
===== node operator =====&lt;br /&gt;
A &#039;&#039;&#039;node operator&#039;&#039;&#039; (NO) is a non-canister [[#principal|principal]] who has the authority to add/remove [[#node|nodes]] to/from the [[#Internet Computer (IC)|IC]].&lt;br /&gt;
&lt;br /&gt;
[[#node provider|node providers]] come in possession of Hardware Security Modules (HSM), and register the HSMs with the [[#network nervous system (NNS)|NNS]]. (The HSM registration process consists essentially in deriving an IC principal ID from the key stored on the HSM, and persisting that ID with the NNS.) NPs hand registered HSMs over to legal persons, who now gain the authority to physically “operate nodes” (aka install [[#replica|replicas]]). The caveat is that, as opposed to &amp;quot;regular&amp;quot; principals, where a great deal of care goes into making sure that one principal ID corresponds to only one person, HSMs can routinely exchange hands, hence many persons can act as the same NO principal at different times.&lt;br /&gt;
&lt;br /&gt;
===== node provider =====&lt;br /&gt;
A &#039;&#039;&#039;node provider&#039;&#039;&#039; (NP) is a non-canister [[#principal|principal]] that receives the rewards stemming from node participation to the [[#Internet Computer (IC)|IC]] (aka “payout principal”). Usually, though not necessarily, a node provider is the owner of the [[#node|node]], and may also be involved in node operation and related tasks. A node provider may receive rewards from multiple nodes in multiple [[#data center|data centers]].&lt;br /&gt;
&lt;br /&gt;
==O==&lt;br /&gt;
===== output queue =====&lt;br /&gt;
Each [[#canister|canister]] has an &#039;&#039;&#039;output queue&#039;&#039;&#039; of [[#message|messages]] bound for other canisters.&lt;br /&gt;
&lt;br /&gt;
==P==&lt;br /&gt;
===== peer-to-peer (P2P) =====&lt;br /&gt;
In common usage, &#039;&#039;&#039;peer-to-peer&#039;&#039;&#039; (P2P) computing or networking is a distributed application architecture that partitions workload across a network of equally-privileged computer [[#node|nodes]] so that participants can contribute resources such as processing power, disk storage, or network bandwidth to handle application workload.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;peer-to-peer layer&#039;&#039;&#039; collects and disseminates [[#message|messages]] and artifacts from users and from other nodes.&lt;br /&gt;
&lt;br /&gt;
The [[#node|nodes]] of a [[#subnet|subnet]] form a dedicated peer-to-peer broadcast network that facilitates the secure &#039;&#039;&#039;bounded-time/eventual delivery&#039;&#039;&#039; broadcast of artifacts (such as [[#ingress message|ingress messages]], control messages and their signature shares). The [[#consensus|consensus]] layer builds upon this functionality.&lt;br /&gt;
&lt;br /&gt;
===== principal =====&lt;br /&gt;
A &#039;&#039;&#039;principal&#039;&#039;&#039; is an entity that can be authenticated by the [[#Internet Computer|Internet Computer]]. This is the same sense of the word principal as the [https://en.wikipedia.org/wiki/Principal_(computer_security) Wikipedia definition]. Principals that interact with the Internet Computer do so using a certain [[#identity|identity]].&lt;br /&gt;
&lt;br /&gt;
===== proposal =====&lt;br /&gt;
A &#039;&#039;&#039;proposal&#039;&#039;&#039; is a statement describing an action to modify certain parameters of the [[#Internet Computer (IC)|IC]], or of any of its subsystems. It is implemented as an IC entity having various attributes, such as an ID, a URL, a summary etc. Proposals are submitted by eligible [[#neuron|neuron]] owners for the consideration of the IC community, and undergo a [[#voting|voting]] process, following which they can be adopted or rejected. Adopted proposals are then executed.&lt;br /&gt;
There are several taxonomies of proposals, the most prominent of which groups proposals into &amp;quot;topics,&amp;quot; whose adoption, in turn, triggers certain categories of actions, such as the creation of a [[#subnet|subnet]], the addition of a [[#node|nodes]] to a subnet, and the modification of the [[#ICP|ICP]] exchange rate.&lt;br /&gt;
&lt;br /&gt;
===== proto-node =====&lt;br /&gt;
A &#039;&#039;&#039;proto-node&#039;&#039;&#039; is an [[#Internet Computer (IC)|IC]] entity consisting of a combination of hardware and software, that differs from a [[#node|node]] in that it has not yet been registered with the IC. A proto-node is, in short, a &amp;quot;node-in-waiting,&amp;quot; hence has all that it takes to be a node except the [[#replica|replica]] software.&lt;br /&gt;
&lt;br /&gt;
==Q==&lt;br /&gt;
===== query =====&lt;br /&gt;
A &#039;&#039;&#039;query&#039;&#039;&#039; is an optimised way to execute operations on a [[#canister|canister]] where the state changes are not preserved. Queries are synchronous and can be made to any [[#node|node]] that hosts the canister. Queries do not require [[#consensus|consensus]] to verify the result.&lt;br /&gt;
&lt;br /&gt;
==R==&lt;br /&gt;
===== replica =====&lt;br /&gt;
The &#039;&#039;&#039;replica&#039;&#039;&#039; is a collection of protocol components that are necessary for a [[#node|node]] to participate in a [[#subnet|subnet]].&lt;br /&gt;
&lt;br /&gt;
===== registry =====&lt;br /&gt;
The IC &#039;&#039;&#039;registry&#039;&#039;&#039; manages the system meta-data maintained on the network nervous system ([[#network nervous system (NNS)|NNS]]) and accessed by all [[#subnet|subnet]] blockchains.&lt;br /&gt;
&lt;br /&gt;
==S==&lt;br /&gt;
===== service worker =====&lt;br /&gt;
A [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API &#039;&#039;&#039;service worker&#039;&#039;&#039;], which implements the [[#HTTP gateway protocol|HTTP gateway protocol]] and translates browser asset requests to the IC into API canister calls and verifies the asset certification.&lt;br /&gt;
&lt;br /&gt;
===== smart contract =====&lt;br /&gt;
A &#039;&#039;&#039;smart contract&#039;&#039;&#039; is a stateful computer program designed to automatically execute, control or document relevant events and actions according to the terms of a contract or an agreement. A smart contract can be deployed on the [[#Internet Computer|Internet Computer]] in the form of a [[#canister|canister]] bundling data and code.&lt;br /&gt;
&lt;br /&gt;
A canister can have one or more [[#controller|controllers]] that are permitted to modify the code of the canister, thereby modifying the terms of the smart contract. For a canister smart contract to have immutable code, its list of controllers must be empty.&lt;br /&gt;
&lt;br /&gt;
===== state change =====&lt;br /&gt;
A &#039;&#039;&#039;state change&#039;&#039;&#039; is the result of any [[#transaction|transaction]], function call, or operation that changes the information stored in a [[#canister|canister]]. For example, if a function makes an update call that adds two numbers together or removes a name from a list, the result is a change to the canister state.&lt;br /&gt;
&lt;br /&gt;
===== state manager =====&lt;br /&gt;
The &#039;&#039;&#039;state manager&#039;&#039;&#039; is responsible for&lt;br /&gt;
# maintaining (multiple versions of) the replicated state the deterministic state machine implemented by [[#message routing|message routing]] and the [[#execution environment|execution environment]] operates on,&lt;br /&gt;
# converting back and forth between the replicated state and its canonical version (latter can be understood independent of the concrete implementation),&lt;br /&gt;
# obtaining certifications of parts of the canonical state, which allow other stakeholders such as other [[#subnet|subnets]] and/or users, to verify that some piece of state indeed originates from a valid subnetwork, and&lt;br /&gt;
# providing capabilities to sync the canonical state with other [[#replica|replicas]] in the same subnet so that replicas that have fallen behind can catch up.&lt;br /&gt;
&lt;br /&gt;
===== subnet =====&lt;br /&gt;
A &#039;&#039;&#039;subnet&#039;&#039;&#039; (subnetwork) is a collection of [[#node|nodes]] that run their own instance of the [[#consensus|consensus]] algorithm to produce a subnet blockchain that interacts with other subnets of the [[#Internet Computer (IC)|IC]] using [[#chain key|chain key]] cryptography.&lt;br /&gt;
&lt;br /&gt;
===== system canister =====&lt;br /&gt;
A &#039;&#039;&#039;system canister&#039;&#039;&#039; is a pre-installed [[#canister|canister]] that performs certain tasks needed to maintain the [[#Internet Computer|Internet Computer]].&lt;br /&gt;
&lt;br /&gt;
==T==&lt;br /&gt;
===== transaction =====&lt;br /&gt;
A ledger account &#039;&#039;&#039;transaction&#039;&#039;&#039; is the process of transferring [[#ICP|ICP]] from one [[#account|account]] to another; it can be of three types: (a) regular transfer transaction, (b) [[#burning|burning]] transaction, and (c) [[#minting|minting]] transaction.&lt;br /&gt;
&lt;br /&gt;
===== transfer transaction =====&lt;br /&gt;
A &#039;&#039;&#039;transfer transaction&#039;&#039;&#039; is the process of transferring ICP from any regular ledger [[#account|account]] (i.e. any ledger account except the [[#ICP supply account| ICP supply account]]) to another regular ledger account.&lt;br /&gt;
&lt;br /&gt;
==U==&lt;br /&gt;
===== user =====&lt;br /&gt;
A &#039;&#039;&#039;user&#039;&#039;&#039; is any entity that interacts with the [[#Internet Computer|Internet Computer]]. Users include end-users that use dapps deployed on the [[#Internet Computer (IC)|IC]], dapp developers, holders of [[#ICP|ICP]] utility tokens, and [[#neuron|neuron]] holders.&lt;br /&gt;
&lt;br /&gt;
==V==&lt;br /&gt;
===== valid set rule =====&lt;br /&gt;
The &#039;&#039;&#039;valid set rule&#039;&#039;&#039; is the rule that determines a valid [[#induction pool|induction pool]]. [[#ingress message|Ingress messages]] and [[#inter-canister message|inter-canister messages]] must pass certain checks to ensure that the valid set rule is upheld before they can be added to the induction pool.&lt;br /&gt;
&lt;br /&gt;
===== voting =====&lt;br /&gt;
&#039;&#039;&#039;Voting&#039;&#039;&#039; is the process through which [[#proposal|proposals]] are selected for adoption and implementation. Its direct participants are the [[#neuron|neurons]], who both (a) submit proposals and (b) vote on proposals. The voting process is a rather intricate undertaking, involving aspects such as neuron eligibility, voting power, chains of neuron followees etc. This has been designed with security and dependability in mind, and is being continuously improved in order to prevent the concentration of voting power in the hands of just a few neuron owners.&lt;br /&gt;
&lt;br /&gt;
==W==&lt;br /&gt;
===== WebAssembly =====&lt;br /&gt;
&#039;&#039;&#039;WebAssembly&#039;&#039;&#039; (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_nodes&amp;diff=3553</id>
		<title>Boundary nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_nodes&amp;diff=3553"/>
		<updated>2022-11-15T10:45:24Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Ruediger.birkner moved page Boundary nodes to Boundary Nodes: Capitalization of the title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Boundary Nodes]]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=3552</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=3552"/>
		<updated>2022-11-15T10:45:24Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: Ruediger.birkner moved page Boundary nodes to Boundary Nodes: Capitalization of the title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), which allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;ic0.app/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to the right replica node in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists of rate-limiting and an operator-maintained denylist. The rate-limits are in place to protect the IC from being overwhelmed with external accesses. The denylist allows a boundary node operator to comply with local legal frameworks (e.g., blocking gambling services in a particular geography).&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node extracts infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
Unfortunately, not all applications natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by enabling canisters to handle conventional HTTP requests allowing, for example, browsers to interact with canisters. A gateway implementing this protocol translates between HTTP requests and API canister calls and can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the correctness of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, unfortunately do not support service workers and are therefore not able to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; out-of-the-box. However, they are able to access all the content under &amp;lt;code&amp;gt;raw.ic0.app&amp;lt;/code&amp;gt; as the translation from HTTP requests to API calls happens within the boundary node. Therefore, boundary nodes detect all accesses of crawlers and bots to &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; and internally redirect them to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=3551</id>
		<title>Boundary Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Boundary_Nodes&amp;diff=3551"/>
		<updated>2022-11-15T10:44:15Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: The boundary nodes are the gateway to the Internet Computer (IC), which allow users to seamlessly access the canister smart contracts running on it.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary nodes are the gateway to the Internet Computer (IC), which allow users to seamlessly access the canister smart contracts running on it. The following figure shows how the boundary nodes form the edge of the IC and all accesses to the IC have to go through one of the boundary nodes. &lt;br /&gt;
&lt;br /&gt;
[[File:High-Level Overview.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== Boundary Node Internals ==&lt;br /&gt;
&lt;br /&gt;
At a closer look, boundary nodes consist of two parts: the API node, which provides an endpoint for [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface API canister calls], and the HTTP gateway, which provides an HTTP endpoint for users to access the canisters hosted on the IC with their stock browser.&lt;br /&gt;
&lt;br /&gt;
[[File:Boundary Node Overview.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
=== API Node ===&lt;br /&gt;
&lt;br /&gt;
The API endpoint resides at &amp;lt;code&amp;gt;ic0.app/api/v2&amp;lt;/code&amp;gt; and is specified in the [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-interface IC’s Interface Specification].&lt;br /&gt;
&lt;br /&gt;
Whenever a boundary node receives an API canister call, it passes it through a filter and then routes it to the right replica node in the IC.&lt;br /&gt;
&lt;br /&gt;
Filtering within the boundary node consists of rate-limiting and an operator-maintained denylist. The rate-limits are in place to protect the IC from being overwhelmed with external accesses. The denylist allows a boundary node operator to comply with local legal frameworks (e.g., blocking gambling services in a particular geography).&lt;br /&gt;
&lt;br /&gt;
After an API canister call passed the filtering stage, the boundary node extracts infers the destination canister ID and uses the routing table to look up the subnet in which this canister is hosted. It then randomly chooses a replica within that subnet to which it forwards the API call. The random selection of the target replica ensures that an API call eventually reaches an honest node when the client keeps retrying.&lt;br /&gt;
&lt;br /&gt;
Finally, the boundary node forwards the API canister call to the selected replica node in the core of the IC.&lt;br /&gt;
&lt;br /&gt;
Since the API Node is simply passing the API canister call on to the IC, no trust is required.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Gateway ===&lt;br /&gt;
&lt;br /&gt;
Unfortunately, not all applications natively support API canister calls and therefore cannot directly talk to the canisters hosted on the IC. The [https://internetcomputer.org/docs/current/references/ic-interface-spec/#http-gateway HTTP gateway protocol] bridges that gap by enabling canisters to handle conventional HTTP requests allowing, for example, browsers to interact with canisters. A gateway implementing this protocol translates between HTTP requests and API canister calls and can be implemented in various forms (e.g., as a stand-alone proxy, as a browser plugin, or as a [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API service worker]).&lt;br /&gt;
&lt;br /&gt;
The boundary nodes provide two different implementations of the HTTP gateway protocol:&lt;br /&gt;
&lt;br /&gt;
* Service worker: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary nodes serve a [https://www.npmjs.com/package/@dfinity/service-worker service worker], which is installed in the browser and acts as an HTTP gateway directly in the user’s browser;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;: under &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;, the boundary node runs [https://github.com/dfinity/icx-proxy &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;], an HTTP gateway implementation suitable for all clients that do not support a service worker.&lt;br /&gt;
&lt;br /&gt;
==== Service Worker ====&lt;br /&gt;
&lt;br /&gt;
[[File:Service Worker Flow.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
When accessing &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.ic0.app&amp;lt;/code&amp;gt;, the boundary node returns a service worker implementing the HTTP gateway protocol, which is installed directly in the user’s browser (step 1 and 2). From then on, the service worker will intercept all HTTP requests and translate them to API canister calls (step 3). These API canister calls will then go through the API endpoint of the boundary node to the IC (step 4). The replica sends the response back through the boundary node to the service worker (step 5 and 6). For all responses, the service worker verifies the correctness of the response and only translates it into a proper HTTP response for the browser if it passes all the checks (step 7). &lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The HTTP Gateway endpoint implements the HTTP gateway protocol, which translates between HTTP requests and API canister calls. This endpoint resides at &amp;lt;code&amp;gt;&amp;lt;canister_id&amp;gt;.raw.ic0.app&amp;lt;/code&amp;gt;. Whenever a boundary node receives such a request, it forwards it to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;, a service running directly on the boundary node that implements the HTTP gateway protocol. &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt; translates the HTTP requests into API canister calls and forwards them to the API endpoint of the boundary node. It verifies the certificates of the responses and constructs an HTTP response to send back to the client. Here, the user needs to trust the boundary node as the boundary node is constructing the API calls and verifying the correctness of the IC’s response.&lt;br /&gt;
&lt;br /&gt;
== Additional Features of the Boundary Nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Globally-Distributed ===&lt;br /&gt;
&lt;br /&gt;
The boundary nodes serving &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; are globally distributed and organized in regional pools. All requests are directed to the geographically closest pool and load balanced over the instances within that pool. The health of the boundary nodes is constantly monitored and in case of failure, boundary nodes will be removed from the pools.&lt;br /&gt;
&lt;br /&gt;
=== SEO ===&lt;br /&gt;
&lt;br /&gt;
Bots and crawlers, such as the ones used by search engines, unfortunately do not support service workers and are therefore not able to index content hosted under &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; out-of-the-box. However, they are able to access all the content under &amp;lt;code&amp;gt;raw.ic0.app&amp;lt;/code&amp;gt; as the translation from HTTP requests to API calls happens within the boundary node. Therefore, boundary nodes detect all accesses of crawlers and bots to &amp;lt;code&amp;gt;ic0.app&amp;lt;/code&amp;gt; and internally redirect them to &amp;lt;code&amp;gt;icx-proxy&amp;lt;/code&amp;gt;. This allows the dapps running on the Internet Computer to seamlessly integrate into the Web 2.0 world. These dapps can be indexed by search engines and their metadata can be read in order to generate previews and cards on social platforms.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
To improve the user-perceived performance of the dapps hosted on the IC, the boundary nodes currently provide response caching. Responses to requests are cached for 1s. &lt;br /&gt;
&lt;br /&gt;
== Future Boundary Node Developments ==&lt;br /&gt;
&lt;br /&gt;
To follow future boundary node developments check out the [https://internetcomputer.org/roadmap/ public roadmap], the [https://forum.dfinity.org/ IC developer forum] and the thread on the [https://forum.dfinity.org/t/boundary-node-roadmap/15562 future boundary node architecture].&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=File:Service_Worker_Flow.png&amp;diff=3550</id>
		<title>File:Service Worker Flow.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=File:Service_Worker_Flow.png&amp;diff=3550"/>
		<updated>2022-11-15T10:26:22Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Upon the first request, the boundary node serves the service worker, which is then directly installed in the user&#039;s browser. From then on, the service worker intercepts all HTTP requests and translates them to API calls. The service worker verifies the certification of all responses.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=File:Boundary_Node_Overview.png&amp;diff=3549</id>
		<title>File:Boundary Node Overview.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=File:Boundary_Node_Overview.png&amp;diff=3549"/>
		<updated>2022-11-15T10:18:03Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The boundary node consists of two parts: the API node and the HTTP gateway.&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=File:High-Level_Overview.png&amp;diff=3548</id>
		<title>File:High-Level Overview.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=File:High-Level_Overview.png&amp;diff=3548"/>
		<updated>2022-11-15T10:15:28Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;High-level overview of how the boundary nodes provide access to the core of the Internet Computer. All requests go through one of the many boundary nodes, no matter where they originated (e.g., browser, mobile application, IC-native browser, web-extension).&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=3327</id>
		<title>HTTP asset certification</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=HTTP_asset_certification&amp;diff=3327"/>
		<updated>2022-11-02T14:09:07Z</updated>

		<summary type="html">&lt;p&gt;Ruediger.birkner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HTTP asset certification is a protocol that allows canisters to certify bodies of responses to GET HTTP requests.&lt;br /&gt;
The receiver of such responses can use the IC public key to authenticate the body of the response.&lt;br /&gt;
The protocol relies on [https://smartcontracts.org/docs/interface-spec/index.html#system-api-certified-data Certified data] feature of the IC.&lt;br /&gt;
&lt;br /&gt;
== Canister protocol ==&lt;br /&gt;
&lt;br /&gt;
A canister must follow the following protocol to certify assets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Construct a [https://smartcontracts.org/docs/interface-spec/index.html#_certificate hash tree] that maps paths of HTTP resources to SHA-256 hashes of their bodies.&lt;br /&gt;
An example of such a tree:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*root*&lt;br /&gt;
└── http_assets&lt;br /&gt;
    ├── index.html -&amp;gt; SHA256(body)&lt;br /&gt;
    ├── ...&lt;br /&gt;
    └── /css/styles.css -&amp;gt; SHA256(body)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Compute the root hash of the tree and call [https://smartcontracts.org/docs/interface-spec/index.html#system-api-imports &amp;lt;code&amp;gt;ic0.certified_data_set&amp;lt;/code&amp;gt;] with the bytes of the hash as the argument.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Add a [[#IC-Certificate header]] to each certified HTTP response.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validator protocol ==&lt;br /&gt;
&lt;br /&gt;
The validator follows the following steps to validate the certificate of resource at path &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; served by canister &amp;lt;code&amp;gt;CANISTER_ID&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Hash the body of the HTTP response, obtaining hash &amp;lt;code&amp;gt;DATA_HASH&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Check that the response contains the &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header.&lt;br /&gt;
* Decode the &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; from the value of the &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header.&lt;br /&gt;
* Check the validity of the certificate as described in the [https://smartcontracts.org/docs/interface-spec/index.html#certification Interface Specification: Certification]. This step requires knowing the IC root key.&lt;br /&gt;
* Check that &amp;lt;code&amp;gt;lookup(/http_assets/PATH, tree) = Found(DATA_HASH)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check that &amp;lt;code&amp;gt;lookup(/canister/CANISTER_ID/certified_data, certificate.tree) = Found(reconstruct(tree))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== IC-Certificate header ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;IC-Certificate&amp;lt;/code&amp;gt; header is a Structure Header (as per [https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-header-structure RFC proposal]) is a dictionary with members &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt;, both of which are Byte Sequences:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IC-Certificate: certificate=:&amp;lt;base64(c)&amp;gt;:, tree=:&amp;lt;base64(t)&amp;gt;:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is the CBOR-encoded certificate (see [https://smartcontracts.org/docs/interface-spec/index.html#certification-encoding Interface Specification: Encoding of certificates]).&lt;br /&gt;
* &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; is a Hash Tree, CBOR-encoded according the CDDL &amp;lt;code&amp;gt;#6.55799(hash-tree)&amp;lt;/code&amp;gt; where &amp;lt;code&amp;gt;hash-tree&amp;lt;/code&amp;gt; is the corresponding [https://smartcontracts.org/docs/interface-spec/index.html#api-cddl CDDL production in the Interface Specification].&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;certificate&amp;lt;/code&amp;gt; must be a valid [https://smartcontracts.org/docs/interface-spec/index.html#_certificate Internet Specification: Certificate] with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lookup(/canister/&amp;lt;canister_id&amp;gt;/certified_data, certificate.tree)&lt;br /&gt;
    = Found (reconstruct(tree))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt; exposes the relevant nodes in the &amp;lt;code&amp;gt;/http_assets&amp;lt;/code&amp;gt; subtree to allow the client to lookup the request path to get the expected body hash.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
For this example, we fetched &amp;lt;code&amp;gt;/index.html&amp;lt;/code&amp;gt; resource of the Internet Identity canister (canister id &amp;lt;code&amp;gt;rdmx6-jaaaa-aaaaa-aaadq-cai&amp;lt;/code&amp;gt;) available at https://rdmx6-jaaaa-aaaaa-aaadq-cai.raw.ic0.app/index.html.&lt;br /&gt;
The SHA-256 hash of the resource at the moment of fetching is &amp;lt;code&amp;gt;478afb8206ca0b566a7f138e623accd169fa822602d2f6d717fb67d1045f4f0d&amp;lt;/code&amp;gt;.&lt;br /&gt;
The response contained the following header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IC-Certificate: certificate=:2dn3omR0cmVlgwGDAYMBgwJIY2FuaXN0ZXKDAYMBggRYIIudikoDwH1gRK637olblUhMUX3HlE0Dihj8MTACxGzHgwGCBFggyCRYc8M/ugt8G7C8RPYayn+l4sdBj8gvFotzJELnQ32DAYIEWCA1/+UHZ9SF67w4ssjOi+Jv3ch7WQNzezGmhtuvB+RDpYMCSgAAAAAAAAAHAQGDAYMBgwJOY2VydGlmaWVkX2RhdGGCA1ggWUt10wjWinx0aAWyrNEi/0R7VeuhalDMjGDErzIbZzqCBFgg/VtZRZdYyK/sr3KF2jWeS1rblF+4ajwfDv2ZbCGpaTiCBFggSoI5JS0pCusHP4nh6h780ebr961E0lVnFkFwzF5pZaeCBFggcKidPEGiPoFMPYfEyNGsDRYWmry1iGX0HNUEoKhIATeCBFggR0zdKUZOMcm5EHNl5Tee3XWqbq1gArwUGzZ2FH4rWtmCBFggTkwJcNrh0eJ9FutJcn6th9eCbM2KXnloxed0acxmQNeDAYIEWCA6SNH8IT1JMHEDEE99csK1kw7bqHh7kGMfNDs6popfCoMCRHRpbWWCA0nFnbXrts/65xZpc2lnbmF0dXJlWDCkXN2tcvH5b+xFCzfkuJMqrZDcplfW8vDziJwzx08WOPI4rh2TIGYZ3R6dgQTF0CA=:, tree=:2dn3gwGDAktodHRwX2Fzc2V0c4MBggRYIDgtAGcz5VvevwiEwwZB9zpkt17C9LE6o/O37bEwQUawgwGDAksvaW5kZXguaHRtbIIDWCBHivuCBsoLVmp/E45iOszRafqCJgLS9tcX+2fRBF9PDYIEWCCx2L8SfJwOydBkUxjc8tKXDVUeoiw8qEYI+8b+HRWIWYIEWCAqZ+3yoFSA9s+jbLFbtcVz+wi0HF9x51Kx38qPcBhiDA==:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can extract the following data from the header value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ROOT HASH: 0b2d843df534ac8ed2331fe2782deb71d23a08d9b4019a8fa695ec7fde93de36&lt;br /&gt;
TREE HASH: 594b75d308d68a7c746805b2acd122ff447b55eba16a50cc8c60c4af321b673a&lt;br /&gt;
SIGNATURE: a45cddad72f1f96fec450b37e4b8932aad90dca657d6f2f0f3889c33c74f1638f238ae1d93206619dd1e9d8104c5d020&lt;br /&gt;
CERTIFICATE TIME: 2022-02-02T08:23:24.851277509+00:00&lt;br /&gt;
CERTIFICATE TREE:&lt;br /&gt;
HashTree {&lt;br /&gt;
    root: Fork(&lt;br /&gt;
        Fork(&lt;br /&gt;
            Fork(&lt;br /&gt;
                Label(&amp;quot;canister&amp;quot;, Fork(&lt;br /&gt;
                    Fork(&lt;br /&gt;
                        Pruned(8b9d8a4a03c07d6044aeb7ee895b95484c517dc7944d038a18fc313002c46cc7),&lt;br /&gt;
                        Fork(&lt;br /&gt;
                            Pruned(c8245873c33fba0b7c1bb0bc44f61aca7fa5e2c7418fc82f168b732442e7437d),&lt;br /&gt;
                            Fork(&lt;br /&gt;
                                Pruned(35ffe50767d485ebbc38b2c8ce8be26fddc87b5903737b31a686dbaf07e443a5),&lt;br /&gt;
                                Label(0x00000000000000070101, Fork(&lt;br /&gt;
                                    Fork(&lt;br /&gt;
                                        Label(&amp;quot;certified_data&amp;quot;, Leaf(0x594b75d308d68a7c746805b2acd122ff447b55eba16a50cc8c60c4af321b673a)),&lt;br /&gt;
                                        Pruned(fd5b59459758c8afecaf7285da359e4b5adb945fb86a3c1f0efd996c21a96938),&lt;br /&gt;
                                    ),&lt;br /&gt;
                                    Pruned(4a8239252d290aeb073f89e1ea1efcd1e6ebf7ad44d25567164170cc5e6965a7),&lt;br /&gt;
                                )),&lt;br /&gt;
                            ),&lt;br /&gt;
                        ),&lt;br /&gt;
                    ),&lt;br /&gt;
                    Pruned(70a89d3c41a23e814c3d87c4c8d1ac0d16169abcb58865f41cd504a0a8480137),&lt;br /&gt;
                )),&lt;br /&gt;
                Pruned(474cdd29464e31c9b9107365e5379edd75aa6ead6002bc141b3676147e2b5ad9),&lt;br /&gt;
            ),&lt;br /&gt;
            Pruned(4e4c0970dae1d1e27d16eb49727ead87d7826ccd8a5e7968c5e77469cc6640d7),&lt;br /&gt;
        ),&lt;br /&gt;
        Fork(&lt;br /&gt;
            Pruned(3a48d1fc213d49307103104f7d72c2b5930edba8787b90631f343b3aa68a5f0a),&lt;br /&gt;
            Label(&amp;quot;time&amp;quot;, Leaf(0xc59db5ebb6cffae716)),&lt;br /&gt;
        ),&lt;br /&gt;
    ),&lt;br /&gt;
}&lt;br /&gt;
TREE:&lt;br /&gt;
HashTree {&lt;br /&gt;
    root: Fork(&lt;br /&gt;
        Label(&amp;quot;http_assets&amp;quot;, Fork(&lt;br /&gt;
            Pruned(382d006733e55bdebf0884c30641f73a64b75ec2f4b13aa3f3b7edb1304146b0),&lt;br /&gt;
            Fork(&lt;br /&gt;
                Label(&amp;quot;/index.html&amp;quot;, Leaf(0x478afb8206ca0b566a7f138e623accd169fa822602d2f6d717fb67d1045f4f0d)),&lt;br /&gt;
                Pruned(b1d8bf127c9c0ec9d0645318dcf2d2970d551ea22c3ca84608fbc6fe1d158859),&lt;br /&gt;
            ),&lt;br /&gt;
        )),&lt;br /&gt;
        Pruned(2a67edf2a05480f6cfa36cb15bb5c573fb08b41c5f71e752b1dfca8f7018620c),&lt;br /&gt;
    ),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* The protocol supports only one resource per path. This does not work well with content negotiation protocol.&lt;br /&gt;
* The protocol does not support certification of HTTP statuses and headers. Only resource bodies can be certified. &lt;br /&gt;
&lt;br /&gt;
== Canisters using HTTP asset certification ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/dfinity/internet-identity/blob/7ff3dd51dd98c7b1b43d83950c9f31ea7159103d/src/internet_identity/src/main.rs#L775 Internet Identity canister]&lt;br /&gt;
* [https://github.com/dfinity/nns-dapp/blob/49126394df77b9583e508277fc736eda51de47be/rs/src/assets.rs#L123 NNS frontend]&lt;br /&gt;
* [https://github.com/dfinity/certified-assets Certified assets canister]&lt;br /&gt;
&lt;br /&gt;
== Validators ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/dfinity/ic/tree/master/typescript/service-worker Certifying Service Worker]&lt;br /&gt;
* [https://github.com/dfinity/icx-proxy/blob/b0de0437fe6806a96d942465e5ee284c23b812e8/src/main.rs#L470 ICX proxy]&lt;/div&gt;</summary>
		<author><name>Ruediger.birkner</name></author>
	</entry>
</feed>