# Baremetal

Authors: \[man4ela | catapulta.eth]

## System Requirements

|   CPU  |           OS           |                  RAM                  |     DISK     |
| :----: | :--------------------: | :-----------------------------------: | :----------: |
| 4 vCPU | Debian 12/Ubuntu 22.04 | <p>8GB min</p><p>16GB Recommended</p> | 2.5TB+ (SSD) |

{% hint style="info" %}
*The Fuse archival node has a size of 2.5TB on Septmber 3rd, 2024*
{% endhint %}

### Pre-Requisites

```bash
sudo apt update -y && sudo apt upgrade -y && sudo apt autoremove -y

sudo apt install -y git make wget gcc pkg-config libusb-1.0-0-dev libudev-dev jq gcc g++ curl libssl-dev screen apache2-utils build-essential pkg-config unzip
```

### Setting up Firewall

Set explicit default UFW rules

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
```

Allow SSH

```bash
sudo ufw allow 22/tcp
```

Allow remote RPC connections with Fuse node

```bash
sudo ufw allow from ${REMOTE.HOST.IP} to any port 8545 8546
```

{% hint style="warning" %}
Not advised to allow all or unknown IP address to RPC port
{% endhint %}

Allow P2P Connections

```bash
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
```

Enable Firewall

```bash
sudo ufw enable
```

To check the status of UFW and see the current rules

```bash
sudo ufw status verbose
```

## Building a Node on Fuse with Nethermind client

{% hint style="success" %}
Since **08.2022** Fuse is moving from OE client to [Nethermind](https://nethermind.io/). To bootstrap Fuse archive node this guide covers the steps on how to build Nethermind from source and configure it to run for Fuse Network
{% endhint %}

### Install .NET SDK

```bash
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y apt-transport-https
sudo apt update
sudo apt install -y dotnet-sdk-8.0
```

### Download the Latest Nethermind Release Binary <a href="#the-release-binary" id="the-release-binary"></a>

```bash
wget "$(curl -s https://api.github.com/repos/NethermindEth/nethermind/releases/latest \
        | grep "browser_download_url" \
        | grep "linux-x64.zip" \
        | cut -d '"' -f 4)" -O nethermind-latest-linux-x64.zip
```

Use `unzip` to extract downloaded archive

```bash
unzip nethermind-latest-linux-x64.zip
```

### Configuing Nethermind client

#### Increase the maximum number of open files

```bash
sudo bash -c 'echo "nethermind soft nofile 100000" > /etc/security/limits.d/nethermind.conf' 
sudo bash -c 'echo "nethermind hard nofile 100000" >> /etc/security/limits.d/nethermind.conf'
```

#### Create chainspec file for Fuse

```bash
mkdir -p /root/fuse-archive/chainspec

