-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* better wording + example * ecash loss, not data loss * cached responses * typo Co-authored-by: gandlafbtc <[email protected]> * typo Co-authored-by: gandlafbtc <[email protected]> * typo Co-authored-by: gandlafbtc <[email protected]> * rephrase * new NUT is the way * settings * fix desc * cached indefinetely * expire 0 -> null * readme info * Apply suggestions from code review Co-authored-by: callebtc <[email protected]> * link to NUT-3/4/5 * store specify key * NUT-19 * format * simplify --------- Co-authored-by: Pavol Rusnak <[email protected]> Co-authored-by: gandlafbtc <[email protected]> Co-authored-by: callebtc <[email protected]>
- Loading branch information
1 parent
85c1026
commit fb3187f
Showing
2 changed files
with
69 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# NUT-19: Cached Responses | ||
|
||
`optional` | ||
|
||
--- | ||
|
||
To minimize the risk of loss of funds to due network errors during critical operations such as minting, swapping, and melting, we introduce a caching mechanism for successful responses. This allows wallet to replay requests on cached endpoints and allow it to recover the desired state after a network interruption. | ||
|
||
## Requests & Responses | ||
|
||
Any Mint implementation should elect a data structure `D` that maps request objects to their respective responses. `D` should be fit for fast insertion, look-up and deletion (eviction) operations. This could be an in-memory database or a dedicated caching service like Redis. | ||
|
||
### Derive & Repeat | ||
|
||
Upon receiving a `request` on a cached endpoint, the mint derives a unique key `k` for it which should depend on the method, path, and the payload of `request`. | ||
|
||
The mint uses `k` to look up a `response = D[k]` and discriminates execution based on the following checks: | ||
|
||
- If no cached `response` is found: `request` has no matching `response`. The mint processes `request` as per usual. | ||
- If a cached `response` is found: `request` has a matching `response`. The mint returns the cached `response`. | ||
|
||
### Store | ||
|
||
For each successful response on a cached endpoint (`status_code == 200`), the mint stores the response in `D` under key `k` (`D[k] = response`). | ||
|
||
### Expiry | ||
|
||
The mint decides the `ttl` (Time To Live) of cached response, after which it can evict the entry from `D`. | ||
|
||
## Settings | ||
|
||
Support for NUT-19 is announced as an extension to the `nuts` field of the `GetInfoResponse` described in [NUT-6](06). | ||
|
||
The entry is structured as follows: | ||
|
||
```json | ||
"nuts": { | ||
..., | ||
"19": { | ||
"ttl": <int|null>, | ||
"cached_endpoints": [ | ||
{ | ||
"method": "POST", | ||
"path": "/v1/mint/bolt11", | ||
}, | ||
{ | ||
"method": "POST", | ||
"path": "/v1/swap", | ||
}, | ||
... | ||
] | ||
} | ||
} | ||
``` | ||
|
||
Where: | ||
|
||
- `ttl` is the number of seconds the responses are cached for | ||
- `cached_endpoints` is a list of the methods and paths for which caching is enabled. | ||
- `path` and `method` describe the cached route and its method respectively. | ||
|
||
If `ttl` is `null`, the responses are expected to be cached _indefinitely_. | ||
|
||
[03]: 03.md | ||
[04]: 04.md | ||
[05]: 05.md | ||
[06]: 06.md |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters