Skip to content

Commit 6eb13c2

Browse files
committed
Fix audit issues, disable state connector after Durango
1 parent ecf8084 commit 6eb13c2

File tree

5 files changed

+44
-16
lines changed

5 files changed

+44
-16
lines changed

coreth/consensus/dummy/consensus.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,21 @@ func (self *DummyEngine) verifyHeaderGasFields(config *params.ChainConfig, heade
126126
if header.GasLimit != params.SgbApricotPhase5GasLimit {
127127
return fmt.Errorf("expected gas limit to be %d in ApricotPhase5 but found %d", params.SgbApricotPhase5GasLimit, header.GasLimit)
128128
}
129+
} else if config.IsApricotPhase1(header.Time) {
130+
if header.GasLimit != params.ApricotPhase1GasLimit {
131+
return fmt.Errorf("expected gas limit to be %d in ApricotPhase1, but found %d", params.ApricotPhase1GasLimit, header.GasLimit)
132+
}
133+
} else {
134+
// Verify that the gas limit remains within allowed bounds
135+
diff := int64(parent.GasLimit) - int64(header.GasLimit)
136+
if diff < 0 {
137+
diff *= -1
138+
}
139+
limit := parent.GasLimit / params.GasLimitBoundDivisor
140+
141+
if uint64(diff) >= limit || header.GasLimit < params.MinGasLimit {
142+
return fmt.Errorf("invalid gas limit: have %d, want %d += %d", header.GasLimit, parent.GasLimit, limit)
143+
}
129144
}
130145
} else {
131146
if config.IsApricotPhase1(header.Time) {

coreth/core/governance_settings.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,12 @@ func (st *StateTransition) UpdateInitialAirdropAddress(chainID *big.Int, timesta
303303
}
304304
initialAirdropAddress := GetInitialAirdropContractAddress(chainID, timestamp)
305305
targetAidropAddress := GetTargetAirdropContractAddress(chainID, timestamp)
306-
airdropBalance := st.state.GetBalance(initialAirdropAddress)
307-
st.state.SubBalance(initialAirdropAddress, airdropBalance)
308-
st.state.AddBalance(targetAidropAddress, airdropBalance)
306+
307+
if initialAirdropAddress != targetAidropAddress {
308+
airdropBalance := st.state.GetBalance(initialAirdropAddress)
309+
st.state.SubBalance(initialAirdropAddress, airdropBalance)
310+
st.state.AddBalance(targetAidropAddress, airdropBalance)
311+
}
309312
return nil
310313
}
311314

@@ -322,8 +325,11 @@ func (st *StateTransition) UpdateDistributionAddress(chainID *big.Int, timestamp
322325
}
323326
distributionAddress := GetDistributionContractAddress(chainID, timestamp)
324327
targetDistributionAddress := GetTargetDistributionContractAddress(chainID, timestamp)
325-
distributionBalance := st.state.GetBalance(distributionAddress)
326-
st.state.SubBalance(distributionAddress, distributionBalance)
327-
st.state.AddBalance(targetDistributionAddress, distributionBalance)
328+
329+
if distributionAddress != targetDistributionAddress {
330+
distributionBalance := st.state.GetBalance(distributionAddress)
331+
st.state.SubBalance(distributionAddress, distributionBalance)
332+
st.state.AddBalance(targetDistributionAddress, distributionBalance)
333+
}
328334
return nil
329335
}

coreth/core/state_connector.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ var (
5454
AddValue(params.LocalChainID, GetStateConnectorIsActivatedAndCalledLocal)
5555
)
5656

57-
func GetStateConnectorIsActivatedAndCalled(chainID *big.Int, blockTime uint64, to common.Address) bool {
58-
return stateConnectorActivationVariants.GetValue(chainID)(blockTime, to)
57+
func GetStateConnectorIsActivatedAndCalled(isDurango bool, chainID *big.Int, blockTime uint64, to common.Address) bool {
58+
return !isDurango && stateConnectorActivationVariants.GetValue(chainID)(blockTime, to)
5959
}
6060

6161
func GetStateConnectorIsActivatedAndCalledFlare(blockTime uint64, to common.Address) bool {

coreth/core/state_transition.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,10 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
475475
st.state.SetNonce(msg.From, st.state.GetNonce(sender.Address())+1)
476476
ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, msg.Value)
477477
if vmerr == nil && chainID != nil {
478-
if isSongbird {
479-
handleSongbirdTransitionDbContracts(st, chainID, timestamp, msg, ret)
480-
} else {
481-
handleFlareTransitionDbContracts(st, chainID, timestamp, msg, ret)
478+
if isSongbird { // Songbird, Coston, Local (Songbird)
479+
handleSongbirdTransitionDbContracts(st, rules.IsDurango, chainID, timestamp, msg, ret)
480+
} else if isFlare { // Flare, Coston2, Local (Flare)
481+
handleFlareTransitionDbContracts(st, rules.IsDurango, chainID, timestamp, msg, ret)
482482
}
483483
}
484484
}
@@ -514,8 +514,8 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
514514
}, nil
515515
}
516516

517-
func handleSongbirdTransitionDbContracts(st *StateTransition, chainID *big.Int, timestamp uint64, msg *Message, ret []byte) {
518-
if GetStateConnectorIsActivatedAndCalled(chainID, timestamp, *msg.To) &&
517+
func handleSongbirdTransitionDbContracts(st *StateTransition, isDurango bool, chainID *big.Int, timestamp uint64, msg *Message, ret []byte) {
518+
if GetStateConnectorIsActivatedAndCalled(isDurango, chainID, timestamp, *msg.To) &&
519519
len(msg.Data) >= 36 && len(ret) == 32 &&
520520
bytes.Equal(msg.Data[0:4], SubmitAttestationSelector(chainID, timestamp)) &&
521521
binary.BigEndian.Uint64(ret[24:32]) > 0 {
@@ -525,12 +525,12 @@ func handleSongbirdTransitionDbContracts(st *StateTransition, chainID *big.Int,
525525
}
526526
}
527527

528-
func handleFlareTransitionDbContracts(st *StateTransition, chainID *big.Int, timestamp uint64, msg *Message, ret []byte) {
528+
func handleFlareTransitionDbContracts(st *StateTransition, isDurango bool, chainID *big.Int, timestamp uint64, msg *Message, ret []byte) {
529529
if st.evm.Context.Coinbase != common.HexToAddress("0x0100000000000000000000000000000000000000") {
530530
return
531531
}
532532

533-
if GetStateConnectorIsActivatedAndCalled(chainID, timestamp, *msg.To) &&
533+
if GetStateConnectorIsActivatedAndCalled(isDurango, chainID, timestamp, *msg.To) &&
534534
len(msg.Data) >= 36 && len(ret) == 32 &&
535535
bytes.Equal(msg.Data[0:4], SubmitAttestationSelector(chainID, timestamp)) &&
536536
binary.BigEndian.Uint64(ret[24:32]) > 0 {

coreth/plugin/evm/block_verification.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ func (v blockValidator) SyntacticVerify(b *Block, rules params.Rules) error {
128128
)
129129

130130
}
131+
} else if rules.IsApricotPhase1 {
132+
if ethHeader.GasLimit != params.ApricotPhase1GasLimit {
133+
return fmt.Errorf(
134+
"expected gas limit to be %d after apricot phase 1 but got %d",
135+
params.ApricotPhase1GasLimit, ethHeader.GasLimit,
136+
)
137+
}
131138
}
132139
} else {
133140
if rules.IsApricotPhase1 {

0 commit comments

Comments
 (0)