diff --git a/README.md b/README.md
index 5ddc70a79e9d40dd79e57107bb03d459d10fb0e8..7a830d801e310cca60d5991a8e6d2fcd16b2c530 100644
--- a/README.md
+++ b/README.md
@@ -316,6 +316,14 @@ you'll have to change one if you want to run both at the same time. use `--help`
 
 Reserved for future use: **gRPC ports**: `9092` consensus engine, `9093` snapshot downloader, `9094` TxPool
 
+### How to get diagnostic for bug report?
+
+- Get stack trace: `kill -SIGUSR1 <pid>`, get trace and stop: `kill -6 <pid>`
+- Get CPU profiling: add `--pprof flag`
+  run `go tool pprof -png  http://127.0.0.1:6060/debug/pprof/profile\?seconds\=20 > cpu.png`
+- Get RAM profiling: add `--pprof flag`
+  run `go tool pprof -inuse_space -png  http://127.0.0.1:6060/debug/pprof/heap > mem.png`
+
 Getting in touch
 ================
 
diff --git a/cmd/prometheus/dashboards/erigon.json b/cmd/prometheus/dashboards/erigon.json
index e8633bea71d03116cfcb9a5b16f324161cd0cf5e..58591174036863e608fe6ec4977f0347cc1216e7 100644
--- a/cmd/prometheus/dashboards/erigon.json
+++ b/cmd/prometheus/dashboards/erigon.json
@@ -22,7 +22,7 @@
   "gnetId": null,
   "graphTooltip": 0,
   "id": 1,
-  "iteration": 1631701154074,
+  "iteration": 1631842473201,
   "links": [],
   "panels": [
     {
@@ -2388,32 +2388,7 @@
           },
           "unit": "s"
         },
-        "overrides": [
-          {
-            "__systemRef": "hideSeriesFrom",
-            "matcher": {
-              "id": "byNames",
-              "options": {
-                "mode": "exclude",
-                "names": [
-                  "pool_new_block: turbogeth16c.weblogix.it:6060"
-                ],
-                "prefix": "All except:",
-                "readOnly": true
-              }
-            },
-            "properties": [
-              {
-                "id": "custom.hideFrom",
-                "value": {
-                  "legend": false,
-                  "tooltip": false,
-                  "viz": true
-                }
-              }
-            ]
-          }
-        ]
+        "overrides": []
       },
       "gridPos": {
         "h": 8,
@@ -2637,7 +2612,7 @@
       },
       "gridPos": {
         "h": 6,
-        "w": 7,
+        "w": 8,
         "x": 0,
         "y": 67
       },
@@ -2722,8 +2697,8 @@
       },
       "gridPos": {
         "h": 6,
-        "w": 7,
-        "x": 7,
+        "w": 8,
+        "x": 8,
         "y": 67
       },
       "id": 180,
@@ -2809,14 +2784,40 @@
                 "value": 80
               }
             ]
-          }
+          },
+          "unit": "short"
         },
-        "overrides": []
+        "overrides": [
+          {
+            "__systemRef": "hideSeriesFrom",
+            "matcher": {
+              "id": "byNames",
+              "options": {
+                "mode": "exclude",
+                "names": [
+                  "keys: turbogeth16c.weblogix.it:6060 "
+                ],
+                "prefix": "All except:",
+                "readOnly": true
+              }
+            },
+            "properties": [
+              {
+                "id": "custom.hideFrom",
+                "value": {
+                  "legend": false,
+                  "tooltip": false,
+                  "viz": true
+                }
+              }
+            ]
+          }
+        ]
       },
       "gridPos": {
         "h": 6,
-        "w": 7,
-        "x": 14,
+        "w": 8,
+        "x": 16,
         "y": 67
       },
       "id": 181,
@@ -2836,7 +2837,7 @@
       "targets": [
         {
           "exemplar": true,
-          "expr": "rate(cache_keys_total{name=\"txpool\",instance=~\"$instance\"}[1m])",
+          "expr": "cache_keys_total{name=\"txpool\",instance=~\"$instance\"}",
           "hide": false,
           "interval": "",
           "legendFormat": "keys: {{ instance }} ",
@@ -2847,7 +2848,7 @@
           "expr": "rate(cache_timeout_total{name=\"txpool\",instance=~\"$instance\"}[1m])",
           "hide": false,
           "interval": "",
-          "legendFormat": "timeout: {{ instance }} ",
+          "legendFormat": "timeout/sec: {{ instance }} ",
           "refId": "B"
         }
       ],
@@ -2910,7 +2911,7 @@
       "gridPos": {
         "h": 6,
         "w": 8,
-        "x": 7,
+        "x": 8,
         "y": 73
       },
       "id": 178,
@@ -4949,7 +4950,7 @@
         "auto_count": 30,
         "auto_min": "10s",
         "current": {
-          "selected": true,
+          "selected": false,
           "text": "1m",
           "value": "1m"
         },
@@ -5024,7 +5025,7 @@
     ]
   },
   "time": {
-    "from": "now-1h",
+    "from": "now-12h",
     "to": "now"
   },
   "timepicker": {
@@ -5054,5 +5055,5 @@
   "timezone": "",
   "title": "Erigon Prometheus",
   "uid": "FPpjH6Hik",
-  "version": 34
+  "version": 35
 }
\ No newline at end of file
diff --git a/cmd/sentry/download/downloader.go b/cmd/sentry/download/downloader.go
index 31de56b07fd1cd48fc5ae80a3fe8644b39dfe614..9e30c1a5266867a19f9ad72943932754b1a46b47 100644
--- a/cmd/sentry/download/downloader.go
+++ b/cmd/sentry/download/downloader.go
@@ -385,7 +385,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se
 	//log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId)))
 	var request eth.NewBlockHashesPacket
 	if err := rlp.DecodeBytes(req.Data, &request); err != nil {
-		return fmt.Errorf("decode NewBlockHashes66: %v", err)
+		return fmt.Errorf("decode NewBlockHashes66: %w", err)
 	}
 	for _, announce := range request {
 		cs.Hd.SaveExternalAnnounce(announce.Hash)
@@ -403,7 +403,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se
 			},
 		})
 		if err != nil {
-			return fmt.Errorf("encode header request: %v", err)
+			return fmt.Errorf("encode header request: %w", err)
 		}
 		outreq := proto_sentry.SendMessageByIdRequest{
 			PeerId: req.PeerId,
@@ -417,7 +417,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se
 			if isPeerNotFoundErr(err) {
 				continue
 			}
-			return fmt.Errorf("send header request: %v", err)
+			return fmt.Errorf("send header request: %w", err)
 		}
 	}
 	return nil
@@ -430,7 +430,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se
 	//log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId)))
 	var request eth.NewBlockHashesPacket
 	if err := rlp.DecodeBytes(req.Data, &request); err != nil {
-		return fmt.Errorf("decode newBlockHashes65: %v", err)
+		return fmt.Errorf("decode newBlockHashes65: %w", err)
 	}
 	for _, announce := range request {
 		cs.Hd.SaveExternalAnnounce(announce.Hash)
@@ -445,7 +445,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se
 			Origin:  eth.HashOrNumber{Hash: announce.Hash},
 		})
 		if err != nil {
-			return fmt.Errorf("encode header request: %v", err)
+			return fmt.Errorf("encode header request: %w", err)
 		}
 		outreq := proto_sentry.SendMessageByIdRequest{
 			PeerId: req.PeerId,
@@ -459,7 +459,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se
 			if isPeerNotFoundErr(err) {
 				continue
 			}
-			return fmt.Errorf("send header request: %v", err)
+			return fmt.Errorf("send header request: %w", err)
 		}
 	}
 	return nil
@@ -492,7 +492,7 @@ func (cs *ControlServerImpl) blockHeaders66(ctx context.Context, in *proto_sentr
 	// Parse the entire request from scratch
 	var request eth.BlockHeadersPacket66
 	if err := rlp.DecodeBytes(in.Data, &request); err != nil {
-		return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err)
+		return fmt.Errorf("decode 5 BlockHeadersPacket66: %w", err)
 	}
 	headers := request.BlockHeadersPacket
 	var heighestBlock uint64
@@ -534,7 +534,7 @@ func (cs *ControlServerImpl) blockHeaders66(ctx context.Context, in *proto_sentr
 			}
 		}
 	} else {
-		return fmt.Errorf("singleHeaderAsSegment failed: %v", err)
+		return fmt.Errorf("singleHeaderAsSegment failed: %w", err)
 	}
 	outreq := proto_sentry.PeerMinBlockRequest{
 		PeerId:   in.PeerId,
@@ -567,7 +567,7 @@ func (cs *ControlServerImpl) blockHeaders65(ctx context.Context, in *proto_sentr
 	// Parse the entire request from scratch
 	var request eth.BlockHeadersPacket
 	if err := rlp.DecodeBytes(in.Data, &request); err != nil {
-		return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err)
+		return fmt.Errorf("decode 5 BlockHeadersPacket66: %w", err)
 	}
 	headers := request
 	var heighestBlock uint64
@@ -609,7 +609,7 @@ func (cs *ControlServerImpl) blockHeaders65(ctx context.Context, in *proto_sentr
 			}
 		}
 	} else {
-		return fmt.Errorf("singleHeaderAsSegment failed: %v", err)
+		return fmt.Errorf("singleHeaderAsSegment failed: %w", err)
 	}
 	outreq := proto_sentry.PeerMinBlockRequest{
 		PeerId:   in.PeerId,
@@ -643,7 +643,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry
 	// Parse the entire request from scratch
 	var request eth.NewBlockPacket
 	if err := rlp.DecodeBytes(inreq.Data, &request); err != nil {
-		return fmt.Errorf("decode 4 NewBlockMsg: %v", err)
+		return fmt.Errorf("decode 4 NewBlockMsg: %w", err)
 	}
 	if segments, penalty, err := cs.Hd.SingleHeaderAsSegment(headerRaw, request.Block.Header()); err == nil {
 		if penalty == headerdownload.NoPenalty {
@@ -663,7 +663,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry
 			}
 		}
 	} else {
-		return fmt.Errorf("singleHeaderAsSegment failed: %v", err)
+		return fmt.Errorf("singleHeaderAsSegment failed: %w", err)
 	}
 	cs.Bd.AddToPrefetch(request.Block)
 	outreq := proto_sentry.PeerMinBlockRequest{
@@ -680,7 +680,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry
 func (cs *ControlServerImpl) blockBodies66(inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var request eth.BlockRawBodiesPacket66
 	if err := rlp.DecodeBytes(inreq.Data, &request); err != nil {
-		return fmt.Errorf("decode BlockBodiesPacket66: %v", err)
+		return fmt.Errorf("decode BlockBodiesPacket66: %w", err)
 	}
 	txs, uncles := request.BlockRawBodiesPacket.Unpack()
 	cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)))
@@ -690,7 +690,7 @@ func (cs *ControlServerImpl) blockBodies66(inreq *proto_sentry.InboundMessage, s
 func (cs *ControlServerImpl) blockBodies65(inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var request eth.BlockRawBodiesPacket
 	if err := rlp.DecodeBytes(inreq.Data, &request); err != nil {
-		return fmt.Errorf("decode blockBodies65: %v", err)
+		return fmt.Errorf("decode blockBodies65: %w", err)
 	}
 	txs, uncles := request.Unpack()
 	cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)))
@@ -707,7 +707,7 @@ func (cs *ControlServerImpl) receipts65(ctx context.Context, inreq *proto_sentry
 func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetBlockHeadersPacket66
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getBlockHeaders66: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getBlockHeaders66: %w, data: %x", err, inreq.Data)
 	}
 
 	var headers []*types.Header
@@ -725,7 +725,7 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto
 		BlockHeadersPacket: headers,
 	})
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -737,9 +737,9 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto
 	_, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{})
 	if err != nil {
 		if !isPeerNotFoundErr(err) {
-			return fmt.Errorf("send header response 65: %v", err)
+			return fmt.Errorf("send header response 65: %w", err)
 		}
-		return fmt.Errorf("send header response 66: %v", err)
+		return fmt.Errorf("send header response 66: %w", err)
 	}
 	//log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b)))
 	return nil
@@ -748,7 +748,7 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto
 func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetBlockHeadersPacket
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getBlockHeaders65: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getBlockHeaders65: %w, data: %x", err, inreq.Data)
 	}
 
 	var headers []*types.Header
@@ -763,7 +763,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto
 	}
 	b, err := rlp.EncodeToBytes(eth.BlockHeadersPacket(headers))
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -775,7 +775,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto
 	_, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{})
 	if err != nil {
 		if !isPeerNotFoundErr(err) {
-			return fmt.Errorf("send header response 65: %v", err)
+			return fmt.Errorf("send header response 65: %w", err)
 		}
 	}
 	//log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b)))
@@ -785,7 +785,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto
 func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetBlockBodiesPacket66
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getBlockBodies66: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getBlockBodies66: %w, data: %x", err, inreq.Data)
 	}
 	tx, err := cs.db.BeginRo(ctx)
 	if err != nil {
@@ -799,7 +799,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_
 		BlockBodiesRLPPacket: response,
 	})
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -813,7 +813,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_
 		if isPeerNotFoundErr(err) {
 			return nil
 		}
-		return fmt.Errorf("send bodies response: %v", err)
+		return fmt.Errorf("send bodies response: %w", err)
 	}
 	//log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b)))
 	return nil
@@ -822,7 +822,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_
 func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetBlockBodiesPacket
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getBlockBodies65: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getBlockBodies65: %w, data: %x", err, inreq.Data)
 	}
 	tx, err := cs.db.BeginRo(ctx)
 	if err != nil {
@@ -833,7 +833,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_
 	tx.Rollback()
 	b, err := rlp.EncodeToBytes(eth.BlockBodiesRLPPacket(response))
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -847,7 +847,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_
 		if isPeerNotFoundErr(err) {
 			return nil
 		}
-		return fmt.Errorf("send bodies response: %v", err)
+		return fmt.Errorf("send bodies response: %w", err)
 	}
 	//log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b)))
 	return nil
@@ -856,7 +856,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_
 func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetReceiptsPacket66
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getReceipts66: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getReceipts66: %w, data: %x", err, inreq.Data)
 	}
 	tx, err := cs.db.BeginRo(ctx)
 	if err != nil {
@@ -873,7 +873,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen
 		ReceiptsRLPPacket: receipts,
 	})
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -887,7 +887,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen
 		if isPeerNotFoundErr(err) {
 			return nil
 		}
-		return fmt.Errorf("send bodies response: %v", err)
+		return fmt.Errorf("send bodies response: %w", err)
 	}
 	//log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b)))
 	return nil
