execution_proxy.go 1.01 KB
Newer Older
1 2 3 4 5 6 7
package rpc

import (
	"context"

	"github.com/ethereum/go-ethereum/ethclient"
	"github.com/ethereum/go-ethereum/log"
8
	"github.com/ethereum/go-ethereum/rpc"
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
)

var ExecutionRPCNamespace = "eth"

// ExecutionProxyBackend implements an execution rpc proxy with a leadership check before each call.
type ExecutionProxyBackend struct {
	log    log.Logger
	con    conductor
	client *ethclient.Client
}

var _ ExecutionProxyAPI = (*ExecutionProxyBackend)(nil)

func NewExecutionProxyBackend(log log.Logger, con conductor, client *ethclient.Client) *ExecutionProxyBackend {
	return &ExecutionProxyBackend{
		log:    log,
		con:    con,
		client: client,
	}
}

30 31 32
func (api *ExecutionProxyBackend) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) {
	var result map[string]interface{}
	err := api.client.Client().Call(&result, "eth_getBlockByNumber", number, fullTx)
33 34 35 36 37 38
	if err != nil {
		return nil, err
	}
	if !api.con.Leader(ctx) {
		return nil, ErrNotLeader
	}
39
	return result, nil
40
}