132 lines
2.9 KiB
Markdown
132 lines
2.9 KiB
Markdown
|
|
# Gas Optimization Documentation
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document describes gas optimization strategies and recommendations for the trustless bridge contracts.
|
||
|
|
|
||
|
|
## Current Gas Usage
|
||
|
|
|
||
|
|
### Hot Paths
|
||
|
|
|
||
|
|
1. **submitClaim()**: ~150k-200k gas
|
||
|
|
2. **challengeClaim()**: ~200k-300k gas
|
||
|
|
3. **finalizeClaim()**: ~50k-100k gas
|
||
|
|
4. **releaseToRecipient()**: ~100k-150k gas
|
||
|
|
|
||
|
|
## Optimization Strategies
|
||
|
|
|
||
|
|
### 1. Storage Optimization
|
||
|
|
|
||
|
|
**Current**: Structs may not be optimally packed
|
||
|
|
|
||
|
|
**Recommendation**: Pack structs efficiently
|
||
|
|
```solidity
|
||
|
|
// Before
|
||
|
|
struct Claim {
|
||
|
|
uint256 depositId; // 32 bytes
|
||
|
|
address asset; // 20 bytes
|
||
|
|
uint256 amount; // 32 bytes
|
||
|
|
address recipient; // 20 bytes
|
||
|
|
uint256 challengeWindowEnd; // 32 bytes
|
||
|
|
bool finalized; // 1 byte
|
||
|
|
bool challenged; // 1 byte
|
||
|
|
}
|
||
|
|
// Total: ~150 bytes
|
||
|
|
|
||
|
|
// After (packed)
|
||
|
|
struct Claim {
|
||
|
|
uint256 depositId; // 32 bytes
|
||
|
|
address asset; // 20 bytes
|
||
|
|
address recipient; // 20 bytes
|
||
|
|
uint256 amount; // 32 bytes
|
||
|
|
uint256 challengeWindowEnd; // 32 bytes
|
||
|
|
bool finalized; // 1 byte
|
||
|
|
bool challenged; // 1 byte
|
||
|
|
}
|
||
|
|
// Packed: address + bool + bool in same slot
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Minimize SLOAD Operations
|
||
|
|
|
||
|
|
**Current**: Multiple storage reads
|
||
|
|
|
||
|
|
**Recommendation**: Cache storage values
|
||
|
|
```solidity
|
||
|
|
// Before
|
||
|
|
if (claims[depositId].finalized) revert();
|
||
|
|
if (claims[depositId].challenged) revert();
|
||
|
|
if (block.timestamp > claims[depositId].challengeWindowEnd) revert();
|
||
|
|
|
||
|
|
// After
|
||
|
|
Claim storage claim = claims[depositId];
|
||
|
|
if (claim.finalized) revert();
|
||
|
|
if (claim.challenged) revert();
|
||
|
|
if (block.timestamp > claim.challengeWindowEnd) revert();
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Batch Operations
|
||
|
|
|
||
|
|
**Current**: Individual operations
|
||
|
|
|
||
|
|
**Recommendation**: Implement batch functions
|
||
|
|
```solidity
|
||
|
|
function finalizeClaimsBatch(uint256[] calldata depositIds) external {
|
||
|
|
for (uint256 i = 0; i < depositIds.length; i++) {
|
||
|
|
finalizeClaim(depositIds[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Event Optimization
|
||
|
|
|
||
|
|
**Current**: Multiple events
|
||
|
|
|
||
|
|
**Recommendation**: Combine events where possible
|
||
|
|
```solidity
|
||
|
|
// Before
|
||
|
|
emit ClaimSubmitted(...);
|
||
|
|
emit BondPosted(...);
|
||
|
|
|
||
|
|
// After
|
||
|
|
emit ClaimSubmittedWithBond(...);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Gas Benchmarking
|
||
|
|
|
||
|
|
### Test Suite
|
||
|
|
|
||
|
|
Create `test/bridge/trustless/GasBenchmark.t.sol` to benchmark:
|
||
|
|
- Claim submission gas costs
|
||
|
|
- Challenge gas costs
|
||
|
|
- Finalization gas costs
|
||
|
|
- Release gas costs
|
||
|
|
|
||
|
|
### Target Gas Costs
|
||
|
|
|
||
|
|
- **submitClaim()**: < 150k gas
|
||
|
|
- **challengeClaim()**: < 250k gas
|
||
|
|
- **finalizeClaim()**: < 80k gas
|
||
|
|
- **releaseToRecipient()**: < 120k gas
|
||
|
|
|
||
|
|
## Implementation Priority
|
||
|
|
|
||
|
|
### High Priority
|
||
|
|
1. Storage packing
|
||
|
|
2. SLOAD minimization
|
||
|
|
3. Batch operations
|
||
|
|
|
||
|
|
### Medium Priority
|
||
|
|
4. Event optimization
|
||
|
|
5. Function inlining
|
||
|
|
6. Loop optimization
|
||
|
|
|
||
|
|
### Low Priority
|
||
|
|
7. Assembly optimizations
|
||
|
|
8. Custom errors (already implemented)
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- Contracts: `contracts/bridge/trustless/`
|
||
|
|
- Test Suite: `test/bridge/trustless/`
|
||
|
|
|