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)
rpcdaemonandintegrationbinaries built (make rpcdaemon integration)
How It Works
The CI workflow:
- Backs up chaindata from the reference datadir
- Runs
integration run_migrationsto apply pending migrations - Starts
rpcdaemon --datadir <reference-datadir> - Runs
run_rpc_tests.shwhich cloneserigontech/rpc-tests, sets up a Python venv, and runsrun_tests.pyagainst 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
# Point to your synced mainnet Erigon node
export ERIGON_REFERENCE_DATA_DIR=/path/to/your/erigon/mainnet-datadir
# Optional: workspace for test output
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=$!
# Wait for port 8545
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
# Restore original chaindata
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
# Run just one test
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:
# Show which tests failed
grep "FAILED\|PASS\|SKIP" /tmp/rpc-results/output.log | grep FAIL
# Re-run just the failing API group
cd /tmp/rpc-tests/integration
python3 run_tests.py --blockchain mainnet --port 8545 \
--include-api-list eth_getBlockByNumber \
--display-only-fail --json-diff
# Run with full response dump to see what rpcdaemon returned
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_DIRto 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.