chaintope / tapyrus-signer

Tapyrus Signer reference implementation.
GNU General Public License v3.0
7 stars 8 forks source link

fix failure when the node is not a member of the current federation #120

Closed rantan closed 4 years ago

Yamaguchi commented 4 years ago

NodeStateがIdlingからMember または Masterに移行する際に、panic!が発生します。

[2020-04-29T13:54:08Z TRACE tapyrus_signer::rpc] JSON-RPC request: {"method":"getblockchaininfo","params":[],"id":2,"jsonrpc":"2.0"}
[2020-04-29T13:54:08Z TRACE tapyrus_signer::timer] Start Timer name=round_timer timelimit=40s
[2020-04-29T13:54:08Z TRACE tapyrus_signer::rpc] JSON-RPC response: getblockchaininfo: {"result":{"aggregatePubkeys":{"025171025ffc89954ba97e81e6d02bb556c27613ce6913c6ab03f1b18e52b5ed88":11,"03addb2555f37abf8f28f11f498bec7bd1460e7243c1813847c49a7ae326a97d1c":0},"bestblockhash":"4d9b0694ca40840def2974b4c7411b58058920a6dbc4496692ef8f51d7cabeca","blocks":10,"chain":"1905960821","headers":10,"initialblockdownload":false,"mediantime":1588166549,"mode":"prod","pruned":false,"size_on_disk":3446,"verificationprogress":1,"warnings":""},"error":null,"id":2,"jsonrpc":null}
thread 'main' panicked at 'The nodevss must not None, when it's used. block_height: 0', src/libcore/option.rs:1185:5
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:77
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:61
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1028
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1412
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:65
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:50
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:188
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:205
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:464
  11: std::panicking::continue_panic_fmt
             at src/libstd/panicking.rs:373
  12: rust_begin_unwind
             at src/libstd/panicking.rs:302
  13: core::panicking::panic_fmt
             at src/libcore/panicking.rs:139
  14: core::option::expect_failed
             at src/libcore/option.rs:1185
  15: tapyrus_signer::federation::Federation::signers
  16: tapyrus_signer::signer_node::node_parameters::NodeParameters<T>::pubkey_list
  17: tapyrus_signer::signer_node::next_master_index
  18: tapyrus_signer::signer_node::SignerNode<T,C>::start_next_round
  19: tapyrus_signer::signer_node::SignerNode<T,C>::start
  20: tapyrus_signerd::main
  21: std::rt::lang_start::{{closure}}
  22: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:48
  23: std::panicking::try::do_call
             at src/libstd/panicking.rs:287
  24: __rust_maybe_catch_panic
             at src/libpanic_unwind/lib.rs:78
  25: std::panicking::try
             at src/libstd/panicking.rs:265
  26: std::panic::catch_unwind
             at src/libstd/panic.rs:396
  27: std::rt::lang_start_internal
             at src/libstd/rt.rs:47
  28: main
  29: __libc_start_main
  30: _start
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

NodeStateのblock_heightが0のままとなっているように見える。

Yamaguchi commented 4 years ago

federations.toml is like this:

[[federation]]
block-height = 0
aggregated-public-key = "03addb2555f37abf8f28f11f498bec7bd1460e7243c1813847c49a7ae326a97d1c"

