## 4 Proposed Solution
### Zero-Knowledge Proof System (ZKPS)  
Zero-Knowledge Proof System enables a user to prove the validity of a statement without revealing anything about the statement [42; 43]. The variant of zero-knowledge proof used in this proposed system is zk-SNARK. In zk-SNARK, a prover can prove the validity of his/her statement (identity) without revealing details about personal information. For example, the prover wants to prove that he has a valid registered identity number for both himself and his vehicle without revealing the identity number. The verifier who is RSU in this case should learn that the statement of the prover is true without knowing the identity of the prover. zk-SNARK is a non-interactive variant of a zero-knowledge proof system, providing constant-sized proof and also results in the fast verification of statements [36]. zk-SNARK has been actively researched in recent years [42; 43; 44]. zk-SNARK is an efficient protocol that gives a user complete control over the way of how he/she proves his/her identity [28; 29; 30; 31; 32; 33; 34; 35; 36]. zk-SNARK plays an important role in proving the correctness of user statements in the proposed system. zk-SNARK has been proposed to be in Internet of Things (IoT) and its applications. zk-SNARK in collaboration with blockchain as a distributed ledger provides privacy protection and security [45]. zk-SNARK is an efficient protocol that gives a user complete control on the way how he/she proves his/her identity [28; 29; 30; 31; 32; 33; 34; 35]. zk-SNARK plays an important role in proving the correctness of user statement in the proposed system. zk-SNARK has the following characteristics:  
* Completeness: If the prover acts honestly and sends a true input statement, then the honest verifier following the zk-SNARK protocol correctly will be convinced of the statement.  
Our proposed system consisting of functions (Setup, Prove, Verify) is complete for R if for all R \(\epsilon\) R(1\({}^{\lambda}\)) and for all (x,w) \(\epsilon\) R:  
\[\mathbb{P}[(\text{srs})\leftarrow\text{Setup}(\text{R},\text{C});\;\pi\; \leftarrow\text{prove}(\text{srs},\text{x},\text{w}):\text{Verify}(\text{srs},\text{x},\pi)=1]=1\]  
Witness 'w' is kept secret and in normal circumstances is not known to both the prover and the verifier. It helps in the generation of proof during the zk-SNARK proof setup.  
Figure 3: Structure of blockchain.  
* Soundness: If the prover tries to cheat by sending a false statement, the verifier will not be convinced that the statement is true, rejecting the proof with high probability. The proposed system is sound as far as valid proof is provided, so it is possible to extract a valid witness. \[\text{Adv}(\lambda)=\text{ P}[(\text{srs})\leftarrow\text{KeyGen}(\text{R}, \text{C});(\text{x},\pi)\leftarrow\forall(\text{srs})|\text{Verify}(\text{srs},\text{x},\pi)=1,\ (\text{x},\text{w})\
otin\text{R}]\leq\text{neg}(\text{n}))\] The argument System Adv(\(\lambda\)) is defined as follows and is completely sound for any adversary within the proposed system, and if there exists an extractor 'x\(\forall\)\" such that Adv(\(\lambda\)) \(\approx\) 0: \[\text{R}\leftarrow\text{R}(1^{\lambda}),\ \text{Setup}\ (\text{R},\text{C}) \rightarrow\text{srs};\ \forall(\text{srs})\ \rightarrow(\text{x},\ \pi);\ \text{w} \leftarrow\text{x}\forall(\text{Trans}\forall);\ \text{assert}(\text{x},\text{w})\
otin\text{R}\]
* Zero-Knowledge(ness): If the statement sent by the prover is true, the verifier learns nothing beyond the fact that the statement is true. Therefore, the proof is zero-knowledge if whatever the verifier learns is learnt without interacting with the prover.  
An Argument system Adv(\(\lambda\)) is perfectly zero-knowledge if all the adversaries within the proposed system result in zero such that Adv(\(\lambda\)) = 0  
\[\text{R}\leftarrow\text{R}(1^{\lambda}),\ \text{Setup}\ (\text{R},\text{C}) \rightarrow\text{srs};\ \text{b}\leftarrow[0,1];\ \text{b}^{\prime}\leftarrow\forall(\text{srs});\ \text{if b}=\text{b}^{\prime}\ \text{return}\ 1\ \text{else}\ \text{return}\ 0\]