nimbus-eth1/hive_integration
Jacek Sieka f6be4bd0ec
avoid initTable (#2328)
`initTable` is obsolete since nim 0.19 and can introduce significant
memory overhead while providing no benefit (since the table will be
grown to the default initial size on first use anyway).

In particular, aristo layers will not necessarily use all tables they
initialize, for exampe when many empty accounts are being created.
2024-06-10 11:05:30 +02:00
..
nimbus Use admin prefix for nodeInfo and addPeer JSON-RPCs (#1799) 2023-10-03 14:44:08 +02:00
nodocker avoid initTable (#2328) 2024-06-10 11:05:30 +02:00
README.md chore: fix typos (#2103) 2024-03-25 09:14:47 +01:00
docker-shell collected wisdom after working with hive/docker (#669) 2021-05-18 16:38:35 +01:00

README.md

Integration between nimbus-eth1 and Ethereum Hive test environment

This is a short manual to help you quickly setup and run Hive. For more detailed information please read the hive documentation.

Prerequisities

  • A Linux machine. Trust me, it does not work on Windows or MacOS.
  • Or Linux inside a VM (e.g. VirtualBox) on Windows or MacOS.
  • Docker installed and working in your Linux.
  • Go compiler installed in your Linux.
  • Go must be version 1.16 or later.

Practicalities

Practically, if using an Ubuntu Linux and you want to use the version of Go shipped with Ubuntu, you will need Ubuntu 21.04 or later. It's enough to run apt-get install golang.

If using Ubuntu 20.04 LTS (likely because it's the long-term stable version), the shipped Go isn't recent enough, and there will be build errors. You can either install a non-Ubuntu packaged version of Go (maybe from golang.org, or use a more recent Ubuntu.

If you want to run Hive in a Linux container, you will need Docker to work in the container because Hive calls Docker (a lot!). This is sometimes called "Docker in Docker". Inside LXD containers, Docker doesn't work by default, but usually this is remedied by setting the container flag lxc config set $CONTAINER_NAME security.nesting true, which takes effect immediately.

Building hive

First you will need a working Go installation, Go 1.16 or later. Then:

git clone https://github.com/ethereum/hive
cd ./hive
go build .

How to run hive

First copy the nimbus-eth1/hive_intgration/nimbus folder (from this repo) into the hive/clients folder (in the hive repo).

Then run this command:

./hive --sim <simulation> --client <client(s) you want to test against>

Examples:

./hive --sim ethereum/consensus --client nimbus

or

./hive --sim devp2p/discv4 --client go-ethereum,openethereum,nimbus

Available test suites / simulators

  • devp2p/eth -> require at least 2 clients
  • devp2p/discv4
  • devp2p/snap
  • ethereum/sync
  • ethereum/consensus
  • ethereum/rpc
  • ethereum/graphql
  • ethereum/engine
  • smoke/network
  • smoke/genesis
  • smoke/clique

The number of passes and fails output at the time of writing (2022-11-18) is:

ethereum/consensus:  48682 pass,     0 fail, 48682 total London
ethereum/graphql:       39 pass,     7 fail,    46 total
devp2p/discv4:          14 pass,     0 fail,    14 total
devp2p/eth:             16 pass,     0 fail,    16 total
devp2p/snap              0 pass,     5 fail,     5 total
ethereum/rpc:           15 pass,    26 fail,    41 total
ethereum/sync:           3 pass,     3 fail,     6 total
ethereum/engine:        73 pass,   111 fail,   184 total
smoke/genesis:           3 pass,     0 fail,     3 total
smoke/network:           1 pass,     0 fail,     1 total
smoke/clique:            1 pass,     0 fail,     1 total

Nim simulators without docker

We have rewrite some of the hive simulators in Nim to aid debugging. It is assumed you already install nimbus dependencies via nimble. In the future, we will provide more instructions how to run these simulators using local dependencies.

On Windows you might need to add -d:disable_libbacktrace compiler switch. Working directory is nimbus-eth1 root directory. And you can see the result in a markdown file with the same name with the simulator.

  • ethereum/consensus

    nim c -r -d:release hive_integration/nodocker/consensus/consensus_sim
    

    Note that this program expects the ./tests directory accessible. So if you compile from the hive_integration/nodocker directory on a Posix system, the ./tests directory would be a symlink to ../../tests.

  • ethereum/graphql

    nim c -r -d:release hive_integration/nodocker/graphql/graphql_sim
    

    Similar to above, the directory ./hive_integration is expected.

  • ethereum/engine

    nim c -r -d:release hive_integration/nodocker/engine/engine_sim
    
  • ethereum/rpc

    nim c -r -d:release hive_integration/nodocker/rpc/rpc_sim
    

Observations when working with hive/docker

DNS problems with hive simulation container running alpine OS

  • Problem:
    hive bails out with error when compiling docker compile because it cannot resolve some domain name like github.com. It occured with a locally running DNS resolver (as opposed to a proxy type resolver.)

  • Solution:

    • First solution (may be undesirable): Change local nameserver entry in /etc/resolv.conf to something like

         nameserver 8.8.8.8
      

      Note that docker always copies the host's /etc/resolv.conf to the container one before it executes a RUN directive.

    • Second solution (tedious): In the Dockerfile, prefix all affected RUN directives with the text:

         echo nameserver 8.8.8.8 > /etc/resolv.conf;
      

Peek into nimbus container before it finalises

  • In the nimbus Dockerfile before ENTRYPOINT, add the directive

         RUN mknod /tmp/wait-for-stop p;cat /tmp/wait-for-stop
    
  • (Re-)Build the container with the command:

         ./hive --docker.output ...
    
  • When the building process hangs at the

          RUN mknod ...
    

    directive, then use the ./docker-shell script to enter the running top docker container

  • Useful commands after entering the nimbus container

         apt update
         apt install iproute2 procps vim openssh-client strace
    
  • Resume hive installation & processing:
    In the nimbus container run

         echo > /tmp/wait-for-stop