Run Testnet 2/UNIT1 node

Dedicated node

Testnet 2, or UNIT1, is the second testnet network. To set up a dedicated node for this network, follow the testnet setup instructions with the following changes:

  • Use the following genesis.json file:

    {
      "alloc": {
        "0x0000000000000000000000000000000000006a7e": {
          "code": "0x60806040526004361061006e575f3560e01c806396f396c31161004c57806396f396c3146100e3578063c4a4326d14610105578063e984df0e1461011d578063fccc281314610131575f80fd5b806339dd5d1b146100725780637157405a146100b957806378338413146100ce575b5f80fd5b34801561007d575f80fd5b506100a161008c36600461059e565b5f6020819052908152604090205461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156100c4575f80fd5b506100a161040081565b6100e16100dc3660046105b5565b61015c565b005b3480156100ee575f80fd5b506100f761044e565b6040519081526020016100b0565b348015610110575f80fd5b506100f76402540be40081565b348015610128575f80fd5b506100f7610468565b34801561013c575f80fd5b506101445f81565b6040516001600160a01b0390911681526020016100b0565b61016c6402540be40060016105fc565b34101561017834610478565b61019061018b6402540be40060016105fc565b610478565b6040516020016101a1929190610630565b604051602081830303815290604052906101d75760405162461bcd60e51b81526004016101ce9190610688565b60405180910390fd5b506101ef6402540be400677fffffffffffffff6105fc565b3411156101fb34610478565b61021561018b6402540be400677fffffffffffffff6105fc565b6040516020016102269291906106bd565b604051602081830303815290604052906102535760405162461bcd60e51b81526004016101ce9190610688565b50435f8181526020819052604090205461ffff166104009081119061027790610478565b604051602001610287919061070c565b604051602081830303815290604052906102b45760405162461bcd60e51b81526004016101ce9190610688565b505f818152602081905260408120805461ffff16916102d283610786565b91906101000a81548161ffff021916908361ffff160217905550505f6402540be400346102ff91906107a6565b9050346103116402540be400836105fc565b1461031b34610478565b6103296402540be400610478565b60405160200161033a9291906107c5565b604051602081830303815290604052906103675760405162461bcd60e51b81526004016101ce9190610688565b506040515f90819034908281818185825af1925050503d805f81146103a7576040519150601f19603f3d011682016040523d82523d5f602084013e6103ac565b606091505b50509050806103fd5760405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420746f206275726e2061646472657373000060448201526064016101ce565b604080516bffffffffffffffffffffffff1986168152600784900b60208201527ffeadaf04de8d7c2594453835b9a93b747e20e7a09a7fdb9280579a6dbaf131a8910160405180910390a150505050565b6104656402540be400677fffffffffffffff6105fc565b81565b6104656402540be40060016105fc565b6060815f0361049e5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156104c757806104b181610814565b91506104c09050600a836107a6565b91506104a1565b5f8167ffffffffffffffff8111156104e1576104e161082c565b6040519080825280601f01601f19166020018201604052801561050b576020820181803683370190505b509050815b851561059557610521600182610840565b90505f61052f600a886107a6565b61053a90600a6105fc565b6105449088610840565b61054f906030610853565b90505f8160f81b90508084848151811061056b5761056b61086c565b60200101906001600160f81b03191690815f1a90535061058c600a896107a6565b97505050610510565b50949350505050565b5f602082840312156105ae575f80fd5b5035919050565b5f602082840312156105c5575f80fd5b81356bffffffffffffffffffffffff19811681146105e1575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610613576106136105e8565b92915050565b5f81518060208401855e5f93019283525090919050565b6a029b2b73a103b30b63ab2960ad1b81525f61064f600b830185610619565b7f206d7573742062652067726561746572206f7220657175616c20746f20000000815261067f601d820185610619565b95945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6a029b2b73a103b30b63ab2960ad1b81525f6106dc600b830185610619565b7f206d757374206265206c657373206f7220657175616c20746f20000000000000815261067f601a820185610619565b7f4d6178207472616e7366657273206c696d6974206f662000000000000000000081525f61073d6017830184610619565b7f207265616368656420696e207468697320626c6f636b2e2054727920746f207381527232b732103a3930b739b332b9399030b3b0b4b760691b60208201526033019392505050565b5f61ffff821661ffff810361079d5761079d6105e8565b60010192915050565b5f826107c057634e487b7160e01b5f52601260045260245ffd5b500490565b6a029b2b73a103b30b63ab2960ad1b81525f6107e4600b830185610619565b7f206d7573742062652061206d756c7469706c65206f6620000000000000000000815261067f6017820185610619565b5f60018201610825576108256105e8565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b81810381811115610613576106136105e8565b60ff8181168382160190811115610613576106136105e8565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220106399f534da089226c14e2f183f8421d059a924c65c97d7e4f3e931c54fe1bb64736f6c634300081a0033",
          "balance": "0x0"
        }
      },
      "baseFeePerGas": "0x3b9aca00",
      "blobGasUsed": null,
      "coinbase": "0x0000000000000000000000000000000000000000",
      "config": {
        "chainId": 888171,
        "arrowGlacierBlock": 0,
        "berlinBlock": 0,
        "byzantiumBlock": 0,
        "cancunTime": 0,
        "constantinopleBlock": 0,
        "daoForkBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "ethash": {},
        "grayGlacierBlock": 0,
        "homesteadBlock": 0,
        "istanbulBlock": 0,
        "londonBlock": 0,
        "muirGlacierBlock": 0,
        "petersburgBlock": 0,
        "shanghaiTime": 0,
        "terminalTotalDifficulty": 0,
        "terminalTotalDifficultyPassed": true
      },
      "difficulty": "0x0",
      "excessBlobGas": null,
      "extraData": "0x",
      "gasLimit": "0x4c4b40",
      "gasUsed": "0x0",
      "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "nonce": "0x0",
      "number": "0x0",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x6707c1c0"
    }
    

    Ensure besu is running with the right genesis file by executing the following command on your host:

    curl -H 'content-type: application/json' -sd '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x0", false],"id":1}' 127.0.0.1:8545 | jq .result.hash

    The result must be 0x55650023cd3c23f18d88073486a6caf4d4436b81a401877eb07a5ce6ba6689c2.

  • Save the following list to static-nodes.json:

    [
      "enode://02af745f500a317e9f864e7b529e6797ebaf7eac8ecd4b68be8cc8f5f5615322cce74abb68d29ef837607c2df8cf2f51e6e389313301b789d13fbedcc7b9bbe7@95.31.7.226:31313",
      "enode://4c7bacdd8b0cf8486fef2205901a2332cccaedcce1fa12662b74b6c71fa663f067116cd19aa9ece5ad414d1e200fcd8d922108de579b7a4f35adacbf3b75228c@5.2.78.97:30304",
      "enode://a5202854470733aa13ec3d653948dc1b35c1a9a2c1db0ba4bf5325b01e750e8c9a392f3a7e51d6df157f37b457209e30d26fa6be0ca9805e5562c670fd4bb951@194.61.28.96:30304",
      "enode://b107600a91c65dcfc4a9e22e4770408b171f594b0d94f9a8ae2dfd0eed33c6039431641cf9121f57cc45ef349bc12f8ca481aa625924e5e16e4ef18da1bb9dbd@173.249.16.213:30304"
    ]
  • Use the following settings in waves.conf:

    waves {
      l2 {
        chain-contract-address = 3Mu7v4TAoTUQgpWaThQNFJo3Nx3BH6owhtf
        execution-client-address = "http://besu:8551"
        jwt-secret-file = /etc/secrets/jwtsecret
    
        network {
          port = 6850
          known-peers = [
            "testnet-l2-htz-hel1-1.wavesnodes.com:6850"
            "testnet-l2-htz-hel1-2.wavesnodes.com:6850"
            "testnet-htz-nbg1-1.wavesnodes.com:6850"
          ]
          declared-address = "<your server's IP address>:6850"   # Example: 11.22.33.44:6850
        }
        mining-enable = yes  
      }  
    }
  • In docker-compose.yml, change besu's --chain-id command line argument to 888171, and --target-gas-limit to 5000000.

  • Call join function on the 3Mu7v4TAoTUQgpWaThQNFJo3Nx3BH6owhtf contract.

