package main import ( "bufio" "fmt" "log" "math/big" "net" "os" "strconv" "strings" "sync" "time" "github.com/luxfi/corona/networking" "github.com/luxfi/corona/primitives" "github.com/luxfi/corona/sign" "github.com/luxfi/lattice/v7/ring" "github.com/luxfi/lattice/v7/utils/sampling" "github.com/luxfi/lattice/v7/utils/structs" ) func main() { if len(os.Args) < 2 { fmt.Println("Usage: go run main.go partyID") os.Exit(1) } partyIDString := os.Args[1] iters, err := strconv.Atoi(os.Args[2]) if err != nil { fmt.Println("Error: Please enter a valid integer.") os.Exit(1) } parties, err := strconv.Atoi(os.Args[3]) if err != nil { fmt.Println("Error: Please enter a valid integer.") os.Exit(1) } sign.K = parties sign.Threshold = parties if partyIDString == "l" { if err := sign.LocalRun(iters); err != nil { log.Fatalf("local run: %v", err) } return } partyID, err := strconv.Atoi(partyIDString) if err != nil { fmt.Println("Error: Please enter a valid integer.") os.Exit(1) } // Initialize P2P communication over ZAP transport. // // Peers and their listen addresses come from the CORONA_PEERS env // var, formatted as "rank=host:port,rank=host:port,...". The local // party's own rank is excluded; every other rank in the ceremony // must be present. The local listen port is derived from the same // list (peerAddrs[partyID] specifies "host:port" we bind on). peerAddrs, listenPort, err := parsePeerEnv(os.Getenv("CORONA_PEERS"), partyID) if err != nil { log.Fatalf("CORONA_PEERS: %v", err) } comm, err := networking.NewP2PComm(partyID, listenPort, true /*noDiscovery*/, nil) if err != nil { log.Fatalf("NewP2PComm: %v", err) } defer comm.Close() // Suppress unused-import error from prior wiring. _ = (*net.Conn)(nil) if err := comm.EstablishConnectionsZAP(partyID, sign.K, peerAddrs); err != nil { log.Fatalf("EstablishConnectionsZAP: %v", err) } var setupDuration, genDuration, signRound1Duration, signRound2PreprocessDuration, signRound2Duration, finalizeDuration, verifyDuration time.Duration var genStart, genEnd, signRound1Start, signRound1End, signRound2Start, signRound2End, combinerReceiveEnd, combinerFinalizeEnd time.Time var A structs.Matrix[ring.Poly] var b structs.Vector[ring.Poly] randomKey := make([]byte, sign.KeySize) r, _ := ring.NewRing(1<