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 matchingresponse
. The mint processesrequest
as per usual. - If a cached
response
is found:request
has a matchingresponse
. The mint returns the cachedresponse
.
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.
The entry is structured as follows:
"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 forcached_endpoints
is a list of the methods and paths for which caching is enabled.path
andmethod
describe the cached route and its method respectively.
If ttl
is null
, the responses are expected to be cached indefinitely.