Improve consensus message delivery #1058

Open
opened 2025-12-28 17:15:06 +00:00 by sami · 2 comments
Owner

Originally created by @roman-khimov on GitHub (Jan 18, 2023).

dBFT inevitably relies on eventual message delivery, so in presence of some communication issues it can be delayed, but not subverted. Yet the degree of this delay can be somewhat impractical (as in #2803), so we may want to improve our retransmission mechanisms.

There is a concept of recovery messages already, it can be extended to re-request messages more often (wrt regular dBFT timeouts). That's the first option, using a new set of P2P messages.

Another one is to retransmit in a fashion somewhat similar to transactions, where we just repeat ExtensiblePayloads we have in a pool. It's somewhat more efficient network-wise, but it's hard to formulate strict conditions for when this should happen (dBFT timers and stages are hidden in the consensus process).

Originally created by @roman-khimov on GitHub (Jan 18, 2023). dBFT inevitably relies on eventual message delivery, so in presence of some communication issues it can be delayed, but not subverted. Yet the degree of this delay can be somewhat impractical (as in #2803), so we may want to improve our retransmission mechanisms. There is a concept of recovery messages already, it can be extended to re-request messages more often (wrt regular dBFT timeouts). That's the first option, using a new set of P2P messages. Another one is to retransmit in a fashion somewhat similar to transactions, where we just repeat `ExtensiblePayload`s we have in a pool. It's somewhat more efficient network-wise, but it's hard to formulate strict conditions for when this should happen (dBFT timers and stages are hidden in the consensus process).
Author
Owner

@roman-khimov commented on GitHub (Jan 28, 2023):

Another thing that can be done is sending all extensibles to the new peer (should also be helpful for the #2803 case).

@roman-khimov commented on GitHub (Jan 28, 2023): Another thing that can be done is sending all extensibles to the new peer (should also be helpful for the #2803 case).
Author
Owner

@AnnaShaleva commented on GitHub (Jul 17, 2025):

Here's an example of how this issue can be reproduced on privnet:

  1. Start 4-nodes privnet with dynamic block time extension (TimePerBlock: 1s, MaxTimePerBlock: 20s) via make env_start from scratch.
  2. Repeat multiple times if not reproduced.

Eventually primary node will start as the first node in the setup, immediately create proposal and won't relay it because there's no peers yet. It will request CV:

2025-07-17T13:20:30.585Z	INFO	node started	{"blockHeight": 0, "headerHeight": 0}
2025-07-17T13:20:30.585Z	INFO	starting rpc-server	{"endpoint": ":30336"}
2025-07-17T13:20:30.716Z	INFO	new peer connected	{"addr": "172.200.0.4:60886", "peerCount": 1}
2025-07-17T13:20:30.716Z	INFO	new peer connected	{"addr": "172.200.0.1:20335", "peerCount": 2}
2025-07-17T13:20:30.716Z	INFO	started protocol	{"addr": "172.200.0.4:60886", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 2237166748}
2025-07-17T13:20:30.716Z	INFO	started protocol	{"addr": "172.200.0.1:20335", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 1473506884}
2025-07-17T13:20:30.716Z	INFO	node reached synchronized state, starting services
2025-07-17T13:20:30.716Z	INFO	starting state validation service
2025-07-17T13:20:30.716Z	INFO	starting consensus service
2025-07-17T13:20:30.716Z	INFO	initializing dbft	{"height": 1, "view": 0, "index": 1, "role": "Primary"}
2025-07-17T13:20:30.717Z	INFO	sending PrepareRequest	{"height": 1, "view": 0}
2025-07-17T13:20:30.717Z	INFO	RPC server already started
2025-07-17T13:20:30.723Z	INFO	new peer connected	{"addr": "172.200.0.4:20334", "peerCount": 3}
2025-07-17T13:20:30.724Z	INFO	peer disconnected	{"addr": "172.200.0.4:20334", "error": "already connected", "peerCount": 2}
2025-07-17T13:20:30.784Z	INFO	new peer connected	{"addr": "172.200.0.3:57768", "peerCount": 3}
2025-07-17T13:20:30.784Z	INFO	started protocol	{"addr": "172.200.0.3:57768", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 161005647}
2025-07-17T13:20:30.834Z	INFO	new peer connected	{"addr": "172.200.0.1:36830", "peerCount": 4}
2025-07-17T13:20:30.835Z	INFO	peer disconnected	{"addr": "172.200.0.1:36830", "error": "EOF", "peerCount": 3}
2025-07-17T13:20:30.959Z	INFO	new peer connected	{"addr": "172.200.0.2:20336", "peerCount": 4}
2025-07-17T13:20:30.959Z	INFO	new peer connected	{"addr": "172.200.0.2:45460", "peerCount": 5}
2025-07-17T13:20:30.959Z	INFO	peer disconnected	{"addr": "172.200.0.2:45460", "error": "identical node id", "peerCount": 4}
2025-07-17T13:20:30.959Z	INFO	peer disconnected	{"addr": "172.200.0.2:20336", "error": "identical node id", "peerCount": 3}
2025-07-17T13:20:30.990Z	INFO	new peer connected	{"addr": "172.200.0.3:20333", "peerCount": 4}
2025-07-17T13:20:30.991Z	INFO	peer disconnected	{"addr": "172.200.0.3:20333", "error": "EOF", "peerCount": 3}
2025-07-17T13:20:31.063Z	INFO	new peer connected	{"addr": "172.200.0.3:57776", "peerCount": 4}
2025-07-17T13:20:31.063Z	INFO	peer disconnected	{"addr": "172.200.0.3:57776", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:31.345Z	INFO	persisted to disk	{"blocks": 0, "keys": 132, "headerHeight": 0, "blockHeight": 0, "took": "1.987032ms"}
2025-07-17T13:20:31.717Z	INFO	skip change view	{"nc": 0, "nf": 3}
2025-07-17T13:20:33.869Z	INFO	new peer connected	{"addr": "172.200.0.3:20333", "peerCount": 4}
2025-07-17T13:20:33.869Z	INFO	peer disconnected	{"addr": "172.200.0.3:20333", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:35.717Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:39.717Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:43.718Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:47.718Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:51.718Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:55.719Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:20:59.720Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:21:03.720Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:21:07.720Z	INFO	request change view	{"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1}
2025-07-17T13:21:08.731Z	INFO	received ChangeView	{"validator": 0, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:08.759Z	INFO	received ChangeView	{"validator": 3, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:08.759Z	INFO	changing dbft view	{"height": 1, "view": 1, "index": 1, "role": "Backup"}
2025-07-17T13:21:08.760Z	INFO	received PrepareRequest	{"validator": 0, "tx": 0}
2025-07-17T13:21:08.760Z	INFO	sending PrepareResponse	{"height": 1, "view": 1}
2025-07-17T13:21:08.760Z	INFO	received PrepareResponse	{"validator": 3}
2025-07-17T13:21:08.760Z	INFO	sending Commit	{"height": 1, "view": 1}
2025-07-17T13:21:08.760Z	INFO	received PrepareResponse	{"validator": 2}
2025-07-17T13:21:08.761Z	INFO	received Commit	{"validator": 2}
2025-07-17T13:21:08.761Z	INFO	received Commit	{"validator": 0}
2025-07-17T13:21:08.761Z	INFO	approving block	{"height": 1, "hash": "dc412505955938589c69d31a295d31dc97aa209e6b24c7cbedcddaded6d32dfe", "tx_count": 0, "merkle": "0000000000000000000000000000000000000000000000000000000000000000", "prev": "c49d7b254edd009e9094db4380fb60410616fda75cf77a09f3b92a7de1b48f0f"}
2025-07-17T13:21:08.762Z	INFO	initializing dbft	{"height": 2, "view": 0, "index": 1, "role": "Backup"}

The rest of nodes won't receive proposal, but will receive CV:

2025-07-17T13:20:30.784Z	INFO	initializing dbft	{"height": 1, "view": 0, "index": 2, "role": "Backup"}
2025-07-17T13:20:30.784Z	INFO	RPC server already started
2025-07-17T13:20:30.814Z	INFO	new peer connected	{"addr": "172.200.0.1:20335", "peerCount": 3}
2025-07-17T13:20:30.814Z	INFO	started protocol	{"addr": "172.200.0.1:20335", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 1473506884}
2025-07-17T13:20:30.815Z	INFO	new peer connected	{"addr": "172.200.0.1:38288", "peerCount": 4}
2025-07-17T13:20:30.815Z	INFO	peer disconnected	{"addr": "172.200.0.1:38288", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:30.848Z	INFO	new peer connected	{"addr": "172.200.0.4:20334", "peerCount": 4}
2025-07-17T13:20:30.848Z	INFO	peer disconnected	{"addr": "172.200.0.4:20334", "error": "EOF", "peerCount": 3}
2025-07-17T13:20:30.990Z	INFO	new peer connected	{"addr": "172.200.0.2:45906", "peerCount": 4}
2025-07-17T13:20:30.990Z	INFO	peer disconnected	{"addr": "172.200.0.2:45906", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:31.005Z	INFO	new peer connected	{"addr": "172.200.0.3:20333", "peerCount": 4}
2025-07-17T13:20:31.005Z	INFO	new peer connected	{"addr": "172.200.0.3:53386", "peerCount": 5}
2025-07-17T13:20:31.006Z	INFO	peer disconnected	{"addr": "172.200.0.3:53386", "error": "identical node id", "peerCount": 4}
2025-07-17T13:20:31.006Z	INFO	peer disconnected	{"addr": "172.200.0.3:20333", "error": "identical node id", "peerCount": 3}
2025-07-17T13:20:31.063Z	INFO	new peer connected	{"addr": "172.200.0.2:20336", "peerCount": 4}
2025-07-17T13:20:31.063Z	INFO	peer disconnected	{"addr": "172.200.0.2:20336", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:31.391Z	INFO	persisted to disk	{"blocks": 0, "keys": 132, "headerHeight": 0, "blockHeight": 0, "took": "2.735826ms"}
2025-07-17T13:20:33.869Z	INFO	new peer connected	{"addr": "172.200.0.2:56212", "peerCount": 4}
2025-07-17T13:20:33.869Z	INFO	peer disconnected	{"addr": "172.200.0.2:56212", "error": "already connected", "peerCount": 3}
2025-07-17T13:20:35.719Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:39.719Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:43.719Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:47.719Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:51.720Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:55.720Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:20:59.721Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:03.722Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:07.722Z	INFO	received ChangeView	{"validator": 1, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:08.731Z	INFO	received ChangeView	{"validator": 0, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:08.759Z	INFO	received ChangeView	{"validator": 3, "reason": "Timeout", "new view": 1}
2025-07-17T13:21:08.759Z	INFO	changing dbft view	{"height": 1, "view": 1, "index": 2, "role": "Backup"}
2025-07-17T13:21:08.759Z	INFO	skip change view	{"nc": 0, "nf": 3}
2025-07-17T13:21:08.760Z	INFO	received PrepareRequest	{"validator": 0, "tx": 0}
2025-07-17T13:21:08.760Z	INFO	sending PrepareResponse	{"height": 1, "view": 1}
2025-07-17T13:21:08.760Z	INFO	received PrepareResponse	{"validator": 3}
2025-07-17T13:21:08.760Z	INFO	sending Commit	{"height": 1, "view": 1}
2025-07-17T13:21:08.761Z	INFO	received PrepareResponse	{"validator": 1}
2025-07-17T13:21:08.761Z	INFO	received Commit	{"validator": 1}
2025-07-17T13:21:08.761Z	INFO	received Commit	{"validator": 0}
2025-07-17T13:21:08.761Z	INFO	approving block	{"height": 1, "hash": "dc412505955938589c69d31a295d31dc97aa209e6b24c7cbedcddaded6d32dfe", "tx_count": 0, "merkle": "0000000000000000000000000000000000000000000000000000000000000000", "prev": "c49d7b254edd009e9094db4380fb60410616fda75cf77a09f3b92a7de1b48f0f"}

If there are no transactions in the network, then on backup timer timeout backup nodes will request CV. CV happens, new primary creates proposal immedieately and the block is accepted ASAP.

@AnnaShaleva commented on GitHub (Jul 17, 2025): Here's an example of how this issue can be reproduced on privnet: 1. Start 4-nodes privnet with dynamic block time extension (`TimePerBlock: 1s`, `MaxTimePerBlock: 20s`) via `make env_start` from scratch. 2. Repeat multiple times if not reproduced. Eventually primary node will start as the first node in the setup, immediately create proposal and won't relay it because there's no peers yet. It will request CV: ``` 2025-07-17T13:20:30.585Z INFO node started {"blockHeight": 0, "headerHeight": 0} 2025-07-17T13:20:30.585Z INFO starting rpc-server {"endpoint": ":30336"} 2025-07-17T13:20:30.716Z INFO new peer connected {"addr": "172.200.0.4:60886", "peerCount": 1} 2025-07-17T13:20:30.716Z INFO new peer connected {"addr": "172.200.0.1:20335", "peerCount": 2} 2025-07-17T13:20:30.716Z INFO started protocol {"addr": "172.200.0.4:60886", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 2237166748} 2025-07-17T13:20:30.716Z INFO started protocol {"addr": "172.200.0.1:20335", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 1473506884} 2025-07-17T13:20:30.716Z INFO node reached synchronized state, starting services 2025-07-17T13:20:30.716Z INFO starting state validation service 2025-07-17T13:20:30.716Z INFO starting consensus service 2025-07-17T13:20:30.716Z INFO initializing dbft {"height": 1, "view": 0, "index": 1, "role": "Primary"} 2025-07-17T13:20:30.717Z INFO sending PrepareRequest {"height": 1, "view": 0} 2025-07-17T13:20:30.717Z INFO RPC server already started 2025-07-17T13:20:30.723Z INFO new peer connected {"addr": "172.200.0.4:20334", "peerCount": 3} 2025-07-17T13:20:30.724Z INFO peer disconnected {"addr": "172.200.0.4:20334", "error": "already connected", "peerCount": 2} 2025-07-17T13:20:30.784Z INFO new peer connected {"addr": "172.200.0.3:57768", "peerCount": 3} 2025-07-17T13:20:30.784Z INFO started protocol {"addr": "172.200.0.3:57768", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 161005647} 2025-07-17T13:20:30.834Z INFO new peer connected {"addr": "172.200.0.1:36830", "peerCount": 4} 2025-07-17T13:20:30.835Z INFO peer disconnected {"addr": "172.200.0.1:36830", "error": "EOF", "peerCount": 3} 2025-07-17T13:20:30.959Z INFO new peer connected {"addr": "172.200.0.2:20336", "peerCount": 4} 2025-07-17T13:20:30.959Z INFO new peer connected {"addr": "172.200.0.2:45460", "peerCount": 5} 2025-07-17T13:20:30.959Z INFO peer disconnected {"addr": "172.200.0.2:45460", "error": "identical node id", "peerCount": 4} 2025-07-17T13:20:30.959Z INFO peer disconnected {"addr": "172.200.0.2:20336", "error": "identical node id", "peerCount": 3} 2025-07-17T13:20:30.990Z INFO new peer connected {"addr": "172.200.0.3:20333", "peerCount": 4} 2025-07-17T13:20:30.991Z INFO peer disconnected {"addr": "172.200.0.3:20333", "error": "EOF", "peerCount": 3} 2025-07-17T13:20:31.063Z INFO new peer connected {"addr": "172.200.0.3:57776", "peerCount": 4} 2025-07-17T13:20:31.063Z INFO peer disconnected {"addr": "172.200.0.3:57776", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:31.345Z INFO persisted to disk {"blocks": 0, "keys": 132, "headerHeight": 0, "blockHeight": 0, "took": "1.987032ms"} 2025-07-17T13:20:31.717Z INFO skip change view {"nc": 0, "nf": 3} 2025-07-17T13:20:33.869Z INFO new peer connected {"addr": "172.200.0.3:20333", "peerCount": 4} 2025-07-17T13:20:33.869Z INFO peer disconnected {"addr": "172.200.0.3:20333", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:35.717Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:39.717Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:43.718Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:47.718Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:51.718Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:55.719Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:20:59.720Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:21:03.720Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:21:07.720Z INFO request change view {"view": 0, "height": 1, "reason": "Timeout", "new_view": 1, "nc": 0, "nf": 1} 2025-07-17T13:21:08.731Z INFO received ChangeView {"validator": 0, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:08.759Z INFO received ChangeView {"validator": 3, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:08.759Z INFO changing dbft view {"height": 1, "view": 1, "index": 1, "role": "Backup"} 2025-07-17T13:21:08.760Z INFO received PrepareRequest {"validator": 0, "tx": 0} 2025-07-17T13:21:08.760Z INFO sending PrepareResponse {"height": 1, "view": 1} 2025-07-17T13:21:08.760Z INFO received PrepareResponse {"validator": 3} 2025-07-17T13:21:08.760Z INFO sending Commit {"height": 1, "view": 1} 2025-07-17T13:21:08.760Z INFO received PrepareResponse {"validator": 2} 2025-07-17T13:21:08.761Z INFO received Commit {"validator": 2} 2025-07-17T13:21:08.761Z INFO received Commit {"validator": 0} 2025-07-17T13:21:08.761Z INFO approving block {"height": 1, "hash": "dc412505955938589c69d31a295d31dc97aa209e6b24c7cbedcddaded6d32dfe", "tx_count": 0, "merkle": "0000000000000000000000000000000000000000000000000000000000000000", "prev": "c49d7b254edd009e9094db4380fb60410616fda75cf77a09f3b92a7de1b48f0f"} 2025-07-17T13:21:08.762Z INFO initializing dbft {"height": 2, "view": 0, "index": 1, "role": "Backup"} ``` The rest of nodes won't receive proposal, but will receive CV: ``` 2025-07-17T13:20:30.784Z INFO initializing dbft {"height": 1, "view": 0, "index": 2, "role": "Backup"} 2025-07-17T13:20:30.784Z INFO RPC server already started 2025-07-17T13:20:30.814Z INFO new peer connected {"addr": "172.200.0.1:20335", "peerCount": 3} 2025-07-17T13:20:30.814Z INFO started protocol {"addr": "172.200.0.1:20335", "userAgent": "/NEO-GO:0.110.1-pre-54-gd9313b6f/", "startHeight": 0, "id": 1473506884} 2025-07-17T13:20:30.815Z INFO new peer connected {"addr": "172.200.0.1:38288", "peerCount": 4} 2025-07-17T13:20:30.815Z INFO peer disconnected {"addr": "172.200.0.1:38288", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:30.848Z INFO new peer connected {"addr": "172.200.0.4:20334", "peerCount": 4} 2025-07-17T13:20:30.848Z INFO peer disconnected {"addr": "172.200.0.4:20334", "error": "EOF", "peerCount": 3} 2025-07-17T13:20:30.990Z INFO new peer connected {"addr": "172.200.0.2:45906", "peerCount": 4} 2025-07-17T13:20:30.990Z INFO peer disconnected {"addr": "172.200.0.2:45906", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:31.005Z INFO new peer connected {"addr": "172.200.0.3:20333", "peerCount": 4} 2025-07-17T13:20:31.005Z INFO new peer connected {"addr": "172.200.0.3:53386", "peerCount": 5} 2025-07-17T13:20:31.006Z INFO peer disconnected {"addr": "172.200.0.3:53386", "error": "identical node id", "peerCount": 4} 2025-07-17T13:20:31.006Z INFO peer disconnected {"addr": "172.200.0.3:20333", "error": "identical node id", "peerCount": 3} 2025-07-17T13:20:31.063Z INFO new peer connected {"addr": "172.200.0.2:20336", "peerCount": 4} 2025-07-17T13:20:31.063Z INFO peer disconnected {"addr": "172.200.0.2:20336", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:31.391Z INFO persisted to disk {"blocks": 0, "keys": 132, "headerHeight": 0, "blockHeight": 0, "took": "2.735826ms"} 2025-07-17T13:20:33.869Z INFO new peer connected {"addr": "172.200.0.2:56212", "peerCount": 4} 2025-07-17T13:20:33.869Z INFO peer disconnected {"addr": "172.200.0.2:56212", "error": "already connected", "peerCount": 3} 2025-07-17T13:20:35.719Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:39.719Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:43.719Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:47.719Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:51.720Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:55.720Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:20:59.721Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:03.722Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:07.722Z INFO received ChangeView {"validator": 1, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:08.731Z INFO received ChangeView {"validator": 0, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:08.759Z INFO received ChangeView {"validator": 3, "reason": "Timeout", "new view": 1} 2025-07-17T13:21:08.759Z INFO changing dbft view {"height": 1, "view": 1, "index": 2, "role": "Backup"} 2025-07-17T13:21:08.759Z INFO skip change view {"nc": 0, "nf": 3} 2025-07-17T13:21:08.760Z INFO received PrepareRequest {"validator": 0, "tx": 0} 2025-07-17T13:21:08.760Z INFO sending PrepareResponse {"height": 1, "view": 1} 2025-07-17T13:21:08.760Z INFO received PrepareResponse {"validator": 3} 2025-07-17T13:21:08.760Z INFO sending Commit {"height": 1, "view": 1} 2025-07-17T13:21:08.761Z INFO received PrepareResponse {"validator": 1} 2025-07-17T13:21:08.761Z INFO received Commit {"validator": 1} 2025-07-17T13:21:08.761Z INFO received Commit {"validator": 0} 2025-07-17T13:21:08.761Z INFO approving block {"height": 1, "hash": "dc412505955938589c69d31a295d31dc97aa209e6b24c7cbedcddaded6d32dfe", "tx_count": 0, "merkle": "0000000000000000000000000000000000000000000000000000000000000000", "prev": "c49d7b254edd009e9094db4380fb60410616fda75cf77a09f3b92a7de1b48f0f"} ``` If there are no transactions in the network, then on backup timer timeout backup nodes will request CV. CV happens, new primary creates proposal immedieately and the block is accepted ASAP.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
nspcc-dev/neo-go#1058
No description provided.