//go:build live package stm import ( "context" "encoding/json" "io" "net/http" "testing" "time" ) func TestFullSTMVerify_LivePreprodHead(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() req, _ := http.NewRequestWithContext(ctx, http.MethodGet, preprodHead+"/artifact/cardano-database", nil) resp, err := http.DefaultClient.Do(req) if err != nil { t.Skipf("network: %v", err) } defer resp.Body.Close() var snaps []struct { CertificateHash string `json:"certificate_hash"` } if err := json.NewDecoder(resp.Body).Decode(&snaps); err != nil { t.Fatal(err) } req, _ = http.NewRequestWithContext(ctx, http.MethodGet, preprodHead+"/certificate/"+snaps[0].CertificateHash, nil) resp, err = http.DefaultClient.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) var cert struct { MultiSignature json.RawMessage `json:"multi_signature"` AggregateVerificationKey json.RawMessage `json:"aggregate_verification_key"` SignedMessage string `json:"signed_message"` Metadata struct { Parameters struct { K uint64 `json:"k"` M uint64 `json:"m"` PhiF float64 `json:"phi_f"` } `json:"parameters"` } `json:"metadata"` } if err := json.Unmarshal(body, &cert); err != nil { t.Fatal(err) } ms, err := DecodeMultiSig(cert.MultiSignature) if err != nil { t.Fatal(err) } avk, err := DecodeAVK(cert.AggregateVerificationKey) if err != nil { t.Fatal(err) } params := Parameters{ K: cert.Metadata.Parameters.K, M: cert.Metadata.Parameters.M, PhiF: cert.Metadata.Parameters.PhiF, } t.Logf("params: k=%d m=%d phi_f=%v", params.K, params.M, params.PhiF) msg := []byte(cert.SignedMessage) if err := Verify(msg, ms, avk, params); err != nil { t.Fatalf("STM Verify: %v", err) } t.Logf("✓ FULL STM verification passed against live preprod head cert") }