Activity Anchors are based on a federated and replicated Verifiable Data Registry (VDR). The decentralized network consists of Activity Anchor Servers that write, monitor, witness, and propagate batches of document operations. The batches form a graph that is propagated and replicated between the servers as content-addressable objects. These content-addressable objects can be located via both domain and distributed hash table (DHT) mechanisms. Each Activity Anchor witness server observes a subset of batches in the graph and includes them in their ledgers (as append-only Merkle Tree logs). The servers coordinate by propagating batches of document operations and by monitoring the applicable witness servers' ledgers. The Activity Anchor servers form a decentralized network without reliance on a common blockchain for coordination.
This document specifies a data model and rules for representing a graph of batches, the anchor server API, an [[[ACTIVITYSTREAMS-CORE]]] vocabulary and an [[[ACTIVITYPUB]]] profile for propagating batches, and a [[[RFC7033]]] profile for discovering endpoints.
Our motivation for Activity Anchors is to enable many independent organizations to create Verifiable Data Registries (VDRs) that can become connected over time. In designing Activity Anchors, we have the goal to enable these VDRs to interconnect into a decentralized network without the need to choose a common public blockchain or to rely on special-purpose consortiums to form (and remain in operation). Activity Anchors enables a federated, replicated and scalable VDR based on a decentralized network for propagating, witnessing and replicating changes to documents.
An Activity Anchor Server exposes APIs for propagation, content-addressable storage, discovery, and witnessing.
An operation batch is represented as an AnchorEvent. Hashlinks [[HASHLINK]] are used to link objects to the AnchorEvent.
Hashlinks may refer to the contentObject within an AnchorObject. Prior to creating the hash in the Hashlink, the contents of the contentObject MUST be canoncialized using the JSON Canonicalization Scheme (JCS) [[RFC8785]]. The Hashlink refers to the canonicalized contents of the contentObject.
{ "@context": "https://w3id.org/activityanchors/v1", "object": { "linkset": [ { "anchor": "hl:uEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA", "author": "https://orb.domain2.com/services/orb", "original": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%22%2C%22author%22%3A%22https%3A%2F%2Forb.domain2.com%2Fservices%2Forb%22%2C%22item%22%3A%5B%7B%22href%22%3A%22did%3Aorb%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AEiBlWWTU5i71R2uOAq04RZlNC148RN44gRAzSU9t4_hVGg%22%2C%22previous%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiAPvYn4qoOwAQLjtBqur563OgicWQaH4lB1RMh9oEER0Q%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiCQGgEaHyhghhRIsT4hav8GMwRl-EuyGP_DMULTNTfZUg%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiA4SRtKtlBGm-VS78mtZEiAOBysN_ra8zv66Gnw_uJw4A%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%5D%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%7D%5D%7D", "type": "application/linkset+json" } ], "profile": "https://w3id.org/orb#v0", "related": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%2C%22up%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWRwd3FwY3AyMnlsbWV3engzb3ZvaGVtcHVvYjc0cHFvYjZlNGVzbDNoY3F2eGZqdzVvb2E%22%7D%2C%7B%22href%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWFndGlraDNmcGh3Y3I0YnJjd2R0cTZsdXgybHk2YWZkdmR4dXA3dHJzNTJicXQzN3l3c3E%22%7D%5D%2C%22via%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWNlbWQ1azRua3l5bHc3ZWhueXJlbzY2bnY2eHd4YXVqNDc0ZHVkc3Vha3NicXc3cW56Nm0%22%7D%5D%7D%5D%7D", "type": "application/linkset+json" } ], "replies": [ { "href": "data:application/json,%7B%22%40context%22%3A%5B%22https%3A%2F%2Fwww.w3.org%2F2018%2Fcredentials%2Fv1%22%2C%22https%3A%2F%2Fw3id.org%2Fsecurity%2Fsuites%2Fed25519-2020%2Fv1%22%5D%2C%22credentialSubject%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22id%22%3A%22https%3A%2F%2Forb.domain2.com%2Fvc%2F36c995be-99bb-4d0b-9a47-7027aee67bfe%22%2C%22issuanceDate%22%3A%222022-03-17T19%3A50%3A48.7559537Z%22%2C%22issuer%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proof%22%3A%5B%7B%22created%22%3A%222022-03-17T19%3A50%3A48.7567186Z%22%2C%22domain%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22_nOavU_Te7QCyj6GIxGtnER-SWvawrUygcqt-3HyV_3P_LahVxxZmuNtOdPtrRTI4aZJUM6NmUMq_7gxX5ZFDw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain2.com%23orb2key%22%7D%2C%7B%22created%22%3A%222022-03-17T19%3A50%3A49.245Z%22%2C%22domain%22%3A%22http%3A%2F%2Forb.vct%3A8077%2Fmaple2020%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22bzvRXEWAcskOjz6WgUDDos3e9SiS2DfwmRAwHeuO3rBc0vmbSF6DiVyqeNUc_cSQ8OBYasSiTnWZaJmaEHRVBw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain1.com%23orb1key2%22%7D%5D%2C%22type%22%3A%22VerifiableCredential%22%7D", "type": "application/ld+json" } ] } ] }, "type": "AnchorEvent", "url": "hl:uEiA-eY77-FHYKR5EyMZc3JIwJIowz3dl91oY-14Wxi3STg:uoQ-BeEJpcGZzOi8vYmFma3JlaWI2cGdocHg2Y3IzYXVyNHJnaXl6b256ZXJxZXNmZGJ0M3hteDN2dWdoM2x5bG1tbG9zank" }
hl:uEiAsiwjaXOYDmOHxmvDl3Mx0TfJ0uCar5YXqumjFJUNIBg:uoQ-CeEdodHRwczovL2V4YW1wbGUuY29tL2Nhcy91RWlBc2l3amFYT1lEbU9IeG12RGwzTXgwVGZKMHVDYXI1WVhxdW1qRkpVTklCZ3hCaXBmczovL2JhZmtyZWlibXJtZW51eGhnYW9tb2Q0bTI2ZHM1enRkdWp4emhqb2JndnBzeWwydjJuZGNza3EyaWF5",
The example hashlink includes links to `https://example.com/cas/uEiAsiwjaXOYDmOHxmvDl3Mx0TfJ0uCar5YXqumjFJUNIBg` and `ipfs://bafkreibmrmenuxhgaomod4m26ds5ztdujxzhjobgvpsyl2v2ndcskq2iay` to demonstrate that multiple sources and protocols can be used for each object.
TODO: Complete the description of anchor events.
A witnessed operation batch is represented as a VerifiableCredential. The credentialSubject contains the hash of the witnessed object. The Verifiable Credential is referenced in the AnchorEvent replies property.
{ "@context": [ "https://www.w3.org/2018/credentials/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "credentialSubject": "hl:uEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA", "id": "https://orb.domain2.com/vc/36c995be-99bb-4d0b-9a47-7027aee67bfe", "issuanceDate": "2022-03-17T19:50:48.7559537Z", "issuer": "https://orb.domain2.com", "proof": [ { "created": "2022-03-17T19:50:48.7567186Z", "domain": "https://orb.domain2.com", "proofPurpose": "assertionMethod", "proofValue": "_nOavU_Te7QCyj6GIxGtnER-SWvawrUygcqt-3HyV_3P_LahVxxZmuNtOdPtrRTI4aZJUM6NmUMq_7gxX5ZFDw", "type": "Ed25519Signature2020", "verificationMethod": "did:web:orb.domain2.com#orb2key" }, { "created": "2022-03-17T19:50:49.245Z", "domain": "http://orb.vct:8077/maple2020", "proofPurpose": "assertionMethod", "proofValue": "bzvRXEWAcskOjz6WgUDDos3e9SiS2DfwmRAwHeuO3rBc0vmbSF6DiVyqeNUc_cSQ8OBYasSiTnWZaJmaEHRVBw", "type": "Ed25519Signature2020", "verificationMethod": "did:web:orb.domain1.com#orb1key2" } ], "type": "VerifiableCredential" }
This section defines a minimal profile of [[ACTIVITYPUB]] that Activity Anchor Servers implement to participate in propagation flows.
An Actor exposed by an Activity Anchor Server is capable of participating in propagation flows. ActivityPub endpoints are retrieved by performing an HTTP GET to the Actor endpoint. The Actor endpoint returns an Actor object.
GET /services/anchor HTTP/1.1 Host: alice.example.com Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate
When the service profile exists, an HTTP 200 status code is returned.
HTTP/1.1 200 OK Date: Wed, 27 Jan 2021 21:57:25 GMT Content-Type: application/jrd+json; charset=utf-8 Connection: keep-alive Access-Control-Allow-Origin: * { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", "https://w3id.org/activityanchors/v1" ], "id": "https://alice.example.com/services/anchor", "type": "Service", "publicKey": { "id": "https://alice.example.com/services/anchor#main-key", "owner": "https://alice.example.com/services/anchor", "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....." }, "inbox": "https://alice.example.com/services/anchor/inbox", "outbox": "https://alice.example.com/services/anchor/outbox", "followers": "https://alice.example.com/services/anchor/followers", "following": "https://alice.example.com/services/anchor/following", "witnesses": "https://alice.example.com/services/anchor/witnesses", "witnessing": "https://alice.example.com/services/anchor/witnessing", "likes": "https://alice.example.com/services/anchor/likes", "liked": "https://alice.example.com/services/anchor/liked", "shares": "https://alice.example.com/services/anchor/shares" }
TODO: Review handling of publicKey.
Activity Anchor Servers use ActivityPub Delivery mechanisms to propagate anchor activitys and to request to follow other servers. A propagation or follow request is sent by performing an HTTP POST of an activity to an Activity Anchor Server's ActivityPub inbox endpoint.
Activity Anchor Servers use HTTP Signatures [[HTTP-SIGNATURES]] when calling Server-to-Server APIs to create authenticated messages. The anchor objects are additionally signed using JSON-LD proofs [[LDPROOF]] from both the Writer server as well as Witness servers.
Please refer to [[ACTIVITYPUB]] section 5 for general collections guidance. An Activity Anchor Server exposes:
An Activity Anchor Server that creates a anchor activity uses an Create activity to propagate that knowledge to its own followers. A anchor activity is propagated to another Activity Anchor Server by performing an HTTP POST of an Create activity containing an AnchorCredential to its ActivityPub inbox endpoint.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain2.com/services/orb", "id": "https://orb.domain2.com/services/orb/activities/33762e97-3826-4b24-86ac-91356ca75299", "object": { "@context": "https://w3id.org/activityanchors/v1", "object": { "linkset": [ { "anchor": "hl:uEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA", "author": "https://orb.domain2.com/services/orb", "original": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%22%2C%22author%22%3A%22https%3A%2F%2Forb.domain2.com%2Fservices%2Forb%22%2C%22item%22%3A%5B%7B%22href%22%3A%22did%3Aorb%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AEiBlWWTU5i71R2uOAq04RZlNC148RN44gRAzSU9t4_hVGg%22%2C%22previous%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiAPvYn4qoOwAQLjtBqur563OgicWQaH4lB1RMh9oEER0Q%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiCQGgEaHyhghhRIsT4hav8GMwRl-EuyGP_DMULTNTfZUg%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiA4SRtKtlBGm-VS78mtZEiAOBysN_ra8zv66Gnw_uJw4A%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%5D%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%7D%5D%7D", "type": "application/linkset+json" } ], "profile": "https://w3id.org/orb#v0", "related": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%2C%22up%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWRwd3FwY3AyMnlsbWV3engzb3ZvaGVtcHVvYjc0cHFvYjZlNGVzbDNoY3F2eGZqdzVvb2E%22%7D%2C%7B%22href%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWFndGlraDNmcGh3Y3I0YnJjd2R0cTZsdXgybHk2YWZkdmR4dXA3dHJzNTJicXQzN3l3c3E%22%7D%5D%2C%22via%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWNlbWQ1azRua3l5bHc3ZWhueXJlbzY2bnY2eHd4YXVqNDc0ZHVkc3Vha3NicXc3cW56Nm0%22%7D%5D%7D%5D%7D", "type": "application/linkset+json" } ], "replies": [ { "href": "data:application/json,%7B%22%40context%22%3A%5B%22https%3A%2F%2Fwww.w3.org%2F2018%2Fcredentials%2Fv1%22%2C%22https%3A%2F%2Fw3id.org%2Fsecurity%2Fsuites%2Fed25519-2020%2Fv1%22%5D%2C%22credentialSubject%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22id%22%3A%22https%3A%2F%2Forb.domain2.com%2Fvc%2F36c995be-99bb-4d0b-9a47-7027aee67bfe%22%2C%22issuanceDate%22%3A%222022-03-17T19%3A50%3A48.7559537Z%22%2C%22issuer%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proof%22%3A%5B%7B%22created%22%3A%222022-03-17T19%3A50%3A48.7567186Z%22%2C%22domain%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22_nOavU_Te7QCyj6GIxGtnER-SWvawrUygcqt-3HyV_3P_LahVxxZmuNtOdPtrRTI4aZJUM6NmUMq_7gxX5ZFDw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain2.com%23orb2key%22%7D%2C%7B%22created%22%3A%222022-03-17T19%3A50%3A49.245Z%22%2C%22domain%22%3A%22http%3A%2F%2Forb.vct%3A8077%2Fmaple2020%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22bzvRXEWAcskOjz6WgUDDos3e9SiS2DfwmRAwHeuO3rBc0vmbSF6DiVyqeNUc_cSQ8OBYasSiTnWZaJmaEHRVBw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain1.com%23orb1key2%22%7D%5D%2C%22type%22%3A%22VerifiableCredential%22%7D", "type": "application/ld+json" } ] } ] }, "type": "AnchorEvent", "url": "hl:uEiA-eY77-FHYKR5EyMZc3JIwJIowz3dl91oY-14Wxi3STg:uoQ-BeEJpcGZzOi8vYmFma3JlaWI2cGdocHg2Y3IzYXVyNHJnaXl6b256ZXJxZXNmZGJ0M3hteDN2dWdoM2x5bG1tbG9zank" }, "published": "2022-03-17T19:50:51.0429926Z", "to": [ "https://orb.domain2.com/services/orb/followers", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Create" }
On success, HTTP status code 200 is returned.
An Activity Anchor Server that learns about a new anchor activity that was created by another Activity Anchor Server uses an Announce activity to gossip that knowledge to its own followers. A anchor activity is forwarded to another Activity Anchor Server by performing an HTTP POST of an Announce activity containing an AnchorCredential to its ActivityPub inbox endpoint.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain1.com/services/orb", "id": "https://orb.domain1.com/services/orb/activities/f6679be1-6f36-44a4-aae3-b865c73db8ef", "object": { "items": [ { "@context": "https://w3id.org/activityanchors/v1", "type": "AnchorEvent", "url": "hl:uEiA-eY77-FHYKR5EyMZc3JIwJIowz3dl91oY-14Wxi3STg:uoQ-BeEJpcGZzOi8vYmFma3JlaWI2cGdocHg2Y3IzYXVyNHJnaXl6b256ZXJxZXNmZGJ0M3hteDN2dWdoM2x5bG1tbG9zank" } ], "totalItems": 1, "type": "Collection" }, "published": "2022-03-17T19:50:52.0966142Z", "to": [ "https://orb.domain1.com/services/orb/followers", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Announce" }
On success, HTTP status code 200 is returned.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain1.com/services/orb", "id": "https://orb.domain1.com/services/orb/activities/f6679be1-6f36-44a4-aae3-b865c73db8ef", "object": { "items": [ { "@context": "https://w3id.org/activityanchors/v1", "object": { "linkset": [ { "anchor": "hl:uEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA", "author": "https://orb.domain2.com/services/orb", "original": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%22%2C%22author%22%3A%22https%3A%2F%2Forb.domain2.com%2Fservices%2Forb%22%2C%22item%22%3A%5B%7B%22href%22%3A%22did%3Aorb%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AEiBlWWTU5i71R2uOAq04RZlNC148RN44gRAzSU9t4_hVGg%22%2C%22previous%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiAPvYn4qoOwAQLjtBqur563OgicWQaH4lB1RMh9oEER0Q%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiCQGgEaHyhghhRIsT4hav8GMwRl-EuyGP_DMULTNTfZUg%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AEiA4SRtKtlBGm-VS78mtZEiAOBysN_ra8zv66Gnw_uJw4A%22%2C%22previous%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%22%7D%5D%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%7D%5D%7D", "type": "application/linkset+json" } ], "profile": "https://w3id.org/orb#v0", "related": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%2C%22up%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBvtB4n61hbCWzfbquORj6OD_j4OD4nCSXs4oVuVNuucA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWRwd3FwY3AyMnlsbWV3engzb3ZvaGVtcHVvYjc0cHFvYjZlNGVzbDNoY3F2eGZqdzVvb2E%22%7D%2C%7B%22href%22%3A%22hl%3AuEiAGmhR9leewo8DEVhzh5dL6XjwCjqO9H_nGXdBhPf8WlA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWFndGlraDNmcGh3Y3I0YnJjd2R0cTZsdXgybHk2YWZkdmR4dXA3dHJzNTJicXQzN3l3c3E%22%7D%5D%2C%22via%22%3A%5B%7B%22href%22%3A%22hl%3AuEiBEYPquNVjC7fIduIkd7za-va4KJ5_g6DlQCpBhb8G58w%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWNlbWQ1azRua3l5bHc3ZWhueXJlbzY2bnY2eHd4YXVqNDc0ZHVkc3Vha3NicXc3cW56Nm0%22%7D%5D%7D%5D%7D", "type": "application/linkset+json" } ], "replies": [ { "href": "data:application/json,%7B%22%40context%22%3A%5B%22https%3A%2F%2Fwww.w3.org%2F2018%2Fcredentials%2Fv1%22%2C%22https%3A%2F%2Fw3id.org%2Fsecurity%2Fsuites%2Fed25519-2020%2Fv1%22%5D%2C%22credentialSubject%22%3A%22hl%3AuEiB9Chtelm2NlC00j8_I0Febv5Lre3Qsp-ElzpYPeO2HhA%22%2C%22id%22%3A%22https%3A%2F%2Forb.domain2.com%2Fvc%2F36c995be-99bb-4d0b-9a47-7027aee67bfe%22%2C%22issuanceDate%22%3A%222022-03-17T19%3A50%3A48.7559537Z%22%2C%22issuer%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proof%22%3A%5B%7B%22created%22%3A%222022-03-17T19%3A50%3A48.7567186Z%22%2C%22domain%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22_nOavU_Te7QCyj6GIxGtnER-SWvawrUygcqt-3HyV_3P_LahVxxZmuNtOdPtrRTI4aZJUM6NmUMq_7gxX5ZFDw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain2.com%23orb2key%22%7D%2C%7B%22created%22%3A%222022-03-17T19%3A50%3A49.245Z%22%2C%22domain%22%3A%22http%3A%2F%2Forb.vct%3A8077%2Fmaple2020%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22bzvRXEWAcskOjz6WgUDDos3e9SiS2DfwmRAwHeuO3rBc0vmbSF6DiVyqeNUc_cSQ8OBYasSiTnWZaJmaEHRVBw%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain1.com%23orb1key2%22%7D%5D%2C%22type%22%3A%22VerifiableCredential%22%7D", "type": "application/ld+json" } ] } ] }, "type": "AnchorEvent", "url": "hl:uEiA-eY77-FHYKR5EyMZc3JIwJIowz3dl91oY-14Wxi3STg:uoQ-BeEJpcGZzOi8vYmFma3JlaWI2cGdocHg2Y3IzYXVyNHJnaXl6b256ZXJxZXNmZGJ0M3hteDN2dWdoM2x5bG1tbG9zank" } ], "totalItems": 1, "type": "Collection" }, "published": "2022-03-17T19:50:52.0966142Z", "to": [ "https://orb.domain1.com/services/orb/followers", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Announce" }
On success, HTTP status code 200 is returned.
An Activity Anchor Server requests to follow another Activity Anchor Server by performing an HTTP POST of a Follow activity to its ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://sally.example.com/activities/9052018f-9530-4aef-8a46-40bde9445a25", "type": "Follow", "to": "https://alice.example.com/services/anchor", "actor": "https://sally.example.com/services/anchor", "object": "https://alice.example.com/services/anchor" }
On success, HTTP status code 200 is returned.
An Activity Anchor Server accepts a Follow request by sending an HTTP POST of a Accept activity to the requesting Activity Anchor Server's ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://alice.example.com/activities/e017e49a-6256-44a0-855d-5dc304ae67f7", "to": "https://sally.example.com/services/anchor", "type": "Accept", "actor": "https://alice.example.com/services/anchor", "object": { "id": "https://sally.example.com/activities/9052018f-9530-4aef-8a46-40bde9445a25", "to": "https://alice.example.com/services/anchor", "type": "Follow", "actor": "https://sally.example.com/services/anchor", "object": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server rejects a Follow request by sending an HTTP POST of a Reject activity to the requesting Activity Anchor Server's ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://alice.example.com/activities/e017e49a-6256-44a0-855d-5dc304ae67f7", "to": "https://sally.example.com/services/anchor", "type": "Reject", "actor": "https://alice.example.com/services/anchor", "object": { "id": "https://sally.example.com/activities/9052018f-9530-4aef-8a46-40bde9445a25", "to": "https://alice.example.com/services/anchor", "type": "Follow", "actor": "https://sally.example.com/services/anchor", "object": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server requests to stop following by sending an HTTP POST of a Undo activity to an Activity Anchor Server's ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://sally.example.com/activities/e017e49a-6256-44a0-855d-5dc304ae67f7", "to": "https://alice.example.com/services/anchor", "type": "Undo", "actor": "https://sally.example.com/services/anchor", "object": { "id": "https://sally.example.com/activities/9052018f-9530-4aef-8a46-40bde9445a25", "to": "https://alice.example.com/services/anchor", "type": "Follow", "actor": "https://sally.example.com/services/anchor", "object": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server MAY notify other actors that it has successfully processed an anchor event using the Like activity. In particular, it is useful for the originator of the anchor to discover other actors that are processing the events it is producing. Processing an anchor event MAY also result in the creation of an additional reference to the anchor event due to replication. The result property MAY be included to allow other actors to discover the additional anchor reference. Note: the new anchor reference MAY contain multiple links to the anchor event (representing multiple replication sources).
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://example.domain2.com/services/example", "id": "https://example.domain2.com/services/example/activities/7499c22a-e6b1-4b6c-baff-a555872239b4", "object": { "@context": "https://w3id.org/activityanchors/v1", "type": "AnchorEvent", "url": "hl:uEiB14RklxzqmoiOpQ7KAoQQukw4rIjXhycqZbeqNBq8ecg:uoQ-CeEtodHRwczovL29yYi5kb21haW4xLmNvbS9jYXMvdUVpQjE0UmtseHpxbW9pT3BRN0tBb1FRdWt3NHJJalhoeWNxWmJlcU5CcThlY2d4QmlwZnM6Ly9iYWZrcmVpZHY0ZW1zbHJ6MnUycmNoa2tkd2tha2NiYm9zbWhjd2lydjRoZTR2Z2xuNWtncW5seTZvaQ" }, "published": "2021-11-12T19:35:18.9545239Z", "result": { "@context": "https://w3id.org/activityanchors/v1", "type": "AnchorEvent", "url": "hl:uEiB14RklxzqmoiOpQ7KAoQQukw4rIjXhycqZbeqNBq8ecg:uoQ-BeEtodHRwczovL29yYi5kb21haW4yLmNvbS9jYXMvdUVpQjE0UmtseHpxbW9pT3BRN0tBb1FRdWt3NHJJalhoeWNxWmJlcU5CcThlY2c" }, "to": [ "https://example.domain1.com/services/example", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Like" }
On success, HTTP status code 200 is returned.
An Activity Anchor Server MAY notify other actors that it no longer uses an anchor (or stops replicating the anchor) that it previously liked. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/activityanchors/v1" ], "id": "https://sally.example.com/activities/e017e49a-6256-44a0-855d-5dc304ae67f7", "to": [ "https://alice.example.com/services/anchor", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Undo", "actor": "https://sally.example.com/services/anchor", "object": { "id": "https://sally.example.com/services/anchor/activities/d2f4b508-021c-48a2-ad08-8949970366b2", "type": "Like", "actor": "https://sally.example.com/services/anchor", "to": [ "https://alice.example.com/services/anchor", "https://www.w3.org/ns/activitystreams#Public" ], "published": "2021-01-27T09:30:10Z", "object": { "type": "AnchorEvent", "url": "hl:uEiCsFp-ft8tI1DFGbXs78tw-HS561mMPa3Z6GsGAHElrNQ:uoQ-CeE1odHRwczovL3NhbGx5LmV4YW1wbGUuY29tL2Nhcy91RWlDc0ZwLWZ0OHRJMURGR2JYczc4dHctSFM1NjFtTVBhM1o2R3NHQUhFbHJOUXhCaXBmczovL2JhZmtyZWlmbWMycHo3bjZsamRrZGNydG5wbTU3ZnhiNmR1eGh2dnRkYjV2eG02cTJ5Z2FieXNsbGd1" }, "result": { "type": "AnchorEvent", "url": "hl:uEiCsFp-ft8tI1DFGbXs78tw-HS561mMPa3Z6GsGAHElrNQ:uoQ-BeDhodHRwczovL2V4YW1wbGUuY29tL2NmMTQ5YTY4LTA4NTYtNDMwNC1hOWVjLTM0NzU2NzU1NDE2Yw" } } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server invites another Activity Anchor Server to be a witness by performing an HTTP POST of an Invite activity containing a witnesses object to its ActivityPub inbox endpoint.
POST /services/anchor/inbox HTTP/1.1 Host: alice.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/activityanchors/v1" ], "id": "https://sally.example.com/activities/7052018f-9530-3aef-8a46-20bde9445a21", "to": "https://alice.example.com/services/anchor", "type": "Invite", "actor": "https://sally.example.com/services/anchor", "object": "https://w3id.org/activityanchors#AnchorWitness", "target": "https://alice.example.com/services/anchor" }
On success, HTTP status code 200 is returned.
An Activity Anchor Server accepts an Invite Witness request by sending an HTTP POST of a Accept activity to the requesting Activity Anchor Server's ActivityPub inbox endpoint. Upon receiving this activity, the requesting Activity Anchor Server adds the actor to its collection of 'witnesses'. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/activityanchors/v1" ], "id": "https://alice.example.com/activities/f017e49a-7256-44a0-255d-3dc304ae67f7", "to": "https://sally.example.com/services/anchor", "type": "Accept", "actor": "https://alice.example.com/services/anchor", "object": { "type": "Invite", "id": "https://sally.example.com/activities/7052018f-9530-3aef-8a46-20bde9445a21", "actor": "https://sally.example.com/services/anchor", "object": "https://w3id.org/activityanchors#AnchorWitness", "target": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server rejects an Invite Witness request by sending an HTTP POST of a Reject activity to the requesting Activity Anchor Server's ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/activityanchors/v1" ], "id": "https://alice.example.com/activities/b013e49a-6256-24a0-855d-1dc304ar67f7", "to": "https://sally.example.com/services/anchor", "type": "Reject", "actor": "https://alice.example.com/services/anchor", "object": { "type": "Invite", "id": "https://sally.example.com/activities/7052018f-9530-3aef-8a46-20bde9445a21", "actor": "https://sally.example.com/services/anchor", "object": "https://w3id.org/activityanchors#AnchorWitness", "target": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server notifies a Witness that they have been removed by sending an HTTP POST of a Undo activity to an Activity Anchor Server's ActivityPub inbox endpoint. Refer to ActivityPub for guidance.
POST /services/anchor/inbox HTTP/1.1 Host: sally.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/activityanchors/v1" ], "id": "https://sally.example.com/activities/b013e49a-6256-24a0-855d-1dc304ar67f7", "to": "https://alice.example.com/services/anchor", "type": "Undo", "actor": "https://sally.example.com/services/anchor", "object": { "type": "Invite", "id": "https://sally.example.com/activities/7052018f-9530-3aef-8a46-20bde9445a21", "actor": "https://sally.example.com/services/anchor", "object": "https://w3id.org/activityanchors#AnchorWitness", "target": "https://alice.example.com/services/anchor" } }
On success, HTTP status code 200 is returned.
An Activity Anchor Server sends a preannouncement of an anchor using an Offer activity populated with an AnchorCredential. The AnchorCredential contains a Linked Data Proof from the activity server. The Offer activity also includes a startTime and endTime indicating the time period where the Activity Anchor Server will accept linked data proofs for inclusion into the anchor activity. The startTime is the current timestamp for the Activity Anchor Server. The endTime is the cut-off timestamp for inclusion into the activity.
POST /services/anchor/inbox HTTP/1.1 Host: witness1.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain2.com/services/orb", "endTime": "2022-03-17T20:01:40.3993939Z", "id": "https://orb.domain2.com/services/orb/activities/575e71af-908d-4624-9c0e-f3ccb499a834", "object": { "linkset": [ { "anchor": "hl:uEiDfqRoVGvXNZFsk_bn3YXl5Fkvm3PTz0x74F_jiJyhmRg", "author": "https://orb.domain2.com/services/orb", "original": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiDs8R1BpGCi2fyhGoqUp63MWQ-xTDBDHEsKBl_Z1JDdLA%22%2C%22author%22%3A%22https%3A%2F%2Forb.domain2.com%2Fservices%2Forb%22%2C%22item%22%3A%5B%7B%22href%22%3A%22did%3Aorb%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%3AEiAEEAHzgqgAZnsStD_M-CUAeMOoyKu-6sCFQeUuIJ2Z-A%22%2C%22previous%22%3A%22hl%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%3AEiAOgbNe-wswfrOr8M27BTmNN9gyXuD1oX7DAgUkbg34hw%22%2C%22previous%22%3A%22hl%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiBp-sz4eQW13Ph8s00_RwoBVVGANtgAxlWHxx9eUKPaPw%3AEiC1O3WET-i2kokYfXU-5pRhmR48S2mK-AfbaP0pzOuHGQ%22%2C%22previous%22%3A%22hl%3AuEiBp-sz4eQW13Ph8s00_RwoBVVGANtgAxlWHxx9eUKPaPw%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiCRVwZ72b_Y4LrItUo_K7yBkORUphc4H5YEnM9CiI1-ew%3AEiBZeAuEMDD-Nq1VZoD3UviF6q3nk0cDkT8twzyPs38FAA%22%2C%22previous%22%3A%22hl%3AuEiCRVwZ72b_Y4LrItUo_K7yBkORUphc4H5YEnM9CiI1-ew%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiAs8Y9cJFhzhoxgvJbvrOuD0vhBoOvtEHZYNWkGxxwQBA%3AEiD4tf0lLUtFDiTVhltCcV_IHQDGXreeNj1JX0yd8j5UNQ%22%2C%22previous%22%3A%22hl%3AuEiAs8Y9cJFhzhoxgvJbvrOuD0vhBoOvtEHZYNWkGxxwQBA%22%7D%2C%7B%22href%22%3A%22did%3Aorb%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%3AEiAYzrOSgdO73oNIZp6U_lbdXJh4Dp1rifzwF0JWPnXZdw%22%2C%22previous%22%3A%22hl%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%22%7D%5D%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%7D%5D%7D", "type": "application/linkset+json" } ], "profile": "https://w3id.org/orb#v0", "related": [ { "href": "data:application/json,%7B%22linkset%22%3A%5B%7B%22anchor%22%3A%22hl%3AuEiDfqRoVGvXNZFsk_bn3YXl5Fkvm3PTz0x74F_jiJyhmRg%22%2C%22profile%22%3A%22https%3A%2F%2Fw3id.org%2Forb%23v0%22%2C%22up%22%3A%5B%7B%22href%22%3A%22hl%3AuEiDVhc3Qc0pRNBWXu_WxKTrlgDkf7IENAeRY-8g5NQpD9g%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWd2cXhnNWE0MmtrZTJibGY1MzZ3eXNzb3hmcWE0cjczZWJidWE2aXdoM3phNHRrY3NkNnk%22%7D%2C%7B%22href%22%3A%22hl%3AuEiBp-sz4eQW13Ph8s00_RwoBVVGANtgAxlWHxx9eUKPaPw%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWRqN2xncHE2aWZ3eG9wcTdmdGp1N3VvY3Fia3ZpeWFud3lhZGRmbGI2aGQ1cGZiaTYyaDQ%22%7D%2C%7B%22href%22%3A%22hl%3AuEiCRVwZ72b_Y4LrItUo_K7yBkORUphc4H5YEnM9CiI1-ew%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWVyazRkaHh3bjczZHFsdnNmdmppN3N4cGVic2RzZmpqcXhoYXB6bWJlNHo1YmlyZGw2cG0%22%7D%2C%7B%22href%22%3A%22hl%3AuEiAs8Y9cJFhzhoxgvJbvrOuD0vhBoOvtEHZYNWkGxxwQBA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWJtNmdodnlqY3lvb2RpeXlmNHMzeDJ6MjRkMmw0ZWRpaGw1dWlobXdidm5lZG1vaGFxYXE%22%7D%5D%2C%22via%22%3A%5B%7B%22href%22%3A%22hl%3AuEiDs8R1BpGCi2fyhGoqUp63MWQ-xTDBDHEsKBl_Z1JDdLA%3AuoQ-BeEJpcGZzOi8vYmFma3JlaWhtNmVvdWRqZGF1bG03emlpMnJra2twbG9tbGVoM2N0YnFpbW9ld2NxZ2w3bTVqZWc1ZnE%22%7D%5D%7D%5D%7D", "type": "application/linkset+json" } ], "replies": [ { "href": "data:application/json,%7B%22%40context%22%3A%5B%22https%3A%2F%2Fwww.w3.org%2F2018%2Fcredentials%2Fv1%22%2C%22https%3A%2F%2Fw3id.org%2Fsecurity%2Fsuites%2Fed25519-2020%2Fv1%22%5D%2C%22credentialSubject%22%3A%22hl%3AuEiDfqRoVGvXNZFsk_bn3YXl5Fkvm3PTz0x74F_jiJyhmRg%22%2C%22id%22%3A%22https%3A%2F%2Forb.domain2.com%2Fvc%2F1e1d0577-f1d7-4468-8368-d02ed06ac4ad%22%2C%22issuanceDate%22%3A%222022-03-17T19%3A51%3A40.0860918Z%22%2C%22issuer%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proof%22%3A%7B%22created%22%3A%222022-03-17T19%3A51%3A40.0865179Z%22%2C%22domain%22%3A%22https%3A%2F%2Forb.domain2.com%22%2C%22proofPurpose%22%3A%22assertionMethod%22%2C%22proofValue%22%3A%22HwbTeCLK9IBovC_Oyp1l3BKZFT5h9tpwWIgC1f216aYI22hLM5EsKuJq1J2dsRtFakxXtwVKG4j2_XeVy0IJCA%22%2C%22type%22%3A%22Ed25519Signature2020%22%2C%22verificationMethod%22%3A%22did%3Aweb%3Aorb.domain2.com%23orb2key%22%7D%2C%22type%22%3A%22VerifiableCredential%22%7D", "type": "application/ld+json" } ] } ] }, "startTime": "2022-03-17T19:51:40.3993939Z", "target": "https://w3id.org/activityanchors#AnchorWitness", "to": [ "https://orb.domain1.com/services/orb", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Offer" }
A Witness promises to include an anchor event into their ledger using a Accept activity populated with its linked data proof of an AnchorCredential received in a previous Offer. A reference to the previously offered object is populated into the object field. The Witness includes the time range when the anchor activity will become included into their ledger using startTime and endTime fields.
POST /services/anchor/inbox HTTP/1.1 Host: witness1.example.com Content-Type: application/ld+json; profile="https://www.w3.org/ns/activitystreams" Accept-Encoding: gzip, deflate { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain1.com/services/orb", "id": "https://orb.domain1.com/services/orb/activities/e99568ba-23b0-45be-9d7d-3b6a5b87df26", "object": { "@context": "https://www.w3.org/ns/activitystreams", "actor": "https://orb.domain2.com/services/orb", "id": "https://orb.domain2.com/services/orb/activities/575e71af-908d-4624-9c0e-f3ccb499a834", "object": "hl:uEiDfqRoVGvXNZFsk_bn3YXl5Fkvm3PTz0x74F_jiJyhmRg", "target": "https://w3id.org/activityanchors#AnchorWitness", "to": [ "https://orb.domain1.com/services/orb", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Offer" }, "result": { "@context": "https://w3id.org/activityanchors/v1", "attachment": [ { "@context": [ "https://w3id.org/security/v1", "https://w3id.org/security/suites/ed25519-2020/v1" ], "proof": { "created": "2022-03-17T19:51:41.199Z", "domain": "http://orb.vct:8077/maple2020", "proofPurpose": "assertionMethod", "proofValue": "AJScmmux_ZakG5Bt0sZEWtZoMfV7httIiZjNTJjSBI-_-x3K5KNjzmsG9nSKJabWSaJZQHxO_UuU-ecXi3hrBg", "type": "Ed25519Signature2020", "verificationMethod": "did:web:orb.domain1.com#orb1key2" } } ], "endTime": "2022-03-17T20:01:41.4943369Z", "inReplyTo": "hl:uEiDfqRoVGvXNZFsk_bn3YXl5Fkvm3PTz0x74F_jiJyhmRg", "startTime": "2022-03-17T19:51:41.4943369Z", "type": "AnchorReceipt" }, "to": [ "https://orb.domain2.com/services/orb", "https://www.w3.org/ns/activitystreams#Public" ], "type": "Accept" }
The Writer Activity Anchor Server assembles the linked data proofs into a proof chain to create the final AnchorCredential. The proof chain starts with the Writer's linked data proof followed by each witness's linked data proof. See .
Determine if it makes sense to also include log-specific attachments such as signed certificate timestamps.
TODO: Provide description and example for Reject.
WebFinger [[RFC7033]] is used to discover endpoints for anchor service and resource URIs.
The following example retrieves endpoints for a service named anchor at alice.example.com.
GET /.well-known/webfinger?resource=https%3A%2F%2Falice.example.com%2Fservices%2Fanchor HTTP/1.1 Host: alice.example.com Accept-Encoding: gzip, deflate
When the resource exists, an HTTP 200 status code is returned.
HTTP/1.1 200 OK Date: Sat, 30 Jan 2021 13:20:11 GMT Content-Type: application/jrd+json Connection: keep-alive Access-Control-Allow-Origin: * { "subject": "https://alice.example.com/services/anchor", "aliases": [ "https://alice.example.com/@anchor", "https://alice.example.com/services/anchor" ], "links": [ { "rel": "self", "type": "application/activity+json", "href": "https://alice.example.com/services/anchor" } ] }
Aliases for a resource can also be queried. For example, the following is a request for anchor@alice.example.com. This request has the same response as the prior example.
GET /.well-known/webfinger?resource=acct%anchor%40alice.example.com HTTP/1.1 Host: alice.example.com Accept-Encoding: gzip, deflate
WebFinger is also used to query for resource endpoint discovery.
GET /.well-known/webfinger?resource=https%3A%2F%2Fsally.example.com%2Fanchor activitys%2Fbafkreiatkubvbkdidscmqynkyls3iqawdqvthi7e6mbky2amuw3inxsi3y HTTP/1.1 Host: sally.example.com Accept-Encoding: gzip, deflate
When the resource exists, an HTTP 200 status code is returned.
HTTP/1.1 200 OK Date: Sat, 30 Jan 2021 13:20:11 GMT Content-Type: application/jrd+json Connection: keep-alive Access-Control-Allow-Origin: * { "subject": "https://sally.example.com/anchors/bafkreiatkubvbkdidscmqynkyls3iqawdqvthi7e6mbky2amuw3inxsi3y", "links": [ { "rel": "self", "type": "application/ld+json", "href": "https://sally.example.com/anchors/bafkreiatkubvbkdidscmqynkyls3iqawdqvthi7e6mbky2amuw3inxsi3y" }, { "rel": "working-copy", "type": "application/ld+json", "href": "https://sally.example.com/cas/uEiCsFp-ft8tI1DFGbXs78tw-HS561mMPa3Z6GsGAHElrNQ" }, { "rel": "working-copy", "type": "application/ld+json", "href": "https://replica.example.com/cas/uEiCsFp-ft8tI1DFGbXs78tw-HS561mMPa3Z6GsGAHElrNQ" } ] }
Review the appropriate link relations in the above example.