Skip to content

Commit

Permalink
fix emited expired retryable leaf position, add revival unit test draft
Browse files Browse the repository at this point in the history
  • Loading branch information
magicxyyz committed Jun 20, 2023
1 parent 3d5e8de commit 637aa15
Show file tree
Hide file tree
Showing 4 changed files with 269 additions and 17 deletions.
10 changes: 5 additions & 5 deletions arbos/internal_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func ApplyInternalTxUpdate(tx *types.ArbitrumInternalTx, state *arbosState.Arbos
// Try to reap 2 retryables, revert the state on failure
snapshot := evm.StateDB.Snapshot()
var merkleUpdateEvents []merkleAccumulator.MerkleTreeNodeEvent
var expiredRetryableLeafs []*retryables.ExpiredRetryableLeaf
var expiredRetryableLeaves []*retryables.ExpiredRetryableLeaf
for i := 0; i < 2; i++ {
var events []merkleAccumulator.MerkleTreeNodeEvent
var leaf *retryables.ExpiredRetryableLeaf
Expand All @@ -99,13 +99,13 @@ func ApplyInternalTxUpdate(tx *types.ArbitrumInternalTx, state *arbosState.Arbos
}
merkleUpdateEvents = append(merkleUpdateEvents, events...)
if leaf != nil {
expiredRetryableLeafs = append(expiredRetryableLeafs, leaf)
expiredRetryableLeaves = append(expiredRetryableLeaves, leaf)
}
}
if err == nil {
for _, leaf := range expiredRetryableLeafs {
position := merkletree.LevelAndLeaf{Level: leaf.Event.Level, Leaf: leaf.Event.NumLeaves}
if err = EmitRetryableExpiredEvent(evm, leaf.TicketId, leaf.Event.Hash, position.ToBigInt()); err != nil {
for _, leaf := range expiredRetryableLeaves {
position := merkletree.LevelAndLeaf{Level: 0, Leaf: leaf.Index}
if err = EmitRetryableExpiredEvent(evm, leaf.TicketId, leaf.Hash, position.ToBigInt()); err != nil {
log.Error("Failed to emit RetryableExpired event", "err", err)
break
}
Expand Down
16 changes: 9 additions & 7 deletions arbos/merkleAccumulator/merkleAccumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package merkleAccumulator
import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/offchainlabs/nitro/arbos/storage"
"github.com/offchainlabs/nitro/util/arbmath"
)
Expand Down Expand Up @@ -107,6 +108,7 @@ func (acc *MerkleAccumulator) GetPartials() ([]*common.Hash, error) {
}

func (acc *MerkleAccumulator) setPartial(level uint64, val *common.Hash) error {
log.Warn("setPartial", "level", level, "val", val)
if acc.backingStorage != nil {
err := acc.backingStorage.SetByUint64(2+level, *val)
if err != nil {
Expand All @@ -121,10 +123,10 @@ func (acc *MerkleAccumulator) setPartial(level uint64, val *common.Hash) error {
}

// Note: itemHash is hashed before being included in the tree, to prevent confusing leafs with branches.
func (acc *MerkleAccumulator) Append(itemHash common.Hash) ([]MerkleTreeNodeEvent, *MerkleTreeNodeEvent, error) {
func (acc *MerkleAccumulator) Append(itemHash common.Hash) ([]MerkleTreeNodeEvent, uint64, error) {
size, err := acc.size.Increment()
if err != nil {
return nil, nil, err
return nil, 0, err
}
events := []MerkleTreeNodeEvent{}

Expand All @@ -134,25 +136,25 @@ func (acc *MerkleAccumulator) Append(itemHash common.Hash) ([]MerkleTreeNodeEven
if level == CalcNumPartials(size-1) { // -1 to counteract the acc.size++ at top of this function
h := common.BytesToHash(soFar)
err := acc.setPartial(level, &h)
return events, &MerkleTreeNodeEvent{level, size - 1, h}, err
return events, size, err
}
thisLevel, err := acc.getPartial(level)
if err != nil {
return nil, nil, err
return nil, size, err
}
if *thisLevel == (common.Hash{}) {
h := common.BytesToHash(soFar)
err := acc.setPartial(level, &h)
return events, &MerkleTreeNodeEvent{level, size - 1, h}, err
return events, size, err
}
soFar, err = acc.Keccak(thisLevel.Bytes(), soFar)
if err != nil {
return nil, nil, err
return nil, size, err
}
h := common.Hash{}
err = acc.setPartial(level, &h)
if err != nil {
return nil, nil, err
return nil, size, err
}
level += 1
events = append(events, MerkleTreeNodeEvent{level, size - 1, common.BytesToHash(soFar)})
Expand Down
Loading

0 comments on commit 637aa15

Please sign in to comment.