Skip to content

Commit 08c8cb1

Browse files
committed
fix: sync prev committee during sequencerconfig derivation
1 parent 7d95f46 commit 08c8cb1

File tree

4 files changed

+114
-24
lines changed

4 files changed

+114
-24
lines changed

justfile

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -199,42 +199,40 @@ test-dyn-comm: build_release_until build-test-utils
199199
--spawn "1:anvil --port 8545" \
200200
--run "2:sleep 2" \
201201
--run "3:scripts/deploy-test-contract" \
202-
--spawn "4:target/release/yapper --keyset-file test-configs/c0/committee.toml" \
203-
--spawn "5:target/release/run-committee --configs test-configs/c0/ --committee 0 --timeboost target/release/timeboost --until 1000" \
204-
--run "6:target/release/mkconfig -n 3 \
202+
--spawn "4:target/release/run-committee --configs test-configs/c0/ --committee 0" \
203+
--run "5:target/release/mkconfig -n 3 \
205204
--public-addr 127.0.0.1:9000 \
206205
--internal-addr 127.0.0.1:9003 \
207206
--http-api 127.0.0.1:9004 \
208207
--chain-namespace 10101 \
209208
--parent-rpc-url http://127.0.0.1:8545 \
210209
--parent-ws-url ws://127.0.0.1:8545 \
211210
--parent-chain-id 31337 \
212-
--parent-ibox-contract "0xa0f3a1a4e2b2bcb7b48c8527c28098f207572ec1" \
213-
--key-manager-contract "0x2bbf15bc655c4cc157b769cfcb1ea9924b9e1a35" \
211+
--parent-ibox-contract 0xa0f3a1a4e2b2bcb7b48c8527c28098f207572ec1 \
212+
--key-manager-contract 0x2bbf15bc655c4cc157b769cfcb1ea9924b9e1a35 \
214213
--timestamp `just now-plus-20s` \
215214
--stamp-dir /tmp \
216215
--output test-configs/c1" \
217-
--run "7:target/release/register \
216+
--run "6:target/release/register \
218217
-u http://localhost:8545 \
219218
-k 0x2bbf15bc655c4cc157b769cfcb1ea9924b9e1a35 \
220219
-c test-configs/c1/committee.toml" \
221-
--run "8:sleep 8" \
222-
--run "9:target/release/register \
220+
--run "7:sleep 8" \
221+
--run "8:target/release/register \
223222
-u http://localhost:8545 \
224223
-k 0x2bbf15bc655c4cc157b769cfcb1ea9924b9e1a35 \
225224
-c test-configs/c0/committee.toml \
226225
-a threshold-enc-key" \
227-
--spawn "10:target/release/yapper \
226+
--spawn "9:target/release/yapper \
228227
--keyset-file test-configs/c1/committee.toml \
229228
--parent-url http://localhost:8545 \
230229
--key-manager-contract 0x2bbf15bc655c4cc157b769cfcb1ea9924b9e1a35" \
231-
target/release/run-committee -- --configs test-configs/c1/ \
230+
target/release/run-committee -- \
231+
--configs test-configs/c1/ \
232232
--committee 1 \
233-
--timeboost target/release/timeboost \
234233
--until 500 \
235234
--required-decrypt-rounds 3
236235

237-
238236
# portable calculation of now() + 20s in "%Y-%m-%dT%H:%M:%SZ" format
239237
[private]
240238
now-plus-20s:

