From 22a17d2c97556346090ec9b40ab3e53e69f5391b Mon Sep 17 00:00:00 2001 From: aryansonid Date: Fri, 13 Mar 2026 13:04:39 +0530 Subject: [PATCH] feat: add testing md --- test/TEST_REWARDS.md | 221 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 test/TEST_REWARDS.md diff --git a/test/TEST_REWARDS.md b/test/TEST_REWARDS.md new file mode 100644 index 0000000000..998ac7a889 --- /dev/null +++ b/test/TEST_REWARDS.md @@ -0,0 +1,221 @@ +# Testing Whitelist Extra Rewards + +This guide shows you how to verify that whitelisted validators receive **double block rewards**. + +## Prerequisites + +You can test this in two ways: + +1. **Manual devnet setup (recommended for functional testing):** + Run two local `geth` processes (node1 + node2) with block production enabled. +2. **Docker setup (for structure / integration):** + Spin up two nodes via `docker-compose`. + +### Manual Devnet Setup (no Docker) + +These commands assume you are in a separate checkout of geth **v1.11.6** +in a directory like `~/Desktop/go-ethereum-v1.11`, and that you have a +`genesis.json` configured with the three accounts used in this test. + +#### 0. Clone and build geth v1.11.6 (one-time) + +```bash +cd ~/Desktop +git clone https://github.com/ethereum/go-ethereum.git go-ethereum-v1.11 +cd go-ethereum-v1.11 +git checkout v1.11.6 +make geth +``` + +#### 1. Start node1 (whitelisted validator) + +```bash +./build/bin/geth --datadir node1 init genesis.json + +./build/bin/geth --datadir node1 \ + --networkid 1234 --nodiscover \ + --http --http.addr 0.0.0.0 --http.port 8545 \ + --port 30303 \ + --http.api eth,net,web3,admin,miner \ + --mine --miner.threads 1 \ + --miner.etherbase 0xca6b49ee60cdd276ab503fbd6fb80a3cfbc06ffc +``` + +#### 2. Start node2 (non-whitelisted validator) + +```bash +./build/bin/geth --datadir node2 init genesis.json + +./build/bin/geth --datadir node2 \ + --networkid 1234 --nodiscover \ + --http --http.addr 0.0.0.0 --http.port 8546 \ + --port 30304 \ + --http.api eth,net,web3,admin,miner \ + --mine --miner.threads 1 \ + --miner.etherbase 0xab52b2c71f61cd9447a932c0cb55d1752571dab8 +``` + +#### 3. Verify blocks are being produced + +```bash +./build/bin/geth attach --exec "eth.blockNumber" http://localhost:8545 +``` + +The block number should increase over time. + +#### 4. (Optional) Connect the two nodes explicitly + +Get node1's enode: + +```bash +./build/bin/geth attach --exec "admin.nodeInfo.enode" http://localhost:8545 +``` + +Then on node2: + +```bash +./build/bin/geth attach --exec "admin.addPeer('ENODE_HERE')" http://localhost:8546 +``` + +Verify from node1: + +```bash +./build/bin/geth attach --exec "admin.peers" http://localhost:8545 +``` + +Once blocks are moving, you can run the Go test scripts from this repo (see below). + +## Step-by-Step Testing + +### Step 1: Check Initial State + +First, let's see the current balances **before** whitelisting: + +```bash +# Run the test script (this will show balances and wait for blocks) +go run ./test/test_rewards/test_rewards.go +``` + +This will show: +- Current block number +- Miner1 (Node1) balance +- Miner2 (Node2) balance +- Then wait for 10 blocks and show the results + +**Expected before whitelisting**: Both miners should earn roughly the same per-block reward. + +### Step 2: Whitelist Node1's Miner + +Now, add Node1's miner address to the whitelist: + +```bash +go run ./test/whitelist_validator/whitelist_tx.go +``` + +You should see: +``` +Whitelisting transaction sent: 0x... +``` + +Wait for this transaction to be mined (check logs or wait ~15 seconds). + +### Step 3: Verify Extra Rewards + +Run the test script again: + +```bash +go run ./test/test_rewards/test_rewards.go +``` + +**Expected after whitelisting**: +- **Miner1 (whitelisted)** should earn **~2x** the reward per block +- **Miner2 (not whitelisted)** should earn normal reward +- The ratio should be approximately **2.0x** (or close to it) + +### Step 4: Manual Verification (Alternative Method) + +If you want to verify manually using `geth attach`: + +```bash +# Attach to node1 +docker exec -it geth-node1 geth attach http://localhost:8545 +``` + +In the JavaScript console: + +```javascript +// Miner addresses +var miner1 = "0x26357d0353bEA3f89B654b14ccdc610720753F5E"; // Node1 +var miner2 = "0xa6d864bb0D1F25EDD958c48E202F7a51b3E93424"; // Node2 + +// Check current balances +web3.fromWei(eth.getBalance(miner1), "ether"); +web3.fromWei(eth.getBalance(miner2), "ether"); + +// Get current block number +eth.blockNumber; + +// Wait for 5-10 blocks, then check again +// Miner1 should have increased by ~2x more than Miner2 +``` + +### Step 5: Check Block Miners + +To see which node mined which blocks: + +```javascript +// Check last 10 blocks +for (var i = 0; i < 10; i++) { + var block = eth.getBlock(eth.blockNumber - i); + console.log("Block " + block.number + ": mined by " + block.miner); +} +``` + +## Expected Results + +### Before Whitelisting: +- Miner1 per-block reward: ~5 ETH (Frontier reward) +- Miner2 per-block reward: ~5 ETH (Frontier reward) +- Ratio: ~1.0x + +### After Whitelisting: +- Miner1 per-block reward: ~10 ETH (Frontier reward × 2) +- Miner2 per-block reward: ~5 ETH (Frontier reward) +- Ratio: ~2.0x ✅ + +## Troubleshooting + +### If Miner1 is not getting extra rewards: + +1. **Check if whitelist transaction was mined:** + ```bash + docker logs geth-node1 --tail 50 | grep -i "whitelist\|0x0100" + ``` + +2. **Verify the precompile is registered:** + - Check `core/vm/contracts.go` - should have whitelist precompile at `0x0100` + +3. **Check consensus code:** + - Verify `consensus/ethash/consensus.go` has the whitelist check in `accumulateRewards` + +4. **Rebuild Docker images:** + ```bash + docker compose build --no-cache + docker compose down + docker compose up -d + ``` + +### If both miners get the same reward: + +- Make sure you ran `go run ./test/whitelist_validator/whitelist_tx.go` **after** starting the nodes +- Check that the transaction was successfully mined (look for the tx hash in logs) +- Verify Node1 is actually mining blocks (check `docker logs geth-node1`) + +## Understanding the Reward Logic + +The extra reward logic is in `consensus/ethash/consensus.go`: + +1. During block creation, `accumulateRewards()` is called +2. It checks if the block's `coinbase` (miner) is whitelisted by calling the precompile at `0x0100` +3. If whitelisted, it adds **one extra block reward** on top of the normal reward +4. Result: **whitelisted miners get 2× the base block reward**