nostr-attestations 0.0.0-development → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  One Nostr event kind for all attestations — credentials, endorsements, vouches, provenance, licensing, and trust.
4
4
 
5
+ **Nostr:** [`npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2`](https://njump.me/npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2)
6
+
5
7
  ## Install
6
8
 
7
9
  ```
@@ -122,9 +124,65 @@ const attestation = parseAttestation(event)
122
124
 
123
125
  `vectors/attestations.json` contains 10 frozen conformance test vectors covering the full range of attestation types (credential, endorsement, vouch, verifier, provenance) and states (active, revoked, self-attestation). Any conformant implementation must produce identical parse results from these inputs. The vectors are pinned — if tests against them fail, the implementation is broken, not the vector.
124
126
 
127
+ ## Attested on Nostr
128
+
129
+ This library's authorship is claimed on Nostr using the very protocol it implements — NIP-VA eating its own dog food.
130
+
131
+ A self-attestation alone only proves that the holder of a private key *claims* authorship — not that the claim is true. The real value comes from **third-party attestations**: other pubkeys independently publishing `type: endorsement` events that reference this repo.
132
+
133
+ But counting endorsements isn't enough either — anyone can create 50 throwaway npubs and endorse themselves. What matters is **who** endorses, not how many. A single endorsement from a pubkey with a verified NIP-05 domain, a history of notes, and followers you recognise is worth more than a thousand from anonymous keys. This is a web of trust, not a vote count. When verifying, ask: do I know this endorser? Do people I trust follow them? That's how you resist Sybil attacks without a centralised authority.
134
+
135
+ All verification uses [nak](https://github.com/fiatjaf/nak) (the Nostr Army Knife). Install with `go install github.com/fiatjaf/nak@latest` or `brew install fiatjaf/tap/nak`.
136
+
137
+ **1. GitHub → Nostr** — this README claims `npub1mgv...` (see header above)
138
+
139
+ **2. Nostr → GitHub** — the repo announcement points back here:
140
+
141
+ ```bash
142
+ nak req -k 30617 \
143
+ -a $(nak decode npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2) \
144
+ -d nostr-attestations \
145
+ wss://relay.damus.io
146
+ # Look for the "web" tag → github.com/forgesworn/nostr-attestations
147
+ ```
148
+
149
+ **3. Verify the authorship claim** — signed by the same key:
150
+
151
+ ```bash
152
+ nak req -k 31000 \
153
+ -a $(nak decode npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2) \
154
+ -d authorship:nostr-attestations \
155
+ wss://relay.damus.io 2>/dev/null | nak verify \
156
+ && echo "✓ Signature valid"
157
+ ```
158
+
159
+ **4. Check for third-party endorsements:**
160
+
161
+ ```bash
162
+ nak req -k 31000 \
163
+ -t a=30617:da19f1cd34beca44be74da4b306d9d1dd86b6343cef94ce22c49c6f59816e5bd:nostr-attestations \
164
+ wss://relay.damus.io
165
+ # Returns all attestations referencing this repo — filter by pubkey or type client-side
166
+ ```
167
+
168
+ Same npub on both sides — you'd need to control both GitHub and the private key to fake it. Third-party endorsements add independent signatures that can't be faked by one person.
169
+
170
+ **Endorse it yourself:**
171
+
172
+ ```bash
173
+ nak event -k 31000 \
174
+ --prompt-sec \
175
+ -d endorsement:da19f1cd34beca44be74da4b306d9d1dd86b6343cef94ce22c49c6f59816e5bd \
176
+ -t type=endorsement \
177
+ -p da19f1cd34beca44be74da4b306d9d1dd86b6343cef94ce22c49c6f59816e5bd \
178
+ -t a=30617:da19f1cd34beca44be74da4b306d9d1dd86b6343cef94ce22c49c6f59816e5bd:nostr-attestations \
179
+ -t summary="Reviewed and endorsed nostr-attestations" \
180
+ wss://relay.damus.io wss://nos.lol wss://relay.nostr.band
181
+ ```
182
+
125
183
  ## NIP-VA
126
184
 
127
- Full protocol specification: [NIP-VA.md](./NIP-VA.md)
185
+ Full protocol specification: [NIP-VA.md](./NIP-VA.md) | [NostrHub](https://nostrhub.io/npub1mgvlrnf5hm9yf0n5mf9nqmvarhvxkc6remu5ec3vf8r0txqkuk7su0e7q2)
128
186
 
129
187
  ## Licence
130
188
 
@@ -1 +1 @@
1
- {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEpF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAwC1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAyBxE"}
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEpF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CA6C1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAyBxE"}
package/dist/builders.js CHANGED
@@ -30,6 +30,11 @@ export function createAttestation(params) {
30
30
  throw new Error('expiration must be a finite number');
31
31
  tags.push(['expiration', String(params.expiration)]);
32
32
  }
33
+ if (params.validFrom != null) {
34
+ if (!Number.isFinite(params.validFrom))
35
+ throw new Error('validFrom must be a finite number');
36
+ tags.push(['valid_from', String(params.validFrom)]);
37
+ }
33
38
  if (params.tags) {
34
39
  for (const tag of params.tags) {
35
40
  tags.push(tag);
@@ -1 +1 @@
1
- {"version":3,"file":"builders.js","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEzD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAyBtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGpD"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEzD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CA2BtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGpD"}
package/dist/parsers.js CHANGED
@@ -14,6 +14,7 @@ export function parseAttestation(event) {
14
14
  const dTag = findTag(event.tags, 'd');
15
15
  const parsed = dTag ? parseDTag(dTag) : null;
16
16
  const expirationStr = findTag(event.tags, 'expiration');
17
+ const validFromStr = findTag(event.tags, 'valid_from');
17
18
  return {
18
19
  kind: ATTESTATION_KIND,
19
20
  type,
@@ -23,6 +24,7 @@ export function parseAttestation(event) {
23
24
  subject: findTag(event.tags, 'p'),
24
25
  summary: findTag(event.tags, 'summary'),
25
26
  expiration: expirationStr ? Number(expirationStr) : null,
27
+ validFrom: validFromStr ? Number(validFromStr) : null,
26
28
  revoked: findTag(event.tags, 'status') === 'revoked',
27
29
  reason: findTag(event.tags, 'reason'),
28
30
  tags: event.tags,
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGxC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAA;IAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAEvD,OAAO;QACL,IAAI,EAAE,gBAAyB;QAC/B,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;QACtC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC;QACjC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;QACvC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS;QACpD,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAA;IACjD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGxC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAA;IAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAEtD,OAAO;QACL,IAAI,EAAE,gBAAyB;QAC/B,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;QACtC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC;QACjC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;QACvC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS;QACpD,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAA;IACjD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,SAAS,CAAA;AACpD,CAAC"}
package/dist/types.d.ts CHANGED
@@ -27,6 +27,8 @@ export interface AttestationParams {
27
27
  summary?: string;
28
28
  /** Unix timestamp for attestation expiry (NIP-40). */
29
29
  expiration?: number;
30
+ /** Unix timestamp for deferred activation (valid_from). */
31
+ validFrom?: number;
30
32
  /** Additional application-specific tags. */
31
33
  tags?: string[][];
32
34
  /** Event content: empty string, human-readable text, or JSON. */
@@ -59,6 +61,8 @@ export interface Attestation {
59
61
  subject: string | null;
60
62
  summary: string | null;
61
63
  expiration: number | null;
64
+ /** Earliest time the attestation is valid (deferred activation). */
65
+ validFrom: number | null;
62
66
  revoked: boolean;
63
67
  reason: string | null;
64
68
  /** All tags from the original event (for application-specific access). */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nostr-attestations",
3
- "version": "0.0.0-development",
3
+ "version": "1.0.1",
4
4
  "description": "Builders, parsers, and validators for NIP-VA (kind 31000) Verifiable Attestation events on Nostr.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -7,13 +7,34 @@
7
7
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8
8
  "created_at": 1700000000,
9
9
  "tags": [
10
- ["d", "credential:def456"],
11
- ["type", "credential"],
12
- ["p", "def456"],
13
- ["expiration", "1735689600"],
14
- ["summary", "Professional credential verified"],
15
- ["profession", "attorney"],
16
- ["jurisdiction", "US-NY"]
10
+ [
11
+ "d",
12
+ "credential:def456"
13
+ ],
14
+ [
15
+ "type",
16
+ "credential"
17
+ ],
18
+ [
19
+ "p",
20
+ "def456"
21
+ ],
22
+ [
23
+ "expiration",
24
+ "1735689600"
25
+ ],
26
+ [
27
+ "summary",
28
+ "Professional credential verified"
29
+ ],
30
+ [
31
+ "profession",
32
+ "attorney"
33
+ ],
34
+ [
35
+ "jurisdiction",
36
+ "US-NY"
37
+ ]
17
38
  ],
18
39
  "content": "{\"proof\":\"ring-sig-abc\"}",
19
40
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -31,15 +52,37 @@
31
52
  "revoked": false,
32
53
  "reason": null,
33
54
  "tags": [
34
- ["d", "credential:def456"],
35
- ["type", "credential"],
36
- ["p", "def456"],
37
- ["expiration", "1735689600"],
38
- ["summary", "Professional credential verified"],
39
- ["profession", "attorney"],
40
- ["jurisdiction", "US-NY"]
55
+ [
56
+ "d",
57
+ "credential:def456"
58
+ ],
59
+ [
60
+ "type",
61
+ "credential"
62
+ ],
63
+ [
64
+ "p",
65
+ "def456"
66
+ ],
67
+ [
68
+ "expiration",
69
+ "1735689600"
70
+ ],
71
+ [
72
+ "summary",
73
+ "Professional credential verified"
74
+ ],
75
+ [
76
+ "profession",
77
+ "attorney"
78
+ ],
79
+ [
80
+ "jurisdiction",
81
+ "US-NY"
82
+ ]
41
83
  ],
42
- "content": "{\"proof\":\"ring-sig-abc\"}"
84
+ "content": "{\"proof\":\"ring-sig-abc\"}",
85
+ "validFrom": null
43
86
  },
44
87
  "valid": true
45
88
  },
@@ -51,9 +94,18 @@
51
94
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
52
95
  "created_at": 1700000000,
53
96
  "tags": [
54
- ["d", "verifier:notary"],
55
- ["type", "verifier"],
56
- ["summary", "Identity verification service"]
97
+ [
98
+ "d",
99
+ "verifier:notary"
100
+ ],
101
+ [
102
+ "type",
103
+ "verifier"
104
+ ],
105
+ [
106
+ "summary",
107
+ "Identity verification service"
108
+ ]
57
109
  ],
58
110
  "content": "",
59
111
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -71,11 +123,21 @@
71
123
  "revoked": false,
72
124
  "reason": null,
73
125
  "tags": [
74
- ["d", "verifier:notary"],
75
- ["type", "verifier"],
76
- ["summary", "Identity verification service"]
126
+ [
127
+ "d",
128
+ "verifier:notary"
129
+ ],
130
+ [
131
+ "type",
132
+ "verifier"
133
+ ],
134
+ [
135
+ "summary",
136
+ "Identity verification service"
137
+ ]
77
138
  ],
78
- "content": ""
139
+ "content": "",
140
+ "validFrom": null
79
141
  },
80
142
  "valid": true
81
143
  },
@@ -87,12 +149,30 @@
87
149
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
88
150
  "created_at": 1700000000,
89
151
  "tags": [
90
- ["d", "endorsement:def456"],
91
- ["type", "endorsement"],
92
- ["p", "def456"],
93
- ["summary", "Reliable provider"],
94
- ["context", "plumbing"],
95
- ["confidence", "high"]
152
+ [
153
+ "d",
154
+ "endorsement:def456"
155
+ ],
156
+ [
157
+ "type",
158
+ "endorsement"
159
+ ],
160
+ [
161
+ "p",
162
+ "def456"
163
+ ],
164
+ [
165
+ "summary",
166
+ "Reliable provider"
167
+ ],
168
+ [
169
+ "context",
170
+ "plumbing"
171
+ ],
172
+ [
173
+ "confidence",
174
+ "high"
175
+ ]
96
176
  ],
97
177
  "content": "",
98
178
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -110,14 +190,33 @@
110
190
  "revoked": false,
111
191
  "reason": null,
112
192
  "tags": [
113
- ["d", "endorsement:def456"],
114
- ["type", "endorsement"],
115
- ["p", "def456"],
116
- ["summary", "Reliable provider"],
117
- ["context", "plumbing"],
118
- ["confidence", "high"]
193
+ [
194
+ "d",
195
+ "endorsement:def456"
196
+ ],
197
+ [
198
+ "type",
199
+ "endorsement"
200
+ ],
201
+ [
202
+ "p",
203
+ "def456"
204
+ ],
205
+ [
206
+ "summary",
207
+ "Reliable provider"
208
+ ],
209
+ [
210
+ "context",
211
+ "plumbing"
212
+ ],
213
+ [
214
+ "confidence",
215
+ "high"
216
+ ]
119
217
  ],
120
- "content": ""
218
+ "content": "",
219
+ "validFrom": null
121
220
  },
122
221
  "valid": true
123
222
  },
@@ -129,12 +228,30 @@
129
228
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
130
229
  "created_at": 1700000000,
131
230
  "tags": [
132
- ["d", "provenance:evt123"],
133
- ["type", "provenance"],
134
- ["e", "evt123"],
135
- ["summary", "Authenticity verified"],
136
- ["origin", "Sheffield, UK"],
137
- ["method", "physical-inspection"]
231
+ [
232
+ "d",
233
+ "provenance:evt123"
234
+ ],
235
+ [
236
+ "type",
237
+ "provenance"
238
+ ],
239
+ [
240
+ "e",
241
+ "evt123"
242
+ ],
243
+ [
244
+ "summary",
245
+ "Authenticity verified"
246
+ ],
247
+ [
248
+ "origin",
249
+ "Sheffield, UK"
250
+ ],
251
+ [
252
+ "method",
253
+ "physical-inspection"
254
+ ]
138
255
  ],
139
256
  "content": "{\"chain_of_custody\":[\"maker\",\"distributor\",\"retailer\"]}",
140
257
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -152,14 +269,33 @@
152
269
  "revoked": false,
153
270
  "reason": null,
154
271
  "tags": [
155
- ["d", "provenance:evt123"],
156
- ["type", "provenance"],
157
- ["e", "evt123"],
158
- ["summary", "Authenticity verified"],
159
- ["origin", "Sheffield, UK"],
160
- ["method", "physical-inspection"]
272
+ [
273
+ "d",
274
+ "provenance:evt123"
275
+ ],
276
+ [
277
+ "type",
278
+ "provenance"
279
+ ],
280
+ [
281
+ "e",
282
+ "evt123"
283
+ ],
284
+ [
285
+ "summary",
286
+ "Authenticity verified"
287
+ ],
288
+ [
289
+ "origin",
290
+ "Sheffield, UK"
291
+ ],
292
+ [
293
+ "method",
294
+ "physical-inspection"
295
+ ]
161
296
  ],
162
- "content": "{\"chain_of_custody\":[\"maker\",\"distributor\",\"retailer\"]}"
297
+ "content": "{\"chain_of_custody\":[\"maker\",\"distributor\",\"retailer\"]}",
298
+ "validFrom": null
163
299
  },
164
300
  "valid": true
165
301
  },
@@ -171,12 +307,30 @@
171
307
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
172
308
  "created_at": 1700000000,
173
309
  "tags": [
174
- ["d", "credential:def456"],
175
- ["type", "credential"],
176
- ["p", "def456"],
177
- ["status", "revoked"],
178
- ["reason", "license-expired"],
179
- ["summary", "Credential revoked"]
310
+ [
311
+ "d",
312
+ "credential:def456"
313
+ ],
314
+ [
315
+ "type",
316
+ "credential"
317
+ ],
318
+ [
319
+ "p",
320
+ "def456"
321
+ ],
322
+ [
323
+ "status",
324
+ "revoked"
325
+ ],
326
+ [
327
+ "reason",
328
+ "license-expired"
329
+ ],
330
+ [
331
+ "summary",
332
+ "Credential revoked"
333
+ ]
180
334
  ],
181
335
  "content": "",
182
336
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -194,14 +348,33 @@
194
348
  "revoked": true,
195
349
  "reason": "license-expired",
196
350
  "tags": [
197
- ["d", "credential:def456"],
198
- ["type", "credential"],
199
- ["p", "def456"],
200
- ["status", "revoked"],
201
- ["reason", "license-expired"],
202
- ["summary", "Credential revoked"]
351
+ [
352
+ "d",
353
+ "credential:def456"
354
+ ],
355
+ [
356
+ "type",
357
+ "credential"
358
+ ],
359
+ [
360
+ "p",
361
+ "def456"
362
+ ],
363
+ [
364
+ "status",
365
+ "revoked"
366
+ ],
367
+ [
368
+ "reason",
369
+ "license-expired"
370
+ ],
371
+ [
372
+ "summary",
373
+ "Credential revoked"
374
+ ]
203
375
  ],
204
- "content": ""
376
+ "content": "",
377
+ "validFrom": null
205
378
  },
206
379
  "valid": true
207
380
  },
@@ -213,12 +386,30 @@
213
386
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
214
387
  "created_at": 1700000000,
215
388
  "tags": [
216
- ["d", "credential:ghi789"],
217
- ["type", "credential"],
218
- ["p", "ghi789"],
219
- ["status", "revoked"],
220
- ["reason", "compromised"],
221
- ["effective", "1704067200"]
389
+ [
390
+ "d",
391
+ "credential:ghi789"
392
+ ],
393
+ [
394
+ "type",
395
+ "credential"
396
+ ],
397
+ [
398
+ "p",
399
+ "ghi789"
400
+ ],
401
+ [
402
+ "status",
403
+ "revoked"
404
+ ],
405
+ [
406
+ "reason",
407
+ "compromised"
408
+ ],
409
+ [
410
+ "effective",
411
+ "1704067200"
412
+ ]
222
413
  ],
223
414
  "content": "",
224
415
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -236,14 +427,33 @@
236
427
  "revoked": true,
237
428
  "reason": "compromised",
238
429
  "tags": [
239
- ["d", "credential:ghi789"],
240
- ["type", "credential"],
241
- ["p", "ghi789"],
242
- ["status", "revoked"],
243
- ["reason", "compromised"],
244
- ["effective", "1704067200"]
430
+ [
431
+ "d",
432
+ "credential:ghi789"
433
+ ],
434
+ [
435
+ "type",
436
+ "credential"
437
+ ],
438
+ [
439
+ "p",
440
+ "ghi789"
441
+ ],
442
+ [
443
+ "status",
444
+ "revoked"
445
+ ],
446
+ [
447
+ "reason",
448
+ "compromised"
449
+ ],
450
+ [
451
+ "effective",
452
+ "1704067200"
453
+ ]
245
454
  ],
246
- "content": ""
455
+ "content": "",
456
+ "validFrom": null
247
457
  },
248
458
  "valid": true
249
459
  },
@@ -255,10 +465,22 @@
255
465
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
256
466
  "created_at": 1700000000,
257
467
  "tags": [
258
- ["d", "vouch:def456"],
259
- ["type", "vouch"],
260
- ["p", "def456"],
261
- ["expiration", "1735689600"]
468
+ [
469
+ "d",
470
+ "vouch:def456"
471
+ ],
472
+ [
473
+ "type",
474
+ "vouch"
475
+ ],
476
+ [
477
+ "p",
478
+ "def456"
479
+ ],
480
+ [
481
+ "expiration",
482
+ "1735689600"
483
+ ]
262
484
  ],
263
485
  "content": "",
264
486
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -276,12 +498,25 @@
276
498
  "revoked": false,
277
499
  "reason": null,
278
500
  "tags": [
279
- ["d", "vouch:def456"],
280
- ["type", "vouch"],
281
- ["p", "def456"],
282
- ["expiration", "1735689600"]
501
+ [
502
+ "d",
503
+ "vouch:def456"
504
+ ],
505
+ [
506
+ "type",
507
+ "vouch"
508
+ ],
509
+ [
510
+ "p",
511
+ "def456"
512
+ ],
513
+ [
514
+ "expiration",
515
+ "1735689600"
516
+ ]
283
517
  ],
284
- "content": ""
518
+ "content": "",
519
+ "validFrom": null
285
520
  },
286
521
  "valid": true
287
522
  },
@@ -293,11 +528,27 @@
293
528
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
294
529
  "created_at": 1700000000,
295
530
  "tags": [
296
- ["d", "credential:def456"],
297
- ["type", "credential"],
298
- ["p", "def456"],
299
- ["L", "example.com/identity"],
300
- ["l", "verified", "example.com/identity"]
531
+ [
532
+ "d",
533
+ "credential:def456"
534
+ ],
535
+ [
536
+ "type",
537
+ "credential"
538
+ ],
539
+ [
540
+ "p",
541
+ "def456"
542
+ ],
543
+ [
544
+ "L",
545
+ "example.com/identity"
546
+ ],
547
+ [
548
+ "l",
549
+ "verified",
550
+ "example.com/identity"
551
+ ]
301
552
  ],
302
553
  "content": "",
303
554
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -315,13 +566,30 @@
315
566
  "revoked": false,
316
567
  "reason": null,
317
568
  "tags": [
318
- ["d", "credential:def456"],
319
- ["type", "credential"],
320
- ["p", "def456"],
321
- ["L", "example.com/identity"],
322
- ["l", "verified", "example.com/identity"]
569
+ [
570
+ "d",
571
+ "credential:def456"
572
+ ],
573
+ [
574
+ "type",
575
+ "credential"
576
+ ],
577
+ [
578
+ "p",
579
+ "def456"
580
+ ],
581
+ [
582
+ "L",
583
+ "example.com/identity"
584
+ ],
585
+ [
586
+ "l",
587
+ "verified",
588
+ "example.com/identity"
589
+ ]
323
590
  ],
324
- "content": ""
591
+ "content": "",
592
+ "validFrom": null
325
593
  },
326
594
  "valid": true
327
595
  },
@@ -333,8 +601,14 @@
333
601
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
334
602
  "created_at": 1700000000,
335
603
  "tags": [
336
- ["d", "credential"],
337
- ["type", "credential"]
604
+ [
605
+ "d",
606
+ "credential"
607
+ ],
608
+ [
609
+ "type",
610
+ "credential"
611
+ ]
338
612
  ],
339
613
  "content": "",
340
614
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -352,10 +626,17 @@
352
626
  "revoked": false,
353
627
  "reason": null,
354
628
  "tags": [
355
- ["d", "credential"],
356
- ["type", "credential"]
629
+ [
630
+ "d",
631
+ "credential"
632
+ ],
633
+ [
634
+ "type",
635
+ "credential"
636
+ ]
357
637
  ],
358
- "content": ""
638
+ "content": "",
639
+ "validFrom": null
359
640
  },
360
641
  "valid": true
361
642
  },
@@ -367,9 +648,18 @@
367
648
  "pubkey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
368
649
  "created_at": 1700000000,
369
650
  "tags": [
370
- ["d", "credential:def456"],
371
- ["type", "credential"],
372
- ["p", "def456"]
651
+ [
652
+ "d",
653
+ "credential:def456"
654
+ ],
655
+ [
656
+ "type",
657
+ "credential"
658
+ ],
659
+ [
660
+ "p",
661
+ "def456"
662
+ ]
373
663
  ],
374
664
  "content": "{\"signatures\":[{\"type\":\"schnorr\",\"value\":\"deadbeef\"}],\"merkle_root\":\"cafebabe\"}",
375
665
  "id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
@@ -387,11 +677,21 @@
387
677
  "revoked": false,
388
678
  "reason": null,
389
679
  "tags": [
390
- ["d", "credential:def456"],
391
- ["type", "credential"],
392
- ["p", "def456"]
680
+ [
681
+ "d",
682
+ "credential:def456"
683
+ ],
684
+ [
685
+ "type",
686
+ "credential"
687
+ ],
688
+ [
689
+ "p",
690
+ "def456"
691
+ ]
393
692
  ],
394
- "content": "{\"signatures\":[{\"type\":\"schnorr\",\"value\":\"deadbeef\"}],\"merkle_root\":\"cafebabe\"}"
693
+ "content": "{\"signatures\":[{\"type\":\"schnorr\",\"value\":\"deadbeef\"}],\"merkle_root\":\"cafebabe\"}",
694
+ "validFrom": null
395
695
  },
396
696
  "valid": true
397
697
  }