@metalabel/dfos-protocol 0.0.3 → 0.2.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/CONTENT-MODEL.md +63 -22
- package/DID-METHOD.md +7 -8
- package/PROTOCOL.md +414 -94
- package/README.md +17 -11
- package/dist/chain/index.d.ts +115 -2
- package/dist/chain/index.js +14 -1
- package/dist/chunk-CZSEEZLL.js +258 -0
- package/dist/chunk-E5CFQG2B.js +99 -0
- package/dist/{chunk-VEBMLR37.js → chunk-GEVJ3SEV.js} +232 -6
- package/dist/credentials/index.d.ts +206 -0
- package/dist/credentials/index.js +35 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +58 -32
- package/dist/merkle/index.d.ts +45 -0
- package/dist/merkle/index.js +14 -0
- package/examples/beacon.json +14 -0
- package/examples/content-delegated.json +44 -0
- package/examples/content-delete.json +5 -4
- package/examples/content-lifecycle.json +9 -7
- package/examples/credential-read.json +12 -0
- package/examples/credential-write.json +14 -0
- package/examples/merkle-tree.json +28 -0
- package/package.json +10 -9
- package/schemas/manifest.v1.json +29 -0
- package/schemas/post.v1.json +5 -0
- package/schemas/profile.v1.json +5 -0
- package/REGISTRY-API.md +0 -242
- package/dist/chunk-U6DANYPT.js +0 -311
- package/dist/registry/index.d.ts +0 -143
- package/dist/registry/index.js +0 -34
- package/openapi.yaml +0 -376
- package/schemas/document-envelope.v1.json +0 -37
package/dist/index.js
CHANGED
|
@@ -1,20 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
ContentOperationsParams,
|
|
4
|
-
ContentOperationsResponse,
|
|
5
|
-
IdentityOperationsParams,
|
|
6
|
-
IdentityOperationsResponse,
|
|
7
|
-
RegistryError,
|
|
8
|
-
ResolveContentResponse,
|
|
9
|
-
ResolveIdentityResponse,
|
|
10
|
-
ResolveOperationResponse,
|
|
11
|
-
SubmitContentChainRequest,
|
|
12
|
-
SubmitContentChainResponse,
|
|
13
|
-
SubmitIdentityChainRequest,
|
|
14
|
-
SubmitIdentityChainResponse,
|
|
15
|
-
createRegistryServer
|
|
16
|
-
} from "./chunk-U6DANYPT.js";
|
|
17
|
-
import {
|
|
2
|
+
BeaconPayload,
|
|
18
3
|
ContentOperation,
|
|
19
4
|
ED25519_PRIV_MULTICODEC,
|
|
20
5
|
ED25519_PUB_MULTICODEC,
|
|
@@ -25,11 +10,40 @@ import {
|
|
|
25
10
|
deriveChainIdentifier,
|
|
26
11
|
deriveContentId,
|
|
27
12
|
encodeEd25519Multikey,
|
|
13
|
+
signBeacon,
|
|
28
14
|
signContentOperation,
|
|
15
|
+
signCountersignature,
|
|
29
16
|
signIdentityOperation,
|
|
17
|
+
verifyBeacon,
|
|
18
|
+
verifyBeaconCountersignature,
|
|
30
19
|
verifyContentChain,
|
|
20
|
+
verifyCountersignature,
|
|
31
21
|
verifyIdentityChain
|
|
32
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-GEVJ3SEV.js";
|
|
23
|
+
import {
|
|
24
|
+
buildMerkleTree,
|
|
25
|
+
generateMerkleProof,
|
|
26
|
+
hashLeaf,
|
|
27
|
+
hexToBytes,
|
|
28
|
+
verifyMerkleProof
|
|
29
|
+
} from "./chunk-E5CFQG2B.js";
|
|
30
|
+
import {
|
|
31
|
+
AuthTokenClaims,
|
|
32
|
+
AuthTokenVerificationError,
|
|
33
|
+
ContentReadSubject,
|
|
34
|
+
ContentWriteSubject,
|
|
35
|
+
CredentialClaims,
|
|
36
|
+
CredentialVerificationError,
|
|
37
|
+
DFOSCredentialType,
|
|
38
|
+
VCClaim,
|
|
39
|
+
VC_TYPE_CONTENT_READ,
|
|
40
|
+
VC_TYPE_CONTENT_WRITE,
|
|
41
|
+
createAuthToken,
|
|
42
|
+
createCredential,
|
|
43
|
+
decodeCredentialUnsafe,
|
|
44
|
+
verifyAuthToken,
|
|
45
|
+
verifyCredential
|
|
46
|
+
} from "./chunk-CZSEEZLL.js";
|
|
33
47
|
import {
|
|
34
48
|
JwsVerificationError,
|
|
35
49
|
JwtVerificationError,
|
|
@@ -54,34 +68,35 @@ import {
|
|
|
54
68
|
verifyJwt
|
|
55
69
|
} from "./chunk-ZXXP5W5N.js";
|
|
56
70
|
export {
|
|
57
|
-
|
|
71
|
+
AuthTokenClaims,
|
|
72
|
+
AuthTokenVerificationError,
|
|
73
|
+
BeaconPayload,
|
|
58
74
|
ContentOperation,
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
ContentReadSubject,
|
|
76
|
+
ContentWriteSubject,
|
|
77
|
+
CredentialClaims,
|
|
78
|
+
CredentialVerificationError,
|
|
79
|
+
DFOSCredentialType,
|
|
61
80
|
ED25519_PRIV_MULTICODEC,
|
|
62
81
|
ED25519_PUB_MULTICODEC,
|
|
63
82
|
IdentityOperation,
|
|
64
|
-
IdentityOperationsParams,
|
|
65
|
-
IdentityOperationsResponse,
|
|
66
83
|
JwsVerificationError,
|
|
67
84
|
JwtVerificationError,
|
|
68
85
|
MultikeyPublicKey,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
ResolveOperationResponse,
|
|
73
|
-
SubmitContentChainRequest,
|
|
74
|
-
SubmitContentChainResponse,
|
|
75
|
-
SubmitIdentityChainRequest,
|
|
76
|
-
SubmitIdentityChainResponse,
|
|
86
|
+
VCClaim,
|
|
87
|
+
VC_TYPE_CONTENT_READ,
|
|
88
|
+
VC_TYPE_CONTENT_WRITE,
|
|
77
89
|
VerifiedIdentity,
|
|
78
90
|
base64urlDecode,
|
|
79
91
|
base64urlEncode,
|
|
92
|
+
buildMerkleTree,
|
|
93
|
+
createAuthToken,
|
|
94
|
+
createCredential,
|
|
80
95
|
createJws,
|
|
81
96
|
createJwt,
|
|
82
97
|
createNewEd25519Keypair,
|
|
83
|
-
createRegistryServer,
|
|
84
98
|
dagCborCanonicalEncode,
|
|
99
|
+
decodeCredentialUnsafe,
|
|
85
100
|
decodeJwsUnsafe,
|
|
86
101
|
decodeJwtUnsafe,
|
|
87
102
|
decodeMultikey,
|
|
@@ -90,17 +105,28 @@ export {
|
|
|
90
105
|
encodeEd25519Multikey,
|
|
91
106
|
generateId,
|
|
92
107
|
generateIdNoPrefix,
|
|
108
|
+
generateMerkleProof,
|
|
109
|
+
hashLeaf,
|
|
110
|
+
hexToBytes,
|
|
93
111
|
importEd25519Keypair,
|
|
94
112
|
isCanonicallyEqual,
|
|
95
113
|
isValidEd25519Signature,
|
|
96
114
|
isValidId,
|
|
97
115
|
normalizedId,
|
|
98
116
|
parseDagCborCID,
|
|
117
|
+
signBeacon,
|
|
99
118
|
signContentOperation,
|
|
119
|
+
signCountersignature,
|
|
100
120
|
signIdentityOperation,
|
|
101
121
|
signPayloadEd25519,
|
|
122
|
+
verifyAuthToken,
|
|
123
|
+
verifyBeacon,
|
|
124
|
+
verifyBeaconCountersignature,
|
|
102
125
|
verifyContentChain,
|
|
126
|
+
verifyCountersignature,
|
|
127
|
+
verifyCredential,
|
|
103
128
|
verifyIdentityChain,
|
|
104
129
|
verifyJws,
|
|
105
|
-
verifyJwt
|
|
130
|
+
verifyJwt,
|
|
131
|
+
verifyMerkleProof
|
|
106
132
|
};
|
|
@@ -0,0 +1,45 @@
|
|
|
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 };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Beacon: signed merkle root announcement with witness countersignature",
|
|
3
|
+
"type": "beacon",
|
|
4
|
+
"controllerJws": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmJlYWNvbiIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJjaWQiOiJiYWZ5cmVpaGhvbHV1aTdzN25zNzRpZW02YWhmeHNiNDcyaHdvZ2JxZDMyeXJycDVmenRjM2t4YTVxdSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiYmVhY29uIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsIm1lcmtsZVJvb3QiOiI3ZTgwZDQ3ODBmNDU0ZTBmY2EwYjA5MGQ4YzY0NmY1NzJiNDkzNTRmNTQxNTQ1MzE2MDYxMDVhYWQyZmRhMjhlIiwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowNTowMC4wMDBaIn0._1RgZpMv63-M3ZUeTNX679xkAeX3TY0PJ0ImH7422cKA7I88Hf8bBVQMVVhP3oNdvX7i7Q4se5EP3kk5aEuxDQ",
|
|
5
|
+
"witnessJws": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmJlYWNvbiIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X2V6OWE4NzR0Y2tyM2R2OTMzZDNja2QiLCJjaWQiOiJiYWZ5cmVpaGhvbHV1aTdzN25zNzRpZW02YWhmeHNiNDcyaHdvZ2JxZDMyeXJycDVmenRjM2t4YTVxdSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiYmVhY29uIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsIm1lcmtsZVJvb3QiOiI3ZTgwZDQ3ODBmNDU0ZTBmY2EwYjA5MGQ4YzY0NmY1NzJiNDkzNTRmNTQxNTQ1MzE2MDYxMDVhYWQyZmRhMjhlIiwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowNTowMC4wMDBaIn0.awA8ctmLHjJCHZcH0lav7HpadkIoGiG2WR-pCf-0XfPVi9dD8Z2at0E7iAnOUnVEc5VthBo-mMklSIJFK28IDw",
|
|
6
|
+
"controllerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
7
|
+
"witnessPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
|
|
8
|
+
"expected": {
|
|
9
|
+
"beaconCID": "bafyreihholuui7s7ns74iem6ahfxsb472hwogbqd32yrrp5fztc3kxa5qu",
|
|
10
|
+
"did": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
11
|
+
"merkleRoot": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
|
|
12
|
+
"createdAt": "2026-03-07T00:05:00.000Z"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Content chain: creator signs genesis, delegate signs update with write VC",
|
|
3
|
+
"type": "content-delegated",
|
|
4
|
+
"chain": [
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MTA6MDAuMDAwWiIsIm5vdGUiOm51bGx9.oanyS9rbkqrxd1j8T172jVG4ILKFwW2t1JhkQLxsFqHMMURqA5Hl-0GzGFrfSkQT02Nq5RMYXzhcToqbjoV8AQ",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpuemtmODM4ZWZyNDI0NDMzcm4ycnprI2tleV9hOHIyNzQzNGFhcjc2YWU3MmM4NzdmIiwiY2lkIjoiYmFmeXJlaWJtMjRmNjY3cGlsNHhiZ2M3emZhM3lvdXRkandya3B4YTJjbWQ3Zm50aWxhYWljMmRlNzQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlmbml5bmQ2aGV2NjQ2dW9hamFjM2VnYWs3cDJxZmhyaGhvNG1mbXBwYTNydGNqcGV0Z2RlIiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjExOjAwLjAwMFoiLCJub3RlIjoiZGVsZWdhdGVkIGVkaXQgYnkga2V5MyIsImF1dGhvcml6YXRpb24iOiJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SW5aaksycDNkQ0lzSW10cFpDSTZJbVJwWkRwa1ptOXpPbVV6ZG5aMFkyczBNbVEwWldGalpHNTZkblJ5YmpZamEyVjVYM0k1WlhZek5HWjJZekl6ZWprNU9YWmxZV0ZtZERnaWZRLmV5SnBjM01pT2lKa2FXUTZaR1p2Y3pwbE0zWjJkR05yTkRKa05HVmhZMlJ1ZW5aMGNtNDJJaXdpYzNWaUlqb2laR2xrT21SbWIzTTZibnByWmpnek9HVm1jalF5TkRRek0zSnVNbko2YXlJc0ltVjRjQ0k2TVRjNU9EYzJNVFl3TUN3aWFXRjBJam94TnpjeU9EUXhOakF3TENKMll5STZleUpBWTI5dWRHVjRkQ0k2V3lKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdmJuTXZZM0psWkdWdWRHbGhiSE12ZGpJaVhTd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWtSR1QxTkRiMjUwWlc1MFYzSnBkR1VpWFN3aVkzSmxaR1Z1ZEdsaGJGTjFZbXBsWTNRaU9uc2lZMjl1ZEdWdWRFbGtJam9pWVdNeU5ubzRlbXRyWlRZM2VqUTRZV1l6Y21ob09TSjlmWDAuZG5vN2lkcnVTMUZDVzl2ZEp5TjAyT1g0a05vcEh0RGlvRE5feHo3MzdBb2tmT1FZa0c3VHFzcXlmM3VPQ0p1MTRtZmhLbGNsb2RMT01LcVBGcGJNQkEifQ.8CiWJSk5Aw0OntAj_vxMawd4rDx42SwhlaPFpevthXVYqXLIOjEeyUO59YnbfQ4dSoz2PfEoRTrBnm4oXIPYAg"
|
|
7
|
+
],
|
|
8
|
+
"creatorPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
9
|
+
"delegatePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
10
|
+
"documents": [
|
|
11
|
+
{
|
|
12
|
+
"content": {
|
|
13
|
+
"$schema": "https://schemas.dfos.com/post/v1",
|
|
14
|
+
"format": "short-post",
|
|
15
|
+
"title": "Original Post",
|
|
16
|
+
"body": "Content created by the chain owner.",
|
|
17
|
+
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
|
|
18
|
+
},
|
|
19
|
+
"baseDocumentCID": null,
|
|
20
|
+
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
21
|
+
"createdAt": "2026-03-07T00:10:00.000Z"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"content": {
|
|
25
|
+
"$schema": "https://schemas.dfos.com/post/v1",
|
|
26
|
+
"format": "short-post",
|
|
27
|
+
"title": "Delegated Edit",
|
|
28
|
+
"body": "Content updated by an authorized delegate.",
|
|
29
|
+
"createdByDID": "did:dfos:nzkf838efr424433rn2rzk"
|
|
30
|
+
},
|
|
31
|
+
"baseDocumentCID": "bafyreign7gfuu54wo2geg3tf5tepeplblktahjfzqjpujizc7a2boeycca",
|
|
32
|
+
"createdByDID": "did:dfos:nzkf838efr424433rn2rzk",
|
|
33
|
+
"createdAt": "2026-03-07T00:11:00.000Z"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"authorization": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udGVudElkIjoiYWMyNno4emtrZTY3ejQ4YWYzcmhoOSJ9fX0.dno7idruS1FCW9vdJyN02OX4kNopHtDioDN_xz737AokfOQYkG7Tqsqyf3uOCJu14mfhKlclodLOMKqPFpbMBA",
|
|
37
|
+
"expected": {
|
|
38
|
+
"contentId": "ac26z8zkke67z48af3rhh9",
|
|
39
|
+
"creatorDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
40
|
+
"isDeleted": false,
|
|
41
|
+
"currentDocumentCID": "bafyreifniynd6hev646uoajac3egak7p2qfhrhho4mfmppa3rtcjpetgde",
|
|
42
|
+
"length": 2
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"description": "Content chain: create + delete",
|
|
3
3
|
"type": "content",
|
|
4
4
|
"chain": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWQydjUyN2lxMzZ2dnUyNWc3b3BjczJudjRjbmRhcWdrd29naHEzdHB3Z215cnBxZWVuZ2EifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoicmVtb3ZpbmcgY29udGVudCJ9.9DTnVeYjVV6Kc971etvWeNn9iMme7RnrRZRmYBO0iaYeePJDblL_p2uuEIuxtAQQp1bATpsQ475zpK6N2A0eAg"
|
|
7
7
|
],
|
|
8
8
|
"signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
|
|
9
9
|
"documents": [
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"$schema": "https://schemas.dfos.com/post/v1",
|
|
13
13
|
"format": "short-post",
|
|
14
14
|
"title": "Hello World",
|
|
15
|
-
"body": "First post on the protocol."
|
|
15
|
+
"body": "First post on the protocol.",
|
|
16
|
+
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
|
|
16
17
|
},
|
|
17
18
|
"baseDocumentCID": null,
|
|
18
19
|
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
}
|
|
21
22
|
],
|
|
22
23
|
"expected": {
|
|
23
|
-
"contentId": "
|
|
24
|
+
"contentId": "a82z92a3hndk6c97thcrn8",
|
|
24
25
|
"isDeleted": true,
|
|
25
26
|
"currentDocumentCID": null,
|
|
26
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
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
|
|
6
|
+
"eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWg2ZTVjYmppdHBvemh6aGdtZmt0bWlvaG14eW4zdWN3aHFkM21qaXhpenZ3bWxodjdobTQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlkaDdlMzZjdnd5M3V3NXlwaXRjcWs3dW9rdGJra2tqN2U2aHhoa3k0bzc1cnhuN2t4aWx1IiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.46H3WBKigCzUrIOvS2ekYJFdK1OeLhqvcZTj8FBqFNKO1ivs3oC0ui_hzTKkKO-8uevMjf9-k0GOjyw2u16PDA"
|
|
7
7
|
],
|
|
8
8
|
"signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
|
|
9
9
|
"documents": [
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"$schema": "https://schemas.dfos.com/post/v1",
|
|
13
13
|
"format": "short-post",
|
|
14
14
|
"title": "Hello World",
|
|
15
|
-
"body": "First post on the protocol."
|
|
15
|
+
"body": "First post on the protocol.",
|
|
16
|
+
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
|
|
16
17
|
},
|
|
17
18
|
"baseDocumentCID": null,
|
|
18
19
|
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
@@ -23,17 +24,18 @@
|
|
|
23
24
|
"$schema": "https://schemas.dfos.com/post/v1",
|
|
24
25
|
"format": "short-post",
|
|
25
26
|
"title": "Hello World (edited)",
|
|
26
|
-
"body": "Updated content."
|
|
27
|
+
"body": "Updated content.",
|
|
28
|
+
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
|
|
27
29
|
},
|
|
28
|
-
"baseDocumentCID": "
|
|
30
|
+
"baseDocumentCID": "bafyreihzwuoupfg3dxip6xmgzmxsywyii2jeoxxzbgx3zxm2in7knoi3g4",
|
|
29
31
|
"createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
30
32
|
"createdAt": "2026-03-07T00:03:00.000Z"
|
|
31
33
|
}
|
|
32
34
|
],
|
|
33
35
|
"expected": {
|
|
34
|
-
"contentId": "
|
|
36
|
+
"contentId": "a82z92a3hndk6c97thcrn8",
|
|
35
37
|
"isDeleted": false,
|
|
36
|
-
"currentDocumentCID": "
|
|
38
|
+
"currentDocumentCID": "bafyreidh7e36cvwy3uw5ypitcqk7uoktbkkkj7e6hxhky4o75rxn7kxilu",
|
|
37
39
|
"length": 2
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "VC-JWT: DFOSContentRead credential",
|
|
3
|
+
"type": "credential",
|
|
4
|
+
"credential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50UmVhZCJdLCJjcmVkZW50aWFsU3ViamVjdCI6e319fQ.zGC2aUOgqXlVwTxSFSa_6g_gGEDEtS5YMLfIJNyPC9hn5IcbHtHxET8MqOKmFfKm9xJgA8uyDv12sr_D3hF9DQ",
|
|
5
|
+
"issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
6
|
+
"subjectPublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
7
|
+
"expected": {
|
|
8
|
+
"iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
9
|
+
"sub": "did:dfos:nzkf838efr424433rn2rzk",
|
|
10
|
+
"vcType": "DFOSContentRead"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "VC-JWT: DFOSContentWrite credential (broad + narrowed)",
|
|
3
|
+
"type": "credential",
|
|
4
|
+
"broadCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnt9fX0.Oj0wl8jjzJtT7nluaTa3e9UgdDBnAYagTRs5ZnlW3Dvfxw8BUkEuZ2o_gu80QBl1cHUUxLwmc3-lToPPT7iMCQ",
|
|
5
|
+
"narrowCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udGVudElkIjoiYTgyejkyYTNobmRrNmM5N3RoY3JuOCJ9fX0.XecRGtsjHJbE5S2AxNLkfvnHof_t7gZRe_qrbBCLogvzPule51CWVWFsgJctgWu2jEPGiFxAedPOuuhXitSLBA",
|
|
6
|
+
"issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
|
|
7
|
+
"subjectPublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
|
|
8
|
+
"expected": {
|
|
9
|
+
"iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
|
|
10
|
+
"sub": "did:dfos:nzkf838efr424433rn2rzk",
|
|
11
|
+
"vcType": "DFOSContentWrite",
|
|
12
|
+
"narrowContentId": "a82z92a3hndk6c97thcrn8"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Merkle tree: 5 content IDs → sorted → leaf hashes → root, with inclusion proof for \"charlie\"",
|
|
3
|
+
"type": "merkle",
|
|
4
|
+
"contentIds": ["alpha", "bravo", "charlie", "delta", "echo"],
|
|
5
|
+
"expected": {
|
|
6
|
+
"sortedIds": ["alpha", "bravo", "charlie", "delta", "echo"],
|
|
7
|
+
"root": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
|
|
8
|
+
"leafCount": 5,
|
|
9
|
+
"charlieProof": {
|
|
10
|
+
"contentId": "charlie",
|
|
11
|
+
"root": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
|
|
12
|
+
"path": [
|
|
13
|
+
{
|
|
14
|
+
"hash": "4f4a9410ffcdf895c4adb880659e9b5c0dd1f23a30790684340b3eaacb045398",
|
|
15
|
+
"position": "right"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"hash": "90d39555bb3c223e12f5a375c3011d2462fe2e1e36b8416a0b623d5831a9b4f3",
|
|
19
|
+
"position": "left"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"hash": "092c79e8f80e559e404bcf660c48f3522b67aba9ff1484b0367e1a4ddef7431d",
|
|
23
|
+
"position": "right"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metalabel/dfos-protocol",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "DFOS Protocol — Ed25519 signed chain primitives,
|
|
5
|
+
"description": "DFOS Protocol — Ed25519 signed chain primitives, beacons, merkle trees, and verification",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Metalabel <hello@metalabel.com> (https://metalabel.com)",
|
|
8
8
|
"repository": {
|
|
@@ -37,9 +37,13 @@
|
|
|
37
37
|
"import": "./dist/chain/index.js",
|
|
38
38
|
"types": "./dist/chain/index.d.ts"
|
|
39
39
|
},
|
|
40
|
-
"./
|
|
41
|
-
"import": "./dist/
|
|
42
|
-
"types": "./dist/
|
|
40
|
+
"./merkle": {
|
|
41
|
+
"import": "./dist/merkle/index.js",
|
|
42
|
+
"types": "./dist/merkle/index.d.ts"
|
|
43
|
+
},
|
|
44
|
+
"./credentials": {
|
|
45
|
+
"import": "./dist/credentials/index.js",
|
|
46
|
+
"types": "./dist/credentials/index.d.ts"
|
|
43
47
|
}
|
|
44
48
|
},
|
|
45
49
|
"files": [
|
|
@@ -49,8 +53,6 @@
|
|
|
49
53
|
"PROTOCOL.md",
|
|
50
54
|
"DID-METHOD.md",
|
|
51
55
|
"CONTENT-MODEL.md",
|
|
52
|
-
"REGISTRY-API.md",
|
|
53
|
-
"openapi.yaml",
|
|
54
56
|
"LICENSE",
|
|
55
57
|
"README.md"
|
|
56
58
|
],
|
|
@@ -58,7 +60,6 @@
|
|
|
58
60
|
"@ipld/dag-cbor": "^9.2.5",
|
|
59
61
|
"@noble/curves": "^2.0.1",
|
|
60
62
|
"@noble/hashes": "^2.0.1",
|
|
61
|
-
"hono": "^4.12.3",
|
|
62
63
|
"multiformats": "^13.4.2",
|
|
63
64
|
"zod": "^4.3.6"
|
|
64
65
|
},
|
|
@@ -75,6 +76,6 @@
|
|
|
75
76
|
"clean": "rm -rf dist",
|
|
76
77
|
"typecheck": "tsc --noEmit",
|
|
77
78
|
"test": "vitest run",
|
|
78
|
-
"generate-examples": "
|
|
79
|
+
"generate-examples": "tsx scripts/generate-examples.ts"
|
|
79
80
|
}
|
|
80
81
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schemas.dfos.com/manifest/v1",
|
|
4
|
+
"title": "Manifest",
|
|
5
|
+
"description": "A manifest — a named map of protocol object references for semantic navigation. Keys are path-like labels. Values are protocol references: content chain identifiers (22-char bare hash), DIDs (did:dfos:...), or CIDs (bafyrei...). The document layer of the dark forest. Discovery is social or out-of-band.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["$schema", "entries"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": {
|
|
10
|
+
"const": "https://schemas.dfos.com/manifest/v1"
|
|
11
|
+
},
|
|
12
|
+
"entries": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"propertyNames": {
|
|
15
|
+
"pattern": "^[a-z0-9][a-z0-9._/-]*[a-z0-9]$",
|
|
16
|
+
"minLength": 2,
|
|
17
|
+
"maxLength": 128
|
|
18
|
+
},
|
|
19
|
+
"additionalProperties": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[a-z0-9][a-z0-9:._/-]*$",
|
|
22
|
+
"minLength": 1,
|
|
23
|
+
"maxLength": 512
|
|
24
|
+
},
|
|
25
|
+
"description": "Named entries mapping path-like keys to protocol object references (contentId, DID, or CID)."
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"additionalProperties": false
|
|
29
|
+
}
|
package/schemas/post.v1.json
CHANGED
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"type": "array",
|
|
36
36
|
"items": { "type": "string" },
|
|
37
37
|
"description": "Topic names this post belongs to. Stored as names for portability."
|
|
38
|
+
},
|
|
39
|
+
"createdByDID": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"pattern": "^did:",
|
|
42
|
+
"description": "DID of the identity that authored this content. Optional — omit when the signer IS the author."
|
|
38
43
|
}
|
|
39
44
|
},
|
|
40
45
|
"additionalProperties": false,
|
package/schemas/profile.v1.json
CHANGED
|
@@ -28,6 +28,11 @@
|
|
|
28
28
|
"background": {
|
|
29
29
|
"$ref": "#/$defs/media",
|
|
30
30
|
"description": "Background image."
|
|
31
|
+
},
|
|
32
|
+
"createdByDID": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"pattern": "^did:",
|
|
35
|
+
"description": "DID of the identity that authored this content. Optional — omit when the signer IS the author."
|
|
31
36
|
}
|
|
32
37
|
},
|
|
33
38
|
"additionalProperties": false,
|