timeboost/src/binaries/timeboost.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ async fn main() -> Result<()> {
100100
.iter()
101101
.map(|peer| {
102102
let sig_key = multisig::PublicKey::try_from(peer.sigKey.as_ref())
103-
.expect("Failed to parse sigKey");
103+
.expect("Should parse sigKey bytes");
104104
let dh_key =
105-
x25519::PublicKey::try_from(peer.dhKey.as_ref()).expect("Failed to parse dhKey");
106-
let dkg_enc_key = DkgEncKey::from_bytes(peer.dkgKey.as_ref())
107-
.expect("Blackbox from_bytes should work");
105+
x25519::PublicKey::try_from(peer.dhKey.as_ref()).expect("Should parse dhKey bytes");
106+
let dkg_enc_key =
107+
DkgEncKey::from_bytes(peer.dkgKey.as_ref()).expect("Should parse dkgKey bytes");
108108
let sailfish_address = cliquenet::Address::try_from(peer.networkAddress.as_ref())
109-
.expect("Failed to parse networkAddress");
109+
.expect("Should parse networkAddress string");
110110
(sig_key, dh_key, dkg_enc_key, sailfish_address)
111111
})
112112
.collect::<Vec<_>>();

timeboost/src/conf.rs

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
use alloy::providers::ProviderBuilder;
2+
use anyhow::Result;
13
use bon::Builder;
24
use cliquenet::{Address, AddressableCommittee};
3-
use multisig::{Keypair, x25519};
5+
use multisig::{Committee, Keypair, x25519};
46
use timeboost_builder::{CertifierConfig, SubmitterConfig, robusta};
5-
use timeboost_config::ChainConfig;
6-
use timeboost_crypto::prelude::DkgDecKey;
7+
use timeboost_config::{ChainConfig, DECRYPTER_PORT_OFFSET};
8+
use timeboost_contract::{CommitteeMemberSol, KeyManager};
9+
use timeboost_crypto::prelude::{DkgDecKey, DkgEncKey};
710
use timeboost_sequencer::SequencerConfig;
811
use timeboost_types::{KeyStore, ThresholdKeyCell};
912

@@ -61,8 +64,95 @@ pub struct TimeboostConfig {
6164
}
6265

6366
impl TimeboostConfig {
64-
pub fn sequencer_config(&self) -> SequencerConfig {
65-
SequencerConfig::builder()
67+
pub async fn sequencer_config(&self) -> Result<SequencerConfig> {
68+
let cur_cid: u64 = self.sailfish_committee.committee().id().into();
69+
70+
let (prev_sailfish, prev_decrypt) = if cur_cid == 0u64 {
71+
(None, None)
72+
} else {
73+
// syncing with contract to get peer info about the previous committee
74+
// largely adapted from binaries/timeboost.rs
75+
// TODO: (alex) extrapolate the remaining logic into a common helper
76+
let prev_cid = cur_cid - 1;
77+
78+
let provider =
79+
ProviderBuilder::new().connect_http(self.chain_config.parent.rpc_url.clone());
80+
let contract =
81+
KeyManager::new(self.chain_config.parent.key_manager_contract, &provider);
82+
let members: Vec<CommitteeMemberSol> =
83+
contract.getCommitteeById(prev_cid).call().await?.members;
84+
85+
tracing::info!(label = %self.sign_keypair.public_key(), committee_id = %prev_cid, "prev committee info synced");
86+
87+
let peer_hosts_and_keys = members
88+
.iter()
89+
.map(|peer| {
90+
let sig_key = multisig::PublicKey::try_from(peer.sigKey.as_ref())
91+
.expect("Should parse sigKey bytes");
92+
let dh_key = x25519::PublicKey::try_from(peer.dhKey.as_ref())
93+
.expect("Should parse dhKey bytes");
94+
let dkg_enc_key = DkgEncKey::from_bytes(peer.dkgKey.as_ref())
95+
.expect("Should parse dkgKey bytes");
96+
let sailfish_address =
97+
cliquenet::Address::try_from(peer.networkAddress.as_ref())
98+
.expect("Should parse networkAddress string");
99+
(sig_key, dh_key, dkg_enc_key, sailfish_address)
100+
})
101+
.collect::<Vec<_>>();
102+
103+
let mut sailfish_peer_hosts_and_keys = Vec::new();
104+
let mut decrypt_peer_hosts_and_keys = Vec::new();
105+
let mut dkg_enc_keys = Vec::new();
106+
107+
for (signing_key, dh_key, dkg_enc_key, sailfish_addr) in
108+
peer_hosts_and_keys.iter().cloned()
109+
{
110+
sailfish_peer_hosts_and_keys.push((signing_key, dh_key, sailfish_addr.clone()));
111+
decrypt_peer_hosts_and_keys.push((
112+
signing_key,
113+
dh_key,
114+
sailfish_addr.clone().with_offset(DECRYPTER_PORT_OFFSET),
115+
));
116+
dkg_enc_keys.push(dkg_enc_key.clone());
117+
}
118+
119+
let sailfish_committee = {
120+
let c = Committee::new(
121+
prev_cid,
122+
sailfish_peer_hosts_and_keys
123+
.iter()
124+
.enumerate()
125+
.map(|(i, (k, ..))| (i as u8, *k)),
126+
);
127+
AddressableCommittee::new(c, sailfish_peer_hosts_and_keys.iter().cloned())
128+
};
129+
130+
let decrypt_committee = {
131+
let c = Committee::new(
132+
prev_cid,
133+
decrypt_peer_hosts_and_keys
134+
.iter()
135+
.enumerate()
136+
.map(|(i, (k, ..))| (i as u8, *k)),
137+
);
138+
AddressableCommittee::new(c, decrypt_peer_hosts_and_keys.iter().cloned())
139+
};
140+
141+
let key_store = KeyStore::new(
142+
sailfish_committee.committee().clone(),
143+
dkg_enc_keys
144+
.into_iter()
145+
.enumerate()
146+
.map(|(i, k)| (i as u8, k)),
147+
);
148+
149+
(
150+
Some(sailfish_committee),
151+
Some((decrypt_committee, key_store)),
152+
)
153+
};
154+
155+
Ok(SequencerConfig::builder()
66156
.sign_keypair(self.sign_keypair.clone())
67157
.dh_keypair(self.dh_keypair.clone())
68158
.dkg_key(self.dkg_key.clone())
@@ -71,10 +161,12 @@ impl TimeboostConfig {
71161
.sailfish_committee(self.sailfish_committee.clone())
72162
.decrypt_committee((self.decrypt_committee.clone(), self.key_store.clone()))
73163
.recover(self.recover)
164+
.maybe_previous_sailfish_committee(prev_sailfish)
165+
.maybe_previous_decrypt_committee(prev_decrypt)
74166
.leash_len(self.leash_len)
75167
.threshold_dec_key(self.threshold_dec_key.clone())
76168
.chain_config(self.chain_config.clone())
77-
.build()
169+
.build())
78170
}
79171

80172
pub fn certifier_config(&self) -> CertifierConfig {

timeboost/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ impl Timeboost {
5858
pub async fn new(cfg: TimeboostConfig) -> Result<Self> {
5959
let pro = Arc::new(PrometheusMetrics::default());
6060
let met = Arc::new(TimeboostMetrics::new(&*pro));
61-
let seq = Sequencer::new(cfg.sequencer_config(), &*pro).await?;
61+
let seq = Sequencer::new(cfg.sequencer_config().await?, &*pro).await?;
6262
let blk = Certifier::new(cfg.certifier_config(), &*pro).await?;
6363
let sub = Submitter::new(cfg.submitter_config(), &*pro);
6464

0 commit comments

Comments
 (0)