From e0ec6d5eff7ecbcd3679cbecbbbf6fab5e331e7a Mon Sep 17 00:00:00 2001 From: George Tankersley Date: Tue, 2 Oct 2018 22:27:57 +0000 Subject: [PATCH] zipWIP: add diagrams and tables --- arch.png | Bin 0 -> 36262 bytes zip-XXX-light-payment-detection.rst | 173 +++++++++++++++++----------- 2 files changed, 105 insertions(+), 68 deletions(-) create mode 100644 arch.png diff --git a/arch.png b/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..4922c7330b39ef8ca6612a18b2677946f1bb123f GIT binary patch literal 36262 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 z zVUM{$(3V=yIopjTppdJjbUP@3lHn%XabR#ieyBO!2v(e7I??B)JJ?FQ(#mB3eJs&d z)s#A``Q<+2d;T}Q`B@lNv~z~g^Hlq3w88V~2W8XXuUZxHPA9lxcgNg0#6|i@KB&(W zaaM2*&8dr0M~0TpIfoTYT4V@rqBF5NIrT2%jmKi$e$FTwVNwq&V=pT6x#%AJ;$uS> z5*buqz5I+!QZa#0F?=or+lk|tk=|Ra+UXG74JL4y9@dIOdKMQzt|RI6(!q65ddl}z zmrCqHi-U-OMw3Rs`gd6I9Dj)Bo4)<4-c}iU

hT>j+-z(;&Y{@a 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 Nme-Igmob0+zW@Mmn^gb+ literal 0 HcmV?d00001 diff --git a/zip-XXX-light-payment-detection.rst b/zip-XXX-light-payment-detection.rst index 84e945ea..b682d8e9 100644 --- a/zip-XXX-light-payment-detection.rst +++ b/zip-XXX-light-payment-detection.rst @@ -16,70 +16,70 @@ Terminology The terms below are to be interpreted as follows: Light client - A client that is not a full participant in the network of Zcash peers. It can - send and receive payments, but does not store or validate a copy of the - blockchain. + A client that is not a full participant in the network of Zcash peers. It can send and + receive payments, but does not store or validate a copy of the blockchain. Abstract ======== -This proposal defines a protocol for a Zcash light client supporting Sapling -shielded transactions. +This proposal defines a protocol for a Zcash light client supporting Sapling shielded +transactions. Motivation ========== -Currently a client that wishes to send or receive shielded payments must be a -full node participanting in the Zcash network. This requires an amount of -available bandwidth, space, and processing power that may be unsuitable for -some classes of user. This light client protocol addresses that need, and is -appropriate for low-power, bandwidth-conscious, or otherwise limited machines -(such as mobile phones). +Currently a client that wishes to send or receive shielded payments must be a full node +participanting in the Zcash network. This requires an amount of available bandwidth, +space, and processing power that may be unsuitable for some classes of user. This light +client protocol addresses that need, and is appropriate for low-power, +bandwidth-conscious, or otherwise limited machines (such as mobile phones). High-Level Design ================= There are three logical components to a Zcash light client system: -- **Zcash node** that provides chain state and serves as a root of trust for - the system. +- **Zcash node** that provides chain state and serves as a root of trust for the system. -- **Proxy server** that extracts blockchain data from zcashd to store and serve - it in a lower-bandwidth format. +- **Proxy server** that extracts blockchain data from zcashd to store and serve it in a + lower-bandwidth format. -- **Light client** that subscribes to the stream from a proxy server and uses - that data to update its own view of the chain state. +- **Light client** that subscribes to the stream from a proxy server and uses that data to + update its own view of the chain state. The light client MAY be attached to a wallet + backend that will track particular Sapling notes. +.. figure:: arch.png + :align: center + :figclass: align-center -[ASCII DIAGRAM HERE or include png] + Outline of the light wallet architecture Security Model ============== -In this model, we propose **payment detection privacy** as our main security -goal. That is, the proxy should not learn which transactions (received from the -blockchain) are addressed to a given light wallet. If we further assume network -privacy (via Tor or similar), the proxy should not be able to link different -connections or queries as deriving from the the same wallet. +In this model, we propose **payment detection privacy** as our main security goal. That +is, the proxy should not learn which transactions (received from the blockchain) are +addressed to a given light wallet. If we further assume network privacy (via Tor or +similar), the proxy should not be able to link different connections or queries as +deriving from the the same wallet. -In particular, the underlying Zcash node / proxy combination is assumed to be -"honest but curious" and is trusted to provide a correct view of the current -best chain state and to faithfully transmit queries and responses. Methods for -weakening this assumption are discussed in appendix FOO. +In particular, the underlying Zcash node / proxy combination is assumed to be "honest but +curious" and is trusted to provide a correct view of the current best chain state and to +faithfully transmit queries and responses. Methods for weakening this assumption are +discussed in appendix FOO. This ZIP does not address how to spend notes privately. Compact Stream Format ===================== -A key observation in this protocol is that the current zcashd encrypted field -is several hundred bytes long, due to the inclusion of a transaction “memo”. -The need to download this entire field imposes a substantial bandwidth cost on -each light wallets, which may be a limited mobile device on a -restricted-bandwidth plan. While more efficient techniques can be -developed in the future, for the moment we propose ignoring the memo field -during payment detection. Futhermore, we can also ignore any information that -is not directly relevant to a Sapling shielded transaction. +A key observation in this protocol is that the current zcashd encrypted field is several +hundred bytes long, due to the inclusion of a transaction “memo”. The need to download +this entire field imposes a substantial bandwidth cost on each light wallets, which may be +a limited mobile device on a restricted-bandwidth plan. While more efficient techniques +can be developed in the future, for the moment we propose ignoring the memo field during +payment detection. Futhermore, we can also ignore any information that is not directly +relevant to a Sapling shielded transaction. A **compact block** is a packaging of ONLY the data from a block needed to: @@ -87,8 +87,8 @@ A **compact block** is a packaging of ONLY the data from a block needed to: 2. Detect a spend of your shielded Sapling notes 3. Update your witnesses to generate new Sapling spend proofs. -A compact block and its component compact transactions are encoded on the wire -using the following Protocol Buffers [XXX] format: +A compact block and its component compact transactions are encoded on the wire using the +following Protocol Buffers [XXX] format: .. code:: proto @@ -123,48 +123,84 @@ using the following Protocol Buffers [XXX] format: Encoding Details ---------------- -`blockHash`, `txHash`, `nf`, `cmu`, and `epk` are encoded as specified in the Zcash Protocol Spec. +``blockHash``, ``txHash``, ``nf``, ``cmu``, and ``epk`` are encoded as +specified in the Zcash Protocol Spec. -The output ciphertext is handled differently, as described in section Output Ciphertext Compression. +The output and spend descriptions are handled differently, as described in the following +sections. -Output Ciphertext Compression ------------------------------ +Output Compression +------------------ -In the normal Zcash protocol, the output ciphertext consists of the AEAD -encrypted form of a *note plaintext*: +In the normal Zcash protocol, the output ciphertext consists of the AEAD encrypted form of +a *note plaintext* (see Zcash Spec section 5.5): -[diagram from 5.5-beta22] ++------------+----------+----------+-------------+-----------------------------------+ +| 8-bit 0x01 | 88-bit d | 64-bit v | 256-bit rcm | memo (512 bytes) + tag (16 bytes) | ++------------+----------+----------+-------------+-----------------------------------+ -A recipient detects their transactions by trial-decrypting this ciphertext. On -a full node that has the entire block chain, the primary cost is computational. -For light clients however, there is an additional bandwidth cost: every -ciphertext on the block chain must be streamed from the server (or network -node) the light client is connected to. This results in a total of 580 bytes -per output that must be streamed to the client. +A recipient detects their transactions by trial-decrypting this ciphertext. On a full node +that has the entire block chain, the primary cost is computational. For light clients +however, there is an additional bandwidth cost: every ciphertext on the block chain must +be received from the server (or network node) the light client is connected to. This +results in a total of 580 bytes per output that must be streamed to the client. -However, we don't need all of that just to detect payments. The first 52 bytes -of the ciphertext contain the contents and opening of the note commitment, -which is all of the data needed to spend the note and to verify that the note -is spendable. If we ignore the memo and the authentication tag, we're left with -a 32-byte ephemeral key, the 32-byte note commitment, and only the first 52 -bytes of the ciphertext for each output needed to decrypt, verify, and spend a -note. This totals to 116 bytes per output, for an 80% reduction in bandwidth -use. +However, we don't need all of that just to detect payments. The first 52 bytes of the +ciphertext contain the contents and opening of the note commitment, which is all of the +data needed to spend the note and to verify that the note is spendable. If we ignore the +memo and the authentication tag, we're left with a 32-byte ephemeral key, the 32-byte note +commitment, and only the first 52 bytes of the ciphertext for each output needed to +decrypt, verify, and spend a note. This totals to 116 bytes per output, for an 80% +reduction in bandwidth use. However, skipping the full ciphertext means that we can no longer calculate the -authentication tag for the entire ciphertext and will need to do something else -to validate the integrity of the decrypted note plaintext. +authentication tag for the entire ciphertext and will need to do something else to +validate the integrity of the decrypted note plaintext. -Since the note commitment is sent outside the ciphertext and is authenticated -by the binding signature over the entire transaction, it serves as an adequate -check on the validity of the decrypted plaintext (assuming you trust the entity -assembling transactions). We therefore recalculate the note commitment from the -decrypted plaintext. If the recalculated commitment matches the one in the -output, we accept note as valid and spendable. +Since the note commitment is sent outside the ciphertext and is authenticated by the +binding signature over the entire transaction, it serves as an adequate check on the +validity of the decrypted plaintext (assuming you trust the entity assembling +transactions). We therefore recalculate the note commitment from the decrypted plaintext. +If the recalculated commitment matches the one in the output, we accept note as valid and +spendable. + +Spend Compression +----------------- + +Recall that a full Sapling Spend description is 384 bytes long: + ++-------+--------------+-----------+ +| Bytes | Name | Type | ++=======+==============+===========+ +| 32 | cv | char[32] | ++-------+--------------+-----------+ +| 32 | anchor | char[32] | ++-------+--------------+-----------+ +| 32 | nullifier | char[32] | ++-------+--------------+-----------+ +| 32 | rk | char[32] | ++-------+--------------+-----------+ +| 192 | zkproof | char[192] | ++-------+--------------+-----------+ +| 64 | spendAuthSig | char[64] | ++-------+--------------+-----------+ + +The only part necessary for detection is the nullifier, which allows a light client to +detect when one of its own notes has been spent. This means we only need to take 32 bytes +of each Spend, for a 90% improvement in bandwidth use. Proxy operation =============== +The proxy's purpose is to provide a scalable and bandwidth-efficient interface between a +Zcash node and any number of light clients. It accomplishes this by parsing a blockwise +stream of transactions from the node and converting them into the compact format described +above. + +The proxy stores + + + Client operation ================ @@ -176,8 +212,8 @@ You can require the proxy to give you all the block headers to validate. Reference Implementation ======================== -This proposal is supported by a set of libraries and reference code made -available by the Zcash Company. +This proposal is supported by a set of libraries and reference code made available by the +Zcash Company. [NOTE: 2018-09-17 WE HAVE NOT YET FINISHED OR RELEASED THESE.] @@ -185,4 +221,5 @@ References ========== [bipXXX] define a light client + [XXX] protobufs