162 lines
5.0 KiB
Markdown
162 lines
5.0 KiB
Markdown
# Transaction Failure Analysis - ChainID 138
|
|
|
|
**Date**: 2025-01-12
|
|
**Transaction**: `0x4dc9f5eedf580c2b37457916b04048481aba19cf3c1a106ea1ee9eefa0dc03c8`
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
**Status**: ❌ **Transaction FAILED** (status 0x0)
|
|
**Gas Used**: 10,000,000 (ALL available gas consumed)
|
|
**Contract Address**: `0x9a1d0dbee997929ed02fd19e0e199704d20914db` (assigned but contract not deployed)
|
|
|
|
**Key Finding**: Contract address was assigned, indicating CREATE opcode executed, but deployment failed during constructor execution.
|
|
|
|
---
|
|
|
|
## Transaction Details
|
|
|
|
### Receipt Information
|
|
- **Block Number**: 0x28467 (165,991)
|
|
- **Block Hash**: `0x0d9ff3e108d8e97ad33aedbdce084f999ed154f384d8f545f14dfcaecb2e5b5c`
|
|
- **Status**: `0x0` (FAILED)
|
|
- **Gas Used**: `0x989680` (10,000,000)
|
|
- **Gas Limit**: `0x989680` (10,000,000)
|
|
- **Gas Price**: `0x4a817c800` (20 gwei)
|
|
- **Contract Address**: `0x9a1d0dbee997929ed02fd19e0e199704d20914db`
|
|
- **Logs**: Empty array (no events emitted)
|
|
- **Transaction Index**: 0x0
|
|
|
|
### Transaction Information
|
|
- **From**: `0x4a666f96fc8764181194447a7dfdb7d471b301c8`
|
|
- **To**: `null` (contract creation)
|
|
- **Value**: `0x0`
|
|
- **Input**: Contract creation bytecode (~4.7KB)
|
|
- **Nonce**: 0x2d (45)
|
|
- **ChainID**: 0x8a (138)
|
|
|
|
---
|
|
|
|
## Critical Observations
|
|
|
|
### 1. Contract Address Was Assigned ✅
|
|
- **Address**: `0x9a1d0dbee997929ed02fd19e0e199704d20914db`
|
|
- **Implication**: CREATE opcode executed successfully
|
|
- **Meaning**: Network allows contract creation at the opcode level
|
|
|
|
### 2. All Gas Was Consumed ❌
|
|
- **Gas Limit**: 10,000,000
|
|
- **Gas Used**: 10,000,000
|
|
- **Implication**: Transaction ran out of gas during execution
|
|
- **Note**: This is unusual for a standard ERC20 contract
|
|
|
|
### 3. No Logs Emitted ❌
|
|
- **Logs Array**: Empty
|
|
- **Implication**: Constructor didn't complete successfully
|
|
- **Meaning**: Failure occurred before any events could be emitted
|
|
|
|
### 4. DEBUG API Not Enabled ⚠️
|
|
- **Error**: "Method not enabled"
|
|
- **Implication**: Cannot get revert reason
|
|
- **Solution**: Enable DEBUG API in Besu configuration
|
|
|
|
---
|
|
|
|
## Possible Causes
|
|
|
|
### 1. Constructor Revert
|
|
- Constructor code may contain a revert condition
|
|
- Network state may cause constructor to fail
|
|
- Contract bytecode appears valid (standard ERC20)
|
|
|
|
### 2. Network-Level Restriction
|
|
- Network may restrict contract creation after CREATE opcode
|
|
- Validators may reject contract creation transactions
|
|
- Network policy may prevent certain contract deployments
|
|
|
|
### 3. Gas Limit Restriction
|
|
- Network may have effective gas limit lower than block limit
|
|
- Contract execution may require more gas than available
|
|
- 10M gas should be sufficient for standard ERC20
|
|
|
|
### 4. Contract Size Limit
|
|
- Bytecode is ~4.7KB (well under 24KB EIP-170 limit)
|
|
- Network may have stricter size limits
|
|
- Contract may exceed network-specific limits
|
|
|
|
### 5. Network State Issue
|
|
- Network state may be corrupted
|
|
- Validator consensus may reject contract creation
|
|
- Network configuration may prevent deployments
|
|
|
|
---
|
|
|
|
## Diagnostic Steps
|
|
|
|
### Step 1: Check Contract Code at Address
|
|
```bash
|
|
curl -X POST -H "Content-Type: application/json" \
|
|
--data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0x9a1d0dbee997929ed02fd19e0e199704d20914db","latest"],"id":1}' \
|
|
http://localhost:8545 | jq
|
|
```
|
|
|
|
**Expected**: Should return `0x` (empty) if contract doesn't exist, or bytecode if it does.
|
|
|
|
### Step 2: Enable DEBUG API
|
|
Edit `/etc/besu/config-rpc-core.toml`:
|
|
```toml
|
|
rpc-http-api=["ETH","NET","WEB3","TXPOOL","QBFT","ADMIN","DEBUG","TRACE"]
|
|
```
|
|
|
|
Restart Besu:
|
|
```bash
|
|
systemctl restart besu-rpc
|
|
```
|
|
|
|
Then get revert reason:
|
|
```bash
|
|
curl -X POST -H "Content-Type: application/json" \
|
|
--data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x4dc9f5eedf580c2b37457916b04048481aba19cf3c1a106ea1ee9eefa0dc03c8",{"tracer":"callTracer"}],"id":1}' \
|
|
http://localhost:8545 | jq
|
|
```
|
|
|
|
### Step 3: Check Block Details
|
|
```bash
|
|
curl -X POST -H "Content-Type: application/json" \
|
|
--data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x28467",true],"id":1}' \
|
|
http://localhost:8545 | jq
|
|
```
|
|
|
|
### Step 4: Try Higher Gas Limit
|
|
If possible, try deploying with higher gas limit (15M or 20M) to see if it's a gas issue.
|
|
|
|
---
|
|
|
|
## Recommendations
|
|
|
|
1. **Enable DEBUG API** to get revert reason
|
|
2. **Check contract code** at assigned address
|
|
3. **Verify network configuration** for contract creation restrictions
|
|
4. **Check validator logs** for rejection reasons
|
|
5. **Try deploying from validator node** (may have different permissions)
|
|
6. **Contact network administrators** with this analysis
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
The transaction failure is unusual because:
|
|
- Contract address was assigned (CREATE executed)
|
|
- All gas was consumed (suggests execution failure)
|
|
- No logs emitted (constructor didn't complete)
|
|
|
|
This pattern suggests a network-level restriction or validator-level rejection that occurs **after** the CREATE opcode executes but **during** constructor execution.
|
|
|
|
**Next Step**: Enable DEBUG API to get the exact revert reason.
|
|
|
|
---
|
|
|
|
**Last Updated**: 2025-01-12
|
|
|