mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-21 19:14:19 +01:00
BlindedMessages is now List[BlindedMessage] (no blinded_messages field) and PostMintRequest (new) is now with outputs field
This commit is contained in:
@@ -20,12 +20,12 @@ Mint: `Bob`
|
||||
# Blind Diffie-Hellmann key exchange (BDHKE)
|
||||
|
||||
- Mint `Bob` publishes `K = kG`
|
||||
- `Alice` picks secret `x` and computes `Y = hash_to_curve(x)`
|
||||
- `Alice` sends to `Bob`: `T = Y + rG` with `r` being a random nonce
|
||||
- `Bob` sends back to `Alice` blinded key: `Q = kT` (these two steps are the DH key exchange)
|
||||
- `Alice` can calculate the unblinded key as `Q - rK = kY + krG - krG = kY = Z`
|
||||
- `Alice` picks secret `x` and computes `Y = hash_to_curve(x)`
|
||||
- `Alice` sends to `Bob`: `T = Y + rG` with `r` being a random nonce (**blinding**)
|
||||
- `Bob` sends back to `Alice` blinded key: `Q = kT` (these two steps are the DH key exchange) (**signing**)
|
||||
- `Alice` can calculate the unblinded key as `Q - rK = kY + krG - krG = kY = Z` (**unblinding**)
|
||||
- Alice can take the pair `(x, Z)` as a token and can send it to `Carol`.
|
||||
- `Carol` can send `(x, Z)` to `Bob` who then checks that `k*hash_to_curve(x) == Z`, and if so treats it as a valid spend of a token, adding `x` to the list of spent secrets.
|
||||
- `Carol` can send `(x, Z)` to `Bob` who then checks that `k*hash_to_curve(x) == Z` (**verification**), and if so treats it as a valid spend of a token, adding `x` to the list of spent secrets.
|
||||
|
||||
## 0.1 - Models
|
||||
|
||||
|
||||
@@ -77,3 +77,23 @@ def derive_keyset_id(keys: Dict[int, PublicKey]):
|
||||
).decode()[:12]
|
||||
```
|
||||
|
||||
[00]: 00.md
|
||||
[01]: 02.md
|
||||
[03]: 03.md
|
||||
[04]: 04.md
|
||||
[05]: 05.md
|
||||
[06]: 06.md
|
||||
[07]: 07.md
|
||||
[08]: 08.md
|
||||
[09]: 09.md
|
||||
[10]: 10.md
|
||||
[11]: 11.md
|
||||
[12]: 12.md
|
||||
[13]: 13.md
|
||||
[14]: 14.md
|
||||
[15]: 15.md
|
||||
[16]: 16.md
|
||||
[17]: 17.md
|
||||
[18]: 18.md
|
||||
[19]: 19.md
|
||||
[20]: 20.md
|
||||
@@ -27,4 +27,25 @@ Response of `Bob`:
|
||||
}
|
||||
```
|
||||
|
||||
with `pr` being the bolt11 payment request and `hash` the hash of the invoice. A wallet **MUST** store the `hash` and `amount_sat` in its database to later request the tokens upon paying the invoice. A wallet **SHOULD** then present the payment request (for example via QR code) to the user such that they can pay the invoice with another Lightning wallet. After the user has paid the invoice, a wallet **MUST** continue with #4 - Minting tokens [TODO: Link to #4].
|
||||
with `pr` being the bolt11 payment request and `hash` the hash of the invoice. A wallet **MUST** store the `hash` and `amount_sat` in its database to later request the tokens upon paying the invoice. A wallet **SHOULD** then present the payment request (for example via QR code) to the user such that they can pay the invoice with another Lightning wallet. After the user has paid the invoice, a wallet **MUST** continue with #4 - Minting tokens [TODO: Link to #4].
|
||||
|
||||
[00]: 00.md
|
||||
[01]: 02.md
|
||||
[03]: 03.md
|
||||
[04]: 04.md
|
||||
[05]: 05.md
|
||||
[06]: 06.md
|
||||
[07]: 07.md
|
||||
[08]: 08.md
|
||||
[09]: 09.md
|
||||
[10]: 10.md
|
||||
[11]: 11.md
|
||||
[12]: 12.md
|
||||
[13]: 13.md
|
||||
[14]: 14.md
|
||||
[15]: 15.md
|
||||
[16]: 16.md
|
||||
[17]: 17.md
|
||||
[18]: 18.md
|
||||
[19]: 19.md
|
||||
[20]: 20.md
|
||||
@@ -12,25 +12,22 @@ Request of `Alice`:
|
||||
POST https://mint.host:3338/mint&payment_hash=67d1d9ea6ada225c115418671b64a
|
||||
```
|
||||
|
||||
With the data being of the form `BlindedMessages`:
|
||||
With the json payload data being of the form `PostMintRequest`:
|
||||
|
||||
```json
|
||||
{
|
||||
"blinded_messages":
|
||||
[
|
||||
BlindedMessage,
|
||||
...
|
||||
]
|
||||
"outputs": `BlindedMessages`
|
||||
}
|
||||
```
|
||||
|
||||
`BlindedMessages` is a list (array) of `BlindedMessage`s (see [NUT-0][00]).
|
||||
|
||||
With curl:
|
||||
|
||||
```bash
|
||||
curl -X POST https://mint.host:3338/mint&payment_hash=67d1d9ea6ada225c115418671b64a -d \
|
||||
{
|
||||
"blinded_messages":
|
||||
"outputs":
|
||||
[
|
||||
{
|
||||
"amount": 2,
|
||||
@@ -39,7 +36,6 @@ curl -X POST https://mint.host:3338/mint&payment_hash=67d1d9ea6ada225c115418671b
|
||||
{
|
||||
"amount": 8,
|
||||
"B_": "03b54ab451b15005f2c64d38fc512fca695914c8fd5094ee044e5724ad41fda247"
|
||||
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -47,7 +43,7 @@ curl -X POST https://mint.host:3338/mint&payment_hash=67d1d9ea6ada225c115418671b
|
||||
|
||||
Response of `Bob`:
|
||||
|
||||
If the invoice was successfully paid, `Bob` responds with a `PostMintResponse` which is essentially a list of `BlindedSignature`'s [TODO: Link PostMintResponse]
|
||||
If the invoice was successfully paid, `Bob` responds with a `PostMintResponse` which is a list of `BlindedSignature`'s (see [NUT-0][00]).
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -72,7 +68,7 @@ If the invoice was not paid yet, `Bob` responds with an error. In that case, `Al
|
||||
|
||||
## Unblinding signatures
|
||||
|
||||
Upon receiving the `PostMintResponse` with the list of `BlindedSignature`'s from the mint `Bob`, a wallet `Alice` **MUST** then unblind the `BlindedSignature`'s from `Bob` (see #0 Notation [TODO: Link to unblinding]) to generate a list of `Proof`'s. A `Proof` is effectively an ecash `Token` and can later be used to redeem the token. The wallet **MUST** store the `Proof` in its database.
|
||||
Upon receiving the `PostMintResponse` with the list of `BlindedSignature`'s from the mint `Bob`, a wallet `Alice` **MUST** then unblind the `BlindedSignature`'s from `Bob` (see BDHKE [NUT-0][00]) to generate a list of `Proof`'s. A `Proof` is effectively an ecash `Token` and can later be used to redeem the token. The wallet **MUST** store the `Proof` in its database.
|
||||
|
||||
A list multiple `Proof`'s is called `Proofs` and has the form:
|
||||
|
||||
@@ -91,4 +87,25 @@ A list multiple `Proof`'s is called `Proofs` and has the form:
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
[00]: 00.md
|
||||
[01]: 02.md
|
||||
[03]: 03.md
|
||||
[04]: 04.md
|
||||
[05]: 05.md
|
||||
[06]: 06.md
|
||||
[07]: 07.md
|
||||
[08]: 08.md
|
||||
[09]: 09.md
|
||||
[10]: 10.md
|
||||
[11]: 11.md
|
||||
[12]: 12.md
|
||||
[13]: 13.md
|
||||
[14]: 14.md
|
||||
[15]: 15.md
|
||||
[16]: 16.md
|
||||
[17]: 17.md
|
||||
[18]: 18.md
|
||||
[19]: 19.md
|
||||
[20]: 20.md
|
||||
@@ -56,4 +56,25 @@ curl -X POST https://mint.host:3338/mint&payment_hash=67d1d9ea6ada225c115418671b
|
||||
}
|
||||
```
|
||||
|
||||
Only if the `paid==true`, the wallet `Alice` **MUST** delete the `Proofs` from her database (or move them to a history). If `paid==false`, `Alice` **CAN** repeat the same multiple times until the payment is successful.
|
||||
Only if the `paid==true`, the wallet `Alice` **MUST** delete the `Proofs` from her database (or move them to a history). If `paid==false`, `Alice` **CAN** repeat the same multiple times until the payment is successful.
|
||||
|
||||
[00]: 00.md
|
||||
[01]: 02.md
|
||||
[03]: 03.md
|
||||
[04]: 04.md
|
||||
[05]: 05.md
|
||||
[06]: 06.md
|
||||
[07]: 07.md
|
||||
[08]: 08.md
|
||||
[09]: 09.md
|
||||
[10]: 10.md
|
||||
[11]: 11.md
|
||||
[12]: 12.md
|
||||
[13]: 13.md
|
||||
[14]: 14.md
|
||||
[15]: 15.md
|
||||
[16]: 16.md
|
||||
[17]: 17.md
|
||||
[18]: 18.md
|
||||
[19]: 19.md
|
||||
[20]: 20.md
|
||||
@@ -32,6 +32,8 @@ With the data being of the form `SplitRequest`:
|
||||
}
|
||||
```
|
||||
|
||||
`BlindedMessages` is a list (array) of `BlindedMessage`s (see [NUT-0][00]).
|
||||
|
||||
With curl:
|
||||
|
||||
```bash
|
||||
@@ -49,8 +51,7 @@ curl -X POST https://mint.host:3338/split -d \
|
||||
...
|
||||
}
|
||||
],
|
||||
"outputs":{
|
||||
"blinded_messages":
|
||||
"outputs":
|
||||
[
|
||||
{
|
||||
"amount": 2,
|
||||
@@ -59,10 +60,38 @@ curl -X POST https://mint.host:3338/split -d \
|
||||
{
|
||||
...
|
||||
}
|
||||
]
|
||||
},
|
||||
],
|
||||
"amount": 40
|
||||
}
|
||||
```
|
||||
|
||||
If successful, `Bob` will respond
|
||||
If successful, `Bob` will respond with a `PostSplitResponse`
|
||||
|
||||
```python
|
||||
class PostSplitResponse(BaseModel):
|
||||
fst: BlindedSignatures
|
||||
snd: BlindedSignatures
|
||||
```
|
||||
|
||||
`BlindedSignatures` is a list (array) of `BlindedSignature`s (see [NUT-0][00]).
|
||||
|
||||
[00]: 00.md
|
||||
[01]: 02.md
|
||||
[03]: 03.md
|
||||
[04]: 04.md
|
||||
[05]: 05.md
|
||||
[06]: 06.md
|
||||
[07]: 07.md
|
||||
[08]: 08.md
|
||||
[09]: 09.md
|
||||
[10]: 10.md
|
||||
[11]: 11.md
|
||||
[12]: 12.md
|
||||
[13]: 13.md
|
||||
[14]: 14.md
|
||||
[15]: 15.md
|
||||
[16]: 16.md
|
||||
[17]: 17.md
|
||||
[18]: 18.md
|
||||
[19]: 19.md
|
||||
[20]: 20.md
|
||||
Reference in New Issue
Block a user