mirror of
https://github.com/nostr-protocol/nips.git
synced 2024-11-09 22:09:06 -05:00
e55c86d207
also Regenerate example PKs and improve organization/presentation.
85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
NIP: 26
|
|
=======
|
|
|
|
Delegated Event Signing
|
|
-----
|
|
|
|
`draft` `optional` `author:markharding` `author:minds`
|
|
|
|
This NIP defines how events can be delegated so that they can be signed by other keypairs.
|
|
|
|
Another application of this proposal is to abstract away the use of the 'root' keypairs when interacting with clients. For example, a user could generate new keypairs for each client they wish to use and authorize those keypairs to generate events on behalf of their root pubkey, where the root keypair is stored in cold storage.
|
|
|
|
#### Introducing the 'delegation' tag
|
|
|
|
This NIP introduces a new tag: `delegation` which is formatted as follows:
|
|
|
|
```json
|
|
[
|
|
"delegation",
|
|
<pubkey of the delegator>,
|
|
<conditions query string>,
|
|
<64-bytes schnorr signature of the sha256 hash of the delegation token>
|
|
]
|
|
```
|
|
|
|
##### Delegation Token
|
|
|
|
The **delegation token** should be a 64-byte Schnorr signature of the sha256 hash of the following string:
|
|
|
|
```
|
|
nostr:delegation:<pubkey of publisher (delegatee)>:<conditions query string>
|
|
```
|
|
|
|
|
|
#### Example
|
|
|
|
```
|
|
# Delegator:
|
|
privkey: ee35e8bb71131c02c1d7e73231daa48e9953d329a4b701f7133c8f46dd21139c
|
|
pubkey: 8e0d3d3eb2881ec137a11debe736a9086715a8c8beeeda615780064d68bc25dd
|
|
|
|
# Delegatee:
|
|
privkey: 777e4f60b4aa87937e13acc84f7abcc3c93cc035cb4c1e9f7a9086dd78fffce1
|
|
pubkey: 477318cfb5427b9cfc66a9fa376150c1ddbc62115ae27cef72417eb959691396
|
|
```
|
|
|
|
Delegation string to grant note publishing authorization to the delegatee (477318cf) for the next 30 days.
|
|
```json
|
|
nostr:delegation:477318cfb5427b9cfc66a9fa376150c1ddbc62115ae27cef72417eb959691396:kind=1&created_at<1675721885
|
|
```
|
|
|
|
The delegator (8e0d3d3e) then signs the above delegation string, the result of which is the delegation token:
|
|
```
|
|
cbc49c65fe04a3181d72fb5a9f1c627e329d5f45d300a2dfed1c3e788b7834dad48a6d27d8e244af39c77381334ede97d4fd15abe80f35fda695fd9bd732aa1e
|
|
```
|
|
|
|
The delegatee (477318cf) can now construct an event on behalf of the delegator (8e0d3d3e). The delegatee then signs the event with its own private key and publishes.
|
|
```json
|
|
{
|
|
"id": "ac4c71e69c39b1bd605de812543ebfaf81d5af365354f061d48981fb61e00b8a",
|
|
"pubkey": "477318cfb5427b9cfc66a9fa376150c1ddbc62115ae27cef72417eb959691396",
|
|
"created_at": 1673129661,
|
|
"kind": 1,
|
|
"tags": [
|
|
[
|
|
"delegation",
|
|
"8e0d3d3eb2881ec137a11debe736a9086715a8c8beeeda615780064d68bc25dd",
|
|
"kind=1&created_at<1675721813",
|
|
"cbc49c65fe04a3181d72fb5a9f1c627e329d5f45d300a2dfed1c3e788b7834dad48a6d27d8e244af39c77381334ede97d4fd15abe80f35fda695fd9bd732aa1e"
|
|
]
|
|
],
|
|
"content": "Hello, world!",
|
|
"sig": "55ed9a78d6449b8c189b6dbc34bc4bcd34dcc79e6da6c9078268fe3d7c0cbe62b1b907ffb76ba591e83895b1329bf2e6e16f3b0cd5827272e420d419c6f0f0b5"
|
|
}
|
|
```
|
|
|
|
The event should be considered a valid delegation if the conditions are satisfied (`kind=1` and `created_at<1675721813` in this example) and, upon validation of the delegation token, are found to be unchanged from the conditions in the original delegation string.
|
|
|
|
Clients should display the delegated note as if it was published directly by the delegator (8e0d3d3e).
|
|
|
|
|
|
#### Relay & Client Querying Support
|
|
|
|
Relays should answer requests such as `["REQ", "", {"authors": ["A"]}]` by querying both the `pubkey` and delegation tags `[1]` value.
|