Commit beb2d4e2 authored by Adrian Sutton's avatar Adrian Sutton Committed by GitHub

Merge pull request #8530 from ethereum-optimism/refcell/local-context-loading

feat(op-challenger): Alphabet Trace Provider Local Context Loading
parents 4a2731ff 3df468ef
...@@ -58,7 +58,7 @@ func (f *FaultDisputeGameContract) addLocalDataTx(data *types.PreimageOracleData ...@@ -58,7 +58,7 @@ func (f *FaultDisputeGameContract) addLocalDataTx(data *types.PreimageOracleData
call := f.contract.Call( call := f.contract.Call(
methodAddLocalData, methodAddLocalData,
data.GetIdent(), data.GetIdent(),
data.LocalContext, types.NoLocalContext,
new(big.Int).SetUint64(uint64(data.OracleOffset)), new(big.Int).SetUint64(uint64(data.OracleOffset)),
) )
return call.ToTxCandidate() return call.ToTxCandidate()
......
...@@ -60,7 +60,6 @@ func TestFaultDisputeGame_UpdateOracleTx(t *testing.T) { ...@@ -60,7 +60,6 @@ func TestFaultDisputeGame_UpdateOracleTx(t *testing.T) {
stubRpc, game := setupFaultDisputeGameTest(t) stubRpc, game := setupFaultDisputeGameTest(t)
data := &faultTypes.PreimageOracleData{ data := &faultTypes.PreimageOracleData{
IsLocal: true, IsLocal: true,
LocalContext: common.Hash{0x02},
OracleKey: common.Hash{0xbc}.Bytes(), OracleKey: common.Hash{0xbc}.Bytes(),
OracleData: []byte{1, 2, 3, 4, 5, 6, 7}, OracleData: []byte{1, 2, 3, 4, 5, 6, 7},
OracleOffset: 16, OracleOffset: 16,
...@@ -68,7 +67,7 @@ func TestFaultDisputeGame_UpdateOracleTx(t *testing.T) { ...@@ -68,7 +67,7 @@ func TestFaultDisputeGame_UpdateOracleTx(t *testing.T) {
claimIdx := uint64(6) claimIdx := uint64(6)
stubRpc.SetResponse(fdgAddr, methodAddLocalData, batching.BlockLatest, []interface{}{ stubRpc.SetResponse(fdgAddr, methodAddLocalData, batching.BlockLatest, []interface{}{
data.GetIdent(), data.GetIdent(),
data.LocalContext, faultTypes.NoLocalContext,
new(big.Int).SetUint64(uint64(data.OracleOffset)), new(big.Int).SetUint64(uint64(data.OracleOffset)),
}, nil) }, nil)
tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data) tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data)
......
...@@ -55,7 +55,6 @@ func TestOutputBisectionGame_UpdateOracleTx(t *testing.T) { ...@@ -55,7 +55,6 @@ func TestOutputBisectionGame_UpdateOracleTx(t *testing.T) {
stubRpc, game := setupOutputBisectionGameTest(t) stubRpc, game := setupOutputBisectionGameTest(t)
data := &faultTypes.PreimageOracleData{ data := &faultTypes.PreimageOracleData{
IsLocal: true, IsLocal: true,
LocalContext: common.Hash{0x02},
OracleKey: common.Hash{0xbc}.Bytes(), OracleKey: common.Hash{0xbc}.Bytes(),
OracleData: []byte{1, 2, 3, 4, 5, 6, 7}, OracleData: []byte{1, 2, 3, 4, 5, 6, 7},
OracleOffset: 16, OracleOffset: 16,
......
...@@ -179,8 +179,7 @@ func TestPerformAction(t *testing.T) { ...@@ -179,8 +179,7 @@ func TestPerformAction(t *testing.T) {
PreState: []byte{1, 2, 3}, PreState: []byte{1, 2, 3},
ProofData: []byte{4, 5, 6}, ProofData: []byte{4, 5, 6},
OracleData: &types.PreimageOracleData{ OracleData: &types.PreimageOracleData{
IsLocal: true, IsLocal: true,
LocalContext: common.Hash{0x06},
}, },
} }
err := responder.PerformAction(context.Background(), action) err := responder.PerformAction(context.Background(), action)
......
...@@ -33,6 +33,6 @@ func (a *alphabetWithProofProvider) GetStepData(ctx context.Context, i types.Pos ...@@ -33,6 +33,6 @@ func (a *alphabetWithProofProvider) GetStepData(ctx context.Context, i types.Pos
return nil, nil, nil, err return nil, nil, nil, err
} }
traceIndex := i.TraceIndex(int(a.depth)).Uint64() traceIndex := i.TraceIndex(int(a.depth)).Uint64()
data := types.NewPreimageOracleData(types.NoLocalContext, []byte{byte(traceIndex)}, []byte{byte(traceIndex - 1)}, uint32(traceIndex-1)) data := types.NewPreimageOracleData([]byte{byte(traceIndex)}, []byte{byte(traceIndex - 1)}, uint32(traceIndex-1))
return preimage, []byte{byte(traceIndex - 1)}, data, nil return preimage, []byte{byte(traceIndex - 1)}, data, nil
} }
...@@ -7,12 +7,19 @@ import ( ...@@ -7,12 +7,19 @@ import (
"math/big" "math/big"
"strings" "strings"
preimage "github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum-optimism/optimism/cannon/mipsevm" "github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
) )
const (
L2ClaimBlockNumberLocalIndex = 4
)
var ( var (
ErrIndexTooLarge = errors.New("index is larger than the maximum index") ErrIndexTooLarge = errors.New("index is larger than the maximum index")
) )
...@@ -50,7 +57,9 @@ func (ap *AlphabetTraceProvider) GetStepData(ctx context.Context, i types.Positi ...@@ -50,7 +57,9 @@ func (ap *AlphabetTraceProvider) GetStepData(ctx context.Context, i types.Positi
if traceIndex.Cmp(big.NewInt(int64(len(ap.state)))) >= 0 { if traceIndex.Cmp(big.NewInt(int64(len(ap.state)))) >= 0 {
return ap.GetStepData(ctx, types.NewPosition(int(ap.depth), big.NewInt(int64(len(ap.state))))) return ap.GetStepData(ctx, types.NewPosition(int(ap.depth), big.NewInt(int64(len(ap.state)))))
} }
return BuildAlphabetPreimage(traceIndex, ap.state[traceIndex.Uint64()]), []byte{}, nil, nil key := preimage.LocalIndexKey(L2ClaimBlockNumberLocalIndex).PreimageKey()
preimageData := types.NewPreimageOracleData(key[:], nil, 0)
return BuildAlphabetPreimage(traceIndex, ap.state[traceIndex.Uint64()]), []byte{}, preimageData, nil
} }
// Get returns the claim value at the given index in the trace. // Get returns the claim value at the given index in the trace.
......
...@@ -5,7 +5,10 @@ import ( ...@@ -5,7 +5,10 @@ import (
"math/big" "math/big"
"testing" "testing"
preimage "github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
...@@ -58,7 +61,9 @@ func TestGetStepData_Succeeds(t *testing.T) { ...@@ -58,7 +61,9 @@ func TestGetStepData_Succeeds(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, expected, retrieved) require.Equal(t, expected, retrieved)
require.Empty(t, proof) require.Empty(t, proof)
require.Nil(t, data) key := preimage.LocalIndexKey(L2ClaimBlockNumberLocalIndex).PreimageKey()
expectedLocalContextData := types.NewPreimageOracleData(key[:], nil, 0)
require.Equal(t, expectedLocalContextData, data)
} }
// TestGetPreimage_TooLargeIndex_Fails tests the GetPreimage // TestGetPreimage_TooLargeIndex_Fails tests the GetPreimage
......
...@@ -105,7 +105,7 @@ func (p *CannonTraceProvider) GetStepData(ctx context.Context, pos types.Positio ...@@ -105,7 +105,7 @@ func (p *CannonTraceProvider) GetStepData(ctx context.Context, pos types.Positio
} }
var oracleData *types.PreimageOracleData var oracleData *types.PreimageOracleData
if len(proof.OracleKey) > 0 { if len(proof.OracleKey) > 0 {
oracleData = types.NewPreimageOracleData(p.localContext, proof.OracleKey, proof.OracleValue, proof.OracleOffset) oracleData = types.NewPreimageOracleData(proof.OracleKey, proof.OracleValue, proof.OracleOffset)
} }
return value, data, oracleData, nil return value, data, oracleData, nil
} }
......
...@@ -124,7 +124,7 @@ func TestGetStepData(t *testing.T) { ...@@ -124,7 +124,7 @@ func TestGetStepData(t *testing.T) {
require.EqualValues(t, generator.proof.StateData, preimage) require.EqualValues(t, generator.proof.StateData, preimage)
require.EqualValues(t, generator.proof.ProofData, proof) require.EqualValues(t, generator.proof.ProofData, proof)
expectedData := types.NewPreimageOracleData(common.Hash{}, generator.proof.OracleKey, generator.proof.OracleValue, generator.proof.OracleOffset) expectedData := types.NewPreimageOracleData(generator.proof.OracleKey, generator.proof.OracleValue, generator.proof.OracleOffset)
require.EqualValues(t, expectedData, data) require.EqualValues(t, expectedData, data)
}) })
......
...@@ -20,7 +20,6 @@ var ( ...@@ -20,7 +20,6 @@ var (
// to load into the onchain oracle. // to load into the onchain oracle.
type PreimageOracleData struct { type PreimageOracleData struct {
IsLocal bool IsLocal bool
LocalContext common.Hash
OracleKey []byte OracleKey []byte
OracleData []byte OracleData []byte
OracleOffset uint32 OracleOffset uint32
...@@ -37,10 +36,9 @@ func (p *PreimageOracleData) GetPreimageWithoutSize() []byte { ...@@ -37,10 +36,9 @@ func (p *PreimageOracleData) GetPreimageWithoutSize() []byte {
} }
// NewPreimageOracleData creates a new [PreimageOracleData] instance. // NewPreimageOracleData creates a new [PreimageOracleData] instance.
func NewPreimageOracleData(lctx common.Hash, key []byte, data []byte, offset uint32) *PreimageOracleData { func NewPreimageOracleData(key []byte, data []byte, offset uint32) *PreimageOracleData {
return &PreimageOracleData{ return &PreimageOracleData{
IsLocal: len(key) > 0 && key[0] == byte(1), IsLocal: len(key) > 0 && key[0] == byte(1),
LocalContext: lctx,
OracleKey: key, OracleKey: key,
OracleData: data, OracleData: data,
OracleOffset: offset, OracleOffset: offset,
......
...@@ -4,24 +4,21 @@ import ( ...@@ -4,24 +4,21 @@ import (
"math/big" "math/big"
"testing" "testing"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestNewPreimageOracleData(t *testing.T) { func TestNewPreimageOracleData(t *testing.T) {
t.Run("LocalData", func(t *testing.T) { t.Run("LocalData", func(t *testing.T) {
data := NewPreimageOracleData(common.Hash{0x01}, []byte{1, 2, 3}, []byte{4, 5, 6}, 7) data := NewPreimageOracleData([]byte{1, 2, 3}, []byte{4, 5, 6}, 7)
require.True(t, data.IsLocal) require.True(t, data.IsLocal)
require.Equal(t, common.Hash{0x01}, data.LocalContext)
require.Equal(t, []byte{1, 2, 3}, data.OracleKey) require.Equal(t, []byte{1, 2, 3}, data.OracleKey)
require.Equal(t, []byte{4, 5, 6}, data.OracleData) require.Equal(t, []byte{4, 5, 6}, data.OracleData)
require.Equal(t, uint32(7), data.OracleOffset) require.Equal(t, uint32(7), data.OracleOffset)
}) })
t.Run("GlobalData", func(t *testing.T) { t.Run("GlobalData", func(t *testing.T) {
data := NewPreimageOracleData(common.Hash{0x01}, []byte{0, 2, 3}, []byte{4, 5, 6}, 7) data := NewPreimageOracleData([]byte{0, 2, 3}, []byte{4, 5, 6}, 7)
require.False(t, data.IsLocal) require.False(t, data.IsLocal)
require.Equal(t, common.Hash{0x01}, data.LocalContext)
require.Equal(t, []byte{0, 2, 3}, data.OracleKey) require.Equal(t, []byte{0, 2, 3}, data.OracleKey)
require.Equal(t, []byte{4, 5, 6}, data.OracleData) require.Equal(t, []byte{4, 5, 6}, data.OracleData)
require.Equal(t, uint32(7), data.OracleOffset) require.Equal(t, uint32(7), data.OracleOffset)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment