Add proof-measure client (public securedBy / measured-immutability service)

proof-measure is a separate, public, unauthenticated Dragonchain service. Adds:
- client.UnauthenticatedClient: HMAC-free transport mirroring Client's
  marshal/decode/error handling.
- proofmeasure.ProofMeasureClient: GetSecurity / Report / Health, default base
  URL https://proof-measure.dragonchain.com; standalone + a DragonchainSDK.ProofMeasure handle.
- models for SecurityResult/RawMeasure/ReportRequest/TransactionReport/etc
  (decimals as strings, timestamps int64).
- httptest unit tests.
This commit is contained in:
2026-06-04 13:40:21 -04:00
parent bc2b622873
commit 7d8e23768f
6 changed files with 441 additions and 0 deletions

View File

@@ -147,6 +147,43 @@ All API methods accept a `context.Context` as their first parameter for timeout
### Block
- `Get(ctx, blockID)` - Get block by ID
### Proof Measure (public, unauthenticated)
- `GetSecurity(ctx, network, since)` - A network's accumulated security since `since` (unix seconds; `0` = service default), as raw measure + USD valuation. `network` = `"BTC"` or `"ETH"`.
- `Report(ctx, req)` - Per-transaction "securedBy" report over interchain anchors.
- `Health(ctx)` - Service liveness.
## Proof Measure
`proof-measure` is a separate, **public, unauthenticated** Dragonchain service
(the measured-immutability / "securedBy" metric) at
`https://proof-measure.dragonchain.com`. It needs no credentials. The SDK exposes
it two ways:
```go
// 1. Via the main SDK (targets the default public endpoint):
sec, err := client.ProofMeasure.GetSecurity(ctx, "BTC", time.Now().Add(-time.Hour).Unix())
if err != nil {
log.Fatal(err)
}
fmt.Printf("BTC secured by %s (%s) since %d\n", sec.ValueUSDFormatted, sec.Raw.Value+" "+sec.Raw.Unit, sec.SinceUnix)
// 2. Standalone (no prime credentials needed; empty URL = public prod):
import "git.dragonchain.com/dragonchain/prime-sdk-go/proofmeasure"
pm := proofmeasure.NewProofMeasureClient("") // or a custom base URL
report, err := pm.Report(ctx, &models.ReportRequest{
TransactionID: "tx-123", PrimeID: "my-prime", BlockID: "42",
Anchors: []models.ReportAnchorInput{
{Network: "BTC", TxHash: "0x...", Timestamp: anchorUnix},
{Network: "ETH", TxHash: "0x...", Timestamp: anchorUnix},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Secured by %s across %d anchors\n", report.TotalValueUSDFormatted, len(report.Anchors))
```
## Authentication
The SDK uses HMAC-SHA256 authentication. You need to provide: