Skip to main content

Run a full node from source

This guide outlines the steps to start a Morph node. The example assumes the home directory is ~/.morph

Hardware requirements​

Running the morph node requires 2 processes: geth and node.

  • Geth:the Morph execution layer which needs to meet the requirements as below

    • Fast CPU with 4+ cores
    • 32GB+ RAM
    • High-performance SSD with at least 1TB of free space
    • 25+ MBit/sec download Internet service
  • Node:the Morph consensus layer embedded tendermint which needs to meet the tendermint hardware requirements.

tip

According to limitations of the current geth implementation, we only support archive mode for launching a Geth. So the storage size of Geth will constantly increase along with blocks produced.

Build executable binary​

Clone morph​

mkdir -p ~/.morph 
cd ~/.morph
git clone https://github.com/morph-l2/morph.git

Next, you need to check out a release version. You can find the available release versions on the Morph Releases page. It is recommended to use the latest release version.

cd morph
git checkout ${RELEASE_VERSION}

Build Geth​

Notice: You need C compiler to build geth

make geth

Build Node​

cd ~/.morph/morph/node 
make build

Config Preparation​

  1. Download the config files and make data dir
cd ~/.morph

## mainnet
wget https://raw.githubusercontent.com/morph-l2/run-morph-node/main/mainnet/data.zip

## testnet
wget https://raw.githubusercontent.com/morph-l2/run-morph-node/main/holesky/data.zip

unzip data.zip
  1. Create a shared secret with node
cd ~/.morph
openssl rand -hex 32 > jwt-secret.txt

Start Node​

Mainnet nodes support synchronization from either the genesis block or a snapshot block, while testnet nodes only support synchronization from snapshots.

Sync from snapshot(Recommended)​

You should build the binary and prepare the config files in the above steps first, then download the snapshot.

Download snapshot​

Download the latest snapshot corresponding to either the mainnet or testnet network.

A complete record of historical snapshots is available here. Below is an example of how to download a snapshot

## mainnet
wget -q --show-progress https://snapshot.morphl2.io/mainnet/${SNAPSHOT_NAME}.tar.gz
tar -xzvf ${SNAPSHOT_NAME}.tar.gz

## holesky
wget -q --show-progress https://snapshot.morphl2.io/holesky/${SNAPSHOT_NAME}.tar.gz
tar -xzvf ${SNAPSHOT_NAME}.tar.gz

Extracting snapshot data to the data directory your node points to

mv ${SNAPSHOT_NAME}/geth geth-data
mv ${SNAPSHOT_NAME}/data node-data

Start execution client​

Script for starting mainnet geth
./morph/go-ethereum/build/bin/geth --morph \
--datadir "./geth-data" \
--http --http.api=web3,debug,eth,txpool,net,engine \
--authrpc.addr localhost \
--authrpc.vhosts="localhost" \
--authrpc.port 8551 \
--authrpc.jwtsecret=./jwt-secret.txt \
--log.filename=./geth.log

note

For testnet, using --morph-holesky instead

tail -f geth.log to check if the Geth is running properly, or you can also execute the curl command below to check if you are connected to the peer.

curl -X POST -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' localhost:8545

{"jsonrpc":"2.0","id":74,"result":"0x6"}

Start consensus client​

 ./morph/node/build/bin/morphnode --home ./node-data \
--l2.jwt-secret ./jwt-secret.txt \
--l2.eth http://localhost:8545 \
--l2.engine http://localhost:8551 \
--log.filename ./node.log

tail -f node.log to check if the node is running properly, and you can also execute the command curl to check your node connection status.

curl http://localhost:26657/net_info

{
"jsonrpc": "2.0",
"id": -1,
"result": {
"listening": true,
"listeners": [
"Listener(@)"
],
"n_peers": "7",
"peers": [
{
"node_info": {
"protocol_version": {
"p2p": "8",
"block": "11",
"app": "0"
},
"id": "b4ac59de479b0251d441ca0385429bc21713a208",
"listen_addr": "tcp://0.0.0.0:26610",
"network": "chain-morph-mainnet",
"version": "0.37.0-alpha.1",
"channels": "402021222338606100",
"moniker": "morph-dataseed-node-0",
"other": {
"tx_index": "on",
"rpc_address": "tcp://0.0.0.0:26657"
}
},
"is_outbound": true,
.......

Check sync status​

curl http://localhost:26657/status to check the sync status of the node

{
"jsonrpc": "2.0",
"id": -1,
"result": {
"node_info": {
"protocol_version": {
"p2p": "8",
"block": "11",
"app": "0"
},
"id": "cde0d7cecfe9c82244c1dfa72c951759d02f1024",
"listen_addr": "tcp://0.0.0.0:26656",
"network": "chain-morph-mainnet",
"version": "0.37.0-alpha.1",
"channels": "402021222338606100",
"moniker": "my-morph-node",
"other": {
"tx_index": "on",
"rpc_address": "tcp://0.0.0.0:26657"
}
},
"sync_info": {
"latest_block_hash": "B4C0E514CD984B101FA89D7DB48C1FE18384F64C25E5565F618A5FE2851C42A9",
"latest_app_hash": "",
"latest_block_height": "2410",
"latest_block_time": "2024-10-21T08:49:09.952573291Z",
"earliest_block_hash": "0D66D908033DA7A3F5A95179B8D64261EDD887B944E59502A1C9EFBC1C9C4EF5",
"earliest_app_hash": "",
"earliest_block_height": "1",
"earliest_block_time": "2024-10-21T06:00:00Z",
"catching_up": false
},
"validator_info": {
"address": "B7395023EFF719D0EE15AD96FFC7F69B6B9E52EF",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "tZI+wTExwoKeyUFgdSSYmf4sAYp4BhJu13UgPy1wDOc="
},
"voting_power": "0"
}
}
}

The returned "catching_up" indicates whether the node is in sync or not. True means it is in sync.

The returned "latest_block_height" indicates the latest block height this node synced.

Sync from genesis block​

Start the execution client and consensus client directly without downloading snapshot.