Overflow Protection: Integer Safety
Arithmetic Safety: DERO includes explicit checks to prevent integer overflow attacks that could manipulate transaction fees or values. These checks are performed during proof verification before any transaction is accepted.
The Threat: Integer Overflow Attacks
What is Integer Overflow?
Integer overflow occurs when an arithmetic operation produces a value outside the range that can be represented by the data type. In blockchain contexts, this can be exploited to:
- Create tokens from nothing (if overflow wraps to positive)
- Bypass fee requirements (if fees overflow to small values)
- Manipulate transaction values (if sums overflow)
Example Attack Vector
Attacker's Goal: Pay minimal fees while appearing to pay maximum
uint64 max value: 18,446,744,073,709,551,615
If fees + extra_value overflows:
fees = 18,446,744,073,709,551,610
extra_value = 10
fees + extra_value = 18,446,744,073,709,551,620
= 4 (after overflow!) ← Attack succeeds!DERO's Protection Mechanism
The Overflow Check
Location: cryptography/crypto/proof_verify.go:108-110
total_open_value := s.Fees + extra_value
if total_open_value < s.Fees || total_open_value < extra_value { // stop over flowing attacks
return false
}How It Works
The Mathematical Principle
For unsigned integers, if a + b overflows:
a + b < a (always true after overflow)
a + b < b (always true after overflow)For valid (non-overflowing) addition:
a + b >= a (always true)
a + b >= b (always true)This property is exploited to detect overflow without needing arbitrary-precision arithmetic.
Verification: Step-by-Step
Normal Case (No Overflow)
fees := uint64(1000)
extra_value := uint64(500)
total_open_value := fees + extra_value // = 1500
// Check 1: Is 1500 < 1000? NO
// Check 2: Is 1500 < 500? NO
// Result: ✅ VALID - no overflowAttack Case (Overflow Detected)
fees := uint64(18446744073709551610)
extra_value := uint64(10)
total_open_value := fees + extra_value // = 4 (overflowed!)
// Check 1: Is 4 < 18446744073709551610? YES!
// Result: ❌ OVERFLOW DETECTED - transaction rejectedTest It Yourself
Go Verification Program
cat <<'EOF' > /tmp/overflow_test.go
package main
import (
"fmt"
)
func main() {
// Normal case
fees1 := uint64(1000)
extra1 := uint64(500)
total1 := fees1 + extra1
fmt.Println("=== Normal Case ===")
fmt.Printf("fees: %d, extra: %d, total: %d\n", fees1, extra1, total1)
fmt.Printf("total < fees? %v\n", total1 < fees1)
fmt.Printf("total < extra? %v\n", total1 < extra1)
fmt.Printf("Result: %s\n\n", checkOverflow(fees1, extra1))
// Overflow case
fees2 := uint64(18446744073709551610)
extra2 := uint64(10)
total2 := fees2 + extra2
fmt.Println("=== Overflow Attack Case ===")
fmt.Printf("fees: %d, extra: %d, total: %d\n", fees2, extra2, total2)
fmt.Printf("total < fees? %v\n", total2 < fees2)
fmt.Printf("total < extra? %v\n", total2 < extra2)
fmt.Printf("Result: %s\n", checkOverflow(fees2, extra2))
}
func checkOverflow(fees, extra uint64) string {
total := fees + extra
if total < fees || total < extra {
return "❌ OVERFLOW DETECTED - REJECTED"
}
return "✅ VALID - no overflow"
}
EOF
go run /tmp/overflow_test.goExpected Output:
=== Normal Case ===
fees: 1000, extra: 500, total: 1500
total < fees? false
total < extra? false
Result: ✅ VALID - no overflow
=== Overflow Attack Case ===
fees: 18446744073709551610, extra: 10, total: 4
total < fees? true
total < extra? false
Result: ❌ OVERFLOW DETECTED - REJECTEDWhere This Check Occurs
In the Verification Flow
Position in Code
The overflow check happens early in the verification process, before expensive cryptographic operations:
// proof_verify.go - Verify function
func (proof *Proof) Verify(scid Hash, scid_index int, s *Statement, txid Hash, extra_value uint64) bool {
// ... initial setup ...
// Line 108-110: OVERFLOW CHECK (happens first!)
total_open_value := s.Fees + extra_value
if total_open_value < s.Fees || total_open_value < extra_value {
return false
}
// ... rest of verification (only if overflow check passes) ...
}Why early? Checking for overflow before expensive operations:
- Saves computational resources on invalid transactions
- Prevents attackers from wasting node resources
- Fails fast on obviously malicious inputs
Related Protections
Combined with Other Checks
| Check | What It Prevents | Location |
|---|---|---|
| Overflow check | Arithmetic manipulation | proof_verify.go:108-110 |
| Bit decomposition | Negative amounts | proof_generate.go:479-487 |
| Range proof | Out-of-range values | Bulletproof system |
| Inner product | Proof forgery | proof_innerproduct.go |
Defense in Depth
Transaction submitted
↓
Overflow check (this page)
↓
Proof structure validation
↓
Parity check
↓
Sigma proof verification
↓
Range proof verification
↓
Inner product verification
↓
✅ Transaction acceptedSecurity Guarantees
What This Protects Against
| Attack | How It's Blocked |
|---|---|
| Fee overflow | Sum comparison catches wraparound |
| Value manipulation | Early rejection before processing |
| Resource exhaustion | Fails fast, minimal computation |
Confidence Level
Mathematical Certainty: The overflow check uses a fundamental property of unsigned integer arithmetic that cannot be bypassed. If a + b overflows, then a + b < a is always true. This is guaranteed by CPU hardware behavior.
Key Takeaways
The Protection Summary
Overflow attack attempt:
fees + extra_value overflows
↓
total < fees (true due to wraparound)
↓
Check detects overflow
↓
Transaction REJECTED
↓
Attack FAILEDWhy This Matters
- Prevents token creation from arithmetic manipulation
- Protects fee integrity ensuring miners receive proper fees
- Fails fast saving network resources
- Hardware-guaranteed relies on CPU arithmetic behavior
Source Code Reference
File: cryptography/crypto/proof_verify.go
Lines: 108-110
Function: Verify()
// The complete overflow protection check
total_open_value := s.Fees + extra_value
if total_open_value < s.Fees || total_open_value < extra_value { // stop over flowing attacks
return false
}Verification command:
git clone https://github.com/deroproject/derohe.git
cd derohe
sed -n '108,110p' cryptography/crypto/proof_verify.goRelated Pages
Security Suite:
- Negative Transfer Protection - Bit decomposition defense
- Range Proof Integrity - Triple-layer protection
- Proof Verification Flow - Complete verification process
Technical Reference:
- Transaction Proofs - Proof system overview
- Network Consensus - Distributed validation