GotThatData Claude Opus 4.5 commited on
Commit
b773f5c
Β·
1 Parent(s): 646fc8e

Integrate real BSV blockchain attestation

Browse files

- Add SimpleBSV API integration for on-chain attestation
- Results are published to BSV mainnet with txid
- Include WhatsOnChain verification link
- No trade secrets exposed - only result summaries
- Fallback to offline mode if API unavailable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Files changed (2) hide show
  1. app.py +88 -8
  2. requirements.txt +1 -0
app.py CHANGED
@@ -15,9 +15,55 @@ import gradio as gr
15
  import hashlib
16
  import random
17
  import time
 
 
 
18
  from datetime import datetime
19
  from typing import Optional, Dict, List, Tuple
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  # =============================================================================
22
  # Demo Configuration - Pre-computed results (no trade secrets exposed)
23
  # =============================================================================
@@ -351,12 +397,45 @@ def create_confidence_bars(evidence_codes: List[str], confidence: float) -> str:
351
 
352
 
353
  def generate_bsv_attestation(variant_id: str, classification: str, confidence: float) -> str:
354
- """Generate BSV blockchain attestation."""
355
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC")
356
 
357
- # Create deterministic hash
358
- data_str = f"{variant_id}|{classification}|{confidence}|{timestamp}"
 
 
 
 
 
 
 
 
 
 
 
 
359
  query_hash = hashlib.sha256(data_str.encode()).hexdigest()[:16]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
 
361
  return f"""
362
  ```
@@ -376,12 +455,13 @@ def generate_bsv_attestation(variant_id: str, classification: str, confidence: f
376
  β•‘ β•‘
377
  β•‘ ───────────────────────────────────────────────────────── β•‘
378
  β•‘ β•‘
379
- β•‘ Status: βœ“ DEMO ATTESTATION β•‘
380
- β•‘ Network: BSV Testnet β•‘
 
 
381
  β•‘ β•‘
382
- β•‘ This certificate demonstrates TopoGrammar's blockchain β•‘
383
- β•‘ verification capability. Production attestations are β•‘
384
- β•‘ recorded on BSV mainnet. β•‘
385
  β•‘ β•‘
386
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
387
  ```
 
15
  import hashlib
16
  import random
17
  import time
18
+ import httpx
19
+ import json
20
+ import os
21
  from datetime import datetime
22
  from typing import Optional, Dict, List, Tuple
23
 
24
+ # =============================================================================
25
+ # BSV Blockchain Configuration
26
+ # =============================================================================
27
+
28
+ BSV_API_URL = "https://simplebsv.codenlighten.org"
29
+ BSV_API_KEY = os.getenv("BSV_API_KEY", "REDACTED_BSV_KEY")
30
+
31
+
32
+ def publish_to_bsv(data: Dict) -> Optional[str]:
33
+ """
34
+ Publish attestation data to BSV blockchain via SimpleBSV API.
35
+
36
+ Args:
37
+ data: Dictionary containing attestation data (no trade secrets)
38
+
39
+ Returns:
40
+ Transaction ID if successful, None otherwise
41
+ """
42
+ try:
43
+ headers = {
44
+ "Content-Type": "application/json",
45
+ "x-api-key": BSV_API_KEY
46
+ }
47
+
48
+ # Use ?wait=true for synchronous response with txid
49
+ response = httpx.post(
50
+ f"{BSV_API_URL}/publish/json?wait=true",
51
+ headers=headers,
52
+ json={"data": data},
53
+ timeout=30.0
54
+ )
55
+
56
+ if response.status_code == 200:
57
+ result = response.json()
58
+ return result.get("txid")
59
+ else:
60
+ print(f"BSV API error: {response.status_code} - {response.text}")
61
+ return None
62
+
63
+ except Exception as e:
64
+ print(f"BSV publish error: {e}")
65
+ return None
66
+
67
  # =============================================================================
68
  # Demo Configuration - Pre-computed results (no trade secrets exposed)
69
  # =============================================================================
 
397
 
398
 
399
  def generate_bsv_attestation(variant_id: str, classification: str, confidence: float) -> str:
400
+ """Generate and publish BSV blockchain attestation."""
401
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC")
402
 
403
+ # Create attestation data (no trade secrets - only results summary)
404
+ attestation_data = {
405
+ "platform": "TopoGrammar",
406
+ "version": "v2.1.0",
407
+ "timestamp": timestamp,
408
+ "analysis_type": "VUS_Resolution",
409
+ "variant_id": variant_id,
410
+ "classification": classification,
411
+ "confidence": round(confidence, 2),
412
+ "attestation_type": "demo"
413
+ }
414
+
415
+ # Create hash of the attestation data
416
+ data_str = json.dumps(attestation_data, sort_keys=True)
417
  query_hash = hashlib.sha256(data_str.encode()).hexdigest()[:16]
418
+ full_hash = hashlib.sha256(data_str.encode()).hexdigest()
419
+
420
+ # Publish to BSV blockchain
421
+ txid = publish_to_bsv(attestation_data)
422
+
423
+ if txid:
424
+ # Real blockchain attestation
425
+ whatsonchain_url = f"https://whatsonchain.com/tx/{txid}"
426
+ status_line = f"Status: βœ“ RECORDED ON BSV MAINNET"
427
+ txid_display = txid[:20] + "..." if len(txid) > 20 else txid
428
+ verify_section = f"""β•‘ Transaction ID: {txid_display}
429
+ β•‘ β•‘
430
+ β•‘ πŸ”— Verify on WhatsOnChain: β•‘
431
+ β•‘ {whatsonchain_url[:54]}"""
432
+ else:
433
+ # Fallback if API fails
434
+ status_line = "Status: ⚠ OFFLINE MODE (BSV API unavailable)"
435
+ verify_section = f"""β•‘ Data Hash: {full_hash[:32]}...
436
+ β•‘ β•‘
437
+ β•‘ β„Ή Blockchain recording temporarily unavailable. β•‘
438
+ β•‘ Result hash preserved for later attestation."""
439
 
440
  return f"""
441
  ```
 
455
  β•‘ β•‘
456
  β•‘ ───────────────────────────────────────────────────────── β•‘
457
  β•‘ β•‘
458
+ β•‘ {status_line}
459
+ β•‘ Network: BSV Mainnet β•‘
460
+ β•‘ β•‘
461
+ {verify_section}
462
  β•‘ β•‘
463
+ β•‘ This attestation is immutably recorded on BSV blockchain. β•‘
464
+ β•‘ No proprietary algorithms or trade secrets are published. β•‘
 
465
  β•‘ β•‘
466
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
467
  ```
requirements.txt CHANGED
@@ -1 +1,2 @@
1
  gradio>=4.0.0
 
 
1
  gradio>=4.0.0
2
+ httpx>=0.25.0