feat: add testing md

This commit is contained in:
aryansonid 2026-03-13 13:04:39 +05:30
parent 5d1a25e93b
commit 22a17d2c97

221
test/TEST_REWARDS.md Normal file
View file

@ -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**