Jonas Nick
Liam Eagen
Robin Linus
Blockchain (PoW, ...)
Transaction Validation
"Layer 0.5"
"Layer 1"
🛡️
👩🌾
Ivy: 2 sat
Transaction 1
Ivy
the Issuer
On-Chain
Off-Chain
Ivy: 10 🐸
Transaction 1
Sign("I issue 10 🐸-coins in transaction 1, output 1. Redeemable for physical frogs.")
👩🌾
Ivy: 2 sat
Transaction 1
Ivy
the Issuer
On-Chain
Off-Chain
Ivy: 1 sat
Roy: 1 sat
Transaction 2
Roy
the Receiver
🧑🎤
Ivy: 10 🐸
Transaction 1
Ivy: 3 🐸
Roy: 7 🐸
Transaction 2
"Coin Proof":
Transaction graph connecting Roy's output to an issuance transaction
... then transactions are only validated "client-side" and simply ignored if they are invalid.
Post-quantum
non-interactive publishing
prunable wallet state
PCD
Payment Channels
MEVil
TS-Accumulator
Instantiation
Light clients
Reorgs
Sign-to-Contract Schnorr Half-Aggregation
<REDACTED>
█ █ █ █ █ █ █ █
ᗰᗩᗪᑎᕮᔕᔕ ᗯᗩITᔕ
64-byte nullifier
Private and Efficient CSV
Communication Channels
Client-Side Validation Model
Accounts
mempool
🚢
👩🚀
🧑🎤
Sally the Sender
Roy the Receiver
Coin, Coin Proof
Verify:
All txs in the coin proof
are valid.
Ivy: 3 🐸
Roy: 7 🐸
Nullifier := (CoinID, TxHash)🧑🎤
👩🚀
Blockchain
| CoinID | TxHash |
|---|---|
| <some CoinID> | <...> |
| <other CoinID> | <...> |
nullifier key-value store
Embed nullifier
Process nullifiers
Process nullifiers:
Ignore nullifiers whose CoinID is already in the KV-store.
(<some CoinID>, <some TxHash>)
IGNORED by Roy
👩🚀
🧑🎤
Sally the Sender
Roy the Receiver
Coin, Coin Proof
Verify Coin Proof:
Every coin spent in the coin proof must be present in the KV-store and the tx hashes must match.
| CoinID | TxHash |
|---|---|
| <some CoinID> | <...> |
| <other CoinID> | <...> |
nullifier key-value store
Problem: Posting nullifiers requires a dedicated on-chain tx.
AggNullifier := (Nullifier_PubKeys, AggSig)Nullifier := (Nullifier_PubKey, Signature)Nullifier := (Nullifier_PubKey, TxHash, Signature) Nullifier := (Nullifier_PubKey, TxHash)Nullifier := (CoinID, TxHash)(insecure, one nullifier per coin)
(insecure, one nullifier per tx)
128 bytes
96 bytes
64 bytes
Accounts
Signature
Sign-To-Contract
Signature Half-Aggregation
👩🚀
🧑🎤
Coin, Coin Proof
👷
Tx := (AcctState, Coins,
NewAcctState, NewCoins)Nullifier
AggNullifier
...
Block i + 1
Block i
Block i + 2
aggregates & publishes
reads & verifies aggregate sig
| <...> | <...> |
|---|---|
| <...> | <...> |
🖥️
🖥️
🖥️
Local Input
Local Input
Local Input
Output
Output
Output
Output
, π₁
, π₂
, π₃
, π₄
🖥️
🖥️
🖥️
Local Input
Local Input
Local Input
Output
Output
Output
Output
, π₁
, π₂
, π₃
, π₄
👩🚀
Local Input
AcctState
Coin
AcctState
Coin
, π₁
, π₂
, π₃
, π₄
🧑🎤