The Bulletproofs protocol when appeared made some kind of revolution in ZK world, especially in anonymous transactions where range proofs are the most complicated and important part to validate correct transfer. Today, may protocols rely on Bulletproofs of Bulletproofs+ (more advanced version) to enable range-proofs. Additionally, Bulletproofs protocol introduced the proof of correct scalar multiplication of committed vectors (called inner-product argument), that becomes also useful in many other protocols. That is why, understanding how original Bulletproofs protocol works is so important nowadays.
Inner-product argument
As mentioned, we start from defining the protocol that enables proof of correct scalar vector multiplication. Let’s put generators and vectors and . For the commitment we are going to proof a validness of . This protocol works with prover complexity and proof size, and has name inner-product argument, but many sources refer to it just as Bulletproofs.
Let’s put (we assume that is a power of two) and also notate and first and last halves of vector . WLOG, we also modify the commitment a little, assuming that and now starting to work only with instead of .
We define the following additively homomorphic function as:
Then, the prover and the verifier run the following protocol for the input :
-
The prover evaluates and shares the following values:
We also note that
-
The verifier samples challenge and shares with the prover
-
The prover puts
-
The prover shares and
-
The verifier puts and checks that
Note, that if we go through the obvious proof of scalar multiplication, the prover has to share with the verifier directly that consumes elements of proof size, but the presented protocol reduces the proof size to elements that is only elements.
Next, we can put new generators
and then, the final check at Phase 4/5 is equal to the check that for the commitment to the vectors , the is a valid scalar multiplication. So, instead of Phase 4/5 the prover and the verifier can run the protocol again over the input where each next step divides the size of the proof data by two, until the size reaches where the prover opens directly.
You can check the implementation of inner-product argument in my crypto library.
Completeness
or it equals to over the new generators .