@@ -896,7 +896,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen
 func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error {
 	var query eth.GetReceiptsPacket
 	if err := rlp.DecodeBytes(inreq.Data, &query); err != nil {
-		return fmt.Errorf("decoding getReceipts65: %v, data: %x", err, inreq.Data)
+		return fmt.Errorf("decoding getReceipts65: %w, data: %x", err, inreq.Data)
 	}
 	tx, err := cs.db.BeginRo(ctx)
 	if err != nil {
@@ -910,7 +910,7 @@ func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sen
 	tx.Rollback()
 	b, err := rlp.EncodeToBytes(eth.ReceiptsRLPPacket(receipts))
 	if err != nil {
-		return fmt.Errorf("encode header response: %v", err)
+		return fmt.Errorf("encode header response: %w", err)
 	}
 	outreq := proto_sentry.SendMessageByIdRequest{
 		PeerId: inreq.PeerId,
@@ -924,7 +924,7 @@ func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sen
 		if isPeerNotFoundErr(err) {
 			return nil
 		}
-		return fmt.Errorf("send bodies response: %v", err)
+		return fmt.Errorf("send bodies response: %w", err)
 	}
 	//log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b)))
 	return nil
diff --git a/cmd/sentry/download/sentry.go b/cmd/sentry/download/sentry.go
index ba248bec7e11e5fa8939341354053422515995dd..20022057300b67b39b116cb307d0ae2f6f019db8 100644
--- a/cmd/sentry/download/sentry.go
+++ b/cmd/sentry/download/sentry.go
@@ -193,7 +193,7 @@ func handShake(
 		var reply eth.StatusPacket
 		if err1 = msg.Decode(&reply); err1 != nil {
 			msg.Discard()
-			return fmt.Errorf("decode message %v: %v", msg, err1)
+			return fmt.Errorf("decode message %v: %w", msg, err1)
 		}
 		msg.Discard()
 		if reply.NetworkID != networkID {
@@ -209,7 +209,7 @@ func handShake(
 			return fmt.Errorf("genesis hash does not match: theirs %x, ours %x", reply.Genesis, genesisHash)
 		}
 		if err1 = forkFilter(reply.ForkID); err1 != nil {
-			return fmt.Errorf("%v", err1)
+			return fmt.Errorf("%w", err1)
 		}
 
 		td, overflow := uint256.FromBig(reply.TD)
@@ -284,7 +284,7 @@ func runPeer(
 		}
 		msg, err := rw.ReadMsg()
 		if err != nil {
-			return fmt.Errorf("reading message: %v", err)
+			return fmt.Errorf("reading message: %w", err)
 		}
 		if msg.Size > eth.ProtocolMaxMsgSize {
 			msg.Discard()
@@ -485,7 +485,7 @@ func NewSentryServer(ctx context.Context, dialCandidates enode.Iterator, readNod
 				return ss.startSync(ctx, bestHash, peerID)
 			})
 			if err != nil {
-				return fmt.Errorf("handshake to peer %s: %v", peerID, err)
+				return fmt.Errorf("handshake to peer %s: %w", peerID, err)
 			}
 			log.Debug(fmt.Sprintf("[%s] Received status message OK", peerID), "name", peer.Name())
 
@@ -565,7 +565,7 @@ func (ss *SentryServerImpl) startSync(ctx context.Context, bestHash common.Hash,
 			Origin:  eth.HashOrNumber{Hash: bestHash},
 		})
 		if err != nil {
-			return fmt.Errorf("startSync encode packet failed: %v", err)
+			return fmt.Errorf("startSync encode packet failed: %w", err)
 		}
 
 		if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{
@@ -589,7 +589,7 @@ func (ss *SentryServerImpl) startSync(ctx context.Context, bestHash common.Hash,
 			},
 		})
 		if err != nil {
-			return fmt.Errorf("startSync encode packet failed: %v", err)
+			return fmt.Errorf("startSync encode packet failed: %w", err)
 		}
 		if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{
 			PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)),
@@ -679,7 +679,7 @@ func (ss *SentryServerImpl) SendMessageByMinBlock(_ context.Context, inreq *prot
 			}
 		}
 		ss.GoodPeers.Delete(peerID)
-		return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock to peer %s: %v", peerID, err)
+		return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock to peer %s: %w", peerID, err)
 	}
 	peerInfo.AddDeadline(time.Now().Add(30 * time.Second))
 	return &proto_sentry.SentPeers{Peers: []*proto_types.H512{gointerfaces.ConvertBytesToH512([]byte(peerID))}}, nil
@@ -714,7 +714,7 @@ func (ss *SentryServerImpl) SendMessageById(_ context.Context, inreq *proto_sent
 			}
 		}
 		ss.GoodPeers.Delete(peerID)
-		return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById to peer %s: %v", peerID, err)
+		return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById to peer %s: %w", peerID, err)
 	}
 	return &proto_sentry.SentPeers{Peers: []*proto_types.H512{inreq.PeerId}}, nil
 }
diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go
index 01de3d4c65f37965c1cd6ef62165d1217e99a8c2..3e457cbd5f5bd07033f133a38a512acc5140aa9d 100644
--- a/common/compiler/solidity.go
+++ b/common/compiler/solidity.go
@@ -109,7 +109,7 @@ func CompileSolidityString(solc, source string) (map[string]*Contract, error) {
 		return nil, err
 	}
 	args := append(s.makeArgs(), "--")
-	cmd := exec.Command(s.Path, append(args, "-")...)
+	cmd := exec.Command(s.Path, append(args, "-")...) //nolint:gosec
 	cmd.Stdin = strings.NewReader(source)
 	return s.run(cmd, source)
 }
@@ -128,7 +128,7 @@ func CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract,
 		return nil, err
 	}
 	args := append(s.makeArgs(), "--")
-	cmd := exec.Command(s.Path, append(args, sourcefiles...)...)
+	cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec
 	return s.run(cmd, source)
 }
 
