# RPC Transaction Failure - Root Cause Identified

**Date**: 2026-01-27  
**Status**: ✅ **ROOT CAUSE FOUND**

---

## 🔍 Root Cause

**Error Message**: 
```
The method eth_sendTransaction is not supported. 
Use eth_sendRawTransaction to send a signed transaction to Besu.
```

### Problem

All Besu RPC nodes are **rejecting transactions** because:

1. **`eth_sendTransaction` is NOT supported** by Besu
2. Clients are trying to send **unsigned transactions**
3. Besu requires **pre-signed transactions** using `eth_sendRawTransaction`
4. Transactions are rejected **before getting a hash** (no hash = rejection at RPC level)

---

## ✅ Configuration Status

All RPC nodes are correctly configured:
- ✅ Account permissioning: **DISABLED** (not blocking)
- ✅ Minimum gas price: **Not configured** (not blocking)
- ✅ RPC responding: **All nodes operational**
- ✅ Network synchronized: **All nodes synced**

**The issue is NOT configuration - it's the transaction method being used.**

---

## 🔧 Solution

### For Clients/Applications

**❌ Don't use:**
```javascript
// This will FAIL - eth_sendTransaction not supported
web3.eth.sendTransaction({
    from: '0x...',
    to: '0x...',
    value: '1000000000000000000'
})
```

**✅ Use instead:**
```javascript
// Sign transaction first, then send raw
const tx = {
    from: '0x...',
    to: '0x...',
    value: '1000000000000000000',
    gas: 21000,
    gasPrice: '1000000000',
    nonce: await web3.eth.getTransactionCount('0x...')
}

// Sign the transaction
const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey)

// Send the signed transaction
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction)
```

### Using ethers.js

```javascript
// ethers.js automatically signs transactions
const tx = await wallet.sendTransaction({
    to: '0x...',
    value: ethers.utils.parseEther('1.0')
})
// This works because ethers signs before sending
```

### Using web3.js

```javascript
// web3.js requires explicit signing
const account = web3.eth.accounts.privateKeyToAccount('0x...')
const tx = {
    from: account.address,
    to: '0x...',
    value: web3.utils.toWei('1', 'ether'),
    gas: 21000,
    gasPrice: web3.utils.toWei('1', 'gwei'),
    nonce: await web3.eth.getTransactionCount(account.address)
}

const signedTx = await account.signTransaction(tx)
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction)
```

---

## 📋 Affected RPC Nodes

All RPC nodes have this behavior (this is **expected Besu behavior**):

| VMID | IP Address | Hostname | Status |
|------|------------|----------|--------|
| 2400 | 192.168.11.240 | thirdweb-rpc-1 | ✅ Operational |
| 2401 | 192.168.11.241 | thirdweb-rpc-2 | ✅ Operational |
| 2402 | 192.168.11.242 | thirdweb-rpc-3 | ✅ Operational |
| 2500 | 192.168.11.250 | besu-rpc-1 | ✅ Operational |
| 2501 | 192.168.11.251 | besu-rpc-2 | ✅ Operational |
| 2502 | 192.168.11.252 | besu-rpc-3 | ✅ Operational |
| 2505 | 192.168.11.201 | besu-rpc-luis-0x8a | ✅ Operational |
| 2506 | 192.168.11.202 | besu-rpc-luis-0x1 | ✅ Operational |
| 2507 | 192.168.11.203 | besu-rpc-putu-0x8a | ✅ Operational |
| 2508 | 192.168.11.204 | besu-rpc-putu-0x1 | ✅ Operational |

---

## 🔍 Why This Happens

### Besu Security Model

Besu **does not support** `eth_sendTransaction` because:
1. **Security**: Prevents accidental exposure of private keys
2. **Best Practice**: Requires explicit transaction signing
3. **Compliance**: Aligns with enterprise security requirements
4. **No Unlocked Accounts**: Besu doesn't support account unlocking

### Comparison with Other Clients

| Client | eth_sendTransaction | eth_sendRawTransaction |
|--------|-------------------|----------------------|
| **Geth** | ✅ Supported (with unlocked accounts) | ✅ Supported |
| **Besu** | ❌ **NOT Supported** | ✅ **Required** |
| **Erigon** | ✅ Supported (with unlocked accounts) | ✅ Supported |

---

## ✅ Verification

Test that `eth_sendRawTransaction` works:

```bash
# 1. Create and sign a transaction (using your client)
# 2. Send the signed transaction
curl -X POST http://192.168.11.250:8545 \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "method": "eth_sendRawTransaction",
    "params": ["0x<signed_transaction_hex>"],
    "id": 1
  }'
```

**Expected Response:**
```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x<transaction_hash>"
}
```

---

## 📝 Summary

**Issue**: Simple transfers failing without getting a hash  
**Root Cause**: Clients using `eth_sendTransaction` which Besu doesn't support  
**Solution**: Use `eth_sendRawTransaction` with pre-signed transactions  
**Status**: ✅ **Not a bug - expected Besu behavior**

---

## 🛠️ Next Steps

1. **Update client code** to use `eth_sendRawTransaction`
2. **Sign transactions** before sending to RPC
3. **Test with signed transactions** to verify fix
4. **Document** this requirement for all clients

---

**Last Updated**: 2026-01-27  
**Status**: ✅ **ROOT CAUSE IDENTIFIED - NOT A CONFIGURATION ISSUE**