Shared setup

A single waves node instance can run several consensus client instances, however a separate execution client instance is required for each network. This guide assumes you already have a testnet node instance set up as described in the guide.

  • Create besu.yml with the following contents:

    services:
      besu:
        container_name: besu
        image: hyperledger/besu:latest
        pull_policy: always
        stop_grace_period: 5m
        command:
          - --logging=ALL
          - --host-allowlist=*
          - --rpc-http-enabled
          - --rpc-http-api=ETH,NET,WEB3,TXPOOL,TRACE
          - --rpc-http-cors-origins=all
          - --rpc-ws-enabled
          - --discovery-enabled=true
          - --engine-rpc-enabled
          - --engine-jwt-secret=/etc/secrets/jwtsecret
          - --engine-host-allowlist=*
          - --node-private-key-file=/etc/secrets/p2p-key
          - --data-path=/var/lib/besu
          - --genesis-file=/etc/besu/genesis.json
          - --static-nodes-file=/etc/besu/static-nodes.json
          - --data-storage-format=BONSAI
        volumes:
          - ./data/secrets:/etc/secrets:ro
          - ./log4j2.xml:/etc/besu/log4j2.xml
        environment:
          - LOG4J_CONFIGURATION_FILE=/etc/besu/log4j2.xml
  • Edit docker-compose.yml:

    services:
      besu:
        container_name: besu
        extends:
          file: ./besu.yml
          service: besu
        environment:
          - BESU_NETWORK_ID=88817
          - BESU_TARGET_GAS_LIMIT=15000000
        volumes:
          - ./genesis.json:/etc/besu/genesis.json
          - ./data/besu:/var/lib/besu
          - ./logs/besu:/opt/besu/logs
          - ./static-nodes.json:/etc/besu/static-nodes.json
        ports:
          - '30303:30303/tcp'
          - '30303:30303/udp'
          - '127.0.0.1:8545:8545'
    
      besu-2:
        container_name: besu-2
        extends:
          file: ./besu.yml
          service: besu
        environment:
          - BESU_NETWORK_ID=888171
          - BESU_TARGET_GAS_LIMIT=5000000
        volumes:
          - ./genesis-2.json:/etc/besu/genesis.json
          - ./data/besu-2:/var/lib/besu
          - ./logs/besu-2:/opt/besu/logs
          - ./static-nodes-2.json:/etc/besu/static-nodes.json
        ports:
          - '30304:30303/tcp'
          - '30304:30303/udp'
          - '127.0.0.1:8546:8545'
    
      waves-node:
        container_name: waves-node
        image: ghcr.io/unitsnetwork/consensus-client:testnet-2
        ports:
          - "6850:6850"
          - "6865:6865"
          - "6868:6868"
          - "127.0.0.1:6869:6869"
        environment:
          - JAVA_OPTS=-Dwaves.config.directory=/etc/waves -Dlogback.file.level=TRACE
        volumes:
          - ./data/secrets:/etc/secrets:ro
          - ./data/waves:/var/lib/waves/data
          - ./waves.conf:/etc/waves/waves.conf:ro
          - ./logs/waves:/var/log/waves
    

    Note the new image for waves node: ghcr.io/unitsnetwork/consensus-client:testnet-2, and also an extra port for waves node: '6850:6850'.

  • Save the genesis config and static nodes list from the 'Dedicated node' section to genesis-2.json and static-nodes-2.json files, respectively.

  • Create data & log directories for the besu-2 container:

    mkdir -p data/besu-2 logs/besu-2
    chown 1000 data/besu-2 logs/besu-2
  • Edit waves.conf:

    waves {
      blockchain.type = TESTNET
      extensions = [
        units.ConsensusClient
      ]
    
      wallet {
        seed = <your-base58-encoded-seed>
        password = <some-string-as-password>
        file = null
      }
    
      network {
        port = 6868
        declared-address = "<your server's IP address>:6868"   # Example: 11.22.33.44:6868.
      }
    
      rest-api.bind-address = "0.0.0.0"
    }
    
    units {
      defaults.jwt-secret-file = /etc/secrets/jwtsecret
      chains = [{
        chain-contract = 3Msx4Aq69zWUKy4d1wyKnQ4ofzEDAfv5Ngf
        execution-client-address = "http://besu:8551"
        
        network {
          port = 6865
          known-peers = [
            "testnet-l2-htz-hel1-1.wavesnodes.com:6865"
            "testnet-l2-htz-hel1-2.wavesnodes.com:6865"
            "testnet-htz-nbg1-1.wavesnodes.com:6865"
          ]
          declared-address = "<your server's IP address>:6865"   # Example: 11.22.33.44:6865
        }
        mining-enable = yes
      },{
        chain-contract = 3Mu7v4TAoTUQgpWaThQNFJo3Nx3BH6owhtf
        execution-client-address = "http://besu-2:8551"
        
        network {
          port = 6850
          known-peers = [
            "testnet-l2-htz-hel1-1.wavesnodes.com:6850"
            "testnet-l2-htz-hel1-2.wavesnodes.com:6850"
            "testnet-htz-nbg1-1.wavesnodes.com:6850"
          ]
          declared-address = "<your server's IP address>:6850"   # Example: 11.22.33.44:6850
        }
        mining-enable = yes
      }]
    }

Last updated