@metalabel/dfos-protocol 0.9.0 → 0.11.0
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 +7 -11
- package/dist/chain/index.d.ts +37 -33
- package/dist/chain/index.js +27 -9
- package/dist/{chunk-ZXXP5W5N.js → chunk-GQOZJKKO.js} +58 -10
- package/dist/{chunk-24VGJGUM.js → chunk-LQFOBE6X.js} +25 -27
- package/dist/{chunk-UEJ364OG.js → chunk-SDUOUFTF.js} +110 -75
- package/dist/credentials/index.d.ts +3 -12
- package/dist/credentials/index.js +2 -2
- package/dist/crypto/index.d.ts +16 -7
- package/dist/crypto/index.js +3 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.js +29 -21
- package/dist/{schemas-BEl38wrI.d.ts → schemas-Myod8ES9.d.ts} +58 -14
- package/examples/content-delegated.json +11 -11
- package/examples/content-delete.json +5 -5
- package/examples/content-lifecycle.json +9 -9
- package/examples/credential-read.json +3 -3
- package/examples/credential-write.json +5 -5
- package/examples/identity-delete.json +4 -4
- package/examples/identity-genesis.json +3 -3
- package/examples/identity-rotation.json +4 -4
- package/examples/identity-services.json +38 -0
- package/package.json +10 -14
- package/dist/chunk-E5CFQG2B.js +0 -99
- package/dist/merkle/index.d.ts +0 -45
- package/dist/merkle/index.js +0 -14
- package/examples/beacon.json +0 -14
- package/examples/merkle-tree.json +0 -28
- package/schemas/manifest.v1.json +0 -29
|
@@ -2,12 +2,46 @@ import { z } from 'zod';
|
|
|
2
2
|
|
|
3
3
|
/** Function that signs a byte array and returns a signature */
|
|
4
4
|
type Signer = (message: Uint8Array) => Promise<Uint8Array>;
|
|
5
|
+
/** Max number of service entries in an identity's services state */
|
|
6
|
+
declare const MAX_SERVICES_ENTRIES = 16;
|
|
7
|
+
/** Max CBOR-encoded size of the services array (bytes) — protocol constant */
|
|
8
|
+
declare const MAX_SERVICES_PAYLOAD_SIZE = 8192;
|
|
5
9
|
declare const MultikeyPublicKey: z.ZodObject<{
|
|
6
10
|
id: z.ZodString;
|
|
7
11
|
type: z.ZodLiteral<"Multikey">;
|
|
8
12
|
publicKeyMultibase: z.ZodString;
|
|
9
13
|
}, z.core.$strict>;
|
|
10
14
|
type MultikeyPublicKey = z.infer<typeof MultikeyPublicKey>;
|
|
15
|
+
/**
|
|
16
|
+
* Anchor target shapes — a ContentAnchor references a STABLE content
|
|
17
|
+
* identifier, dispatched by structural form:
|
|
18
|
+
* - 31-char contentId (content chain) → mutable, gateable
|
|
19
|
+
* - CIDv1 base32 (artifact) → immutable, public
|
|
20
|
+
* Both are stable; a chain HEAD CID (also base32 but resolves to a non-artifact
|
|
21
|
+
* op) is rejected by the shape-dispatch + resolution type check, never anchored.
|
|
22
|
+
*/
|
|
23
|
+
declare const CONTENT_ID_ANCHOR_RE: RegExp;
|
|
24
|
+
declare const ARTIFACT_CID_ANCHOR_RE: RegExp;
|
|
25
|
+
/**
|
|
26
|
+
* Service entry — discovery vocabulary in identity-chain state.
|
|
27
|
+
*
|
|
28
|
+
* Open namespace: `type` is an arbitrary bounded string. Recognized types
|
|
29
|
+
* (`DfosRelay`, `ContentAnchor`) are structurally validated; UNRECOGNIZED types
|
|
30
|
+
* are preserved verbatim and ignored (MUST-ignore-unknown) — only the common
|
|
31
|
+
* envelope (id + type) and the byte cap apply. New service types therefore
|
|
32
|
+
* never require a protocol/cross-language change.
|
|
33
|
+
*/
|
|
34
|
+
declare const ServiceEntry: z.ZodObject<{
|
|
35
|
+
id: z.ZodString;
|
|
36
|
+
type: z.ZodString;
|
|
37
|
+
}, z.core.$catchall<z.ZodUnknown>>;
|
|
38
|
+
type ServiceEntry = z.infer<typeof ServiceEntry>;
|
|
39
|
+
/** Identity services state — full-state, bounded, unique entry ids */
|
|
40
|
+
declare const ServicesArray: z.ZodArray<z.ZodObject<{
|
|
41
|
+
id: z.ZodString;
|
|
42
|
+
type: z.ZodString;
|
|
43
|
+
}, z.core.$catchall<z.ZodUnknown>>>;
|
|
44
|
+
type ServicesArray = z.infer<typeof ServicesArray>;
|
|
11
45
|
declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
12
46
|
version: z.ZodLiteral<1>;
|
|
13
47
|
type: z.ZodLiteral<"create">;
|
|
@@ -26,6 +60,10 @@ declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
26
60
|
type: z.ZodLiteral<"Multikey">;
|
|
27
61
|
publicKeyMultibase: z.ZodString;
|
|
28
62
|
}, z.core.$strict>>;
|
|
63
|
+
services: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
64
|
+
id: z.ZodString;
|
|
65
|
+
type: z.ZodString;
|
|
66
|
+
}, z.core.$catchall<z.ZodUnknown>>>>;
|
|
29
67
|
createdAt: z.ZodISODateTime;
|
|
30
68
|
}, z.core.$strict>, z.ZodObject<{
|
|
31
69
|
version: z.ZodLiteral<1>;
|
|
@@ -46,6 +84,10 @@ declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
46
84
|
type: z.ZodLiteral<"Multikey">;
|
|
47
85
|
publicKeyMultibase: z.ZodString;
|
|
48
86
|
}, z.core.$strict>>;
|
|
87
|
+
services: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
88
|
+
id: z.ZodString;
|
|
89
|
+
type: z.ZodString;
|
|
90
|
+
}, z.core.$catchall<z.ZodUnknown>>>>;
|
|
49
91
|
createdAt: z.ZodISODateTime;
|
|
50
92
|
}, z.core.$strict>, z.ZodObject<{
|
|
51
93
|
version: z.ZodLiteral<1>;
|
|
@@ -72,6 +114,10 @@ declare const VerifiedIdentity: z.ZodObject<{
|
|
|
72
114
|
type: z.ZodLiteral<"Multikey">;
|
|
73
115
|
publicKeyMultibase: z.ZodString;
|
|
74
116
|
}, z.core.$strict>>;
|
|
117
|
+
services: z.ZodArray<z.ZodObject<{
|
|
118
|
+
id: z.ZodString;
|
|
119
|
+
type: z.ZodString;
|
|
120
|
+
}, z.core.$catchall<z.ZodUnknown>>>;
|
|
75
121
|
}, z.core.$strict>;
|
|
76
122
|
type VerifiedIdentity = z.infer<typeof VerifiedIdentity>;
|
|
77
123
|
declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
@@ -91,7 +137,6 @@ declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
91
137
|
baseDocumentCID: z.ZodNullable<z.ZodString>;
|
|
92
138
|
createdAt: z.ZodISODateTime;
|
|
93
139
|
note: z.ZodNullable<z.ZodString>;
|
|
94
|
-
/** DFOS credential authorizing this operation when signer is not the chain creator */
|
|
95
140
|
authorization: z.ZodOptional<z.ZodString>;
|
|
96
141
|
}, z.core.$strict>, z.ZodObject<{
|
|
97
142
|
version: z.ZodLiteral<1>;
|
|
@@ -100,19 +145,9 @@ declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
100
145
|
previousOperationCID: z.ZodString;
|
|
101
146
|
createdAt: z.ZodISODateTime;
|
|
102
147
|
note: z.ZodNullable<z.ZodString>;
|
|
103
|
-
/** DFOS credential authorizing this operation when signer is not the chain creator */
|
|
104
148
|
authorization: z.ZodOptional<z.ZodString>;
|
|
105
149
|
}, z.core.$strict>], "type">;
|
|
106
150
|
type ContentOperation = z.infer<typeof ContentOperation>;
|
|
107
|
-
/** Beacon: floating signed manifest pointer announcement */
|
|
108
|
-
declare const BeaconPayload: z.ZodObject<{
|
|
109
|
-
version: z.ZodLiteral<1>;
|
|
110
|
-
type: z.ZodLiteral<"beacon">;
|
|
111
|
-
did: z.ZodString;
|
|
112
|
-
manifestContentId: z.ZodString;
|
|
113
|
-
createdAt: z.ZodISODateTime;
|
|
114
|
-
}, z.core.$strict>;
|
|
115
|
-
type BeaconPayload = z.infer<typeof BeaconPayload>;
|
|
116
151
|
/** Max CBOR-encoded payload size for artifacts (bytes) — protocol constant */
|
|
117
152
|
declare const MAX_ARTIFACT_PAYLOAD_SIZE = 16384;
|
|
118
153
|
/** Artifact: standalone signed inline document, immutable, CID-addressable */
|
|
@@ -126,16 +161,25 @@ declare const ArtifactPayload: z.ZodObject<{
|
|
|
126
161
|
createdAt: z.ZodISODateTime;
|
|
127
162
|
}, z.core.$strict>;
|
|
128
163
|
type ArtifactPayload = z.infer<typeof ArtifactPayload>;
|
|
129
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* Countersign: standalone witness attestation referencing a target operation by CID.
|
|
166
|
+
*
|
|
167
|
+
* `relation` is an OPEN-namespace tag naming the nature of the attestation
|
|
168
|
+
* (e.g. `coauthors`, `endorses`, `witnessed`, `holds`, `received`). It is an
|
|
169
|
+
* arbitrary bounded string — recognized values carry social meaning to clients,
|
|
170
|
+
* unrecognized values MUST be preserved and ignored. Optional, so a bare witness
|
|
171
|
+
* attestation (no relation) encodes identically (CID-neutral).
|
|
172
|
+
*/
|
|
130
173
|
declare const CountersignPayload: z.ZodObject<{
|
|
131
174
|
version: z.ZodLiteral<1>;
|
|
132
175
|
type: z.ZodLiteral<"countersign">;
|
|
133
176
|
did: z.ZodString;
|
|
134
177
|
targetCID: z.ZodString;
|
|
178
|
+
relation: z.ZodOptional<z.ZodString>;
|
|
135
179
|
createdAt: z.ZodISODateTime;
|
|
136
180
|
}, z.core.$strict>;
|
|
137
181
|
type CountersignPayload = z.infer<typeof CountersignPayload>;
|
|
138
|
-
/** Revocation: signed credential revocation artifact, gossiped
|
|
182
|
+
/** Revocation: signed credential revocation artifact, gossiped on the proof plane */
|
|
139
183
|
declare const RevocationPayload: z.ZodObject<{
|
|
140
184
|
version: z.ZodLiteral<1>;
|
|
141
185
|
type: z.ZodLiteral<"revocation">;
|
|
@@ -145,4 +189,4 @@ declare const RevocationPayload: z.ZodObject<{
|
|
|
145
189
|
}, z.core.$strict>;
|
|
146
190
|
type RevocationPayload = z.infer<typeof RevocationPayload>;
|
|
147
191
|
|
|
148
|
-
export {
|
|
192
|
+
export { ARTIFACT_CID_ANCHOR_RE as A, CONTENT_ID_ANCHOR_RE as C, IdentityOperation as I, MAX_ARTIFACT_PAYLOAD_SIZE as M, RevocationPayload as R, ServiceEntry as S, VerifiedIdentity as V, ArtifactPayload as a, ContentOperation as b, CountersignPayload as c, MAX_SERVICES_ENTRIES as d, MAX_SERVICES_PAYLOAD_SIZE as e, MultikeyPublicKey as f, ServicesArray as g, type Signer as h };
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"description": "Content chain: creator signs genesis, delegate signs update with write credential",
|
|
3
3
|
"type": "content-delegated",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWRkc2pnZGk3dmZib2tlejVyZWl4enRmcm9kNnhjbmh0Ymc0NmI3dnZmZGRwb2Z4czVtaXkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWRyd2V4NWRjYjJ1c3NqNmJ0eGJjMzQyM3U1d2VzNnJyd29tbXhhemt1bHRzcG9oN2EzdGkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MTA6MDAuMDAwWiIsIm5vdGUiOm51bGx9.cxfEOGZ08zCQVuqiiljZNCxZudQi3CGqANtFnWLVyh0m9Sdq2yFk_fl4jCcw_4lTDvkYOkMgEOm_VvkpnqdMDA",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczo5NGFoNzk2M24yMjNrOGM5ODg0aGgyN2VraDQybmVhI2tleV9hOHIyNzQzNGFhcjc2YWU3MmM4NzdmYTQ3a2FyOHJuIiwiY2lkIjoiYmFmeXJlaWd3ZjI0aGhkN2N3dGlhMndocWl3bDVndHZwbGRxNnZtZmozY2ZvdGV5cmJpdjNxMmJhbGkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWRkc2pnZGk3dmZib2tlejVyZWl4enRmcm9kNnhjbmh0Ymc0NmI3dnZmZGRwb2Z4czVtaXkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWllanNzaWhrZGZsamphYmRhbWhrdXlpYm1jNzQzaG4zaTM2YTdmbnV6c2plb2FydHBlNXdhIiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWRyd2V4NWRjYjJ1c3NqNmJ0eGJjMzQyM3U1d2VzNnJyd29tbXhhemt1bHRzcG9oN2EzdGkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjExOjAwLjAwMFoiLCJub3RlIjoiZGVsZWdhdGVkIGVkaXQgYnkga2V5MyIsImF1dGhvcml6YXRpb24iOiJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SW1ScFpEcGtabTl6T21OeVpXUmxiblJwWVd3aUxDSnJhV1FpT2lKa2FXUTZaR1p2Y3pwamJtNXVablE1WmpoaE1uSnVPVE00WkRadWEzb3pPSEk0TkRkMk1tdHlJMnRsZVY5eU9XVjJNelJtZG1NeU0zbzVPVGwyWldGaFpuUTRNMjV1TWpsNmRtaGxJaXdpWTJsa0lqb2lZbUZtZVhKbGFXUmtaVzkyZFRJeVpYTjVhSE5pTlRaa2FHRTJaVFJ4TkhZeU5tbHVObmQ1YjNsMGRYbDJjVFV5TlhjMWFqTnlZMlp0Tm1raWZRLmV5SjJaWEp6YVc5dUlqb3hMQ0owZVhCbElqb2lSRVpQVTBOeVpXUmxiblJwWVd3aUxDSnBjM01pT2lKa2FXUTZaR1p2Y3pwamJtNXVablE1WmpoaE1uSnVPVE00WkRadWEzb3pPSEk0TkRkMk1tdHlJaXdpWVhWa0lqb2laR2xrT21SbWIzTTZPVFJoYURjNU5qTnVNakl6YXpoak9UZzROR2hvTWpkbGEyZzBNbTVsWVNJc0ltRjBkQ0k2VzNzaWNtVnpiM1Z5WTJVaU9pSmphR0ZwYmpvemNqSTBNMmczTnpsbGEzSnVjbUZoWTJVMk16ZzRNbVoyT0dRNE16ZzVJaXdpWVdOMGFXOXVJam9pZDNKcGRHVWlmVjBzSW5CeVppSTZXMTBzSW1WNGNDSTZNVGM1T0RjMk1UWXdNQ3dpYVdGMElqb3hOemN5T0RReE5qQXdmUS5oWko1LXpLTXNKR0tQaEtVdjVCaEt4QnJYLWlaUjNJazNJNTB2b1NEUTVrbWFLOXlvNkI3MTZBY05ibnhlc01tclpXX0FfNzJuZDVYQ29iSTZUbFJBZyJ9.0eNH6RC6O-OkFDBLEWk3YugPUzc9WGtZnG8wRzEEjz0SEwTx5z4FkNoP8Fygu7nd9DZbel9flZL-f0Lg_yD6BA"
|
|
7
7
|
],
|
|
8
8
|
"creatorPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
9
9
|
"delegatePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
"format": "short-post",
|
|
15
15
|
"title": "Original Post",
|
|
16
16
|
"body": "Content created by the chain owner.",
|
|
17
|
-
"createdByDID": "did:dfos:
|
|
17
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
|
|
18
18
|
},
|
|
19
19
|
"baseDocumentCID": null,
|
|
20
|
-
"createdByDID": "did:dfos:
|
|
20
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
21
21
|
"createdAt": "2026-03-07T00:10:00.000Z"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
@@ -26,19 +26,19 @@
|
|
|
26
26
|
"format": "short-post",
|
|
27
27
|
"title": "Delegated Edit",
|
|
28
28
|
"body": "Content updated by an authorized delegate.",
|
|
29
|
-
"createdByDID": "did:dfos:
|
|
29
|
+
"createdByDID": "did:dfos:94ah7963n223k8c9884hh27ekh42nea"
|
|
30
30
|
},
|
|
31
|
-
"baseDocumentCID": "
|
|
32
|
-
"createdByDID": "did:dfos:
|
|
31
|
+
"baseDocumentCID": "bafyreidrwex5dcb2ussj6btxbc3423u5wes6rrwommxazkultspoh7a3ti",
|
|
32
|
+
"createdByDID": "did:dfos:94ah7963n223k8c9884hh27ekh42nea",
|
|
33
33
|
"createdAt": "2026-03-07T00:11:00.000Z"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
|
-
"authorization": "
|
|
36
|
+
"authorization": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWRkZW92dTIyZXN5aHNiNTZkaGE2ZTRxNHYyNmluNnd5b3l0dXl2cTUyNXc1ajNyY2ZtNmkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjozcjI0M2g3Nzlla3JucmFhY2U2Mzg4MmZ2OGQ4Mzg5IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.hZJ5-zKMsJGKPhKUv5BhKxBrX-iZR3Ik3I50voSDQ5kmaK9yo6B716AcNbnxesMmrZW_A_72nd5XCobI6TlRAg",
|
|
37
37
|
"expected": {
|
|
38
|
-
"contentId": "
|
|
39
|
-
"creatorDID": "did:dfos:
|
|
38
|
+
"contentId": "3r243h779ekrnraace63882fv8d8389",
|
|
39
|
+
"creatorDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
40
40
|
"isDeleted": false,
|
|
41
|
-
"currentDocumentCID": "
|
|
41
|
+
"currentDocumentCID": "bafyreiejssihkdfljjabdamhkuyibmc743hn3i36a7fnuzsjeoartpe5wa",
|
|
42
42
|
"length": 2
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"description": "Content chain: create + delete",
|
|
3
3
|
"type": "content",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.POTcvRbYb5r_P6ZpJRNAufCkEHmfebUyc1jb_USg7xdG8bwq520HMsg6wWjfrhU8Y-7_86IcLwpldD03_L0-Ag",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFsaXlvenNqaW4yaTd4NHl4ejJwcmJnaGIybGU1YzYycGxsbWxhc3YyaGlhZ3l5ZnZjc2kifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoicmVtb3ZpbmcgY29udGVudCJ9.k_zTEiRy1aPc1d39SQJOCf8yCVaRoYhenun4RJTxBsmDu6TZ5EvBAvXnbFS0DYLE3X1wV1G6YQG6rpxYElG_Ag"
|
|
7
7
|
],
|
|
8
8
|
"signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
|
|
9
9
|
"documents": [
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
"format": "short-post",
|
|
14
14
|
"title": "Hello World",
|
|
15
15
|
"body": "First post on the protocol.",
|
|
16
|
-
"createdByDID": "did:dfos:
|
|
16
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
|
|
17
17
|
},
|
|
18
18
|
"baseDocumentCID": null,
|
|
19
|
-
"createdByDID": "did:dfos:
|
|
19
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
20
20
|
"createdAt": "2026-03-07T00:02:00.000Z"
|
|
21
21
|
}
|
|
22
22
|
],
|
|
23
23
|
"expected": {
|
|
24
|
-
"contentId": "
|
|
24
|
+
"contentId": "cv7n8vkvr64cctf3294h9k4eanhff8z",
|
|
25
25
|
"isDeleted": true,
|
|
26
26
|
"currentDocumentCID": null,
|
|
27
27
|
"length": 2
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"description": "Content chain: create + update (with both documents)",
|
|
3
3
|
"type": "content",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.POTcvRbYb5r_P6ZpJRNAufCkEHmfebUyc1jb_USg7xdG8bwq520HMsg6wWjfrhU8Y-7_86IcLwpldD03_L0-Ag",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWJweDRjZ2I0ajZuM216NzY0cHlscmRnNnE3YTQ2bmpuaHg2cDRjcTJybGdldWUzczNldnEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlmZXRwdXRreTRmbnp2N3NyZzdsN3luaWg2ajR5dHplcWlicmNwNXVpZXB2b2x4cWhjYmN5IiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.yTkJOiiCsjIBHmR7773W1pdjC5in_Fl3WUXHl8Y_Hyb47RgfiWVufPirIolnuI-IOOl6zHNNmDfmy6kFROwOAg"
|
|
7
7
|
],
|
|
8
8
|
"signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
|
|
9
9
|
"documents": [
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"format": "short-post",
|
|
14
14
|
"title": "Hello World",
|
|
15
15
|
"body": "First post on the protocol.",
|
|
16
|
-
"createdByDID": "did:dfos:
|
|
16
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
|
|
17
17
|
},
|
|
18
18
|
"baseDocumentCID": null,
|
|
19
|
-
"createdByDID": "did:dfos:
|
|
19
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
20
20
|
"createdAt": "2026-03-07T00:02:00.000Z"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
"format": "short-post",
|
|
26
26
|
"title": "Hello World (edited)",
|
|
27
27
|
"body": "Updated content.",
|
|
28
|
-
"createdByDID": "did:dfos:
|
|
28
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
|
|
29
29
|
},
|
|
30
|
-
"baseDocumentCID": "
|
|
31
|
-
"createdByDID": "did:dfos:
|
|
30
|
+
"baseDocumentCID": "bafyreievcqrmvtz2pis5tdizt7sjotoqqogl6vrrqga64w2tnwkq2rnudy",
|
|
31
|
+
"createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
32
32
|
"createdAt": "2026-03-07T00:03:00.000Z"
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"expected": {
|
|
36
|
-
"contentId": "
|
|
36
|
+
"contentId": "cv7n8vkvr64cctf3294h9k4eanhff8z",
|
|
37
37
|
"isDeleted": false,
|
|
38
|
-
"currentDocumentCID": "
|
|
38
|
+
"currentDocumentCID": "bafyreifetputky4fnzv7srg7l7ynih6j4ytzeqibrcp5uiepvolxqhcbcy",
|
|
39
39
|
"length": 2
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "DFOS credential: read access",
|
|
3
3
|
"type": "credential",
|
|
4
|
-
"credential": "
|
|
4
|
+
"credential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWN0aGNiaXp4dmdlbXN4djdrc2NvbzdhcGllYWFsM2Z5ZTM3bzQ1Zmt5a25lN2I0aG9icmEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoicmVhZCJ9XSwicHJmIjpbXSwiZXhwIjoxNzk4NzYxNjAwLCJpYXQiOjE3NzI4NDE2MDB9.UvTItuWFriA39FZIdB5TuXa_b07eyNLc-iR0cej2litSkjBYAZaLlDJUmyDQ-3dB7TmNVXDbB3SMbpvLnWW9Dw",
|
|
5
5
|
"issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
6
6
|
"audiencePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
7
7
|
"expected": {
|
|
8
|
-
"iss": "did:dfos:
|
|
9
|
-
"aud": "did:dfos:
|
|
8
|
+
"iss": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
9
|
+
"aud": "did:dfos:94ah7963n223k8c9884hh27ekh42nea"
|
|
10
10
|
}
|
|
11
11
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "DFOS credential: write access (broad + narrowed)",
|
|
3
3
|
"type": "credential",
|
|
4
|
-
"broadCredential": "
|
|
5
|
-
"narrowCredential": "
|
|
4
|
+
"broadCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWZ5aW5ieGhicml0NTZtM2FhdjY2bXc0eGQ2YWRxamFzdmNmaG11NjZnNnRudXFncnljbG0ifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.A-EygURAN2bALVwI2AZKFEuy30ZnWJFBaD4jCTf1d7A90rYELStjTWJ1iI7OulihTCfaVtlvj5HtX6Dwv1VxAg",
|
|
5
|
+
"narrowCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWNiNGVoZWl6eHNrM3N6Ymgyb2dvbXU0cmV1NGd0a2kycHB4NjR6ZW8zeGFrMnh1bWZ2dWkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjpjdjduOHZrdnI2NGNjdGYzMjk0aDlrNGVhbmhmZjh6IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.xwsGleofAr78xbT4jCrK402PEI8G_OzvxJITvAjL5ltr7_2bdkX4sCjmZbnjl9m9QcEXnWyWbBgYO8KFl2r8CQ",
|
|
6
6
|
"issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
7
7
|
"audiencePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
8
8
|
"expected": {
|
|
9
|
-
"iss": "did:dfos:
|
|
10
|
-
"aud": "did:dfos:
|
|
11
|
-
"narrowContentId": "
|
|
9
|
+
"iss": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
10
|
+
"aud": "did:dfos:94ah7963n223k8c9884hh27ekh42nea",
|
|
11
|
+
"narrowContentId": "cv7n8vkvr64cctf3294h9k4eanhff8z"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"description": "Identity chain: genesis + delete (terminal)",
|
|
3
3
|
"type": "identity",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0ODNubjI5enZoZSIsImNpZCI6ImJhZnlyZWlnaWJ5anN2bGt0ZTQ2Zzd6NHIydXd5eHA2eDU1b3RlbzRmcjVuZGE3emFvbHFvbDIyM3hhIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDE6MDAuMDAwWiJ9.7SNEk43hmCoN4vpUELfHNMsHO_H1QBPurEFPH3n2xf3cVR3EvJ1A7-xwf8_f3AmawFNI712jMQTpj9r4jQvQCg"
|
|
7
7
|
],
|
|
8
8
|
"expected": {
|
|
9
|
-
"did": "did:dfos:
|
|
9
|
+
"did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
10
10
|
"isDeleted": true,
|
|
11
11
|
"controllerKeys": [
|
|
12
12
|
{
|
|
13
|
-
"id": "
|
|
13
|
+
"id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
|
|
14
14
|
"type": "Multikey",
|
|
15
15
|
"publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
|
|
16
16
|
}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"description": "Identity chain: genesis (single create operation)",
|
|
3
3
|
"type": "identity",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg"
|
|
6
6
|
],
|
|
7
7
|
"expected": {
|
|
8
|
-
"did": "did:dfos:
|
|
8
|
+
"did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
9
9
|
"isDeleted": false,
|
|
10
10
|
"controllerKeys": [
|
|
11
11
|
{
|
|
12
|
-
"id": "
|
|
12
|
+
"id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
|
|
13
13
|
"type": "Multikey",
|
|
14
14
|
"publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
|
|
15
15
|
}
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"description": "Identity chain: genesis + key rotation",
|
|
3
3
|
"type": "identity",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0ODNubjI5enZoZSIsImNpZCI6ImJhZnlyZWliZnVoNjN1djMzaTJpNWVvb2UzYm9pdDJydXlqZWh1YnNyeWVtdXV6Nm1ydGxlajI2cmVpIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSIsImF1dGhLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJhc3NlcnRLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJjb250cm9sbGVyS2V5cyI6W3siaWQiOiJrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZG43ejZ6cmN0OCIsInR5cGUiOiJNdWx0aWtleSIsInB1YmxpY0tleU11bHRpYmFzZSI6Ino2TWtmVWQ2NUpyQWhmZGdGdU1DY2NVOVRoUXZqQjJmSkFNVUhrdXVhakY5OTJnSyJ9XSwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowMTowMC4wMDBaIn0.7fqvWGEVYW9atA1uqpp7lIUOWp4dATLpLjOmFWzJN-8gTL-QnXDCeyGcBu5AXhHzO52fauwUavh1KrB6wBYuCw"
|
|
7
7
|
],
|
|
8
8
|
"expected": {
|
|
9
|
-
"did": "did:dfos:
|
|
9
|
+
"did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
|
|
10
10
|
"isDeleted": false,
|
|
11
11
|
"controllerKeys": [
|
|
12
12
|
{
|
|
13
|
-
"id": "
|
|
13
|
+
"id": "key_ez9a874tckr3dv933d3ckdn7z6zrct8",
|
|
14
14
|
"type": "Multikey",
|
|
15
15
|
"publicKeyMultibase": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK"
|
|
16
16
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Identity chain: genesis publishing a services set (relay locator + content/artifact anchors)",
|
|
3
|
+
"type": "identity",
|
|
4
|
+
"chain": [
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpZGkzcXBzM3F0dHFwMjJtM3kzM2JkYmYyaXlrYnE1cjQ1ampod2EzN21nZXNvdjdzZGd6ZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJzZXJ2aWNlcyI6W3siaWQiOiJyZWxheSIsInR5cGUiOiJEZm9zUmVsYXkiLCJlbmRwb2ludCI6Imh0dHBzOi8vcmVsYXkuZGZvcy5jb20ifSx7ImlkIjoicHJvZmlsZSIsInR5cGUiOiJDb250ZW50QW5jaG9yIiwibGFiZWwiOiJwcm9maWxlIiwiYW5jaG9yIjoiY3Y3bjh2a3ZyNjRjY3RmMzI5NGg5azRlYW5oZmY4eiJ9LHsiaWQiOiJhdmF0YXIiLCJ0eXBlIjoiQ29udGVudEFuY2hvciIsImxhYmVsIjoiYXZhdGFyIiwiYW5jaG9yIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkifV0sImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDU6MDAuMDAwWiJ9.HCzVJXcUzL62lxtC8omBlit1JNSWk4b4kQKjjjWT00honzZ9-k3dKusIRuhTV6gjT1M74bLVZYUxPb8kJvhHAw"
|
|
6
|
+
],
|
|
7
|
+
"controllerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
8
|
+
"expected": {
|
|
9
|
+
"did": "did:dfos:zhkrrzrd7z623ha8tt7dt699de8r3ar",
|
|
10
|
+
"isDeleted": false,
|
|
11
|
+
"controllerKeys": [
|
|
12
|
+
{
|
|
13
|
+
"id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
|
|
14
|
+
"type": "Multikey",
|
|
15
|
+
"publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"services": [
|
|
19
|
+
{
|
|
20
|
+
"id": "relay",
|
|
21
|
+
"type": "DfosRelay",
|
|
22
|
+
"endpoint": "https://relay.dfos.com"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "profile",
|
|
26
|
+
"type": "ContentAnchor",
|
|
27
|
+
"label": "profile",
|
|
28
|
+
"anchor": "cv7n8vkvr64cctf3294h9k4eanhff8z"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "avatar",
|
|
32
|
+
"type": "ContentAnchor",
|
|
33
|
+
"label": "avatar",
|
|
34
|
+
"anchor": "bafyreievcqrmvtz2pis5tdizt7sjotoqqogl6vrrqga64w2tnwkq2rnudy"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metalabel/dfos-protocol",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "DFOS Protocol — Ed25519 signed chain primitives,
|
|
5
|
+
"description": "DFOS Protocol — Ed25519 signed chain primitives, services, credentials, and verification",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Metalabel <hello@metalabel.com> (https://metalabel.com)",
|
|
8
8
|
"repository": {
|
|
@@ -37,10 +37,6 @@
|
|
|
37
37
|
"import": "./dist/chain/index.js",
|
|
38
38
|
"types": "./dist/chain/index.d.ts"
|
|
39
39
|
},
|
|
40
|
-
"./merkle": {
|
|
41
|
-
"import": "./dist/merkle/index.js",
|
|
42
|
-
"types": "./dist/merkle/index.d.ts"
|
|
43
|
-
},
|
|
44
40
|
"./credentials": {
|
|
45
41
|
"import": "./dist/credentials/index.js",
|
|
46
42
|
"types": "./dist/credentials/index.d.ts"
|
|
@@ -54,19 +50,19 @@
|
|
|
54
50
|
"README.md"
|
|
55
51
|
],
|
|
56
52
|
"dependencies": {
|
|
57
|
-
"@ipld/dag-cbor": "^
|
|
58
|
-
"@noble/curves": "^2.0
|
|
59
|
-
"@noble/hashes": "^2.0
|
|
60
|
-
"multiformats": "^
|
|
61
|
-
"zod": "^4.3
|
|
53
|
+
"@ipld/dag-cbor": "^10.0.1",
|
|
54
|
+
"@noble/curves": "^2.2.0",
|
|
55
|
+
"@noble/hashes": "^2.2.0",
|
|
56
|
+
"multiformats": "^14.0.0",
|
|
57
|
+
"zod": "^4.4.3"
|
|
62
58
|
},
|
|
63
59
|
"devDependencies": {
|
|
64
60
|
"@types/node": "^24.10.4",
|
|
65
|
-
"ajv": "^8.
|
|
61
|
+
"ajv": "^8.20.0",
|
|
66
62
|
"ajv-formats": "^3.0.1",
|
|
67
63
|
"tsup": "^8.5.1",
|
|
68
|
-
"tsx": "^4.
|
|
69
|
-
"vitest": "^4.1.
|
|
64
|
+
"tsx": "^4.22.4",
|
|
65
|
+
"vitest": "^4.1.8"
|
|
70
66
|
},
|
|
71
67
|
"scripts": {
|
|
72
68
|
"build": "tsup",
|
package/dist/chunk-E5CFQG2B.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// src/merkle/tree.ts
|
|
2
|
-
var sha256 = async (data) => {
|
|
3
|
-
const buf = await crypto.subtle.digest("SHA-256", data);
|
|
4
|
-
return new Uint8Array(buf);
|
|
5
|
-
};
|
|
6
|
-
var toHex = (bytes) => {
|
|
7
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
8
|
-
};
|
|
9
|
-
var hexToBytes = (hex) => {
|
|
10
|
-
const bytes = new Uint8Array(hex.length / 2);
|
|
11
|
-
for (let i = 0; i < hex.length; i += 2) {
|
|
12
|
-
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
13
|
-
}
|
|
14
|
-
return bytes;
|
|
15
|
-
};
|
|
16
|
-
var concat = (a, b) => {
|
|
17
|
-
const result = new Uint8Array(a.length + b.length);
|
|
18
|
-
result.set(a, 0);
|
|
19
|
-
result.set(b, a.length);
|
|
20
|
-
return result;
|
|
21
|
-
};
|
|
22
|
-
var hashLeaf = async (contentId) => {
|
|
23
|
-
return sha256(new TextEncoder().encode(contentId));
|
|
24
|
-
};
|
|
25
|
-
var hashInterior = async (left, right) => {
|
|
26
|
-
return sha256(concat(left, right));
|
|
27
|
-
};
|
|
28
|
-
var buildMerkleTree = async (contentIds) => {
|
|
29
|
-
const sorted = [...new Set(contentIds)].sort();
|
|
30
|
-
if (sorted.length === 0) return { root: null, leafCount: 0 };
|
|
31
|
-
let level = await Promise.all(sorted.map(hashLeaf));
|
|
32
|
-
while (level.length > 1) {
|
|
33
|
-
const nextLevel = [];
|
|
34
|
-
for (let i = 0; i < level.length; i += 2) {
|
|
35
|
-
if (i + 1 < level.length) {
|
|
36
|
-
nextLevel.push(await hashInterior(level[i], level[i + 1]));
|
|
37
|
-
} else {
|
|
38
|
-
nextLevel.push(level[i]);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
level = nextLevel;
|
|
42
|
-
}
|
|
43
|
-
return { root: toHex(level[0]), leafCount: sorted.length };
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// src/merkle/proof.ts
|
|
47
|
-
var generateMerkleProof = async (contentIds, targetId) => {
|
|
48
|
-
const sorted = [...new Set(contentIds)].sort();
|
|
49
|
-
const targetIdx = sorted.indexOf(targetId);
|
|
50
|
-
if (targetIdx < 0) return null;
|
|
51
|
-
const { root } = await buildMerkleTree(sorted);
|
|
52
|
-
if (!root) return null;
|
|
53
|
-
const leaves = await Promise.all(sorted.map(hashLeaf));
|
|
54
|
-
const path = [];
|
|
55
|
-
let level = leaves;
|
|
56
|
-
let idx = targetIdx;
|
|
57
|
-
while (level.length > 1) {
|
|
58
|
-
const nextLevel = [];
|
|
59
|
-
const nextIdx = Math.floor(idx / 2);
|
|
60
|
-
for (let i = 0; i < level.length; i += 2) {
|
|
61
|
-
if (i + 1 < level.length) {
|
|
62
|
-
if (i === idx || i + 1 === idx) {
|
|
63
|
-
const siblingIdx = i === idx ? i + 1 : i;
|
|
64
|
-
path.push({
|
|
65
|
-
hash: toHex(level[siblingIdx]),
|
|
66
|
-
position: siblingIdx < idx ? "left" : "right"
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
const interior = await sha256(concat(level[i], level[i + 1]));
|
|
70
|
-
nextLevel.push(interior);
|
|
71
|
-
} else {
|
|
72
|
-
nextLevel.push(level[i]);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
level = nextLevel;
|
|
76
|
-
idx = nextIdx;
|
|
77
|
-
}
|
|
78
|
-
return { contentId: targetId, root, path };
|
|
79
|
-
};
|
|
80
|
-
var verifyMerkleProof = async (proof) => {
|
|
81
|
-
let current = await hashLeaf(proof.contentId);
|
|
82
|
-
for (const step of proof.path) {
|
|
83
|
-
const sibling = hexToBytes(step.hash);
|
|
84
|
-
if (step.position === "left") {
|
|
85
|
-
current = await sha256(concat(sibling, current));
|
|
86
|
-
} else {
|
|
87
|
-
current = await sha256(concat(current, sibling));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return toHex(current) === proof.root;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
export {
|
|
94
|
-
hexToBytes,
|
|
95
|
-
hashLeaf,
|
|
96
|
-
buildMerkleTree,
|
|
97
|
-
generateMerkleProof,
|
|
98
|
-
verifyMerkleProof
|
|
99
|
-
};
|
package/dist/merkle/index.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
declare const hexToBytes: (hex: string) => Uint8Array;
|
|
2
|
-
/**
|
|
3
|
-
* Hash a leaf node — SHA-256 of UTF-8 encoded contentId
|
|
4
|
-
*/
|
|
5
|
-
declare const hashLeaf: (contentId: string) => Promise<Uint8Array>;
|
|
6
|
-
/**
|
|
7
|
-
* Build a sorted binary Merkle tree over content identifiers
|
|
8
|
-
*
|
|
9
|
-
* ContentIds are sorted lexicographically, hashed to leaves, then paired
|
|
10
|
-
* and hashed up to the root. Odd nodes are promoted to the next level.
|
|
11
|
-
*
|
|
12
|
-
* Returns null root for empty input. Deduplicates contentIds.
|
|
13
|
-
*/
|
|
14
|
-
declare const buildMerkleTree: (contentIds: string[]) => Promise<{
|
|
15
|
-
root: string | null;
|
|
16
|
-
leafCount: number;
|
|
17
|
-
}>;
|
|
18
|
-
|
|
19
|
-
interface MerkleProof {
|
|
20
|
-
/** The contentId being proven */
|
|
21
|
-
contentId: string;
|
|
22
|
-
/** Hex SHA-256 root of the tree */
|
|
23
|
-
root: string;
|
|
24
|
-
/** Sibling hashes along the path from leaf to root */
|
|
25
|
-
path: Array<{
|
|
26
|
-
/** Hex SHA-256 of sibling node */
|
|
27
|
-
hash: string;
|
|
28
|
-
/** Position of the sibling relative to the current node */
|
|
29
|
-
position: 'left' | 'right';
|
|
30
|
-
}>;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Generate an inclusion proof for a contentId in the set
|
|
34
|
-
*
|
|
35
|
-
* Returns null if the contentId is not in the set.
|
|
36
|
-
*/
|
|
37
|
-
declare const generateMerkleProof: (contentIds: string[], targetId: string) => Promise<MerkleProof | null>;
|
|
38
|
-
/**
|
|
39
|
-
* Verify a Merkle inclusion proof
|
|
40
|
-
*
|
|
41
|
-
* Recomputes the root from the leaf and proof path, compares to the claimed root.
|
|
42
|
-
*/
|
|
43
|
-
declare const verifyMerkleProof: (proof: MerkleProof) => Promise<boolean>;
|
|
44
|
-
|
|
45
|
-
export { type MerkleProof, buildMerkleTree, generateMerkleProof, hashLeaf, hexToBytes, verifyMerkleProof };
|