handle withdrawals

This commit is contained in:
Roy Crihfield 2024-05-10 17:24:34 +08:00
parent 8c274d0ad4
commit 07b9bbe940
7 changed files with 67 additions and 9 deletions

View File

@ -95,7 +95,7 @@ func init() {
func initConfig() { func initConfig() {
if cfgFile == "" && envFile == "" { if cfgFile == "" && envFile == "" {
log.Fatal("No configuration file specified, use --config , --env flag to provide configuration") log.Warn("No configuration file specified, use --config , --env flag to provide configuration")
} }
if cfgFile != "" { if cfgFile != "" {

View File

@ -60,6 +60,7 @@ func serve() {
logWithCommand.Fatal(err) logWithCommand.Fatal(err)
} }
logWithCommand.Debugf("server config: %+v", serverConfig) logWithCommand.Debugf("server config: %+v", serverConfig)
logWithCommand.Debugf("chain config: %+v", serverConfig.ChainConfig)
server, err := s.NewServer(serverConfig) server, err := s.NewServer(serverConfig)
if err != nil { if err != nil {
logWithCommand.Fatal(err) logWithCommand.Fatal(err)

View File

@ -1245,7 +1245,8 @@ func (pea *PublicEthAPI) rpcMarshalBlock(b *types.Block, inclTx bool, fullTx boo
if inclTx { if inclTx {
td, err := pea.B.GetTd(b.Hash()) td, err := pea.B.GetTd(b.Hash())
if err != nil { if err != nil {
log.Errorf("error getting td for block with hash and number %s, %s: %s", b.Hash().String(), b.Number().String(), err) err = fmt.Errorf("error getting TD for block at (%s, %s): %s", b.Number(), b.Hash(), err)
log.Error(err)
return nil, err return nil, err
} }
fields["totalDifficulty"] = (*hexutil.Big)(td) fields["totalDifficulty"] = (*hexutil.Big)(td)

View File

@ -271,7 +271,7 @@ func (b *Backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo
func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber) (*types.Block, error) { func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber) (*types.Block, error) {
number, err := b.NormalizeBlockNumber(blockNumber) number, err := b.NormalizeBlockNumber(blockNumber)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("failed to normalize block number: %w", err)
} }
canonicalHash, err := b.GetCanonicalHash(uint64(number)) canonicalHash, err := b.GetCanonicalHash(uint64(number))
if err != nil { if err != nil {
@ -349,11 +349,16 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo
return nil, err return nil, err
} }
// Placeholder for withdrawal processing (TODO) // Fetch withdrawals
var withdrawals types.Withdrawals var withdrawals types.Withdrawals
if b.Config.ChainConfig.IsShanghai(header.Number, header.Time) { if b.Config.ChainConfig.IsShanghai(header.Number, header.Time) {
// All blocks after Shanghai must include a withdrawals root. withdrawals, err = b.GetWithdrawals(tx, hash, blockNumber)
withdrawals = make(types.Withdrawals, 0) if err != nil && err != sql.ErrNoRows {
log.Error("error fetching withdrawals: ", err)
return nil, err
}
} else if len(withdrawals) > 0 {
return nil, errors.New("withdrawals set before Shanghai activation")
} }
// Compose everything together into a complete block // Compose everything together into a complete block
@ -501,6 +506,24 @@ func (b *Backend) GetReceiptsByBlockHashAndNumber(tx *sqlx.Tx, hash common.Hash,
return rcts, nil return rcts, nil
} }
// GetWithdrawals retrieves transactions for a provided block hash and number
func (b *Backend) GetWithdrawals(tx *sqlx.Tx, hash common.Hash, number uint64) (types.Withdrawals, error) {
_, rlpBytes, err := b.Retriever.RetrieveWithdrawals(tx, hash, number)
if err != nil {
return nil, err
}
withdrawals := make(types.Withdrawals, len(rlpBytes))
for i, bytes := range rlpBytes {
var withdrawal types.Withdrawal
if err := rlp.DecodeBytes(bytes, &withdrawal); err != nil {
return nil, err
}
withdrawals[i] = &withdrawal
}
return withdrawals, nil
}
// GetTransaction retrieves a tx by hash // GetTransaction retrieves a tx by hash
// It also returns the blockhash, blocknumber, and tx index associated with the transaction // It also returns the blockhash, blocknumber, and tx index associated with the transaction
func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (bool, *types.Transaction, common.Hash, uint64, uint64, error) { func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (bool, *types.Transaction, common.Hash, uint64, uint64, error) {

View File

@ -506,6 +506,24 @@ func (r *Retriever) RetrieveReceiptsByBlockHash(tx *sqlx.Tx, hash common.Hash) (
return cids, rcts, txs, nil return cids, rcts, txs, nil
} }
// RetrieveWithdrawals returns the CIDs and RLP bytes for the withdrawals corresponding to the
// provided block hash, number. Returned CIDs correspond to the leaf node data which contains the
// withdrawal object.
func (r *Retriever) RetrieveWithdrawals(tx *sqlx.Tx, hash common.Hash, number uint64) ([]string, [][]byte, error) {
results := make([]ipldResult, 0)
if err := tx.Select(&results, RetrieveWithdrawalsPgStr, hash.Hex(), number); err != nil {
return nil, nil, err
}
cids := make([]string, len(results))
withdrawals := make([][]byte, len(results))
for i, res := range results {
cids[i] = res.CID
withdrawals[i] = res.Data
}
return cids, withdrawals, nil
}
// RetrieveAccountByAddressAndBlockHash returns the cid and rlp bytes for the account corresponding to the provided address and block hash // RetrieveAccountByAddressAndBlockHash returns the cid and rlp bytes for the account corresponding to the provided address and block hash
// TODO: ensure this handles deleted accounts appropriately // TODO: ensure this handles deleted accounts appropriately
func (r *Retriever) RetrieveAccountByAddressAndBlockHash(address common.Address, hash common.Hash) (StateAccountRecord, error) { func (r *Retriever) RetrieveAccountByAddressAndBlockHash(address common.Address, hash common.Hash) (StateAccountRecord, error) {

View File

@ -107,6 +107,21 @@ WHERE header_cids.block_hash = $1
AND blocks.key = receipt_cids.cid AND blocks.key = receipt_cids.cid
ORDER BY eth.transaction_cids.index ASC ORDER BY eth.transaction_cids.index ASC
` `
RetrieveWithdrawalsPgStr = `
SELECT withdrawal_cids.cid,
blocks.data
FROM eth.withdrawal_cids
JOIN eth.header_cids
ON header_cids.block_hash = $1
AND header_cids.block_number = $2
AND header_cids.canonical
AND withdrawal_cids.block_number = header_cids.block_number
AND withdrawal_cids.header_id = header_cids.block_hash
JOIN ipld.blocks
ON blocks.block_number = header_cids.block_number
AND blocks.key = withdrawal_cids.cid
ORDER BY eth.withdrawal_cids.index ASC`
RetrieveAccountByLeafKeyAndBlockHashPgStr = ` RetrieveAccountByLeafKeyAndBlockHashPgStr = `
SELECT state_cids.nonce, SELECT state_cids.nonce,
state_cids.balance, state_cids.balance,

View File

@ -3,9 +3,9 @@ name: fixturenet-plugeth-tx
description: "Plugeth Ethereum Fixturenet for testing ipld-eth-server" description: "Plugeth Ethereum Fixturenet for testing ipld-eth-server"
repos: repos:
- git.vdb.to/cerc-io/plugeth@statediff-patches # todo: dev - git.vdb.to/cerc-io/plugeth@statediff-patches # todo: dev
- git.vdb.to/cerc-io/plugeth-statediff@update-czkg4844 # todo: dev - git.vdb.to/cerc-io/plugeth-statediff@index-withdrawals # todo: dev
- git.vdb.to/cerc-io/lighthouse - git.vdb.to/cerc-io/lighthouse
- git.vdb.to/cerc-io/ipld-eth-db@v5.2.1-alpha - git.vdb.to/cerc-io/ipld-eth-db@add-withdrawals # todo: dev
- git.vdb.to/cerc-io/ipld-eth-server - git.vdb.to/cerc-io/ipld-eth-server
containers: containers:
- cerc/plugeth-statediff - cerc/plugeth-statediff