Thread

# Abstract Nostr lacks a standardized, interoperable way to make, track, and revoke truthfulness claims about Nostr events. This NIP introduces Attestations, which provides a base structure to: - **Make attestations** about that validity of *any other* event on Nostr of *any* kind; - **Revoke attestations** about previous validity claims. This base Attestation structure can *optionally* be extended to: - Manage simple attestation lifecycles; - Request attestations from other npubs; - Recommend individual attestation providers based on their proficiency in verifying given kinds; - Publish your verification proficiency for given kinds. Attestations enable a web of-trust for notes. --- # Definitions ## Base Definitions | Entity | Definition | | ------------------- | --------------------------------------------------------------------------------- | | `Assertor` | Signer of the `Assertion Event`. Interchangeable with Attestee. | | `Attestor` | Verifying party and signer of the`Attestation Event`. | | `Assertion Event` | Event being attested to by the `Attestor`. | | `Attestation Event` | Event published by the `Attestor` to signal attestation of the `Assertion Event`. | ![Simple Entity Relationship Diagram](image) ```mermaid erDiagram ATTESTOR ||--o{ ATTESTATION_EVENT : signs ASSERTOR ||--o{ ASSERTION_EVENT : signs ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to ``` --- ## Extended Definitions | Entity | Definition | | ---------------------------------------- | -------------------------------------------------------------------------------------------- | | `Requestor` | Signer of the `Attestation Request Event`. | | `Reccomender` | Signer of the `Attestation Recommendation Event`. | | `Attestation Request Event` | The request for an `Attestation Event` from an `Attestor`. | | `Attestor Recommendation Event` | The recommendation of a given `Attestor` for proficiency in the verification of given kinds. | | `Attestor Proficiency Declaration Event` | A declaration of proficiency from a given `Attestor` in the verification of given kinds. | ![Extended Entity Relationship Diagram](image) ```mermaid erDiagram ATTESTOR o|--o{ ATTESTATION_EVENT : signs ATTESTOR o|--|| ATTESTOR_PROFICIENCY_DECLARATION_EVENT : signs ASSERTOR o|--o{ ASSERTION_EVENT : signs ASSERTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs REQUESTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs RECOMMENDER o|--o{ ATTESTOR_RECOMMENDATION_EVENT : signs ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to ATTESTATION_REQUEST_EVENT ||--|| ASSERTION_EVENT : requests_attestation_of ATTESTOR_RECOMMENDATION_EVENT ||--|| ATTESTOR: recommends ATTESTOR_PROFICIENCY_DECLARATION_EVENT ||--|| ATTESTOR: declares_proficiency_of ``` --- # Specification ### Event Kinds | Kind | Description | Type | | ------- | -------------------------------- | ----------- | | `31871` | Attestation | Addressable | | `31872` | Attestation Request | Addressable | | `31873` | Attestor Recommendation | Addressable | | `11871` | Attestor Proficiency Declaration | Replaceable | --- ## Tags ### Attestation Event (`31871`) Event signed by the `Attestor`. The `Attestor` should only sign an `Attestation Event` after verifying the validity of the `Assertion Event` to a degree appropriate for its kind type. | Tag | Description | Format | Required | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `d` | Unique identifier for addressable attestation. | `["d", "<npub>:my-claim-id"]` | Yes | | `e` / `a` / `p` | Specific `Assertion Event`. Exactly one of `e` or `a` or `p` **must** be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]` | Yes | | `v` | Validity claim. Conditional on `s` = `verified` | `["v", "valid"]` or `["v", "invalid"]` | Conditional | | `s` | Marks an Attestation as being in only one of the following states:`accepted`- `rejected` - `verifying` - `verified` - `revoked` | `["s","accepted <> rejected <> verifying <> verified <> revoked"]` | Optional | | `valid_from` | Unix timestamp (seconds). The earliest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_from` tag as having `validity`/`invalidity` from the `created_at` timestamp of the `Assertion Event` | `["valid_from",1671217411]` | Optional | | `valid_to` | UNIX timestamp (seconds). The latest time (inclusive) at which the attestation is valid from. Clients **should** interpret the absence of `valid_to` tag as having `validity`/`invalidity` in perpetuity. | `["valid_from",1671567643]` | Optional | | `expiration` | UNIX timestamp (seconds). The time (inclusive) at which the `Attestation Event` will expire and be treated as such by relays in accordance to `NIP-40`. Clients **should** set this it be the same value as `valid_to` if there is no value in the `Attestation Event` being long-lived. | `["expiration",1671567643]` | Optional | | `request` | `Attestation Request Event` that prompted this attestation. | `["request", "31872:<requestor_pubkey>:<d-tag>"]` | Optional | --- ### Attestation Request (`31872`) Event signed by the `Requestor` (usually the `Assertor`) requesting an `Attestation Event` from an `Attestor`. | Tag | Description | Format | Required | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------- | | `d` | Unique identifier for addressable attestation request. | `["d", "<requestor_pubkey>:my-request-id"]` | Yes | | `e`/`a`/`p` | Specific `Assertion Event` Exactly one of `e` or `a` or `p` must be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]`.| Yes | | `p` | One or more requested `Attestators` | `["p", "<attestor_pubkey>"]` | No | | `cashu_token` | A Cashu token locked to given spending conditions (HLTC, P2PK, etc.). Spending conditions *may* be locked to the observation of requested `Attestation Events`. | `["cashu_token", "<cashuBo...>"]` | No | --- ### Attestor Recommendation (`31873`) Event signed by the `Recommender`. Allows any npub to recommend an `Attestor` for verification proficiency in one or more event kinds. | Tag | Description | Format | Required | | ------ | ---------------------------------------------------------------- | ------------------------------------------------ | -------- | | `d` | Unique identifier for the recommendation of a given`Attestor`. | `["d", "<attestor_pubkey>` | Yes | | `k` | One or more event kinds the attestor is recommended for | `["k", "<kind>"]` (repeatable) | Yes | | `desc` | Optional human-readable reason or context for the recommendation | `["desc", "Trustworthy for place attestations"]` | No | --- ### Attestor Proficiency Declaration (`11871`) Event signed by the `Attestor`. Enables an attestor to publicly declare which event kinds they are proficient in verifying; facilitating discovery of suitable attestors for specific verification needs. | Tag | Description | Format | Required | | ------ | ----------------------------------------------------------------- | -------------------------------------------- | -------- | | `p` | Attestor’s pubkey (the declaring party) | `["p", "<pubkey>"]` | Yes | | `k` | One or more event kinds the attestor claims proficiency in | `["k", "<kind>"]` | Yes | | `desc` | Optional human-readable description of proficiency or credentials | `["desc", "I verify places and attributes"]` | No | --- # Worked Examples ## 1. Attestation Request ``` { "kind": 31872, "tags": [ ["d", "npub1requestor...:my-request-id"], ["a", 12345:npub1...:central-park-saftey-assertation"], ["p", "npub1attestor1..."] ["p", "npub1attestor2..."] ], "content": "Verify safety status for Central Park" } ``` ## 2. Attestation ``` { "kind": 31871, "tags": [ ["d", "npub:safety-verification-2025"], ["a", "12345:npub1...:central-park-saftey-assertation"], ["validity", "valid"], ["valid_from", "1760227200"], // Sept 12, 2025 @ 00:00 UTC ["valid_to", "1760486400"], // Sept 15, 2025 @ 00:00 UTC ["request", "request-event-id-123"] ], "content": "Safety inspection valid" } ``` ## 3. Revocation ``` { "kind": 31871, "tags": [ ["d", "npub:safety-verification-2025"], ["s", "revoked"] ], "content": "Retracted due to new safety concerns" } ``` --- # Related NIPs ## NIP-03 - OpenTimeStamps Attestations An `Attestor`, `Assertor` or any other npub may choose to issue a `kind:1040` `OpenTimestamps Attestations for Events` event to anchor the `Attestation Event` to a given blockheight on the Bitcoin timechain. ## NIP-58 - Badges An `Attestor` or any other npub may choose to issue a badge for a given `Attestation` should they wish.

Replies (2)