diff --git a/common/compiler/vyper.go b/common/compiler/vyper.go
index a9bca95e5901f0584b516e570e5a5ccb0b9e47ba..fb1f98d863e53e7cce8e8a7708ec81c2e28df70c 100644
--- a/common/compiler/vyper.go
+++ b/common/compiler/vyper.go
@@ -83,7 +83,7 @@ func CompileVyper(vyper string, sourcefiles ...string) (map[string]*Contract, er
 		return nil, err
 	}
 	args := s.makeArgs()
-	cmd := exec.Command(s.Path, append(args, sourcefiles...)...)
+	cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec
 	return s.run(cmd, source)
 }
 
diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go
index b0b94dc681706f2faefc2fdafc9b5dd86f79a21d..e34ebfb16acd0dd661863ee48bb821f2a3811243 100644
--- a/core/types/transaction_test.go
+++ b/core/types/transaction_test.go
@@ -521,11 +521,11 @@ func TestTransactionCoding(t *testing.T) {
 func encodeDecodeJSON(tx Transaction) (Transaction, error) {
 	data, err := json.Marshal(tx)
 	if err != nil {
-		return nil, fmt.Errorf("json encoding failed: %v", err)
+		return nil, fmt.Errorf("json encoding failed: %w", err)
 	}
 	var parsedTx Transaction
 	if parsedTx, err = UnmarshalTransactionFromJSON(data); err != nil {
-		return nil, fmt.Errorf("json decoding failed: %v", err)
+		return nil, fmt.Errorf("json decoding failed: %w", err)
 	}
 	return parsedTx, nil
 }
@@ -534,11 +534,11 @@ func encodeDecodeBinary(tx Transaction) (Transaction, error) {
 	var buf bytes.Buffer
 	var err error
 	if err = tx.MarshalBinary(&buf); err != nil {
-		return nil, fmt.Errorf("rlp encoding failed: %v", err)
+		return nil, fmt.Errorf("rlp encoding failed: %w", err)
 	}
 	var parsedTx Transaction
 	if parsedTx, err = UnmarshalTransactionFromBinary(buf.Bytes()); err != nil {
-		return nil, fmt.Errorf("rlp decoding failed: %v", err)
+		return nil, fmt.Errorf("rlp decoding failed: %w", err)
 	}
 	return parsedTx, nil
 }
diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index 743efacbf53ffedfcff5a914d566395fcf8b3ec8..d61e6faed0735b12de3e31a480141fc4d88a6d2c 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -560,7 +560,7 @@ func opJump(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by
 		if usedBitmap && interpreter.cfg.TraceJumpDest {
 			log.Warn("Code Bitmap used for detecting invalid jump",
 				"tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash),
-				"block number", interpreter.evm.Context.BlockNumber,
+				"block_num", interpreter.evm.Context.BlockNumber,
 			)
 		}
 		return nil, ErrInvalidJump
@@ -576,7 +576,7 @@ func opJumpi(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]b
 			if usedBitmap && interpreter.cfg.TraceJumpDest {
 				log.Warn("Code Bitmap used for detecting invalid jump",
 					"tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash),
-					"block number", interpreter.evm.Context.BlockNumber,
+					"block_num", interpreter.evm.Context.BlockNumber,
 				)
 			}
 			return nil, ErrInvalidJump
diff --git a/eth/backend.go b/eth/backend.go
index ad0e6381c78e46c32de5bf4a53c94ad6064bf891..6d9ba66d3b3f86aa0a352779a0d88fbe4e40af9a 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -651,9 +651,11 @@ func (s *Ethereum) StartMining(ctx context.Context, db kv.RwDB, mining *stagedsy
 					if hh.BaseFee != nil {
 						baseFee = hh.BaseFee.Uint64()
 					}
-					return s.txPool2.OnNewBlock(context.Background(), &remote.StateChange{
-						BlockHeight: hh.Number.Uint64(), BlockHash: gointerfaces.ConvertHashToH256(hh.Hash()),
-					}, txpool2.TxSlots{}, txpool2.TxSlots{}, baseFee)
+					return s.txPool2.OnNewBlock(context.Background(), &remote.StateChangeBatch{
+						DatabaseViewID: tx.ViewID(), ChangeBatch: []*remote.StateChange{
+							{BlockHeight: hh.Number.Uint64(), BlockHash: gointerfaces.ConvertHashToH256(hh.Hash()), ProtocolBaseFee: baseFee},
+						},
+					}, txpool2.TxSlots{}, txpool2.TxSlots{})
 				}); err != nil {
 					return err
 				}
diff --git a/eth/stagedsync/stage_blockhashes.go b/eth/stagedsync/stage_blockhashes.go
index 97cb328e1983ec2910a5ac18f2db2ac1c2f81d38..842ee212a43de69979cb35ef125d00880d3567ea 100644
--- a/eth/stagedsync/stage_blockhashes.go
+++ b/eth/stagedsync/stage_blockhashes.go
@@ -96,7 +96,7 @@ func UnwindBlockHashStage(u *UnwindState, tx kv.RwTx, cfg BlockHashesCfg, ctx co
 	}
 
 	if err = u.Done(tx); err != nil {
-		return fmt.Errorf(" reset: %v", err)
+		return fmt.Errorf(" reset: %w", err)
 	}
 	if !useExternalTx {
 		if err = tx.Commit(); err != nil {
diff --git a/eth/stagedsync/stage_bodies.go b/eth/stagedsync/stage_bodies.go
index da2837698cf50b3e413bab6d8b3aa6ade313f95b..6002d1bc7117eca5bdb8dea1c88224369b92ade1 100644
--- a/eth/stagedsync/stage_bodies.go
+++ b/eth/stagedsync/stage_bodies.go
@@ -227,7 +227,7 @@ func logProgressBodies(logPrefix string, committed uint64, prevDeliveredCount, d
 	var m runtime.MemStats
 	runtime.ReadMemStats(&m)
 	log.Info(fmt.Sprintf("[%s] Wrote block bodies", logPrefix),
-		"block number", committed,
+		"block_num", committed,
 		"delivery/sec", common.StorageSize(speed),
 		"wasted/sec", common.StorageSize(wastedSpeed),
 		"alloc", common.StorageSize(m.Alloc),
diff --git a/eth/stagedsync/stage_execute.go b/eth/stagedsync/stage_execute.go
index f4da2c5c98fe7ea9d3740bbf66ea6206b2a80953..8d3cb7e3336eb637e28d973c016e3a5b1d1fa40c 100644
--- a/eth/stagedsync/stage_execute.go
+++ b/eth/stagedsync/stage_execute.go
@@ -208,7 +208,7 @@ func newStateReaderWriter(
 		if block.BaseFee() != nil {
 			blockBaseFee = block.BaseFee().Uint64()
 		}
-		accumulator.StartChange(tx.ID(), block.NumberU64(), block.Hash(), block.NumberU64()-1, block.ParentHash(), txs, blockBaseFee, false)
+		accumulator.StartChange(block.NumberU64(), block.Hash(), block.NumberU64()-1, block.ParentHash(), txs, blockBaseFee, false)
 	} else {
 		accumulator = nil
 	}
@@ -435,7 +435,7 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan
 			return fmt.Errorf("read canonical hash of unwind point: %w", err)
 		}
 
-		accumulator.StartChange(tx.ID(), u.UnwindPoint, hash, s.BlockNumber, prevHash, txs, protocolBaseFee, true /* unwind */)
+		accumulator.StartChange(u.UnwindPoint, hash, s.BlockNumber, prevHash, txs, protocolBaseFee, true)
 	}
 
 	changes := etl.NewCollector(cfg.tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize))
diff --git a/ethdb/snapshotdb/kv_snapshot.go b/ethdb/snapshotdb/kv_snapshot.go
index 13a28a729c11a3de4f759a1e3e68a76ee22d6214..955d207008d3c1e60e1b586d7ec5e9c3fa5940e1 100644
--- a/ethdb/snapshotdb/kv_snapshot.go
+++ b/ethdb/snapshotdb/kv_snapshot.go
@@ -288,8 +288,8 @@ type DBTX interface {
 	DBTX() kv.RwTx
 }
 
-func (s *snTX) DBTX() kv.RwTx { return s.dbTX.(kv.RwTx) }
-func (s *snTX) ID() uint64    { return s.dbTX.ID() }
+func (s *snTX) DBTX() kv.RwTx  { return s.dbTX.(kv.RwTx) }
+func (s *snTX) ViewID() uint64 { return s.dbTX.ViewID() }
 
 func (s *snTX) RwCursor(bucket string) (kv.RwCursor, error) {
 	if !IsSnapshotBucket(bucket) {
diff --git a/go.mod b/go.mod
index 1fc4a78a94abc6a82bf9e40b04c10f0cd6c76224..e80bad4d85e8030854118ec211bedfb989eca16f 100644
--- a/go.mod
+++ b/go.mod
@@ -36,12 +36,10 @@ require (
 	github.com/json-iterator/go v1.1.11
 	github.com/julienschmidt/httprouter v1.3.0
 	github.com/kevinburke/go-bindata v3.21.0+incompatible
-	github.com/kylelemons/godebug v1.1.0 // indirect
-	github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6
+	github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb
 	github.com/ledgerwatch/log/v3 v3.3.0
 	github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d
 	github.com/logrusorgru/aurora/v3 v3.0.0
-	github.com/mattn/go-isatty v0.0.14 // indirect
 	github.com/pelletier/go-toml v1.9.3
 	github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99
 	github.com/quasilyte/go-ruleguard/dsl v0.3.6
diff --git a/go.sum b/go.sum
index 848929a73a45fc5ff19ed0d6bd640338478d086a..ecefe2f02a3f034af79f5417c6905f78d76fe558 100644
--- a/go.sum
+++ b/go.sum
@@ -488,13 +488,12 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758 h1:0D5M2HQSGD3PYPwICLl+/9oulQauOuETfgFvhBDffs0=
 github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
-github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
-github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6 h1:llu40F9ynI283rbyJ8Gug25ec2LTRpe1WTeBlYtO/io=
-github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6/go.mod h1:kZsi9wFAOYIkegoiSj10RXOVc0EmDtUxltnNP1f1ZE0=
+github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb h1:RS3uSN0lx90yRRfihFRCSS7KH6LdXrVDC5E+MMTXVq4=
+github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb/go.mod h1:kZsi9wFAOYIkegoiSj10RXOVc0EmDtUxltnNP1f1ZE0=
 github.com/ledgerwatch/log/v3 v3.3.0 h1:k8N/3NQLILr8CKCMyza261vLFKU7VA+nMNNb0wVyQSc=
 github.com/ledgerwatch/log/v3 v3.3.0/go.mod h1:J58eOHHrIYHxl7LKkRsb/0YibKwtLfauUryl5SLRGm0=
 github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d h1:/IKMrJdfRsoYNc36PXqP4xMH3vhW/8IQyBKGQbKZUno=
@@ -527,9 +526,8 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
 github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
 github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-sqlite3 v1.7.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.13.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
diff --git a/internal/debug/flags.go b/internal/debug/flags.go
index 6ab26c26a4d832203ecd3c03b78de01c5a7e9339..9c659b81baaa61a91be59a57e325a2b4cf63c3bf 100644
--- a/internal/debug/flags.go
+++ b/internal/debug/flags.go
@@ -19,7 +19,7 @@ package debug
 import (
 	"fmt"
 	"net/http"
-	_ "net/http/pprof"
+	_ "net/http/pprof" //nolint:gosec
 	"os"
 	"runtime"
 
diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go
index 67319521f2e01524a5434db08677394881bce935..aa6f1afac08408c2d345ae8fc656a1ac5e0755fe 100644
--- a/internal/jsre/jsre.go
+++ b/internal/jsre/jsre.go
@@ -92,7 +92,7 @@ func randomSource() *rand.Rand {
 	}
 
 	src := rand.NewSource(seed)
-	return rand.New(src)
+	return rand.New(src) //nolint:gosec
 }
 
 // This function runs the main event loop from a goroutine that is started
diff --git a/p2p/dnsdisc/sync.go b/p2p/dnsdisc/sync.go
index 68f3748abf1fcf07ac1d142de451fd69786c0835..c58e31bcbf37a2d7eca4a1fe179511f723b1b7ff 100644
--- a/p2p/dnsdisc/sync.go
+++ b/p2p/dnsdisc/sync.go
@@ -131,7 +131,7 @@ func (ct *clientTree) syncNextLink(ctx context.Context) error {
 }
 
 func (ct *clientTree) syncNextRandomENR(ctx context.Context) (*enode.Node, error) {
-	index := rand.Intn(len(ct.enrs.missing))
+	index := rand.Intn(len(ct.enrs.missing)) //nolint:gosec
 	hash := ct.enrs.missing[index]
 	e, err := ct.enrs.resolveNext(ctx, hash)
 	if err != nil {
diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go
index 297b42fd10daec74839bb7c5a8453a2809a9a2ea..d114713dc7ab68edaf64fd33fa0073a75431770c 100644
--- a/p2p/enode/nodedb.go
+++ b/p2p/enode/nodedb.go
@@ -362,7 +362,7 @@ func (db *DB) Node(id ID) *Node {
 func mustDecodeNode(id, data []byte) *Node {
 	node := new(Node)
 	if err := rlp.DecodeBytes(data, &node.r); err != nil {
-		panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %v", id, err))
+		panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %w", id, err))
 	}
 	// Restore node id cache.
 	copy(node.id[:], id)
diff --git a/p2p/enode/urlv4.go b/p2p/enode/urlv4.go
index a2231ed577cec1e4d688fbe2bf9aec1231284686..16208724e930c5d67d4f701cc8e1944048be3228 100644
--- a/p2p/enode/urlv4.go
+++ b/p2p/enode/urlv4.go
@@ -73,7 +73,7 @@ func ParseV4(rawurl string) (*Node, error) {
 	if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil {
 		id, err := parsePubkey(m[1])
 		if err != nil {
-			return nil, fmt.Errorf("invalid public key (%v)", err)
+			return nil, fmt.Errorf("invalid public key (%w)", err)
 		}
 		return NewV4(id, nil, 0, 0), nil
 	}
@@ -124,7 +124,7 @@ func parseComplete(rawurl string) (*Node, error) {
 		return nil, errors.New("does not contain node ID")
 	}
 	if id, err = parsePubkey(u.User.String()); err != nil {
-		return nil, fmt.Errorf("invalid public key (%v)", err)
+		return nil, fmt.Errorf("invalid public key (%w)", err)
 	}
 	// Parse the IP address.
 	ip := net.ParseIP(u.Hostname())
diff --git a/p2p/rlpx/rlpx.go b/p2p/rlpx/rlpx.go
index f83e36332bb928fc56d94fdbe7358fbf700fb1d9..c6137f47d672aedea1d3afe6a2ed98bb03b1c4f5 100644
--- a/p2p/rlpx/rlpx.go
+++ b/p2p/rlpx/rlpx.go
@@ -631,7 +631,7 @@ func (h *handshakeState) sealEIP8(msg interface{}) ([]byte, error) {
 	}
 	// Pad with random amount of data. the amount needs to be at least 100 bytes to make
 	// the message distinguishable from pre-EIP-8 handshakes.
-	h.wbuf.appendZero(mrand.Intn(100) + 100)
+	h.wbuf.appendZero(mrand.Intn(100) + 100) //nolint:gosec
 
 	prefix := make([]byte, 2)
 	binary.BigEndian.PutUint16(prefix, uint16(len(h.wbuf.data)+eciesOverhead))
diff --git a/turbo/shards/state_change_accumulator.go b/turbo/shards/state_change_accumulator.go
index 77f6be49d3379a53a1b14fcf22d31b718aa44eab..6fafe8a078bf790303573e2a8dd6b8c0d2415dce 100644
--- a/turbo/shards/state_change_accumulator.go
+++ b/turbo/shards/state_change_accumulator.go
@@ -11,40 +11,36 @@ import (
 
 // Accumulator collects state changes in a form that can then be delivered to the RPC daemon
 type Accumulator struct {
-	changes            []remote.StateChange
+	viewID             uint64 // mdbx's txID
+	changes            []*remote.StateChange
 	latestChange       *remote.StateChange
 	accountChangeIndex map[common.Address]int // For the latest changes, allows finding account change by account's address
 	storageChangeIndex map[common.Address]map[common.Hash]int
 }
 
 type StateChangeConsumer interface {
-	SendStateChanges(sc *remote.StateChange)
+	SendStateChanges(ctx context.Context, sc *remote.StateChangeBatch)
 }
 
-func (a *Accumulator) Reset() {
+func (a *Accumulator) Reset(viewID uint64) {
 	a.changes = nil
 	a.latestChange = nil
 	a.accountChangeIndex = nil
 	a.storageChangeIndex = nil
+	a.viewID = viewID
 }
 func (a *Accumulator) SendAndReset(ctx context.Context, c StateChangeConsumer) {
 	if a == nil || c == nil || len(a.changes) == 0 {
 		return
 	}
-	for i := range a.changes {
-		if err := libcommon.Stopped(ctx.Done()); err != nil {
-			return
-		}
-		c.SendStateChanges(&a.changes[i])
-	}
-	a.Reset()
+	c.SendStateChanges(ctx, &remote.StateChangeBatch{DatabaseViewID: a.viewID, ChangeBatch: a.changes})
+	a.Reset(0) // reset here for GC, but there will be another Reset with correct viewID
 }
 
 // StartChange begins accumulation of changes for a new block
-func (a *Accumulator) StartChange(txID, blockHeight uint64, blockHash common.Hash, prevBlockHeight uint64, prevBlockHash common.Hash, txs [][]byte, protocolBaseFee uint64, unwind bool) {
-	a.changes = append(a.changes, remote.StateChange{})
-	a.latestChange = &a.changes[len(a.changes)-1]
-	a.latestChange.DatabaseViewID = txID
+func (a *Accumulator) StartChange(blockHeight uint64, blockHash common.Hash, prevBlockHeight uint64, prevBlockHash common.Hash, txs [][]byte, protocolBaseFee uint64, unwind bool) {
+	a.changes = append(a.changes, &remote.StateChange{})
+	a.latestChange = a.changes[len(a.changes)-1]
 	a.latestChange.BlockHeight = blockHeight
 	a.latestChange.BlockHash = gointerfaces.ConvertHashToH256(blockHash)
 	a.latestChange.PrevBlockHeight = prevBlockHeight
diff --git a/turbo/stages/stageloop.go b/turbo/stages/stageloop.go
index 99d9b04ea4f87ada6f6771fb76aa67fbdb8d26e1..9d1d72af59eb462aa9eba44b52920870336a2e73 100644
--- a/turbo/stages/stageloop.go
+++ b/turbo/stages/stageloop.go
@@ -110,10 +110,6 @@ func StageLoopStep(
 		return err
 	}
 
-	if notifications != nil && notifications.Accumulator != nil {
-		notifications.Accumulator.Reset()
-	}
-
 	canRunCycleInOneTransaction := !initialCycle && highestSeenHeader-origin < 8096 && highestSeenHeader-hashStateStageProgress < 8096
 
 	var tx kv.RwTx // on this variable will run sync cycle.
@@ -125,6 +121,10 @@ func StageLoopStep(
 		defer tx.Rollback()
 	}
 
+	if notifications != nil && notifications.Accumulator != nil && canRunCycleInOneTransaction {
+		notifications.Accumulator.Reset(tx.ViewID())
+	}
+
 	err = sync.Run(db, tx, initialCycle)
 	if err != nil {
 		return err
diff --git a/turbo/txpool/p2p.go b/turbo/txpool/p2p.go
index de706d1aa86aa670739c0e64c55ee76e21c968fa..a8e380c828f58e4416beab5430a6dc7c38a46544 100644
--- a/turbo/txpool/p2p.go
+++ b/turbo/txpool/p2p.go
@@ -325,10 +325,14 @@ func RecvTxMessage(ctx context.Context,
 			return
 		}
 		if err = handleInboundMessage(ctx, req, sentry); err != nil {
-			if rlp.IsDecodeError(err) {
-				log.Debug("[RecvTxMessage] Handling incoming message", "error", err)
-			} else {
-				log.Warn("[RecvTxMessage] Handling incoming message", "error", err)
+			s, ok := status.FromError(err)
+			doLog := !((ok && s.Code() == codes.Canceled) || errors.Is(err, io.EOF) || errors.Is(err, context.Canceled))
+			if doLog {
+				if rlp.IsDecodeError(err) {
+					log.Debug("[RecvTxMessage] Handling incoming message", "error", err)
+				} else {
+					log.Warn("[RecvTxMessage] Handling incoming message", "error", err)
+				}
 			}
 		}
 		if wg != nil {