diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go index e88d16449b3b1349635b86469f538d7658242ce5..91bc7e0058aa7d967f3313ebe3075713903f4e60 100644 --- a/cmd/hack/hack.go +++ b/cmd/hack/hack.go @@ -1689,7 +1689,7 @@ func readCallTraces(chaindata string, block uint64) error { if err2 != nil { return err2 } - var acc common.Address = common.HexToAddress("0x511bc4556d823ae99630ae8de28b9b80df90ea2e") + var acc = common.HexToAddress("0x511bc4556d823ae99630ae8de28b9b80df90ea2e") for k, v, err = idxCursor.Seek(acc[:]); k != nil && err == nil && bytes.HasPrefix(k, acc[:]); k, v, err = idxCursor.Next() { bm := roaring64.New() _, err = bm.ReadFrom(bytes.NewReader(v)) @@ -1994,9 +1994,9 @@ func scanTxs(chaindata string) error { } func scanReceipts3(chaindata string, block uint64) error { - dbdb := mdbx.MustOpen(chaindata) - defer dbdb.Close() - tx, err := dbdb.BeginRw(context.Background()) + db := mdbx.MustOpen(chaindata) + defer db.Close() + tx, err := db.BeginRw(context.Background()) if err != nil { return err } @@ -2255,6 +2255,27 @@ func runBlock(ibs *state.IntraBlockState, txnWriter state.StateWriter, blockWrit return receipts, nil } +func devTx(chaindata string) error { + db := mdbx.MustOpen(chaindata) + defer db.Close() + tx, err := db.BeginRo(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + b, err := rawdb.ReadBlockByNumber(tx, 0) + tool.Check(err) + cc, err := rawdb.ReadChainConfig(tx, b.Hash()) + tool.Check(err) + txn := types.NewTransaction(1, common.Address{}, uint256.NewInt(100), 100_000, uint256.NewInt(1), []byte{1}) + signedTx, err := types.SignTx(txn, *types.LatestSigner(cc), core.DevnetSignPrivateKey) + tool.Check(err) + buf := bytes.NewBuffer(nil) + err = signedTx.MarshalBinary(buf) + tool.Check(err) + fmt.Printf("%x\n", buf.Bytes()) + return nil +} func main() { flag.Parse() @@ -2414,6 +2435,9 @@ func main() { case "scanReceipts3": err = scanReceipts3(*chaindata, uint64(*block)) + + case "devTx": + err = devTx(*chaindata) } if err != nil { diff --git a/eth/backend.go b/eth/backend.go index 7ce61817f6009aa6844e5ecb4fa1f520149783ff..fd22d8973b25408d8fbac2e8dcf0c411ebf1a2ac 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -491,6 +491,12 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere if err := miningRPC.(*privateapi.MiningServer).BroadcastMinedBlock(b); err != nil { log.Error("txpool rpc mined block broadcast", "err", err) } + if err := backend.downloadServer.Hd.AddMinedBlock(b); err != nil { + log.Error("add mined block to header downloader", "err", err) + } + if err := backend.downloadServer.Bd.AddMinedBlock(b); err != nil { + log.Error("add mined block to body downloader", "err", err) + } case b := <-backend.pendingBlocks: if err := miningRPC.(*privateapi.MiningServer).BroadcastPendingBlock(b); err != nil { diff --git a/turbo/stages/bodydownload/body_algos.go b/turbo/stages/bodydownload/body_algos.go index 699a03269d12d29a8868897673260f445c8c69da..9eebc2d5f8bbc2a2e59e7400baf4ace5c2300755 100644 --- a/turbo/stages/bodydownload/body_algos.go +++ b/turbo/stages/bodydownload/body_algos.go @@ -371,3 +371,8 @@ func (bd *BodyDownload) AddToPrefetch(block *types.Block) { } bd.prefetchedBlocks.Add(block) } + +func (bd *BodyDownload) AddMinedBlock(block *types.Block) error { + bd.AddToPrefetch(block) + return nil +} diff --git a/turbo/stages/headerdownload/header_algos.go b/turbo/stages/headerdownload/header_algos.go index aacbc632943e7fc2979d37b4250c85c43136fbf2..5b19b500e5e27085b270120dedaf94de9a94d779 100644 --- a/turbo/stages/headerdownload/header_algos.go +++ b/turbo/stages/headerdownload/header_algos.go @@ -963,6 +963,22 @@ func (hd *HeaderDownload) Fetching() bool { return hd.fetching } +func (hd *HeaderDownload) AddMinedBlock(block *types.Block) error { + buf := bytes.NewBuffer(nil) + if err := block.Header().EncodeRLP(buf); err != nil { + return err + } + segments, _, err := hd.SingleHeaderAsSegment(buf.Bytes(), block.Header()) + if err != nil { + return err + } + + for _, segment := range segments { + _, _ = hd.ProcessSegment(segment, false /* newBlock */, "miner") + } + return nil +} + func DecodeTips(encodings []string) (map[common.Hash]HeaderRecord, error) { hardTips := make(map[common.Hash]HeaderRecord, len(encodings)) diff --git a/turbo/stages/headerdownload/header_data_struct.go b/turbo/stages/headerdownload/header_data_struct.go index 6197f6e6e9b067a9b11360e9586968f114f9f1cc..c3e6dbc41d824d6504ea5bea9fbfe3ffebc907d1 100644 --- a/turbo/stages/headerdownload/header_data_struct.go +++ b/turbo/stages/headerdownload/header_data_struct.go @@ -252,7 +252,7 @@ func (pp PeerPenalty) String() string { return fmt.Sprintf("peerPenalty{peer: %d, penalty: %s, err: %v}", pp.peerHandle, pp.penalty, pp.err) } -// HeaderInserter incapsulates necessary variable for inserting header records to the database, abstracting away the source of these headers +// HeaderInserter encapsulates necessary variable for inserting header records to the database, abstracting away the source of these headers // The headers are "fed" by repeatedly calling the FeedHeader function. type HeaderInserter struct { localTd *big.Int