[[federation]]
block-height = 10
threshold = 3
aggregated-public-key = "025171025ffc89954ba97e81e6d02bb556c27613ce6913c6ab03f1b18e52b5ed88"
node-vss = [
    "03b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d028f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae30003b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d1bb2811fe36fa9e15b7afc0ecdb4c51cad86c2c9135607f38e4ae58198311273bd02c56403d95b6d54deb69065e311d043effc4453fabc712be44849c631922cf016644c222d0bcc55b757e82f8b935d1355357da5efa41814bf7aa2c9c968534187ab255f33352dacc8a47c2afbcd72da22fa3784bf9fe2ba7da277ab8cb36d7a81a6a4e465d7cc74446ca256e237647d696401f3d69f26360cf0f94ad1e4bd62605306b81d7225b9aeb5cfe752534ad4d6e12d51ab1bb014f7993aa78c5e65b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d1bb2811fe36fa9e15b7afc0ecdb4c51cad86c2c9135607f38e4ae58198311273bd02c56403d95b6d54deb69065e311d043effc4453fabc712be44849c631922cf016644c222d0bcc55b757e82f8b935d1355357da5efa41814bf7aa2c9c968534187ab255f33352dacc8a47c2afbcd72da22fa3784bf9fe2ba7da277ab8cb36d7a81a6a4e465d7cc74446ca256e237647d696401f3d69f26360cf0f94ad1e4bd62605306b81d7225b9aeb5cfe752534ad4d6e12d51ab1bb014f7993aa78c5e65",
    "0313f2a73541e6d55a75a80a6da819885c6ed6e56ecff19f5e928c4ea202ca7c90028f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae3000313f2a73541e6d55a75a80a6da819885c6ed6e56ecff19f5e928c4ea202ca7c90adbd69de8655fcc6ead8e771f9f31ead7a431e543bf8ac8d921c80ab301bc8d14434ad06d47a7fc9a31a059b3a9c8bfe756e7cf46aceaf4bf236bb5052080fe14ac0c423f1097f1b0d0bd65eac0ad033d701a16d0b9360b65a06bac4d7bf32453f890b7edb42b9fdd3ed5b3873b894998482cd58001be603dce06840727ac74bac7fcd06b69b1e584400aace503dd3d848ed2dcd704047df85ffb27c62b311e68be76275d32eaf24f89d11b784c32d88c2d052ba9c20fadadcad559c8a613a3e13f2a73541e6d55a75a80a6da819885c6ed6e56ecff19f5e928c4ea202ca7c90adbd69de8655fcc6ead8e771f9f31ead7a431e543bf8ac8d921c80ab301bc8d14434ad06d47a7fc9a31a059b3a9c8bfe756e7cf46aceaf4bf236bb5052080fe14ac0c423f1097f1b0d0bd65eac0ad033d701a16d0b9360b65a06bac4d7bf32453f890b7edb42b9fdd3ed5b3873b894998482cd58001be603dce06840727ac74bac7fcd06b69b1e584400aace503dd3d848ed2dcd704047df85ffb27c62b311e68be76275d32eaf24f89d11b784c32d88c2d052ba9c20fadadcad559c8a613a3e",
    "023cb7d6326e33332d04d026be1a04cdaf084703d8dc75322182d8fb314a03a877028f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae300033cb7d6326e33332d04d026be1a04cdaf084703d8dc75322182d8fb314a03a877be6e3e5cdfc8877c9f9b1a0bbee781019c55098025b03fcede5e4947d16f614072a0d1557a163b0ad262d2c972c4a3c242c3caf4cc0f025aceb2a0bbe53ebf139ba181bda2fe8e1535265336e259b7e57a90b135dd180e769aba8389fdeed32c4068d8fef7b3beb1da0bec4004bf41f9dfe8e81e3eade9d778f26410d152f5ae5cd73f5e01781362d3d9dc95dd806087e4a7ab192b7f50ff8a4fd21f63755e19ed6fbf9eb1fa53e6a1b364452d0d9a5135554430170c058a653e741dfb7310763cb7d6326e33332d04d026be1a04cdaf084703d8dc75322182d8fb314a03a877be6e3e5cdfc8877c9f9b1a0bbee781019c55098025b03fcede5e4947d16f614072a0d1557a163b0ad262d2c972c4a3c242c3caf4cc0f025aceb2a0bbe53ebf139ba181bda2fe8e1535265336e259b7e57a90b135dd180e769aba8389fdeed32c4068d8fef7b3beb1da0bec4004bf41f9dfe8e81e3eade9d778f26410d152f5ae5cd73f5e01781362d3d9dc95dd806087e4a7ab192b7f50ff8a4fd21f63755e19ed6fbf9eb1fa53e6a1b364452d0d9a5135554430170c058a653e741dfb731076",
    "028f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae3028f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae300038f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae32ee7ae5ff8c22d01a8014b170d9fd0122e3f080ba58229a76e9f9f749452a0be589760a2d084977e9b4d5c9dfd999bb28c7e64b13f8df6c659915660978b82562ab07369c54f102080de739986a1a418b408bb3e16bac5abfb55df6bfc9bf1b50bc92ea9cdd633522b05d15e40b09e0cb2b3eb73966c10c5294c4b86452a71453e0539c0cc20d081cfb559590d084716440e0e5c6b0731a77d5a8bb42fd24daa2b368dcd162560a3ed4be6b5a9c85487597b5a2ddd8beebacf98527567fc06678f8ac48009cb0883c4acb3538956255b85c46508c7b285f6631f0ac546ac4ae32ee7ae5ff8c22d01a8014b170d9fd0122e3f080ba58229a76e9f9f749452a0be589760a2d084977e9b4d5c9dfd999bb28c7e64b13f8df6c659915660978b82562ab07369c54f102080de739986a1a418b408bb3e16bac5abfb55df6bfc9bf1b50bc92ea9cdd633522b05d15e40b09e0cb2b3eb73966c10c5294c4b86452a71453e0539c0cc20d081cfb559590d084716440e0e5c6b0731a77d5a8bb42fd24daa2b368dcd162560a3ed4be6b5a9c85487597b5a2ddd8beebacf98527567fc0667"
]
Yamaguchi commented 4 years ago

After the new coming node starts, it has "Joining" state that has 0 block height.

In this part, block_height should not be 0 but the current blocks given by getblockchaininfo

let block_height = state.block_height();
next % params.pubkey_list(block_height + 1).len()
Yamaguchi commented 4 years ago

block_heightの扱いが(私の理解と)1つずれているようなので、以下の変更を加えて動かしてます。

getblockchaininfoで取得したblock_heightは最新のブロック高で、ラウンド開始する際はそれに+1した値のblock_heightでブロックを生成するべきかなと思ってます。

https://github.com/Yamaguchi/tapyrus-signer/commit/9d9a13cbc2480a1db143271be275c350fad13727

Yamaguchi commented 4 years ago

それとは別に、このラウンドとNodeState回りの実装はカオスな感じがしますので、次バージョンで見直すべきかと思っています。 具体的には、ラウンド内での役割(master/member)とノードの状態(アクティブ/非アクティブ)は分離した方がよいかと考えています。

Untitled Diagram (3)

rantan commented 4 years ago

それとは別に、このラウンドとNodeState回りの実装はカオスな感じがしますので、次バージョンで見直すべきかと思っています。

見直し賛成です。 issue を立ててもらえると助かります。

rantan commented 4 years ago

At least, this PR has an error below.

11:53:53 daisuke.1 | [2020-05-04T02:53:53Z TRACE tapyrus_signer::rpc] JSON-RPC request: {"method":"getblockchaininfo","params":[],"id":50,"jsonrpc":"2.0"}
11:53:53 daisuke.1 | [2020-05-04T02:53:53Z TRACE tapyrus_signer::timer] Start Timer name=round_timer timelimit=40s
11:53:53 daisuke.1 | [2020-05-04T02:53:53Z TRACE tapyrus_signer::rpc] JSON-RPC response: getblockchaininfo: {"result":{"aggregatePubkeys":{"0208bcc4ec93360c528416520503e71a200945ec167ab05abcefb81446c1d4fcec":5,"02c609e7cfedfd21553d9b6b45b2f66d1e693255f093c6db9c42d1fa7c22634718":0},"bestblockhash":"587993411b576eb339e7585d9a68d67a9dcece03f3ee6ebc5c44028327e1863b","blocks":8,"chain":"1905960821","headers":8,"initialblockdownload":false,"mediantime":1588560302,"mode":"dev","pruned":false,"size_on_disk":2810,"verificationprogress":1.091819425282206e-18,"warnings":"This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"},"error":null,"id":50,"jsonrpc":null}
11:53:53 daisuke.1 | thread 'main' panicked at 'The nodevss must not None, when it's used.', src/federation.rs:153:9
11:53:53 daisuke.1 | stack backtrace:
11:53:53 daisuke.1 |    0: backtrace::backtrace::libunwind::trace
11:53:53 daisuke.1 |              at /Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.44/src/backtrace/libunwind.rs:86
11:53:53 daisuke.1 |    1: backtrace::backtrace::trace_unsynchronized
11:53:53 daisuke.1 |              at /Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.44/src/backtrace/mod.rs:66
11:53:53 daisuke.1 |    2: std::sys_common::backtrace::_print_fmt
11:53:53 daisuke.1 |              at src/libstd/sys_common/backtrace.rs:78
11:53:53 daisuke.1 |    3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
11:53:53 daisuke.1 |              at src/libstd/sys_common/backtrace.rs:59
11:53:53 daisuke.1 |    4: core::fmt::ArgumentV1::show_usize
11:53:53 daisuke.1 |    5: std::io::Write::write_fmt
11:53:53 daisuke.1 |              at src/libstd/io/mod.rs:1428
11:53:53 daisuke.1 |    6: std::sys_common::backtrace::_print
11:53:53 daisuke.1 |              at src/libstd/sys_common/backtrace.rs:62
11:53:53 daisuke.1 |    7: std::sys_common::backtrace::print
11:53:53 daisuke.1 |              at src/libstd/sys_common/backtrace.rs:49
11:53:53 daisuke.1 |    8: std::panicking::default_hook::{{closure}}
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:204
11:53:53 daisuke.1 |    9: std::panicking::default_hook
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:224
11:53:53 daisuke.1 |   10: std::panicking::rust_panic_with_hook
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:470
11:53:53 daisuke.1 |   11: rust_begin_unwind
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:378
11:53:53 daisuke.1 |   12: std::panicking::begin_panic
11:53:53 daisuke.1 |   13: std::panicking::begin_panic
11:53:53 daisuke.1 |   14: core::option::Option<T>::expect
11:53:53 daisuke.1 |              at /rustc/8aa9d2014f4e5258f83b907e8431c59a33acdae7/src/libcore/option.rs:347
11:53:53 daisuke.1 |   15: tapyrus_signer::federation::Federation::nodevss
11:53:53 daisuke.1 |              at src/federation.rs:153
11:53:53 daisuke.1 |   16: tapyrus_signer::federation::Federation::signers
11:53:53 daisuke.1 |              at src/federation.rs:137
11:53:53 daisuke.1 |   17: tapyrus_signer::signer_node::node_parameters::NodeParameters<T>::pubkey_list
11:53:53 daisuke.1 |              at /Users/taniguchi/repos/chaintope/tapyrus-signer/src/signer_node/node_parameters.rs:83
11:53:53 daisuke.1 |   18: tapyrus_signer::signer_node::next_master_index
11:53:53 daisuke.1 |              at /Users/taniguchi/repos/chaintope/tapyrus-signer/src/signer_node/mod.rs:497
11:53:53 daisuke.1 |   19: tapyrus_signer::signer_node::SignerNode<T,C>::start_next_round
11:53:53 daisuke.1 |              at /Users/taniguchi/repos/chaintope/tapyrus-signer/src/signer_node/mod.rs:444
11:53:53 daisuke.1 |   20: tapyrus_signer::signer_node::SignerNode<T,C>::start
11:53:53 daisuke.1 |              at /Users/taniguchi/repos/chaintope/tapyrus-signer/src/signer_node/mod.rs:214
11:53:53 daisuke.1 |   21: tapyrus_signerd::main
11:53:53 daisuke.1 |              at src/bin/tapyrus-signerd.rs:69
11:53:53 daisuke.1 |   22: std::rt::lang_start::{{closure}}
11:53:53 daisuke.1 |              at /rustc/8aa9d2014f4e5258f83b907e8431c59a33acdae7/src/libstd/rt.rs:67
11:53:53 daisuke.1 |   23: std::rt::lang_start_internal::{{closure}}
11:53:53 daisuke.1 |              at src/libstd/rt.rs:52
11:53:53 daisuke.1 |   24: std::panicking::try::do_call
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:303
11:53:53 daisuke.1 |   25: __rust_maybe_catch_panic
11:53:53 daisuke.1 |              at src/libpanic_unwind/lib.rs:86
11:53:53 daisuke.1 |   26: std::panicking::try
11:53:53 daisuke.1 |              at src/libstd/panicking.rs:281
11:53:53 daisuke.1 |   27: std::panic::catch_unwind
11:53:53 daisuke.1 |              at src/libstd/panic.rs:394
11:53:53 daisuke.1 |   28: std::rt::lang_start_internal
11:53:53 daisuke.1 |              at src/libstd/rt.rs:51
11:53:53 daisuke.1 |   29: std::rt::lang_start
11:53:53 daisuke.1 |              at /rustc/8aa9d2014f4e5258f83b907e8431c59a33acdae7/src/libstd/rt.rs:67
11:53:53 daisuke.1 |   30: tapyrus_signerd::load_federations
11:53:53 daisuke.1 | note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

federations.toml

[[federation]]
block-height= 0
aggregated-public-key = "02c609e7cfedfd21553d9b6b45b2f66d1e693255f093c6db9c42d1fa7c22634718"

[[federation]]
block-height = 5
threshold = 3
aggregated-public-key = "0208bcc4ec93360c528416520503e71a200945ec167ab05abcefb81446c1d4fcec"
node-vss = [
  "02125fad915906961a8307a39784690229b12045bd65812b6bad2a685baf89f8bf03d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200a0003125fad915906961a8307a39784690229b12045bd65812b6bad2a685baf89f8bf2c78ca19fc68f7e0473995b4d62f567abee41e67bd934b279477ab2abd2fd6bc3c4203a930a9ea09db38b45a2653798bbd83bc34d312c2bccde4f35404f8c1f18b4f0b977c89e8d68e19112e47279cb6c5bfd0aaf7180f6cef76726b6f0dc2f58645c1fa22656793b2e174a725136d0f6567cb365a8239a1d2957790f5d653f13bbf47618d255874d6ed90af54ce7a4bfdbe4b896ce39add2a564b99a1c69b717eb1c5407e43ab9d5f8826417077634dee717895b83d0e1f33358520a90a4651125fad915906961a8307a39784690229b12045bd65812b6bad2a685baf89f8bf2c78ca19fc68f7e0473995b4d62f567abee41e67bd934b279477ab2abd2fd6bc3c4203a930a9ea09db38b45a2653798bbd83bc34d312c2bccde4f35404f8c1f18b4f0b977c89e8d68e19112e47279cb6c5bfd0aaf7180f6cef76726b6f0dc2f58645c1fa22656793b2e174a725136d0f6567cb365a8239a1d2957790f5d653f13bbf47618d255874d6ed90af54ce7a4bfdbe4b896ce39add2a564b99a1c69b717eb1c5407e43ab9d5f8826417077634dee717895b83d0e1f33358520a90a4651",
  "039fed61ee184ec428ec5578e1e9d484cca2e1948326936775e8b860fb010ac9ee03d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200a00039fed61ee184ec428ec5578e1e9d484cca2e1948326936775e8b860fb010ac9ee2e3fca4b749207adb476ad26ebaf13508f21e01cd617ab5ec2958b56343a9aa1265798e83f82edce7325b807f7321b8259315bd1be9feca17f6bf8a17580e27b7cffd79dfa8ce4f28784348b3c6a313735497140478f2a7eab13666de3c760698f7735cfcca51aad3ea3b9ef0125acaf5973e8f501da5d7ccbb4a4d880a643877d8fc51b6c2560673375a48ec602fd00668dab4bc1b38aee4da313dfd6ad2a9c9d9f61dd01888398ef55d49795f38b32f3cf95eb4de8d71915e7e6153ecc1f0e9fed61ee184ec428ec5578e1e9d484cca2e1948326936775e8b860fb010ac9ee2e3fca4b749207adb476ad26ebaf13508f21e01cd617ab5ec2958b56343a9aa1265798e83f82edce7325b807f7321b8259315bd1be9feca17f6bf8a17580e27b7cffd79dfa8ce4f28784348b3c6a313735497140478f2a7eab13666de3c760698f7735cfcca51aad3ea3b9ef0125acaf5973e8f501da5d7ccbb4a4d880a643877d8fc51b6c2560673375a48ec602fd00668dab4bc1b38aee4da313dfd6ad2a9c9d9f61dd01888398ef55d49795f38b32f3cf95eb4de8d71915e7e6153ecc1f0e",
  "03ec7684a5e9a506a31a5cdad409ecb5f3c90eadc1b90ef428d6402239b4ecff8d03d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200a0003ec7684a5e9a506a31a5cdad409ecb5f3c90eadc1b90ef428d6402239b4ecff8d7c5f310fcd1a094460836ab75c35a8a58a3455a0f82f091ad0aa930faf62e023ae000dfe3bf27498643f14812ab61030cf182f57814ff8e2aa057a6add805a0c1a296adebd0680b003a82af8e5311c5e4569c31ce6e6e74d59a50c00583e0d2eca59df67b746ef846427b492df3de40f1f0fa47ff56fd0e28cd921c8099ed20c340405ca1f73a216caca526a30c859a70a36aac8dc8ba30b9c133b242162cc9dbbc62c7ba722963b2fca68f8ca9bd8d3c5be0cbc46364d852bd59de278119192ec7684a5e9a506a31a5cdad409ecb5f3c90eadc1b90ef428d6402239b4ecff8d7c5f310fcd1a094460836ab75c35a8a58a3455a0f82f091ad0aa930faf62e023ae000dfe3bf27498643f14812ab61030cf182f57814ff8e2aa057a6add805a0c1a296adebd0680b003a82af8e5311c5e4569c31ce6e6e74d59a50c00583e0d2eca59df67b746ef846427b492df3de40f1f0fa47ff56fd0e28cd921c8099ed20c340405ca1f73a216caca526a30c859a70a36aac8dc8ba30b9c133b242162cc9dbbc62c7ba722963b2fca68f8ca9bd8d3c5be0cbc46364d852bd59de278119192",
  "03d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200a03d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200a0003d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200adc94f72a2777ae5717ee473e4fe881a64d3fc455766eac63e27cee77fb67e4812a68c2c6c5a6ec0e7e39f261d4b63afa6928f232ca67660cf3b58633965a4e8ce178dce2b9d27df7c0c58b5a48942d8f7503a65a9a097591efa7f69f5c93bbfeee060d6f8d44c9e1a0b704ad2b2b5c3686c2485ef4ace7eb5a1e843315255d1930144ff8abce2bc92695aa3186b6f6aa3d5f687fa2dfb7d25d17c94907ca51443b1afeacbdfdc6c5c48036e632ad7ff69ccca0ea604e0701b0080077d7895f59d4c24e0ef419afa0959c324896282fedbf3b675bdebfb4d4779f7e4d2d69200adc94f72a2777ae5717ee473e4fe881a64d3fc455766eac63e27cee77fb67e4812a68c2c6c5a6ec0e7e39f261d4b63afa6928f232ca67660cf3b58633965a4e8ce178dce2b9d27df7c0c58b5a48942d8f7503a65a9a097591efa7f69f5c93bbfeee060d6f8d44c9e1a0b704ad2b2b5c3686c2485ef4ace7eb5a1e843315255d1930144ff8abce2bc92695aa3186b6f6aa3d5f687fa2dfb7d25d17c94907ca51443b1afeacbdfdc6c5c48036e632ad7ff69ccca0ea604e0701b0080077d7895f59"
]
[[federation]]
block-height= 10
aggregated-public-key = "02c609e7cfedfd21553d9b6b45b2f66d1e693255f093c6db9c42d1fa7c22634718"

The tip block height is 8.

Yamaguchi commented 4 years ago

I think the above error will occur in the following scenario.

  1. Round(block_height = 9) started.
  2. NodeState transit to Master(block_height = 9) or Member(block_height = 9)
  3. Some error occurred, so block generation failed.
  4. Round(block_height = 9) started again.
  5. In next_master_index function, state.block_height() return "9" and then params.pubkey_list(block_height + 1) will fail because they is not a member of the federation at block_height 10.
    let block_height = state.block_height();
    next % params.pubkey_list(block_height + 1).len()
rantan commented 4 years ago

Now, this PR can pass tests, which are joining a signer to the federation then leaving the signer, in my local environment.