1
+ use alloy:: providers:: ProviderBuilder ;
2
+ use anyhow:: Result ;
1
3
use bon:: Builder ;
2
4
use cliquenet:: { Address , AddressableCommittee } ;
3
- use multisig:: { Keypair , x25519} ;
5
+ use multisig:: { Committee , Keypair , x25519} ;
4
6
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 } ;
7
10
use timeboost_sequencer:: SequencerConfig ;
8
11
use timeboost_types:: { KeyStore , ThresholdKeyCell } ;
9
12
@@ -61,8 +64,95 @@ pub struct TimeboostConfig {
61
64
}
62
65
63
66
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 ( )
66
156
. sign_keypair ( self . sign_keypair . clone ( ) )
67
157
. dh_keypair ( self . dh_keypair . clone ( ) )
68
158
. dkg_key ( self . dkg_key . clone ( ) )
@@ -71,10 +161,12 @@ impl TimeboostConfig {
71
161
. sailfish_committee ( self . sailfish_committee . clone ( ) )
72
162
. decrypt_committee ( ( self . decrypt_committee . clone ( ) , self . key_store . clone ( ) ) )
73
163
. recover ( self . recover )
164
+ . maybe_previous_sailfish_committee ( prev_sailfish)
165
+ . maybe_previous_decrypt_committee ( prev_decrypt)
74
166
. leash_len ( self . leash_len )
75
167
. threshold_dec_key ( self . threshold_dec_key . clone ( ) )
76
168
. chain_config ( self . chain_config . clone ( ) )
77
- . build ( )
169
+ . build ( ) )
78
170
}
79
171
80
172
pub fn certifier_config ( & self ) -> CertifierConfig {
0 commit comments