mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
working builder tests
This commit is contained in:
parent
28a45e3492
commit
2786f36e04
12 changed files with 384 additions and 28 deletions
|
|
@ -196,9 +196,6 @@ var (
|
||||||
utils.MetricsInfluxDBBucketFlag,
|
utils.MetricsInfluxDBBucketFlag,
|
||||||
utils.MetricsInfluxDBOrganizationFlag,
|
utils.MetricsInfluxDBOrganizationFlag,
|
||||||
}
|
}
|
||||||
suaveApiFlags = []cli.Flag{
|
|
||||||
utils.SuaveEnabled,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var app = flags.NewApp("the go-ethereum command line interface")
|
var app = flags.NewApp("the go-ethereum command line interface")
|
||||||
|
|
@ -248,7 +245,6 @@ func init() {
|
||||||
consoleFlags,
|
consoleFlags,
|
||||||
debug.Flags,
|
debug.Flags,
|
||||||
metricsFlags,
|
metricsFlags,
|
||||||
suaveApiFlags,
|
|
||||||
)
|
)
|
||||||
flags.AutoEnvVars(app.Flags, "GETH")
|
flags.AutoEnvVars(app.Flags, "GETH")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/p2p/netutil"
|
"github.com/ethereum/go-ethereum/p2p/netutil"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
"github.com/ethereum/go-ethereum/suave"
|
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
|
"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
|
||||||
"github.com/ethereum/go-ethereum/trie/triedb/pathdb"
|
"github.com/ethereum/go-ethereum/trie/triedb/pathdb"
|
||||||
|
|
@ -909,13 +908,6 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
|
||||||
Value: metrics.DefaultConfig.InfluxDBOrganization,
|
Value: metrics.DefaultConfig.InfluxDBOrganization,
|
||||||
Category: flags.MetricsCategory,
|
Category: flags.MetricsCategory,
|
||||||
}
|
}
|
||||||
|
|
||||||
// SUAVE namespace rpc settings
|
|
||||||
SuaveEnabled = &cli.BoolFlag{
|
|
||||||
Name: "suave",
|
|
||||||
Usage: "Enable the suave",
|
|
||||||
Category: flags.SuaveCategory,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -1352,10 +1344,6 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetSuaveConfig(ctx *cli.Context, cfg *suave.Config) {
|
|
||||||
cfg.Enabled = ctx.IsSet(SuaveEnabled.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNodeConfig applies node-related command line flags to the config.
|
// SetNodeConfig applies node-related command line flags to the config.
|
||||||
func SetNodeConfig(ctx *cli.Context, cfg *node.Config) {
|
func SetNodeConfig(ctx *cli.Context, cfg *node.Config) {
|
||||||
SetP2PConfig(ctx, &cfg.P2P)
|
SetP2PConfig(ctx, &cfg.P2P)
|
||||||
|
|
@ -1871,18 +1859,11 @@ func SetDNSDiscoveryDefaults(cfg *ethconfig.Config, genesis common.Hash) {
|
||||||
|
|
||||||
// RegisterEthService adds an Ethereum client to the stack.
|
// RegisterEthService adds an Ethereum client to the stack.
|
||||||
// The second return value is the full node instance.
|
// The second return value is the full node instance.
|
||||||
func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, suaveConfig *suave.Config) (ethapi.Backend, *eth.Ethereum) {
|
func RegisterEthService(stack *node.Node, cfg *ethconfig.Config) (ethapi.Backend, *eth.Ethereum) {
|
||||||
backend, err := eth.New(stack, cfg)
|
backend, err := eth.New(stack, cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fatalf("Failed to register the Ethereum service: %v", err)
|
Fatalf("Failed to register the Ethereum service: %v", err)
|
||||||
}
|
}
|
||||||
if suaveConfig.Enabled {
|
|
||||||
log.Info("Enable suave service")
|
|
||||||
if err := suave.Register(stack, backend, suaveConfig); err != nil {
|
|
||||||
Fatalf("Failed to register the suave service: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stack.RegisterAPIs(tracers.APIs(backend.APIBackend))
|
stack.RegisterAPIs(tracers.APIs(backend.APIBackend))
|
||||||
return backend.APIBackend, backend
|
return backend.APIBackend, backend
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,24 @@ type DataRecord struct {
|
||||||
AllowedStores []common.Address
|
AllowedStores []common.Address
|
||||||
Version string
|
Version string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type HttpRequest struct {
|
||||||
|
Url string
|
||||||
|
Method string
|
||||||
|
Headers []string
|
||||||
|
Body []byte
|
||||||
|
WithFlashbotsSignature bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type SimulateTransactionResult struct {
|
||||||
|
Egp uint64
|
||||||
|
Logs []*SimulatedLog
|
||||||
|
Success bool
|
||||||
|
Error string
|
||||||
|
}
|
||||||
|
|
||||||
|
type SimulatedLog struct {
|
||||||
|
Data []byte
|
||||||
|
Addr common.Address
|
||||||
|
Topics []common.Hash
|
||||||
|
}
|
||||||
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum"
|
"github.com/ethereum/go-ethereum"
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/consensus"
|
"github.com/ethereum/go-ethereum/consensus"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/bloombits"
|
"github.com/ethereum/go-ethereum/core/bloombits"
|
||||||
|
|
@ -37,6 +38,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/eth/tracers"
|
"github.com/ethereum/go-ethereum/eth/tracers"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
|
"github.com/ethereum/go-ethereum/internal/ethapi"
|
||||||
"github.com/ethereum/go-ethereum/miner"
|
"github.com/ethereum/go-ethereum/miner"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
|
@ -423,3 +425,20 @@ func (b *EthAPIBackend) BuildBlockFromTxs(ctx context.Context, buildArgs *types.
|
||||||
func (b *EthAPIBackend) BuildBlockFromBundles(ctx context.Context, buildArgs *types.BuildBlockArgs, bundles []types.SBundle) (*types.Block, *big.Int, error) {
|
func (b *EthAPIBackend) BuildBlockFromBundles(ctx context.Context, buildArgs *types.BuildBlockArgs, bundles []types.SBundle) (*types.Block, *big.Int, error) {
|
||||||
return b.eth.Miner().BuildBlockFromBundles(ctx, buildArgs, bundles)
|
return b.eth.Miner().BuildBlockFromBundles(ctx, buildArgs, bundles)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *EthAPIBackend) Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error) {
|
||||||
|
// Note: this is pretty close to be a circle dependency.
|
||||||
|
data := hexutil.Bytes(input)
|
||||||
|
txnArgs := ethapi.TransactionArgs{
|
||||||
|
To: &contractAddr,
|
||||||
|
Data: &data,
|
||||||
|
}
|
||||||
|
|
||||||
|
blockNum := rpc.LatestBlockNumber
|
||||||
|
res, err := ethapi.DoCall(ctx, b, txnArgs, rpc.BlockNumberOrHash{BlockNumber: &blockNum}, nil, nil, 5*time.Second, 100000)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.ReturnData, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
"github.com/ethereum/go-ethereum/suave/backends"
|
||||||
suave_builder "github.com/ethereum/go-ethereum/suave/builder"
|
suave_builder "github.com/ethereum/go-ethereum/suave/builder"
|
||||||
suave_builder_api "github.com/ethereum/go-ethereum/suave/builder/api"
|
suave_builder_api "github.com/ethereum/go-ethereum/suave/builder/api"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
89
suave/backends/eth_backend_server.go
Normal file
89
suave/backends/eth_backend_server.go
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
package backends
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/beacon/engine"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
suave "github.com/ethereum/go-ethereum/suave/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EthBackend is the set of functions exposed from the SUAVE-enabled node
|
||||||
|
type EthBackend interface {
|
||||||
|
BuildEthBlock(ctx context.Context, buildArgs *types.BuildBlockArgs, txs types.Transactions) (*engine.ExecutionPayloadEnvelope, error)
|
||||||
|
BuildEthBlockFromBundles(ctx context.Context, buildArgs *types.BuildBlockArgs, bundles []types.SBundle) (*engine.ExecutionPayloadEnvelope, error)
|
||||||
|
Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ EthBackend = &EthBackendServer{}
|
||||||
|
|
||||||
|
// EthBackendServerBackend is the interface implemented by the SUAVE-enabled node
|
||||||
|
// to resolve the EthBackend server queries
|
||||||
|
type EthBackendServerBackend interface {
|
||||||
|
CurrentHeader() *types.Header
|
||||||
|
BuildBlockFromTxs(ctx context.Context, buildArgs *suave.BuildBlockArgs, txs types.Transactions) (*types.Block, *big.Int, error)
|
||||||
|
BuildBlockFromBundles(ctx context.Context, buildArgs *suave.BuildBlockArgs, bundles []types.SBundle) (*types.Block, *big.Int, error)
|
||||||
|
Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type EthBackendServer struct {
|
||||||
|
b EthBackendServerBackend
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEthBackendServer(b EthBackendServerBackend) *EthBackendServer {
|
||||||
|
return &EthBackendServer{b}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthBackendServer) BuildEthBlock(ctx context.Context, buildArgs *types.BuildBlockArgs, txs types.Transactions) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
if buildArgs == nil {
|
||||||
|
head := e.b.CurrentHeader()
|
||||||
|
buildArgs = &types.BuildBlockArgs{
|
||||||
|
Parent: head.Hash(),
|
||||||
|
Timestamp: head.Time + uint64(12),
|
||||||
|
FeeRecipient: common.Address{0x42},
|
||||||
|
GasLimit: 30000000,
|
||||||
|
Random: head.Root,
|
||||||
|
Withdrawals: nil,
|
||||||
|
Extra: []byte(""),
|
||||||
|
FillPending: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
block, profit, err := e.b.BuildBlockFromTxs(ctx, buildArgs, txs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: we're not adding blobs, but this is not where you would do it anyways
|
||||||
|
return engine.BlockToExecutableData(block, profit, nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthBackendServer) BuildEthBlockFromBundles(ctx context.Context, buildArgs *types.BuildBlockArgs, bundles []types.SBundle) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
if buildArgs == nil {
|
||||||
|
head := e.b.CurrentHeader()
|
||||||
|
buildArgs = &types.BuildBlockArgs{
|
||||||
|
Parent: head.Hash(),
|
||||||
|
Timestamp: head.Time + uint64(12),
|
||||||
|
FeeRecipient: common.Address{0x42},
|
||||||
|
GasLimit: 30000000,
|
||||||
|
Random: head.Root,
|
||||||
|
Withdrawals: nil,
|
||||||
|
Extra: []byte(""),
|
||||||
|
FillPending: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
block, profit, err := e.b.BuildBlockFromBundles(ctx, buildArgs, bundles)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: we're not adding blobs, but this is not where you would do it anyways
|
||||||
|
return engine.BlockToExecutableData(block, profit, nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthBackendServer) Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error) {
|
||||||
|
return e.b.Call(ctx, contractAddr, input)
|
||||||
|
}
|
||||||
58
suave/backends/eth_backend_server_test.go
Normal file
58
suave/backends/eth_backend_server_test.go
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
package backends
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"math/big"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
suave "github.com/ethereum/go-ethereum/suave/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEthBackend_Compatibility(t *testing.T) {
|
||||||
|
// This test ensures that the client is able to call to the server.
|
||||||
|
// It does not cover the internal logic implemention of the endpoints.
|
||||||
|
srv := rpc.NewServer()
|
||||||
|
require.NoError(t, srv.RegisterName("suavex", NewEthBackendServer(&mockBackend{})))
|
||||||
|
|
||||||
|
clt := &RemoteEthBackend{client: rpc.DialInProc(srv)}
|
||||||
|
|
||||||
|
_, err := clt.BuildEthBlock(context.Background(), &types.BuildBlockArgs{}, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = clt.BuildEthBlockFromBundles(context.Background(), &types.BuildBlockArgs{}, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = clt.Call(context.Background(), common.Address{}, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// mockBackend is a backend for the EthBackendServer that returns mock data
|
||||||
|
type mockBackend struct{}
|
||||||
|
|
||||||
|
func (n *mockBackend) CurrentHeader() *types.Header {
|
||||||
|
return &types.Header{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *mockBackend) BuildBlockFromTxs(ctx context.Context, buildArgs *suave.BuildBlockArgs, txs types.Transactions) (*types.Block, *big.Int, error) {
|
||||||
|
block := types.NewBlock(&types.Header{GasUsed: 1000, BaseFee: big.NewInt(1)}, txs, nil, nil, trie.NewStackTrie(nil))
|
||||||
|
return block, big.NewInt(11000), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *mockBackend) BuildBlockFromBundles(ctx context.Context, buildArgs *suave.BuildBlockArgs, bundles []types.SBundle) (*types.Block, *big.Int, error) {
|
||||||
|
var txs types.Transactions
|
||||||
|
for _, bundle := range bundles {
|
||||||
|
txs = append(txs, bundle.Txs...)
|
||||||
|
}
|
||||||
|
block := types.NewBlock(&types.Header{GasUsed: 1000, BaseFee: big.NewInt(1)}, txs, nil, nil, trie.NewStackTrie(nil))
|
||||||
|
return block, big.NewInt(11000), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *mockBackend) Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error) {
|
||||||
|
return []byte{0x1}, nil
|
||||||
|
}
|
||||||
100
suave/backends/eth_backends.go
Normal file
100
suave/backends/eth_backends.go
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
package backends
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/beacon/engine"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
builder "github.com/ethereum/go-ethereum/suave/builder/api"
|
||||||
|
suave "github.com/ethereum/go-ethereum/suave/core"
|
||||||
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ EthBackend = &EthMock{}
|
||||||
|
_ EthBackend = &RemoteEthBackend{}
|
||||||
|
)
|
||||||
|
|
||||||
|
type EthMock struct {
|
||||||
|
*builder.MockServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthMock) BuildEthBlock(ctx context.Context, args *suave.BuildBlockArgs, txs types.Transactions) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
block := types.NewBlock(&types.Header{GasUsed: 1000}, txs, nil, nil, trie.NewStackTrie(nil))
|
||||||
|
return engine.BlockToExecutableData(block, big.NewInt(11000), nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthMock) BuildEthBlockFromBundles(ctx context.Context, args *suave.BuildBlockArgs, bundles []types.SBundle) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
var txs types.Transactions
|
||||||
|
for _, bundle := range bundles {
|
||||||
|
txs = append(txs, bundle.Txs...)
|
||||||
|
}
|
||||||
|
block := types.NewBlock(&types.Header{GasUsed: 1000}, txs, nil, nil, trie.NewStackTrie(nil))
|
||||||
|
return engine.BlockToExecutableData(block, big.NewInt(11000), nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EthMock) Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoteEthBackend struct {
|
||||||
|
endpoint string
|
||||||
|
client *rpc.Client
|
||||||
|
|
||||||
|
*builder.APIClient
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRemoteEthBackend(endpoint string) *RemoteEthBackend {
|
||||||
|
r := &RemoteEthBackend{
|
||||||
|
endpoint: endpoint,
|
||||||
|
}
|
||||||
|
|
||||||
|
r.APIClient = builder.NewClientFromRPC(r)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RemoteEthBackend) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error {
|
||||||
|
if e.client == nil {
|
||||||
|
// should lock
|
||||||
|
var err error
|
||||||
|
client, err := rpc.DialContext(ctx, e.endpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
e.client = client
|
||||||
|
}
|
||||||
|
|
||||||
|
err := e.client.CallContext(ctx, &result, method, args...)
|
||||||
|
if err != nil {
|
||||||
|
client := e.client
|
||||||
|
e.client = nil
|
||||||
|
client.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RemoteEthBackend) BuildEthBlock(ctx context.Context, args *suave.BuildBlockArgs, txs types.Transactions) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
var result engine.ExecutionPayloadEnvelope
|
||||||
|
err := e.CallContext(ctx, &result, "suavex_buildEthBlock", args, txs)
|
||||||
|
|
||||||
|
return &result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RemoteEthBackend) BuildEthBlockFromBundles(ctx context.Context, args *suave.BuildBlockArgs, bundles []types.SBundle) (*engine.ExecutionPayloadEnvelope, error) {
|
||||||
|
var result engine.ExecutionPayloadEnvelope
|
||||||
|
err := e.CallContext(ctx, &result, "suavex_buildEthBlockFromBundles", args, bundles)
|
||||||
|
|
||||||
|
return &result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RemoteEthBackend) Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error) {
|
||||||
|
var result []byte
|
||||||
|
err := e.CallContext(ctx, &result, "suavex_call", contractAddr, input)
|
||||||
|
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/consensus/misc"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
|
@ -80,7 +80,7 @@ func (s *SessionManager) NewSession() (string, error) {
|
||||||
|
|
||||||
// Set baseFee and GasLimit if we are on an EIP-1559 chain
|
// Set baseFee and GasLimit if we are on an EIP-1559 chain
|
||||||
if chainConfig.IsLondon(header.Number) {
|
if chainConfig.IsLondon(header.Number) {
|
||||||
header.BaseFee = misc.CalcBaseFee(chainConfig, parent)
|
header.BaseFee = CalcBaseFee(chainConfig, parent)
|
||||||
if !chainConfig.IsLondon(parent.Number) {
|
if !chainConfig.IsLondon(parent.Number) {
|
||||||
parentGasLimit := parent.GasLimit * chainConfig.ElasticityMultiplier()
|
parentGasLimit := parent.GasLimit * chainConfig.ElasticityMultiplier()
|
||||||
header.GasLimit = core.CalcGasLimit(parentGasLimit, s.config.GasCeil)
|
header.GasLimit = core.CalcGasLimit(parentGasLimit, s.config.GasCeil)
|
||||||
|
|
@ -136,3 +136,44 @@ func (s *SessionManager) AddTransaction(sessionId string, tx *types.Transaction)
|
||||||
}
|
}
|
||||||
return builder.AddTransaction(tx)
|
return builder.AddTransaction(tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CalcBaseFee calculates the basefee of the header.
|
||||||
|
func CalcBaseFee(config *params.ChainConfig, parent *types.Header) *big.Int {
|
||||||
|
// If the current block is the first EIP-1559 block, return the InitialBaseFee.
|
||||||
|
if !config.IsLondon(parent.Number) {
|
||||||
|
return new(big.Int).SetUint64(params.InitialBaseFee)
|
||||||
|
}
|
||||||
|
|
||||||
|
parentGasTarget := parent.GasLimit / config.ElasticityMultiplier()
|
||||||
|
// If the parent gasUsed is the same as the target, the baseFee remains unchanged.
|
||||||
|
if parent.GasUsed == parentGasTarget {
|
||||||
|
return new(big.Int).Set(parent.BaseFee)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
num = new(big.Int)
|
||||||
|
denom = new(big.Int)
|
||||||
|
)
|
||||||
|
|
||||||
|
if parent.GasUsed > parentGasTarget {
|
||||||
|
// If the parent block used more gas than its target, the baseFee should increase.
|
||||||
|
// max(1, parentBaseFee * gasUsedDelta / parentGasTarget / baseFeeChangeDenominator)
|
||||||
|
num.SetUint64(parent.GasUsed - parentGasTarget)
|
||||||
|
num.Mul(num, parent.BaseFee)
|
||||||
|
num.Div(num, denom.SetUint64(parentGasTarget))
|
||||||
|
num.Div(num, denom.SetUint64(config.BaseFeeChangeDenominator()))
|
||||||
|
baseFeeDelta := math.BigMax(num, common.Big1)
|
||||||
|
|
||||||
|
return num.Add(parent.BaseFee, baseFeeDelta)
|
||||||
|
} else {
|
||||||
|
// Otherwise if the parent block used less gas than its target, the baseFee should decrease.
|
||||||
|
// max(0, parentBaseFee * gasUsedDelta / parentGasTarget / baseFeeChangeDenominator)
|
||||||
|
num.SetUint64(parentGasTarget - parent.GasUsed)
|
||||||
|
num.Mul(num, parent.BaseFee)
|
||||||
|
num.Div(num, denom.SetUint64(parentGasTarget))
|
||||||
|
num.Div(num, denom.SetUint64(config.BaseFeeChangeDenominator()))
|
||||||
|
baseFee := num.Sub(parent.BaseFee, num)
|
||||||
|
|
||||||
|
return math.BigMax(baseFee, common.Big0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -136,11 +136,11 @@ func newMockState(t *testing.T) *mockState {
|
||||||
|
|
||||||
preState.AddBalance(premineKeyAddr, big.NewInt(1000000000000000000))
|
preState.AddBalance(premineKeyAddr, big.NewInt(1000000000000000000))
|
||||||
|
|
||||||
root, err := preState.Commit(true)
|
root, err := preState.Commit(1, true)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// for the sake of this test, we only need all the forks enabled
|
// for the sake of this test, we only need all the forks enabled
|
||||||
chainConfig := params.SuaveChainConfig
|
chainConfig := params.TestChainConfig
|
||||||
|
|
||||||
// Disable london so that we do not check gasFeeCap (TODO: Fix)
|
// Disable london so that we do not check gasFeeCap (TODO: Fix)
|
||||||
chainConfig.LondonBlock = big.NewInt(100)
|
chainConfig.LondonBlock = big.NewInt(100)
|
||||||
|
|
|
||||||
50
suave/core/types.go
Normal file
50
suave/core/types.go
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
package suave
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/beacon/engine"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
builder "github.com/ethereum/go-ethereum/suave/builder/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
var AllowedPeekerAny = common.HexToAddress("0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829") // "*"
|
||||||
|
|
||||||
|
type Bytes = hexutil.Bytes
|
||||||
|
type DataId = types.DataId
|
||||||
|
|
||||||
|
type DataRecord struct {
|
||||||
|
Id types.DataId
|
||||||
|
Salt types.DataId
|
||||||
|
DecryptionCondition uint64
|
||||||
|
AllowedPeekers []common.Address
|
||||||
|
AllowedStores []common.Address
|
||||||
|
Version string
|
||||||
|
CreationTx *types.Transaction
|
||||||
|
Signature []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *DataRecord) ToInnerRecord() types.DataRecord {
|
||||||
|
return types.DataRecord{
|
||||||
|
Id: b.Id,
|
||||||
|
Salt: b.Salt,
|
||||||
|
DecryptionCondition: b.DecryptionCondition,
|
||||||
|
AllowedPeekers: b.AllowedPeekers,
|
||||||
|
AllowedStores: b.AllowedStores,
|
||||||
|
Version: b.Version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type MEVMBid = types.DataRecord
|
||||||
|
|
||||||
|
type BuildBlockArgs = types.BuildBlockArgs
|
||||||
|
|
||||||
|
type ConfidentialEthBackend interface {
|
||||||
|
BuildEthBlock(ctx context.Context, args *BuildBlockArgs, txs types.Transactions) (*engine.ExecutionPayloadEnvelope, error)
|
||||||
|
BuildEthBlockFromBundles(ctx context.Context, args *BuildBlockArgs, bundles []types.SBundle) (*engine.ExecutionPayloadEnvelope, error)
|
||||||
|
Call(ctx context.Context, contractAddr common.Address, input []byte) ([]byte, error)
|
||||||
|
|
||||||
|
builder.API
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue