Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 9499bee

Browse files
Ruteriavalonche
authored andcommitted
Add more explicit builder flags and other QoL improvements (#20)
1 parent fa502e6 commit 9499bee

File tree

4 files changed

+117
-81
lines changed

4 files changed

+117
-81
lines changed

builder/builder.go

Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -63,82 +63,92 @@ func NewBuilder(sk *bls.SecretKey, bc IBeaconClient, relay IRelay, builderSignin
6363
}
6464
}
6565

66-
func (b *Builder) OnPayloadAttribute(attrs *BuilderPayloadAttributes) error {
67-
if attrs != nil {
68-
vd, err := b.relay.GetValidatorForSlot(attrs.Slot)
69-
if err != nil {
70-
log.Info("could not get validator while submitting block", "err", err, "slot", attrs.Slot)
71-
return err
72-
}
73-
74-
attrs.SuggestedFeeRecipient = [20]byte(vd.FeeRecipient)
75-
attrs.GasLimit = vd.GasLimit
76-
77-
if b.eth.Synced() {
78-
parentBlock := b.eth.GetBlockByHash(attrs.HeadHash)
79-
if parentBlock == nil {
80-
log.Info("Block hash not found in blocktree", "head block hash", attrs.HeadHash)
81-
return err
82-
}
83-
84-
executableData, block := b.eth.BuildBlock(attrs)
85-
if executableData == nil || block == nil {
86-
log.Error("did not receive the payload")
87-
return errors.New("could not build block")
88-
}
89-
payload, err := executableDataToExecutionPayload(executableData)
90-
if err != nil {
91-
log.Error("could not format execution payload", "err", err)
92-
return err
93-
}
94-
95-
pubkey, err := boostTypes.HexToPubkey(string(vd.Pubkey))
96-
if err != nil {
97-
log.Error("could not parse pubkey", "err", err, "pubkey", vd.Pubkey)
98-
return err
99-
}
100-
101-
value := new(boostTypes.U256Str)
102-
err = value.FromBig(block.Profit)
103-
if err != nil {
104-
log.Error("could not set block value", "err", err)
105-
return err
106-
}
107-
108-
blockBidMsg := boostTypes.BidTrace{
109-
Slot: attrs.Slot,
110-
ParentHash: payload.ParentHash,
111-
BlockHash: payload.BlockHash,
112-
BuilderPubkey: b.builderPublicKey,
113-
ProposerPubkey: pubkey,
114-
ProposerFeeRecipient: boostTypes.Address(attrs.SuggestedFeeRecipient),
115-
GasLimit: executableData.GasLimit,
116-
GasUsed: executableData.GasUsed,
117-
Value: *value,
118-
}
119-
120-
signature, err := boostTypes.SignMessage(&blockBidMsg, b.builderSigningDomain, b.builderSecretKey)
121-
if err != nil {
122-
log.Error("could not sign builder bid", "err", err)
123-
return err
124-
}
125-
126-
blockSubmitReq := boostTypes.BuilderSubmitBlockRequest{
127-
Signature: signature,
128-
Message: &blockBidMsg,
129-
ExecutionPayload: payload,
130-
}
131-
132-
err = b.relay.SubmitBlock(&blockSubmitReq)
133-
if err != nil {
134-
log.Error("could not submit block", "err", err)
135-
return err
136-
}
137-
}
66+
func (b *Builder) onSealedBlock(executableData *beacon.ExecutableDataV1, block *types.Block, proposerPubkey boostTypes.PublicKey, proposerFeeRecipient boostTypes.Address, slot uint64) error {
67+
payload, err := executableDataToExecutionPayload(executableData)
68+
if err != nil {
69+
log.Error("could not format execution payload", "err", err)
70+
return err
71+
}
72+
73+
value := new(boostTypes.U256Str)
74+
err = value.FromBig(block.Profit)
75+
if err != nil {
76+
log.Error("could not set block value", "err", err)
77+
return err
13878
}
79+
80+
blockBidMsg := boostTypes.BidTrace{
81+
Slot: slot,
82+
ParentHash: payload.ParentHash,
83+
BlockHash: payload.BlockHash,
84+
BuilderPubkey: b.builderPublicKey,
85+
ProposerPubkey: proposerPubkey,
86+
ProposerFeeRecipient: proposerFeeRecipient,
87+
GasLimit: executableData.GasLimit,
88+
GasUsed: executableData.GasUsed,
89+
Value: *value,
90+
}
91+
92+
signature, err := boostTypes.SignMessage(&blockBidMsg, b.builderSigningDomain, b.builderSecretKey)
93+
if err != nil {
94+
log.Error("could not sign builder bid", "err", err)
95+
return err
96+
}
97+
98+
blockSubmitReq := boostTypes.BuilderSubmitBlockRequest{
99+
Signature: signature,
100+
Message: &blockBidMsg,
101+
ExecutionPayload: payload,
102+
}
103+
104+
err = b.relay.SubmitBlock(&blockSubmitReq)
105+
if err != nil {
106+
log.Error("could not submit block", "err", err)
107+
return err
108+
}
109+
139110
return nil
140111
}
141112

113+
func (b *Builder) OnPayloadAttribute(attrs *BuilderPayloadAttributes) error {
114+
if attrs == nil {
115+
return nil
116+
}
117+
118+
vd, err := b.relay.GetValidatorForSlot(attrs.Slot)
119+
if err != nil {
120+
log.Info("could not get validator while submitting block", "err", err, "slot", attrs.Slot)
121+
return err
122+
}
123+
124+
attrs.SuggestedFeeRecipient = [20]byte(vd.FeeRecipient)
125+
attrs.GasLimit = vd.GasLimit
126+
127+
proposerPubkey, err := boostTypes.HexToPubkey(string(vd.Pubkey))
128+
if err != nil {
129+
log.Error("could not parse pubkey", "err", err, "pubkey", vd.Pubkey)
130+
return err
131+
}
132+
133+
if !b.eth.Synced() {
134+
return errors.New("backend not Synced")
135+
}
136+
137+
parentBlock := b.eth.GetBlockByHash(attrs.HeadHash)
138+
if parentBlock == nil {
139+
log.Info("Block hash not found in blocktree", "head block hash", attrs.HeadHash)
140+
return errors.New("parent block not found in blocktree")
141+
}
142+
143+
executableData, block := b.eth.BuildBlock(attrs)
144+
if executableData == nil || block == nil {
145+
log.Error("did not receive the payload")
146+
return errors.New("could not build block")
147+
}
148+
149+
return b.onSealedBlock(executableData, block, proposerPubkey, vd.FeeRecipient, attrs.Slot)
150+
}
151+
142152
func executableDataToExecutionPayload(data *beacon.ExecutableDataV1) (*boostTypes.ExecutionPayload, error) {
143153
transactionData := make([]hexutil.Bytes, len(data.Transactions))
144154
for i, tx := range data.Transactions {

builder/service.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ type Service struct {
4141
}
4242

4343
func (s *Service) Start() {
44-
log.Info("Service started")
45-
go s.srv.ListenAndServe()
44+
if s.srv != nil {
45+
log.Info("Service started")
46+
go s.srv.ListenAndServe()
47+
}
4648
}
4749

4850
func (s *Service) PayloadAttributes(payloadAttributes *BuilderPayloadAttributes) error {
@@ -65,8 +67,9 @@ func getRouter(localRelay *LocalRelay) http.Handler {
6567
}
6668

6769
func NewService(listenAddr string, localRelay *LocalRelay, builder *Builder) *Service {
68-
return &Service{
69-
srv: &http.Server{
70+
var srv *http.Server
71+
if localRelay != nil {
72+
srv = &http.Server{
7073
Addr: listenAddr,
7174
Handler: getRouter(localRelay),
7275
/*
@@ -75,13 +78,19 @@ func NewService(listenAddr string, localRelay *LocalRelay, builder *Builder) *Se
7578
WriteTimeout:
7679
IdleTimeout:
7780
*/
78-
},
81+
}
82+
}
83+
84+
return &Service{
85+
srv: srv,
7986
builder: builder,
8087
}
8188
}
8289

8390
type BuilderConfig struct {
91+
Enabled bool
8492
EnableValidatorChecks bool
93+
EnableLocalRelay bool
8594
BuilderSecretKey string
8695
RelaySecretKey string
8796
ListenAddr string
@@ -134,13 +143,18 @@ func Register(stack *node.Node, backend *eth.Ethereum, cfg *BuilderConfig) error
134143

135144
beaconClient := NewBeaconClient(cfg.BeaconEndpoint)
136145

137-
localRelay := NewLocalRelay(relaySk, beaconClient, builderSigningDomain, proposerSigningDomain, ForkData{cfg.GenesisForkVersion, cfg.BellatrixForkVersion, cfg.GenesisValidatorsRoot}, cfg.EnableValidatorChecks)
146+
var localRelay *LocalRelay
147+
if cfg.EnableLocalRelay {
148+
localRelay = NewLocalRelay(relaySk, beaconClient, builderSigningDomain, proposerSigningDomain, ForkData{cfg.GenesisForkVersion, cfg.BellatrixForkVersion, cfg.GenesisValidatorsRoot}, cfg.EnableValidatorChecks)
149+
}
138150

139151
var relay IRelay
140152
if cfg.RemoteRelayEndpoint != "" {
141153
relay = NewRemoteRelay(cfg.RemoteRelayEndpoint, localRelay)
142-
} else {
154+
} else if localRelay != nil {
143155
relay = localRelay
156+
} else {
157+
return errors.New("neither local nor remote relay specified")
144158
}
145159

146160
ethereumService := NewEthereumService(backend)

cmd/geth/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,9 @@ var (
153153
}, utils.NetworkFlags, utils.DatabasePathFlags)
154154

155155
builderApiFlags = []cli.Flag{
156+
utils.BuilderEnabled,
156157
utils.BuilderEnableValidatorChecks,
158+
utils.BuilderEnableLocalRelay,
157159
utils.BuilderSecretKey,
158160
utils.BuilderRelaySecretKey,
159161
utils.BuilderListenAddr,

cmd/utils/flags.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,18 @@ var (
668668
Category: flags.MiscCategory,
669669
}
670670
// Builder API settings
671+
BuilderEnabled = &cli.BoolFlag{
672+
Name: "builder",
673+
Usage: "Enable the builder",
674+
}
671675
BuilderEnableValidatorChecks = &cli.BoolFlag{
672676
Name: "builder.validator_checks",
673677
Usage: "Enable the validator checks",
674678
}
679+
BuilderEnableLocalRelay = &cli.BoolFlag{
680+
Name: "builder.local_relay",
681+
Usage: "Enable the local relay",
682+
}
675683
BuilderSecretKey = &cli.StringFlag{
676684
Name: "builder.secret_key",
677685
Usage: "Builder key used for signing blocks",
@@ -2067,8 +2075,10 @@ func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, bpCfg *builder.
20672075
Fatalf("Failed to register the Engine API service: %v", err)
20682076
}
20692077

2070-
if err := builder.Register(stack, backend, bpCfg); err != nil {
2071-
Fatalf("Failed to register the builder service: %v", err)
2078+
if bpCfg.Enabled {
2079+
if err := builder.Register(stack, backend, bpCfg); err != nil {
2080+
Fatalf("Failed to register the builder service: %v", err)
2081+
}
20722082
}
20732083

20742084
stack.RegisterAPIs(tracers.APIs(backend.APIBackend))

0 commit comments

Comments
 (0)