Skip to content

Commit 7fcf7db

Browse files
authored
Merge pull request #746 from ethpandaops/glamsterdam-devnet-6
glamsterdam devnet 6 (spec `v1.7.0-alpha.11`)
2 parents 0e63023 + 6608e1e commit 7fcf7db

85 files changed

Lines changed: 7009 additions & 642 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

blockdb/types/execdata_sections_ssz.go

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

clients/consensus/chainspec.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,13 @@ type ChainSpecPreset struct {
228228
NumberOfColumns *uint64 `yaml:"NUMBER_OF_COLUMNS" check-if-fork:"FuluForkEpoch"`
229229

230230
// Gloas
231-
PtcSize uint64 `yaml:"PTC_SIZE" check-if-fork:"GloasForkEpoch"`
232-
MaxPayloadAttestations uint64 `yaml:"MAX_PAYLOAD_ATTESTATIONS" check-if-fork:"GloasForkEpoch"`
233-
BuilderRegistryLimit uint64 `yaml:"BUILDER_REGISTRY_LIMIT" check-if-fork:"GloasForkEpoch"`
234-
BuilderPendingWithdrawalsLimit uint64 `yaml:"BUILDER_PENDING_WITHDRAWALS_LIMIT" check-if-fork:"GloasForkEpoch"`
235-
MaxBuildersPerWithdrawalsSweep uint64 `yaml:"MAX_BUILDERS_PER_WITHDRAWALS_SWEEP" check-if-fork:"GloasForkEpoch"`
231+
PtcSize uint64 `yaml:"PTC_SIZE" check-if-fork:"GloasForkEpoch"`
232+
MaxPayloadAttestations uint64 `yaml:"MAX_PAYLOAD_ATTESTATIONS" check-if-fork:"GloasForkEpoch"`
233+
BuilderRegistryLimit uint64 `yaml:"BUILDER_REGISTRY_LIMIT" check-if-fork:"GloasForkEpoch"`
234+
BuilderPendingWithdrawalsLimit uint64 `yaml:"BUILDER_PENDING_WITHDRAWALS_LIMIT" check-if-fork:"GloasForkEpoch"`
235+
MaxBuildersPerWithdrawalsSweep uint64 `yaml:"MAX_BUILDERS_PER_WITHDRAWALS_SWEEP" check-if-fork:"GloasForkEpoch"`
236+
MaxBuilderDepositRequestsPerPayload uint64 `yaml:"MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD" check-if-fork:"GloasForkEpoch"`
237+
MaxBuilderExitRequestsPerPayload uint64 `yaml:"MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD" check-if-fork:"GloasForkEpoch"`
236238

237239
// Heze
238240
InclusionListCommitteeSize uint64 `yaml:"INCLUSION_LIST_COMMITTEE_SIZE" check-if-fork:"HezeForkEpoch"`

clients/execution/chainstate.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import (
1414
)
1515

1616
var DefaultSystemContractAddresses = map[string]common.Address{
17-
rpc.ConsolidationRequestContract: common.HexToAddress("0x0000BBdDc7CE488642fb579F8B00f3a590007251"),
18-
rpc.WithdrawalRequestContract: common.HexToAddress("0x00000961Ef480Eb55e80D19ad83579A64c007002"),
19-
rpc.BeaconRootsContract: common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02"),
20-
rpc.HistoryStorageContract: common.HexToAddress("0x0000F90827F1C53a10cb7A02335B175320002935"),
17+
rpc.ConsolidationRequestContract: common.HexToAddress("0x0000BBdDc7CE488642fb579F8B00f3a590007251"),
18+
rpc.WithdrawalRequestContract: common.HexToAddress("0x00000961Ef480Eb55e80D19ad83579A64c007002"),
19+
rpc.BuilderDepositRequestContract: common.HexToAddress("0x0000884d2AA32eAa155F59A2f24eFa73D9008282"),
20+
rpc.BuilderExitRequestContract: common.HexToAddress("0x000014574A74c805590AFF9499fc7A690f008282"),
21+
rpc.BeaconRootsContract: common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02"),
22+
rpc.HistoryStorageContract: common.HexToAddress("0x0000F90827F1C53a10cb7A02335B175320002935"),
2123
}
2224

2325
type ChainState struct {

clients/execution/clientlogic.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -270,20 +270,16 @@ func (client *Client) pollClientHead() error {
270270
ctx, cancel := context.WithTimeout(client.clientCtx, 10*time.Second)
271271
defer cancel()
272272

273-
latestHeader, err := client.rpcClient.GetLatestHeader(ctx)
273+
headNumber, headHash, err := client.rpcClient.GetLatestHead(ctx)
274274
if err != nil {
275-
return fmt.Errorf("could not get latest header: %v", err)
276-
}
277-
278-
if latestHeader == nil {
279-
return fmt.Errorf("could not find latest header")
275+
return fmt.Errorf("could not get latest head: %v", err)
280276
}
281277

282278
client.headMutex.Lock()
283279
defer client.headMutex.Unlock()
284280

285-
client.headNumber = latestHeader.Number.Uint64()
286-
client.headHash = latestHeader.Hash()
281+
client.headNumber = headNumber
282+
client.headHash = headHash
287283

288284
return nil
289285
}

clients/execution/rpc/ethconfig.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
)
99

1010
const (
11-
DepositContract = "DEPOSIT_CONTRACT_ADDRESS"
12-
ConsolidationRequestContract = "CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS"
13-
WithdrawalRequestContract = "WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS"
14-
BeaconRootsContract = "BEACON_ROOTS_ADDRESS"
15-
HistoryStorageContract = "HISTORY_STORAGE_ADDRESS"
11+
DepositContract = "DEPOSIT_CONTRACT_ADDRESS"
12+
ConsolidationRequestContract = "CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS"
13+
WithdrawalRequestContract = "WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS"
14+
BuilderDepositRequestContract = "BUILDER_DEPOSIT_REQUEST_PREDEPLOY_ADDRESS"
15+
BuilderExitRequestContract = "BUILDER_EXIT_REQUEST_PREDEPLOY_ADDRESS"
16+
BeaconRootsContract = "BEACON_ROOTS_ADDRESS"
17+
HistoryStorageContract = "HISTORY_STORAGE_ADDRESS"
1618
)
1719

1820
type EthConfigFork struct {

clients/execution/rpc/executionapi.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strconv"
99

1010
"github.com/ethereum/go-ethereum/common"
11+
"github.com/ethereum/go-ethereum/common/hexutil"
1112
"github.com/ethereum/go-ethereum/core/types"
1213
"github.com/ethereum/go-ethereum/ethclient"
1314
"github.com/ethereum/go-ethereum/p2p"
@@ -192,13 +193,26 @@ func (ec *ExecutionClient) UninstallBlockFilter(ctx context.Context, filterId Bl
192193
return result, err
193194
}
194195

195-
func (ec *ExecutionClient) GetLatestHeader(ctx context.Context) (*types.Header, error) {
196-
header, err := ec.ethClient.HeaderByNumber(ctx, nil)
196+
// GetLatestHead returns the latest block's number and hash as reported by the
197+
// execution node. The hash is read from the node's response rather than
198+
// recomputed from the header locally, which would be wrong whenever the header
199+
// carries fields the local go-ethereum types do not know about.
200+
func (ec *ExecutionClient) GetLatestHead(ctx context.Context) (uint64, common.Hash, error) {
201+
var head struct {
202+
Number *hexutil.Big `json:"number"`
203+
Hash common.Hash `json:"hash"`
204+
}
205+
206+
err := ec.rpcClient.CallContext(ctx, &head, "eth_getBlockByNumber", "latest", false)
197207
if err != nil {
198-
return nil, err
208+
return 0, common.Hash{}, err
199209
}
200210

201-
return header, nil
211+
if head.Number == nil {
212+
return 0, common.Hash{}, fmt.Errorf("no latest block returned")
213+
}
214+
215+
return head.Number.ToInt().Uint64(), head.Hash, nil
202216
}
203217

204218
func (ec *ExecutionClient) GetLatestBlock(ctx context.Context) (*types.Block, error) {

cmd/dora-explorer/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,10 @@ func startFrontend(router *mux.Router) {
236236
router.HandleFunc("/validator/{idxOrPubKey}", handlers.Validator).Methods("GET")
237237
router.HandleFunc("/validator/{index}/slots", handlers.ValidatorSlots).Methods("GET")
238238
router.HandleFunc("/builders", handlers.Builders).Methods("GET")
239+
router.HandleFunc("/builders/deposits", handlers.BuilderDeposits).Methods("GET")
240+
router.HandleFunc("/builders/exits", handlers.BuilderExits).Methods("GET")
241+
router.HandleFunc("/builders/submit_deposit", handlers.SubmitBuilderDeposit).Methods("GET")
242+
router.HandleFunc("/builders/submit_exit", handlers.SubmitBuilderExit).Methods("GET")
239243
router.HandleFunc("/builder/{idxOrPubKey}", handlers.BuilderDetail).Methods("GET")
240244

241245
if utils.Config.Frontend.Pprof {

db/builder_deposit_request_txs.go

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package db
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
8+
"github.com/ethpandaops/dora/dbtypes"
9+
"github.com/jmoiron/sqlx"
10+
)
11+
12+
func InsertBuilderDepositTxs(ctx context.Context, tx *sqlx.Tx, depositTxs []*dbtypes.BuilderDepositTx) error {
13+
var sql strings.Builder
14+
fmt.Fprint(&sql,
15+
EngineQuery(map[dbtypes.DBEngineType]string{
16+
dbtypes.DBEnginePgsql: "INSERT INTO builder_deposit_request_txs ",
17+
dbtypes.DBEngineSqlite: "INSERT OR REPLACE INTO builder_deposit_request_txs ",
18+
}),
19+
"(block_number, block_index, block_time, block_root, fork_id, public_key, withdrawal_credentials, amount, signature, builder_index, tx_hash, tx_sender, tx_target, dequeue_block)",
20+
" VALUES ",
21+
)
22+
argIdx := 0
23+
fieldCount := 14
24+
25+
args := make([]any, len(depositTxs)*fieldCount)
26+
for i, depositTx := range depositTxs {
27+
if i > 0 {
28+
fmt.Fprintf(&sql, ", ")
29+
}
30+
fmt.Fprintf(&sql, "(")
31+
for f := 0; f < fieldCount; f++ {
32+
if f > 0 {
33+
fmt.Fprintf(&sql, ", ")
34+
}
35+
fmt.Fprintf(&sql, "$%v", argIdx+f+1)
36+
}
37+
fmt.Fprintf(&sql, ")")
38+
39+
args[argIdx+0] = depositTx.BlockNumber
40+
args[argIdx+1] = depositTx.BlockIndex
41+
args[argIdx+2] = depositTx.BlockTime
42+
args[argIdx+3] = depositTx.BlockRoot
43+
args[argIdx+4] = depositTx.ForkId
44+
args[argIdx+5] = depositTx.PublicKey
45+
args[argIdx+6] = depositTx.WithdrawalCredentials
46+
args[argIdx+7] = depositTx.Amount
47+
args[argIdx+8] = depositTx.Signature
48+
args[argIdx+9] = depositTx.BuilderIndex
49+
args[argIdx+10] = depositTx.TxHash
50+
args[argIdx+11] = depositTx.TxSender
51+
args[argIdx+12] = depositTx.TxTarget
52+
args[argIdx+13] = depositTx.DequeueBlock
53+
argIdx += fieldCount
54+
}
55+
fmt.Fprint(&sql, EngineQuery(map[dbtypes.DBEngineType]string{
56+
dbtypes.DBEnginePgsql: " ON CONFLICT (block_root, block_index) DO UPDATE SET builder_index = excluded.builder_index, dequeue_block = excluded.dequeue_block, fork_id = excluded.fork_id",
57+
dbtypes.DBEngineSqlite: "",
58+
}))
59+
60+
_, err := tx.ExecContext(ctx, sql.String(), args...)
61+
if err != nil {
62+
return err
63+
}
64+
return nil
65+
}
66+
67+
func GetBuilderDepositTxsByDequeueRange(ctx context.Context, dequeueFirst uint64, dequeueLast uint64) []*dbtypes.BuilderDepositTx {
68+
depositTxs := []*dbtypes.BuilderDepositTx{}
69+
70+
err := ReaderDb.SelectContext(ctx, &depositTxs, `SELECT builder_deposit_request_txs.*
71+
FROM builder_deposit_request_txs
72+
WHERE dequeue_block >= $1 AND dequeue_block <= $2
73+
ORDER BY dequeue_block ASC, block_number ASC, block_index ASC
74+
`, dequeueFirst, dequeueLast)
75+
if err != nil {
76+
logger.Errorf("Error while fetching builder deposit txs: %v", err)
77+
return nil
78+
}
79+
80+
return depositTxs
81+
}
82+
83+
func GetBuilderDepositTxsByTxHashes(ctx context.Context, txHashes [][]byte) []*dbtypes.BuilderDepositTx {
84+
var sql strings.Builder
85+
args := make([]any, len(txHashes))
86+
87+
fmt.Fprint(&sql, `SELECT builder_deposit_request_txs.*
88+
FROM builder_deposit_request_txs
89+
WHERE tx_hash IN (
90+
`)
91+
92+
for idx, txHash := range txHashes {
93+
args[idx] = txHash
94+
}
95+
appendDollarPlaceholders(&sql, 1, len(txHashes), ", ")
96+
fmt.Fprintf(&sql, ")")
97+
98+
depositTxs := []*dbtypes.BuilderDepositTx{}
99+
err := ReaderDb.SelectContext(ctx, &depositTxs, sql.String(), args...)
100+
if err != nil {
101+
logger.Errorf("Error while fetching builder deposit txs: %v", err)
102+
return nil
103+
}
104+
105+
return depositTxs
106+
}
107+
108+
func GetBuilderDepositTxsFiltered(ctx context.Context, offset uint64, limit uint32, filter *dbtypes.BuilderDepositTxFilter) ([]*dbtypes.BuilderDepositTx, uint64, error) {
109+
var sql strings.Builder
110+
args := []interface{}{}
111+
fmt.Fprint(&sql, `
112+
WITH cte AS (
113+
SELECT
114+
block_number, block_index, block_time, block_root, fork_id, public_key, withdrawal_credentials, amount, signature, builder_index, tx_hash, tx_sender, tx_target, dequeue_block
115+
FROM builder_deposit_request_txs
116+
`)
117+
118+
filterOp := "WHERE"
119+
if filter.MinDequeue > 0 {
120+
args = append(args, filter.MinDequeue)
121+
fmt.Fprintf(&sql, " %v dequeue_block >= $%v", filterOp, len(args))
122+
filterOp = "AND"
123+
}
124+
if filter.MaxDequeue > 0 {
125+
args = append(args, filter.MaxDequeue)
126+
fmt.Fprintf(&sql, " %v dequeue_block <= $%v", filterOp, len(args))
127+
filterOp = "AND"
128+
}
129+
if len(filter.PublicKey) > 0 {
130+
args = append(args, filter.PublicKey)
131+
fmt.Fprintf(&sql, " %v public_key = $%v", filterOp, len(args))
132+
filterOp = "AND"
133+
}
134+
if filter.MinIndex > 0 {
135+
args = append(args, filter.MinIndex)
136+
fmt.Fprintf(&sql, " %v builder_index >= $%v", filterOp, len(args))
137+
filterOp = "AND"
138+
}
139+
if filter.MaxIndex > 0 {
140+
args = append(args, filter.MaxIndex)
141+
fmt.Fprintf(&sql, " %v builder_index <= $%v", filterOp, len(args))
142+
filterOp = "AND"
143+
}
144+
if filter.MinAmount != nil {
145+
args = append(args, *filter.MinAmount)
146+
fmt.Fprintf(&sql, " %v amount >= $%v", filterOp, len(args))
147+
filterOp = "AND"
148+
}
149+
if filter.MaxAmount != nil {
150+
args = append(args, *filter.MaxAmount)
151+
fmt.Fprintf(&sql, " %v amount <= $%v", filterOp, len(args))
152+
}
153+
154+
args = append(args, limit)
155+
fmt.Fprintf(&sql, `)
156+
SELECT
157+
count(*) AS block_number,
158+
0 AS block_index,
159+
0 AS block_time,
160+
null AS block_root,
161+
0 AS fork_id,
162+
null AS public_key,
163+
null AS withdrawal_credentials,
164+
0 AS amount,
165+
null AS signature,
166+
null AS builder_index,
167+
null AS tx_hash,
168+
null AS tx_sender,
169+
null AS tx_target,
170+
0 AS dequeue_block
171+
FROM cte
172+
UNION ALL SELECT * FROM (
173+
SELECT * FROM cte
174+
ORDER BY block_time DESC, block_index DESC
175+
LIMIT $%v
176+
`, len(args))
177+
178+
if offset > 0 {
179+
args = append(args, offset)
180+
fmt.Fprintf(&sql, " OFFSET $%v ", len(args))
181+
}
182+
fmt.Fprintf(&sql, ") AS t1")
183+
184+
depositTxs := []*dbtypes.BuilderDepositTx{}
185+
err := ReaderDb.SelectContext(ctx, &depositTxs, sql.String(), args...)
186+
if err != nil {
187+
logger.Errorf("Error while fetching filtered builder deposit txs: %v", err)
188+
return nil, 0, err
189+
}
190+
191+
return depositTxs[1:], depositTxs[0].BlockNumber, nil
192+
}

0 commit comments

Comments
 (0)