nano /root/fuse-archive/chainspec/fuse.json
```

Copy/Paste the following contents into the file:

```json
{
  "name": "FuseNetwork",
  "engine": {
    "authorityRound": {
      "params": {
        "stepDuration": "5",
        "blockReward": "0x0",
        "blockRewardContractAddress": "0x63D4efeD2e3dA070247bea3073BCaB896dFF6C9B",
        "blockRewardContractTransition": 100,
        "validators": {
          "multi": {
            "0": {
              "list": ["0xd9176e84898a0054680aec3f7c056b200c3d96c3"]
            },
            "100": {
              "safeContract": "0x3014ca10b91cb3D0AD85fEf7A3Cb95BCAc9c0f79"
            }
          }
        }
      }
    }
  },
  "params": {
    "gasLimitBoundDivisor": "0x400",
    "maximumExtraDataSize": "0x20",
    "minGasLimit": "0x1388",
    "networkID": "0x07a",
    "eip155Transition": 0,
    "validateChainIdTransition": 0,
    "eip140Transition": 0,
    "eip211Transition": 0,
    "eip214Transition": 0,
    "eip658Transition": 0,
    "eip150Transition": "0x0",
    "eip160Transition": "0x0",
    "eip161abcTransition": "0x0",
    "eip161dTransition": "0x0",
    "eip98Transition": "0x7fffffffffffff",
    "eip145Transition": "0x38ada7",
    "eip1014Transition": "0x38ada7",
    "eip1052Transition": "0x38ada7",
    "eip1283Transition": "0xd29240",
    "eip1344Transition": "0xd29240",
    "eip1706Transition": "0xd29240",
    "eip1884Transition": "0xd29240",
    "eip2028Transition": "0xd29240",
    "eip2929Transition": "0xd29240",
    "eip2930Transition": "0xd29240",
    "eip1559Transition": "0x1D653E8",
    "eip2565Transition": "0x1D653E8",
    "eip3198Transition": "0x1D653E8",
    "eip3529Transition": "0x1D653E8",
    "eip3541Transition": "0x1D653E8",
    "eip1559BaseFeeMinValueTransition": "0x1D653E8",
    "eip3651TransitionTimestamp": "0x66A78440",
    "eip3855TransitionTimestamp": "0x66A78440",
    "eip3860TransitionTimestamp": "0x66A78440",
    "eip1153TransitionTimestamp": "0x66A78440",
    "eip5656TransitionTimestamp": "0x66A78440",
    "eip6780TransitionTimestamp": "0x66A78440",
    "eip1559BaseFeeMaxChangeDenominator": "0x8",
    "eip1559ElasticityMultiplier": "0x2",
    "eip1559BaseFeeInitialValue": "0x3b9aca00",
    "eip1559BaseFeeMinValue": "0x2540be400",
    "maxCodeSize": 24576,
    "maxCodeSizeTransition": "0x0"
  },
  "genesis": {
    "seal": {
      "authorityRound": {
        "step": "0x0",
        "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      }
    },
    "difficulty": "0x20000",
    "baseFeePerGas": "0x2540BE400",
    "gasLimit": "0x989680"
  },
  "nodes": [
    "enode://60ca021ca7a60c5fedeb39344d6ef282c6c8574c87bf492dcef7ed8dd9611c5a33da2b286f12eb81554c403718565a749d5028c9bcfc1d5b90b8d105ac04da4b@35.205.73.124:30303",
    "enode://550041c1883866ee537ddf220c0ea84b614bce27e9adb8de85b3b86bd745d7ed9575043a78fabe192f1f0ceee71a343f1d5b35f09e6bb41f24ac69bfe214f414@34.76.228.61:30303"
  ],
  "accounts": {
    "0x0000000000000000000000000000000000000001": {
      "balance": "1",
      "builtin": {
        "name": "ecrecover",
        "pricing": {
          "linear": {
            "base": 3000,
            "word": 0
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000002": {
      "balance": "1",
      "builtin": {
        "name": "sha256",
        "pricing": {
          "linear": {
            "base": 60,
            "word": 12
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000003": {
      "balance": "1",
      "builtin": {
        "name": "ripemd160",
        "pricing": {
          "linear": {
            "base": 600,
            "word": 120
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000004": {
      "balance": "1",
      "builtin": {
        "name": "identity",
        "pricing": {
          "linear": {
            "base": 15,
            "word": 3
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000005": {
      "builtin": {
        "name": "modexp",
        "pricing": {
          "0": {
            "price": {
              "modexp": {
                "divisor": 20
              }
            }
          },
          "0xd29240": {
            "info": "EIP-2565: ModExp Gas Cost.",
            "price": {
              "modexp2565": {}
            }
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000006": {
      "builtin": {
        "name": "alt_bn128_add",
        "pricing": {
          "0": {
            "price": {
              "alt_bn128_const_operations": {
                "price": 500
              }
            }
          },
          "0xd29240": {
            "info": "EIP-1108 Istanbul HF",
            "price": {
              "alt_bn128_const_operations": {
                "price": 150
              }
            }
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000007": {
      "builtin": {
        "name": "alt_bn128_mul",
        "pricing": {
          "0": {
            "price": {
              "alt_bn128_const_operations": {
                "price": 4000
              }
            }
          },
          "0xd29240": {
            "info": "EIP-1108 Istanbul HF",
            "price": {
              "alt_bn128_const_operations": {
                "price": 6000
              }
            }
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000008": {
      "builtin": {
        "name": "alt_bn128_pairing",
        "pricing": {
          "0": {
            "price": {
              "alt_bn128_pairing": {
                "base": 100000,
                "pair": 80000
              }
            }
          },
          "0xd29240": {
            "info": "EIP-1108 Istanbul HF",
            "price": {
              "alt_bn128_pairing": {
                "base": 45000,
                "pair": 34000
              }
            }
          }
        }
      }
    },
    "0x0000000000000000000000000000000000000009": {
      "builtin": {
        "name": "blake2_f",
        "pricing": {
          "0xd29240": {
            "info": "EIP-152 Istanbul HF",
            "price": {
              "blake2_f": {
                "gas_per_round": 1
              }
            }
          }
        }
      }
    },
    "0xd9176e84898a0054680aec3f7c056b200c3d96c3": {
      "balance": "300000000000000000000000000"
    }
  }
}
```

`Ctrl + X and Y` to exit and confirm saving changes to a file

#### Create an empty config file for Fuse

```bash
mkdir -p /root/fuse-archive/config

nano /root/fuse-archive/config/empty.cfg
```

Copy/Paste the following contents into the file:

```json
{
}
```

#### Create Data Directory to store chain data for Fuse blockchain

```bash
mkdir /root/fuse-archive/fuse_data
```

#### Configure systemd Service

Ensure that you grant execute permission to the binary file:

```bash
sudo chmod +x /root/fuse-archive/Nethermind.Runner
```

Create a systemd service file:

```bash
sudo nano /etc/systemd/system/nethermind.service
```

Add the following content:

```bash
[Unit]
Description=Nethermind Node
Documentation=https://docs.nethermind.io
After=network.target

[Service]
User=root
Environment=DOTNET_BUNDLE_EXTRACT_BASE_DIR=/root/fuse-archive/fuse-data/basedir
ExecStart=/root/fuse-archive/Nethermind.Runner \
        --datadir=/root/fuse-archive/fuse-data/datadir/ \
        --config=/root/fuse-archive/config/empty.cfg \
        --Init.DiscoveryEnabled=true \
        --Init.WebSocketsEnabled=true \
        --Init.StoreReceipts=true \
        --Init.ChainSpecPath=/root/fuse-archive/chainspec/fuse.json \
        --Init.BaseDbPath=/root/fuse-archive/fuse-data/basedir \
        --Init.GenesisHash=0x6e778e9491576a28bd06fac93844d8494be1f153e60ba7d29b4b51d991d4f830 \
        --Network.DiscoveryPort=30303 \
        --Network.P2PPort=30303 \
        --Network.LocalIp=0.0.0.0 \
        --Network.ExternalIp=0.0.0.0 \
        --JsonRpc.Enabled=true \
        --JsonRpc.Timeout=20000 \
        --JsonRpc.Host=0.0.0.0 \
        --JsonRpc.Port=9656 \
        --JsonRpc.WebSocketsPort=9756 \
        --JsonRpc.JwtSecretFile=/root/fuse-archive/jwt.hex \
        --Receipt.TxLookupLimit=0 \
        --Metrics.NodeName=fuse_archive \
        --Bloom.IndexLevelBucketSizes="[ 16, 16, 16, 16 ]" \
        --Pruning.Mode=none \
        --Mining.MinGasPrice=1000000000 \
        --Merge.Enabled=false \
        --TraceStore.Enabled=true \
        --TraceStore.BlocksToKeep=0 \
        --TraceStore.TraceTypes=Trace,Rewards \
        --Sync.FastSync=false
Restart=on-failure
LimitNOFILE=1000000
KillSignal=SIGKILL
[Install]
WantedBy=multi-user.target
```

`Ctrl + X and Y` to exit and confirm saving changes to a file

#### Reload systemd and Enable the Service

```bash
systemctl enable nethermind #enable nethermind service at system startup

sudo systemctl daemon-reload #refresh systemd configuration when changes made

sudo systemctl start nethermind #start nethermind

sudo systemctl stop nethermind #stop nethermind
```

{% hint style="info" %}
To check or modify `nethermind.service` parameters simply run

`sudo nano /etc/systemd/system/nethermind.service`

Ctrl+X and Y to save changes
{% endhint %}

### View Logs for Debugging

```bash
journalctl -f -u nethermind  #follow logs of nethermind service
```

*The logs should look like below and indicate that your node syncs and is expected to reach a chainhead in \~2-3 days*

{% hint style="success" %}
`28 Jun 01:13:08 | Finalizing validators for transition signalled within contract at block 473632 after block 473633 (0xba9913...ff8838).`

`28 Jun 01:13:08 | Applying validator set change before block 473634 (0xae6e4c...881217).`

`28 Jun 01:13:08 | Downloaded 473,680 / 30,284,955 ( 1.56 %) | current 102 Blk/s | total 156 Blk/s`

`28 Jun 01:13:09 | Processed 473428... 473681 | 193.72 ms | slot 2,151 ms |⛽ Gas gwei: 0.00 .. 0.00 (0.00) .. 0.00`

`28 Jun 01:13:09 | - Blocks 254 0.14 MGas | 6 txs | calls 1,835 ( 0) | sload 4,835 | sstore 735 | create 0`

`28 Jun 01:13:09 | - Block throughput 0.74 MGas/s | 30.97 t/s | 1311.17 Blk/s | recover 0 | process 7`

`28 Jun 01:13:09 | Signal for transition within contract at block 473732 (0x89197a...464a90). New list of 2 : [0xc736793ff31e04807cbf20b39d50ac7a04a4bdad, 0xd9176e84898a0054680aec3f7c056b200c3d96c3].`
{% endhint %}

## References

{% embed url="<https://docs.nethermind.io/get-started/installing-nethermind/>" %}

{% embed url="<https://github.com/fuseio/fuse-network/blob/master/README.md#archival-node>" %}

{% embed url="<https://docs.fuse.io/developers/run-or-access-fuse-nodes>" %}

{% embed url="<https://github.com/fuseio/nethermind-client/tree/production/src/Nethermind/Nethermind.Runner/configs>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.infradao.com/archive-nodes-101/fuse/baremetal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
