Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

[AuRa] What is correct behaviour of Validating Contract with emptyStepsTransition enabled? #9546

@kavu

Description

@kavu

Before filing a new issue, please provide the following information.

  • Parity Ethereum version: Parity-Ethereum/v2.2.0-unstable-6e62d77e4-20180912/x86_64-macos/rustc1.28.0 && Parity-Ethereum/v2.0.4-beta-e2e1d22-20180910/x86_64-macos/rustc1.28.0
  • Operating system: MacOS
  • Installation: built from source && Homebrew

Hello, Parity Team!

Recently I've reported the issue about wrong logic on reporting skipped steps when emptyStepsTransition is enabled (see #9325). And @andresilva fixed it in #9435, many thanks to him!

But now I've faced another problem.

In #9325 we had really generic case, when there is pre-defined list of validators and they have no any ability to repot each other besides reporting about step gap.

But as I said in out production network we have a contract, with reportBenign ability (cite):

Also in this test config you can see simple list of validators, but in production we have contract, which handles reportBenign with removing reported validator. And all validators rather quickly begin to report each other, due to building blocks with a "gap". But that's not the case here, I think I can provide you another chainspec, with contract supplied, to demonstrate similar beheviour.

And now, after the fix, I can't make my validators to report each other, even when the skip their steps! Is it even possible?

Our engine is Authority Round, of course, with immediateTransitions and maximumEmptySteps (set as 3, but any value will show same behaviour, even 0) and reporting (non-safe) validator contract, with reportBenign programmed to remove validators from a list of validators.

  "engine": {
    "authorityRound": {
      "params": {
        "immediateTransitions": true,
        "stepDuration": 4,
        "maximumEmptySteps": 3,
        "emptyStepsTransition": 0,
        "validators" : {
          "contract": "0x0000000000000000000000000000000000000100"
        }
      }
    }
  },

I am adding 3 random addresses as validators, they are non-existent nodes, and they never connect of seal anything.

As you can see in logs below, there is no any reporting (as per engine) and transitioning to new validator set (as per contract logic) here. And of course block generation is really slow, on every step we are waiting for non-existent validator and we receive no empty (or real) seals.

My wild guess is that we need to add a report_skipped after
https://github.com/paritytech/parity-ethereum/blob/98f6d6cae51528b717d75abae91411a0ab5c1fa3/ethcore/src/engines/authority_round/mod.rs#L1007

But I pretty much sure, that it's wrong way to solve(?) it.

Thanks in advance!

And here is my logs:

