--- title: Morph Holesky Testnet Pre-launch Development Resources lang: en-US keywords: [morph,ethereum,rollup,layer2,validity proof,optimstic zk-rollup] description: Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimstic zk-rollup solution. Try it now! --- # Holesky Testnet: ## Network Configuration Before you start, ensure you are connected to the following networks: | Network Name | Morph Holesky Testnet | Holesky Testnet | | --- | --- | --- | | RPC URL | https://rpc-holesky.morphl2.io | https://ethereum-holesky-rpc.publicnode.com/ | | Chain ID | 2810 | 17000 | | Currency Symbol | ETH | ETH | | Block Explorer URL | https://explorer-holesky.morphl2.io/| https://holesky.etherscan.io/ | Websocket Connection: wss://rpc-holesky.morphl2.io:8443/ ## Testnet Bridge bridge-holesky.morphl2.io ## Contract Address ### Main Contract #### L1 Contract [Staking](https://holesky.etherscan.io/address/0x868dd5d1c268277e331b726bb438edde8221d389):0x868dd5d1c268277e331b726bb438edde8221d389 [Rollup](https://holesky.etherscan.io/address/0xd8c5c541d56f59d65cf775de928ccf4a47d4985c):0xd8c5c541d56f59d65cf775de928ccf4a47d4985c [L1MessageQueueWithGasPriceOracle](https://holesky.etherscan.io/address/0x778d1d9a4d8b6b9ade36d967a9ac19455ec3fd0b):0x778d1d9a4d8b6b9ade36d967a9ac19455ec3fd0b [L1CrossDomainMessenger](https://holesky.etherscan.io/address/0xecc966ab425f3f5bd58085ce4ebdbf81d829126f):0xecc966ab425f3f5bd58085ce4ebdbf81d829126f #### L2 Contract [L2ToL1MessagePasser](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000001):0x5300000000000000000000000000000000000001 [L2Sequencer](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000003):0x5300000000000000000000000000000000000003 [L2Gov](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000004):0x5300000000000000000000000000000000000004 [L2Submitter](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000005):0x5300000000000000000000000000000000000005 [L2CrossDomainMessenger](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000007):0x5300000000000000000000000000000000000007 ### Gateway #### L1 Gateway [L1GatewayRouter](https://holesky.etherscan.io/address/0xea593b730d745fb5fe01b6d20e6603915252c6bf):0xea593b730d745fb5fe01b6d20e6603915252c6bf [L1ETHGateway](https://holesky.etherscan.io/address/0xcc3d455481967dc97346ef1771a112d7a14c8f12):0xcc3d455481967dc97346ef1771a112d7a14c8f12 [L1WETHGateway](https://holesky.etherscan.io/address/0xbbdb317b50313d96823eba0fc2c1d9e469dc1906):0xbbdb317b50313d96823eba0fc2c1d9e469dc1906 [L1StandardERC20Gateway](https://holesky.etherscan.io/address/0xb26dafdb434ae93e3b8efde4f0193934955d86cd):0xb26dafdb434ae93e3b8efde4f0193934955d86cd #### L2 Gateway [L2GatewayRouter](https://explorer-holesky.morphl2.io/address/https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000002):0x5300000000000000000000000000000000000002 [L2StandardERC20Gateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000008):0x5300000000000000000000000000000000000008 [L2ERC721Gateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000009):0x5300000000000000000000000000000000000009 [L2ERC1155Gateway](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000C):0x530000000000000000000000000000000000000C [L2WETHGateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000010):0x5300000000000000000000000000000000000010 [L2ETHGateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000006):0x5300000000000000000000000000000000000006 ### Other Layer 2 Predeploys [L2TxFeeVault](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000A):0x530000000000000000000000000000000000000A [ProxyAdmin](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000B):0x530000000000000000000000000000000000000B [MorphStandardERC20](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000D):0x530000000000000000000000000000000000000D [MorphStandardERC20Factory](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000E):0x530000000000000000000000000000000000000E [GasPriceOracle](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000F):0x530000000000000000000000000000000000000F [L2WETH](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000011):0x5300000000000000000000000000000000000011 ## Node Deployment ## Run a Morph Node This guide describes the approach to starting up a morph node. We create the folder `~/.morph` as our home directory for the following example. ### Hardware requirements Running the morph node requires 2 processes to be started, which are `geth` and `node`. `Geth` is the Morph execution layer which needs to meet the [go-ethereum hardware requirements](https://github.com/ethereum/go-ethereum#hardware-requirements), but with less storage, 500GB is enough so far. `Node` is the Morph consensus layer embedded tendermint which needs to meet the [tendermint hardware requirements](https://docs.tendermint.com/v0.34/tendermint-core/running-in-production.html#processor-and-memory). 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 ``` Currently, we use tag v0.1.0-beta as our beta version. ``` cd morph git checkout v0.1.0-beta ``` #### Build Geth ``` make nccc_geth ``` #### Build Node ``` cd ~/.morph/morph/node make build ``` ### Sync from genesis block #### Config Preparation Download the config files and make data dir ``` cd ~/.morph wget https://raw.githubusercontent.com/morph-l2/config-template/main/holesky/data.zip unzip data.zip ``` Create a shared secret with node ``` cd ~/.morph openssl rand -hex 32 > jwt-secret.txt ``` #### Script to start the process *Geth* ``` ./morph/go-ethereum/build/bin/geth --morph-holesky \ --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 \ --miner.gasprice="100000000" \ --log.filename=./geth.log ``` *tail -f geth.log* to check if the Geth is running properly, or you can also exeucte the below curl command 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":"0x3"} ``` *Node* ``` ./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": "3", "peers": [ { "node_info": { "protocol_version": { "p2p": "8", "block": "11", "app": "0" }, "id": "0fb5ce425197a462a66de015ee5fbbf103835b8a", "listen_addr": "tcp://0.0.0.0:26656", "network": "chain-morph-holesky", "version": "0.37.0-alpha.1", "channels": "4020212223386061", "moniker": "morph-dataseed-node-1", "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": "b3f34dc2ce9c4fee5449426992941aee1e09670f", "listen_addr": "tcp://0.0.0.0:26656", "network": "chain-morph-holesky", "version": "0.37.0-alpha.1", "channels": "4020212223386061", "moniker": "my-morph-node", "other": { "tx_index": "on", "rpc_address": "tcp://0.0.0.0:26657" } }, "sync_info": { "latest_block_hash": "71024385DDBEB7B554DB11FD2AE097ECBD99B2AF826C11B2A74F7172F2DEE5D2", "latest_app_hash": "", "latest_block_height": "2992", "latest_block_time": "2024-04-25T13:48:27.647889852Z", "earliest_block_hash": "C7A73D3907C6CA34B9DFA043FC6D4529A8EAEC8F059E100055653E46E63F6F8E", "earliest_app_hash": "", "earliest_block_height": "1", "earliest_block_time": "2024-04-25T09:06:30Z", "catching_up": false }, "validator_info": { "address": "5FB3D3734640792F14B70E7A53FBBD39DB9787A8", "pub_key": { "type": "tendermint/PubKeyEd25519", "value": "rzN67ZJWsaLSGGpNj7HOWs8nrL5kr1n+w0OckWUCetw=" }, "voting_power": "0" } } } ``` The returned "catching_up" indicates whether the node is in sync or not. True means it is in sync. Meanwhile, the returned latest_block_height indicates the latest block height this node synced.