@@ -264,6 +264,79 @@ func (s *E2ETestSuite) RegisterPeers(t *testing.T) {
264264 t .Log ("Peer listing completed" )
265265}
266266
267+ // SeedPreParams loads pre-generated ECDSA pre-parameters from fixture files
268+ // and writes them into each node's BadgerDB. This avoids the expensive safe-prime
269+ // generation at node startup which can take minutes on CI runners.
270+ //
271+ // Each node gets its own unique pre-parameters. Sharing the same pre-parameters
272+ // across nodes causes tss-lib to reject duplicate h1j values during keygen round 2.
273+ func (s * E2ETestSuite ) SeedPreParams (t * testing.T ) {
274+ t .Log ("Seeding pre-generated pre-params into node databases..." )
275+
276+ // Read the badger password from a node config
277+ configPath := filepath .Join (s .testDir , "test_node0" , "config.yaml" )
278+ configData , err := os .ReadFile (configPath )
279+ require .NoError (t , err , "Failed to read node config for badger password" )
280+
281+ var nodeConfig struct {
282+ BadgerPassword string `yaml:"badger_password"`
283+ DbPath string `yaml:"db_path"`
284+ }
285+ require .NoError (t , yaml .Unmarshal (configData , & nodeConfig ), "Failed to parse node config" )
286+
287+ dbBasePath := nodeConfig .DbPath
288+ if dbBasePath == "" {
289+ dbBasePath = "./db"
290+ }
291+
292+ for i := 0 ; i < numNodes ; i ++ {
293+ nodeName := fmt .Sprintf ("test_node%d" , i )
294+
295+ // Load per-node fixture files
296+ fixtureData := make ([][]byte , 2 )
297+ for j := 0 ; j < 2 ; j ++ {
298+ path := filepath .Join (s .testDir , "fixtures" , fmt .Sprintf ("node%d_pre_params_%d.json" , i , j ))
299+ data , err := os .ReadFile (path )
300+ if err != nil {
301+ t .Logf ("Warning: could not read pre-params fixture %s: %v (nodes will generate their own)" , path , err )
302+ return
303+ }
304+ fixtureData [j ] = data
305+ }
306+
307+ nodeDir := filepath .Join (s .testDir , nodeName )
308+ dbPath := filepath .Join (nodeDir , dbBasePath , nodeName )
309+
310+ // Ensure the DB directory exists
311+ require .NoError (t , os .MkdirAll (dbPath , 0755 ), "Failed to create DB directory for %s" , nodeName )
312+
313+ // Open BadgerDB with the same options the node uses
314+ opts := badger .DefaultOptions (dbPath ).
315+ WithCompression (options .ZSTD ).
316+ WithEncryptionKey ([]byte (nodeConfig .BadgerPassword )).
317+ WithIndexCacheSize (16 << 20 ).
318+ WithBlockCacheSize (32 << 20 ).
319+ WithLogger (nil )
320+
321+ db , err := badger .Open (opts )
322+ require .NoError (t , err , "Failed to open BadgerDB for %s" , nodeName )
323+
324+ // Write pre-params
325+ for j := 0 ; j < 2 ; j ++ {
326+ key := fmt .Sprintf ("pre_params_%d" , j )
327+ err := db .Update (func (txn * badger.Txn ) error {
328+ return txn .Set ([]byte (key ), fixtureData [j ])
329+ })
330+ require .NoError (t , err , "Failed to seed %s for %s" , key , nodeName )
331+ }
332+
333+ require .NoError (t , db .Close (), "Failed to close BadgerDB for %s" , nodeName )
334+ t .Logf ("Seeded pre-params for %s" , nodeName )
335+ }
336+
337+ t .Log ("Pre-params seeding complete" )
338+ }
339+
267340func (s * E2ETestSuite ) StartNodes (t * testing.T ) {
268341 t .Log ("Starting MPC nodes..." )
269342
0 commit comments