Loading config file from config.toml
2018-09-13 12:24:03  main INFO parity_ethereum::run  Starting Parity-Ethereum/v2.2.0-unstable-6e62d77e4-20180912/x86_64-macos/rustc1.28.0
2018-09-13 12:24:03  main INFO parity_ethereum::run  Keys path eth/keys/Polys
2018-09-13 12:24:03  main INFO parity_ethereum::run  DB path eth/db/Polys/db/27eb180af56a89b9
2018-09-13 12:24:03  main INFO parity_ethereum::run  State DB configuration: fast
2018-09-13 12:24:03  main INFO parity_ethereum::run  Operating mode: active
2018-09-13 12:24:03  main DEBUG poa  Setting Engine signer to 0x4e65…162e
2018-09-13 12:24:04  main INFO ethcore_service::service  Configured for Polys using AuthorityRound engine
2018-09-13 12:24:04  main TRACE engine  obtained proof for initial set: 1 validators, 4682 bytes
2018-09-13 12:24:04  main INFO engine  Signal for switch to contract-based validator set.
2018-09-13 12:24:04  main INFO engine  Initial contract validators: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e]
2018-09-13 12:24:04  main TRACE engine  Setting up contract caller.
2018-09-13 12:24:04  IO Worker #2 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e]
2018-09-13 12:24:04  IO Worker #2 TRACE engine  Fetched proposer for step 384207661: 0x4e65…162e
2018-09-13 12:24:04  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xaeb728f1d3a45e5c0c65f18315cac028ad3a4f4ee7684a0828939b6ae1a665e51bd013f739a95ffdec9487229e6dbe96f9f1069c1083cfc8736f1b886a21d1d601, step: 384207661, parent_hash: 0x438a0cd2e9a0eb39a03efc7a227df6f48f28fac827eb180af56a89b97338884f }
2018-09-13 12:24:08  IO Worker #3 TRACE engine  Fetched proposer for step 384207662: 0x4e65…162e
2018-09-13 12:24:08  IO Worker #3 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0x5a335554b5ecc8b8a1db9fe24b8637033af85f73c2e60298a5f5e563339bc63f332856fd959ef3c0064c2995db6648a86d0de48d62f3f04dc75f5b4d9308be2301, step: 384207662, parent_hash: 0x438a0cd2e9a0eb39a03efc7a227df6f48f28fac827eb180af56a89b97338884f }
2018-09-13 12:24:09  IO Worker #2 INFO network  Public node URL: enode://ff6744f2e25495340a991239092714c2925070ccd97ae4c981ac4844c0cb740d94b11531e3b4fb9362b98a63e3c9205e6890eeb5c38e49d0fb06eda096c39750@10.16.176.89:30329
2018-09-13 12:24:12  IO Worker #3 TRACE engine  Fetched proposer for step 384207663: 0x4e65…162e
2018-09-13 12:24:12  IO Worker #3 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0x37cacf907ae1de5d7647d714770762e7b0dbfee1931f8a789d2c4a1245021f0d47bd50a6c435b0d08c71f26656d707e4a7acdb07fe0aa3e2acb3b5783ac87c0000, step: 384207663, parent_hash: 0x438a0cd2e9a0eb39a03efc7a227df6f48f28fac827eb180af56a89b97338884f }
2018-09-13 12:24:16  IO Worker #3 TRACE engine  Fetched proposer for step 384207664: 0x4e65…162e
2018-09-13 12:24:16  IO Worker #3 TRACE engine  generate_seal: Issuing a block for step 384207664.
2018-09-13 12:24:16  IO Worker #3 INFO import  Imported #1 0xb9e6…b1ea (0 txs, 0.00 Mgas, 8 ms, 0.79 KiB)
2018-09-13 12:24:20  IO Worker #3 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e]
2018-09-13 12:24:20  IO Worker #3 TRACE engine  Fetched proposer for step 384207665: 0x4e65…162e
2018-09-13 12:24:20  IO Worker #3 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0x6d29dd677a5ad9b987160cd95b8504a978fcdb8e226378cd610f9f86c3856b92615b0c4054115a3ecc7e51b740113af083a9448bee431e5262b4ce30fa07d86a00, step: 384207665, parent_hash: 0xb9e666881b1aae590a0a894e1064ce3d0ad010b01071ef917634bd1e8f6db1ea }
2018-09-13 12:24:24  IO Worker #3 TRACE engine  Fetched proposer for step 384207666: 0x4e65…162e
2018-09-13 12:24:24  IO Worker #3 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0x6daa6fcfea63803536ff338f3e102b1839ec38b0af5a93b696c50b1bf78fbbc83d4ce42f0ac1a831f5b67fc17a6a6d45657c98d876519abe7f2af840f10fcb0201, step: 384207666, parent_hash: 0xb9e666881b1aae590a0a894e1064ce3d0ad010b01071ef917634bd1e8f6db1ea }
2018-09-13 12:24:25   WARN parity_rpc::v1::impls::eth  Fallback to `BlockId::Latest`
2018-09-13 12:24:28  IO Worker #0 TRACE engine  Fetched proposer for step 384207667: 0x4e65…162e
2018-09-13 12:24:28  IO Worker #0 TRACE engine  generate_seal: Issuing a block for step 384207667.
2018-09-13 12:24:28  IO Worker #0 INFO import  Imported #2 0xb0ff…4493 (1 txs, 0.10 Mgas, 8 ms, 0.86 KiB)
2018-09-13 12:24:32  IO Worker #0 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76]
2018-09-13 12:24:32  IO Worker #0 TRACE engine  Fetched proposer for step 384207668: 0x4e65…162e
2018-09-13 12:24:32  IO Worker #0 TRACE engine  generate_seal: Issuing a block for step 384207668.
2018-09-13 12:24:32  IO Worker #0 INFO import  Imported #3 0x5a3c…1d3f (1 txs, 0.10 Mgas, 8 ms, 0.71 KiB)
2018-09-13 12:24:34  IO Worker #0 INFO import     0/25 peers   16 KiB chain 22 KiB db 0 bytes queue 448 bytes sync  RPC:  1 conn,    3 req/s, 1606 µs
2018-09-13 12:24:36  IO Worker #1 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d77]
2018-09-13 12:24:36  IO Worker #1 TRACE engine  Fetched proposer for step 384207669: 0x4e65…162e
2018-09-13 12:24:36  IO Worker #1 TRACE engine  generate_seal: Issuing a block for step 384207669.
2018-09-13 12:24:36  IO Worker #1 INFO import  Imported #4 0xf242…137a (1 txs, 0.10 Mgas, 8 ms, 0.71 KiB)
2018-09-13 12:24:40  IO Worker #0 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d77, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d78]
2018-09-13 12:24:40  IO Worker #0 TRACE engine  Fetched proposer for step 384207670: 0x5e27…7d77
2018-09-13 12:24:40  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207670.
2018-09-13 12:24:44  IO Worker #2 TRACE engine  Fetched proposer for step 384207671: 0x5e27…7d78
2018-09-13 12:24:44  IO Worker #2 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207671.
2018-09-13 12:24:48  IO Worker #1 TRACE engine  Fetched proposer for step 384207672: 0x4e65…162e
2018-09-13 12:24:48  IO Worker #1 TRACE engine  generate_seal: Issuing a block for step 384207672.
2018-09-13 12:24:48  IO Worker #1 INFO import  Imported #5 0x5690…f600 (1 txs, 0.07 Mgas, 10 ms, 0.71 KiB)
2018-09-13 12:24:52  IO Worker #3 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d77, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d78]
2018-09-13 12:24:52  IO Worker #3 TRACE engine  Fetched proposer for step 384207673: 0x5e27…7d76
2018-09-13 12:24:52  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207673.
2018-09-13 12:24:56  IO Worker #1 TRACE engine  Fetched proposer for step 384207674: 0x5e27…7d77
2018-09-13 12:24:56  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207674.
2018-09-13 12:25:00  IO Worker #1 TRACE engine  Fetched proposer for step 384207675: 0x5e27…7d78
2018-09-13 12:25:00  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207675.
2018-09-13 12:25:04  IO Worker #2 TRACE engine  Fetched proposer for step 384207676: 0x4e65…162e
2018-09-13 12:25:04  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xf41cd3d65e6d600c64476f4dd630f850088172029d756aa0f21800437da3d2f05cde965b08ddeff2a67ab775dcbe3c74a8320f36d5c5c56cb02512d9ee360d9700, step: 384207676, parent_hash: 0x56907fe666ce0bb9455da8bd6654ffb9bae7ec879269dc5efaff23207e16f600 }
2018-09-13 12:25:04  IO Worker #0 INFO import     0/25 peers   19 KiB chain 25 KiB db 0 bytes queue 448 bytes sync  RPC:  0 conn,    1 req/s,  351 µs
2018-09-13 12:25:08  IO Worker #3 TRACE engine  Fetched proposer for step 384207677: 0x5e27…7d76
2018-09-13 12:25:08  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207677.
2018-09-13 12:25:12  IO Worker #0 TRACE engine  Fetched proposer for step 384207678: 0x5e27…7d77
2018-09-13 12:25:12  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207678.
2018-09-13 12:25:16  IO Worker #3 TRACE engine  Fetched proposer for step 384207679: 0x5e27…7d78
2018-09-13 12:25:16  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207679.
2018-09-13 12:25:20  IO Worker #2 TRACE engine  Fetched proposer for step 384207680: 0x4e65…162e
2018-09-13 12:25:20  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xe24042b78a8ad36e4addf12683724db4925743ff6e7c19d758cc8d44a38ec6cf5b4179ce8494ecc10cb727f8e93740373698274cd025774d1fa073fa39a32e0100, step: 384207680, parent_hash: 0x56907fe666ce0bb9455da8bd6654ffb9bae7ec879269dc5efaff23207e16f600 }
2018-09-13 12:25:24  IO Worker #0 TRACE engine  Fetched proposer for step 384207681: 0x5e27…7d76
2018-09-13 12:25:24  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207681.
2018-09-13 12:25:28  IO Worker #1 TRACE engine  Fetched proposer for step 384207682: 0x5e27…7d77
2018-09-13 12:25:28  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207682.
2018-09-13 12:25:32  IO Worker #1 TRACE engine  Fetched proposer for step 384207683: 0x5e27…7d78
2018-09-13 12:25:32  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207683.
2018-09-13 12:25:34  IO Worker #3 INFO import     0/25 peers   19 KiB chain 25 KiB db 0 bytes queue 448 bytes sync  RPC:  0 conn,    0 req/s,  351 µs
2018-09-13 12:25:36  IO Worker #2 TRACE engine  Fetched proposer for step 384207684: 0x4e65…162e
2018-09-13 12:25:36  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xa707de6b00c48f9e12d66ff26dcd966d9a878d284ccfca7176b8a36b566c98a303d6976d9c7bef539ec723833e4ec930537d81c09925c7c37f5e63ac00fc097401, step: 384207684, parent_hash: 0x56907fe666ce0bb9455da8bd6654ffb9bae7ec879269dc5efaff23207e16f600 }
2018-09-13 12:25:40  IO Worker #2 TRACE engine  Fetched proposer for step 384207685: 0x5e27…7d76
2018-09-13 12:25:40  IO Worker #2 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207685.
2018-09-13 12:25:44  IO Worker #0 TRACE engine  Fetched proposer for step 384207686: 0x5e27…7d77
2018-09-13 12:25:44  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207686.
2018-09-13 12:25:48  IO Worker #0 TRACE engine  Fetched proposer for step 384207687: 0x5e27…7d78
2018-09-13 12:25:48  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207687.
2018-09-13 12:25:52  IO Worker #1 TRACE engine  Fetched proposer for step 384207688: 0x4e65…162e
2018-09-13 12:25:52  IO Worker #1 TRACE engine  generate_seal: Issuing a block for step 384207688.
2018-09-13 12:25:52  IO Worker #1 INFO import  Imported #6 0xa15f…f94d (0 txs, 0.00 Mgas, 10 ms, 0.79 KiB)
2018-09-13 12:25:56  IO Worker #3 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d77, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d78]
2018-09-13 12:25:56  IO Worker #3 TRACE engine  Fetched proposer for step 384207689: 0x5e27…7d76
2018-09-13 12:25:56  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207689.
2018-09-13 12:26:00  IO Worker #0 TRACE engine  Fetched proposer for step 384207690: 0x5e27…7d77
2018-09-13 12:26:00  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207690.
2018-09-13 12:26:04  IO Worker #1 TRACE engine  Fetched proposer for step 384207691: 0x5e27…7d78
2018-09-13 12:26:04  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207691.
2018-09-13 12:26:08  IO Worker #2 TRACE engine  Fetched proposer for step 384207692: 0x4e65…162e
2018-09-13 12:26:08  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xb469fa8c0e80ec46cd9c8beeb5751064a01dfd1f29bfae29c12d340953ccdf97297f0e9d2bee38ebb5cf1bff624494ef2ffa11d05cde5c106376d2a136ad3e9801, step: 384207692, parent_hash: 0xa15f3c2338ac7c0ff59f7c4d9af4118046c4d0df1d04b1897358fedd7618f94d }
2018-09-13 12:26:09  IO Worker #0 INFO import     0/25 peers   19 KiB chain 25 KiB db 0 bytes queue 448 bytes sync  RPC:  0 conn,    0 req/s,  351 µs
2018-09-13 12:26:12  IO Worker #1 TRACE engine  Fetched proposer for step 384207693: 0x5e27…7d76
2018-09-13 12:26:12  IO Worker #1 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207693.
2018-09-13 12:26:16  IO Worker #2 TRACE engine  Fetched proposer for step 384207694: 0x5e27…7d77
2018-09-13 12:26:16  IO Worker #2 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207694.
2018-09-13 12:26:20  IO Worker #0 TRACE engine  Fetched proposer for step 384207695: 0x5e27…7d78
2018-09-13 12:26:20  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207695.
2018-09-13 12:26:24  IO Worker #1 TRACE engine  Fetched proposer for step 384207696: 0x4e65…162e
2018-09-13 12:26:24  IO Worker #1 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xc07500d1a2cff2bb3c7950e3704f3fe6b157c6768953ebf198103f6c45aa66865716f1e03beb692a0850df8252d5f9f53b2a4db616761127cae6b2f4f316e65901, step: 384207696, parent_hash: 0xa15f3c2338ac7c0ff59f7c4d9af4118046c4d0df1d04b1897358fedd7618f94d }
2018-09-13 12:26:28  IO Worker #0 TRACE engine  Fetched proposer for step 384207697: 0x5e27…7d76
2018-09-13 12:26:28  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207697.
2018-09-13 12:26:32  IO Worker #3 TRACE engine  Fetched proposer for step 384207698: 0x5e27…7d77
2018-09-13 12:26:32  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207698.
2018-09-13 12:26:36  IO Worker #0 TRACE engine  Fetched proposer for step 384207699: 0x5e27…7d78
2018-09-13 12:26:36  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207699.
2018-09-13 12:26:39  IO Worker #0 INFO import     0/25 peers   19 KiB chain 25 KiB db 0 bytes queue 448 bytes sync  RPC:  0 conn,    0 req/s,  351 µs
2018-09-13 12:26:40  IO Worker #2 TRACE engine  Fetched proposer for step 384207700: 0x4e65…162e
2018-09-13 12:26:40  IO Worker #2 TRACE engine  broadcasting empty step message: EmptyStep { signature: 0xe540597ee492004b18a5c012256dc0232915f9b2489d848fab3eeda93bee612743c604c1b370a32820821e97da477b02f00cae0f551220182f5c96c3ce145eae01, step: 384207700, parent_hash: 0xa15f3c2338ac7c0ff59f7c4d9af4118046c4d0df1d04b1897358fedd7618f94d }
2018-09-13 12:26:44  IO Worker #0 TRACE engine  Fetched proposer for step 384207701: 0x5e27…7d76
2018-09-13 12:26:44  IO Worker #0 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207701.
2018-09-13 12:26:48  IO Worker #3 TRACE engine  Fetched proposer for step 384207702: 0x5e27…7d77
2018-09-13 12:26:48  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207702.
2018-09-13 12:26:52  IO Worker #3 TRACE engine  Fetched proposer for step 384207703: 0x5e27…7d78
2018-09-13 12:26:52  IO Worker #3 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207703.
2018-09-13 12:26:56  IO Worker #0 TRACE engine  Fetched proposer for step 384207704: 0x4e65…162e
2018-09-13 12:26:56  IO Worker #0 TRACE engine  generate_seal: Issuing a block for step 384207704.
2018-09-13 12:26:56  IO Worker #0 INFO import  Imported #7 0x6bdc…7648 (0 txs, 0.00 Mgas, 8 ms, 0.79 KiB)
2018-09-13 12:27:00  IO Worker #2 DEBUG engine  Set of validators obtained: [0x4e65fabe9a857524d0a3c7a69308462fe9fc162e, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d76, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d77, 0x5e27485c0ab3ec9f87429b0fed98b244c52f7d78]
2018-09-13 12:27:00  IO Worker #2 TRACE engine  Fetched proposer for step 384207705: 0x5e27…7d76
2018-09-13 12:27:00  IO Worker #2 TRACE engine  generate_seal: 0x4e65…162e not a proposer for step 384207705.
^C2018-09-13 12:27:01  main INFO parity_ethereum::run  Finishing work, please wait...

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions