Commit 774ad161 authored by refcell.eth's avatar refcell.eth Committed by GitHub

feat(op-challenger): large preimage uploader (#9021)

parent 0b7e171d
...@@ -12,8 +12,6 @@ import ( ...@@ -12,8 +12,6 @@ import (
var _ PreimageUploader = (*DirectPreimageUploader)(nil) var _ PreimageUploader = (*DirectPreimageUploader)(nil)
var ErrNilPreimageData = fmt.Errorf("cannot upload nil preimage data")
// DirectPreimageUploader uploads the provided [types.PreimageOracleData] // DirectPreimageUploader uploads the provided [types.PreimageOracleData]
// directly to the PreimageOracle contract in a single transaction. // directly to the PreimageOracle contract in a single transaction.
type DirectPreimageUploader struct { type DirectPreimageUploader struct {
......
package preimages
import (
"context"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
)
var _ PreimageUploader = (*SplitPreimageUploader)(nil)
// PREIMAGE_SIZE_THRESHOLD is the size threshold for determining whether a preimage
// should be uploaded directly or through the large preimage uploader.
// TODO(client-pod#467): determine the correct size threshold to toggle between
//
// the direct and large preimage uploaders.
const PREIMAGE_SIZE_THRESHOLD = 136 * 128
// SplitPreimageUploader routes preimage uploads to the appropriate uploader
// based on the size of the preimage.
type SplitPreimageUploader struct {
directUploader PreimageUploader
largeUploader PreimageUploader
}
func NewSplitPreimageUploader(directUploader PreimageUploader, largeUploader PreimageUploader) *SplitPreimageUploader {
return &SplitPreimageUploader{directUploader, largeUploader}
}
func (s *SplitPreimageUploader) UploadPreimage(ctx context.Context, parent uint64, data *types.PreimageOracleData) error {
if data == nil {
return ErrNilPreimageData
}
if len(data.OracleData) > PREIMAGE_SIZE_THRESHOLD {
return s.largeUploader.UploadPreimage(ctx, parent, data)
} else {
return s.directUploader.UploadPreimage(ctx, parent, data)
}
}
package preimages
import (
"context"
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/stretchr/testify/require"
)
func TestSplitPreimageUploader_UploadPreimage(t *testing.T) {
t.Run("DirectUploadSucceeds", func(t *testing.T) {
oracle, direct, large := newTestSplitPreimageUploader(t)
err := oracle.UploadPreimage(context.Background(), 0, &types.PreimageOracleData{})
require.NoError(t, err)
require.Equal(t, 1, direct.updates)
require.Equal(t, 0, large.updates)
})
t.Run("LargeUploadSucceeds", func(t *testing.T) {
oracle, direct, large := newTestSplitPreimageUploader(t)
err := oracle.UploadPreimage(context.Background(), 0, &types.PreimageOracleData{OracleData: make([]byte, PREIMAGE_SIZE_THRESHOLD+1)})
require.NoError(t, err)
require.Equal(t, 1, large.updates)
require.Equal(t, 0, direct.updates)
})
t.Run("NilPreimageOracleData", func(t *testing.T) {
oracle, _, _ := newTestSplitPreimageUploader(t)
err := oracle.UploadPreimage(context.Background(), 0, nil)
require.ErrorIs(t, err, ErrNilPreimageData)
})
}
type mockPreimageUploader struct {
updates int
uploadFails bool
}
func (s *mockPreimageUploader) UploadPreimage(ctx context.Context, parent uint64, data *types.PreimageOracleData) error {
s.updates++
if s.uploadFails {
return mockUpdateOracleTxError
}
return nil
}
func newTestSplitPreimageUploader(t *testing.T) (*SplitPreimageUploader, *mockPreimageUploader, *mockPreimageUploader) {
direct := &mockPreimageUploader{}
large := &mockPreimageUploader{}
return NewSplitPreimageUploader(direct, large), direct, large
}
...@@ -2,11 +2,14 @@ package preimages ...@@ -2,11 +2,14 @@ package preimages
import ( import (
"context" "context"
"fmt"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum-optimism/optimism/op-service/txmgr"
) )
var ErrNilPreimageData = fmt.Errorf("cannot upload nil preimage data")
// PreimageUploader is responsible for posting preimages. // PreimageUploader is responsible for posting preimages.
type PreimageUploader interface { type PreimageUploader interface {
// UploadPreimage uploads the provided preimage. // UploadPreimage uploads the provided preimage.
......
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