| name | erigon-test-rpc |
| description | Run QA RPC Integration Tests locally against a synced Erigon datadir, or dispatch them remotely via GitHub Actions. Tests compare rpcdaemon JSON-RPC responses against expected results from erigontech/rpc-tests. |
QA RPC Integration Tests
Tests that run rpcdaemon against a pre-synced Erigon datadir and compare JSON-RPC responses against golden expected outputs from the erigontech/rpc-tests repository.
Prerequisites
- A synced Erigon mainnet datadir (the tests need specific blocks to exist — tests at block ~24.3M require sync to at least that height)
- Python 3 (for the rpc-tests runner)
rpcdaemon and integration binaries built (make rpcdaemon integration)
How It Works
The CI workflow:
- Backs up chaindata from the reference datadir
- Runs
integration run_migrations to apply pending migrations
- Starts
rpcdaemon --datadir <reference-datadir>
- Runs
run_rpc_tests.sh which clones erigontech/rpc-tests, sets up a Python venv, and runs run_tests.py against port 8545
- Restores original chaindata from backup
The backup/restore pattern exists because run_migrations writes to the DB.
Local Setup
Step 1: Set your reference datadir
export ERIGON_REFERENCE_DATA_DIR=/path/to/your/erigon/mainnet-datadir
export WORKSPACE=/tmp/rpc-test-run
mkdir -p $WORKSPACE
Step 2: Back up chaindata (protects your DB from migration writes)
cp -r $ERIGON_REFERENCE_DATA_DIR/chaindata /tmp/chaindata-backup
Step 3: Build binaries
make rpcdaemon integration
Step 4: Run migrations
./build/bin/integration run_migrations --datadir $ERIGON_REFERENCE_DATA_DIR --chain mainnet
Step 5: Start rpcdaemon
./build/bin/rpcdaemon --datadir $ERIGON_REFERENCE_DATA_DIR \
--http.api admin,debug,eth,parity,erigon,trace,web3,txpool,ots,net \
--ws > /tmp/rpcdaemon.log 2>&1 &
RPC_DAEMON_PID=$!
for i in {1..30}; do
nc -z localhost 8545 && break || sleep 5
done
Step 6: Run the tests
.github/workflows/scripts/run_rpc_tests_ethereum.sh $WORKSPACE /tmp/rpc-results
echo "Exit: $?"
Step 7: Stop and restore
kill $RPC_DAEMON_PID
rm -rf $ERIGON_REFERENCE_DATA_DIR/chaindata
mv /tmp/chaindata-backup $ERIGON_REFERENCE_DATA_DIR/chaindata
Run a Single Test Manually
Clone rpc-tests and run one test directly:
git clone --depth 1 --branch v1.121.0 https://github.com/erigontech/rpc-tests /tmp/rpc-tests
cd /tmp/rpc-tests
python3 -m venv .venv && source .venv/bin/activate
pip3 install -r requirements.txt
cd integration
python3 run_tests.py --blockchain mainnet --port 8545 \
--include-api-list eth_getBlockByNumber/test_1.json \
--display-only-fail --json-diff
When Tests Fail — Drill Down
The runner outputs diffs for failing tests. Each test is a .json file in the integration/<chain>/ directory of rpc-tests. To investigate:
grep "FAILED\|PASS\|SKIP" /tmp/rpc-results/output.log | grep FAIL
cd /tmp/rpc-tests/integration
python3 run_tests.py --blockchain mainnet --port 8545 \
--include-api-list eth_getBlockByNumber \
--display-only-fail --json-diff
python3 run_tests.py --blockchain mainnet --port 8545 \
--include-api-list eth_getBlockByNumber/test_1.json \
--dump-response
Disabled Tests
Some tests are intentionally disabled in the CI run (see run_rpc_tests_ethereum.sh). These include:
- Engine API tests (require active Erigon engine, not just rpcdaemon)
- Tests requiring specific peer state (
net_peerCount, admin_peers, etc.)
- Known-broken tests with open issues
CI Equivalents
| Variant | CI workflow | File |
|---|
| Mainnet | QA - RPC Integration Tests | qa-rpc-integration-tests.yml |
| Latest blocks | QA - RPC Integration Tests Remote | qa-rpc-integration-tests-remote.yml |
| Gnosis | QA - RPC Integration Tests (Gnosis) | qa-rpc-integration-tests-gnosis.yml |
Remote dispatch:
gh workflow run "QA - RPC Integration Tests" --ref <branch>
gh workflow run "QA - RPC Integration Tests Remote" --ref <branch>
gh workflow run "QA - RPC Integration Tests (Gnosis)" --ref <branch>
TODO: Reference Datadir Setup
The CI runner maintains a pre-synced mainnet datadir at /opt/erigon-versions/reference-version/datadir. To create a local equivalent:
- Sync Erigon mainnet to at least block ~24.5M (covers all test cases)
- Stop the node cleanly
- Set
ERIGON_REFERENCE_DATA_DIR to that datadir
- Follow the workflow above
A full mainnet sync takes ~2-4 days on NVMe with --prune.mode=minimal. Alternatively, ask the team for a snapshot of the reference datadir.