Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
prover_client.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 # Copyright (c) 2015-2022 Clearmatics Technologies Ltd
4 #
5 # SPDX-License-Identifier: LGPL-3.0+
6 
7 from __future__ import annotations
8 from zeth.core.zksnark import IZKSnarkProvider, get_zksnark_provider, \
9  IVerificationKey, ExtendedProof
10 from zeth.core.constants import JS_INPUTS
11 from zeth.core.pairing import PairingParameters, pairing_parameters_from_proto
12 from zeth.api.zeth_messages_pb2 import ProofInputs
13 from zeth.api import prover_pb2 # type: ignore
14 from zeth.api import prover_pb2_grpc # type: ignore
15 import grpc # type: ignore
16 from os.path import exists
17 from os import unlink
18 import json
19 from google.protobuf import empty_pb2
20 from typing import Dict, List, Tuple, Optional, Any
21 
22 
24  """
25  In-memory version of protobuf ProverConfig object
26  """
27  def __init__(self, zksnark_name: str, pairing_parameters: PairingParameters):
28  self.zksnark_name = zksnark_name
29  self.pairing_parameters = pairing_parameters
30 
31  def to_json_dict(self) -> Dict[str, Any]:
32  return {
33  "zksnark_name": self.zksnark_name,
34  "pairing_parameters": self.pairing_parameters.to_json_dict(),
35  }
36 
37  @staticmethod
38  def from_json_dict(json_dict: Dict[str, Any]) -> ProverConfiguration:
39  return ProverConfiguration(
40  json_dict["zksnark_name"],
41  PairingParameters.from_json_dict(json_dict["pairing_parameters"]))
42 
43 
45  prover_config_proto: prover_pb2.ProverConfiguration
46 ) -> ProverConfiguration:
47  return ProverConfiguration(
48  zksnark_name=prover_config_proto.zksnark,
49  pairing_parameters=pairing_parameters_from_proto(
50  prover_config_proto.pairing_parameters))
51 
52 
54  def __init__(
55  self,
56  endpoint: str,
57  prover_config_file: Optional[str] = None):
58  """
59  If config_file is not None, the ProverConfiguration will be cached in the
60  given file.
61  """
62  self.endpoint = endpoint
63  self.prover_config_file = prover_config_file
64  self.prover_config: Optional[ProverConfiguration] = None
65 
66  def get_configuration(self) -> ProverConfiguration:
67  """
68  Get the ProverConfiguration for the connected server, caching in memory
69  and in `config_file` if given.
70  """
71  if self.prover_config is not None:
72  return self.prover_config
73 
74  if (self.prover_config_file is not None) and \
75  exists(self.prover_config_file):
76  try:
77  with open(self.prover_config_file, "r") as prover_config_f:
78  self.prover_config = ProverConfiguration.from_json_dict(
79  json.load(prover_config_f))
80  return self.prover_config
81  except Exception as ex:
82  print(
83  f"prover config error '{self.prover_config_file}': {str(ex)}")
84  unlink(self.prover_config_file)
85 
86  with grpc.insecure_channel(self.endpoint) as channel:
87  stub = prover_pb2_grpc.ProverStub(channel) # type: ignore
88  prover_config_proto = stub.GetConfiguration(_make_empty_message())
90  prover_config_proto)
91 
92  if self.prover_config_file is not None:
93  with open(self.prover_config_file, "w") as prover_config_f:
94  json.dump(self.prover_config.to_json_dict(), prover_config_f)
95 
96  return self.prover_config
97 
98  def get_zksnark_provider(self) -> IZKSnarkProvider:
99  """
100  Get the appropriate zksnark provider, based on the server configuration.
101  """
102  config = self.get_configuration()
103  return get_zksnark_provider(config.zksnark_name)
104 
105  def get_verification_key(self) -> IVerificationKey:
106  """
107  Fetch the verification key from the proving service
108  """
109  with grpc.insecure_channel(self.endpoint) as channel:
110  stub = prover_pb2_grpc.ProverStub(channel) # type: ignore
111  vk_proto = stub.GetVerificationKey(_make_empty_message())
112  zksnark = self.get_zksnark_provider()
113  return zksnark.verification_key_from_proto(vk_proto)
114 
116  self,
117  proof_inputs: ProofInputs) -> Tuple[ExtendedProof, List[int]]:
118  """
119  Request a proof generation to the proving service
120  """
121  assert len(proof_inputs.js_inputs) == JS_INPUTS
122  with grpc.insecure_channel(self.endpoint) as channel:
123  stub = prover_pb2_grpc.ProverStub(channel) # type: ignore
124  extproof_and_pub_data = stub.Prove(proof_inputs)
125  zksnark = self.get_zksnark_provider()
126  extproof = zksnark.extended_proof_from_proto(
127  extproof_and_pub_data.extended_proof)
128  public_data = [int(x, 16) for x in extproof_and_pub_data.public_data]
129  return extproof, public_data
130 
131 
132 def _make_empty_message() -> empty_pb2.Empty:
133  return empty_pb2.Empty()
zeth.core.prover_client.ProverClient.get_proof
Tuple[ExtendedProof, List[int]] get_proof(self, ProofInputs proof_inputs)
Definition: prover_client.py:115
zeth.core.prover_client.ProverConfiguration.__init__
def __init__(self, str zksnark_name, PairingParameters pairing_parameters)
Definition: prover_client.py:27
zeth.core.prover_client.ProverClient.get_verification_key
IVerificationKey get_verification_key(self)
Definition: prover_client.py:105
zeth.cli.zeth_deploy.int
int
Definition: zeth_deploy.py:27
zeth.core.prover_client.ProverClient.prover_config_file
prover_config_file
Definition: prover_client.py:60
zeth.core.prover_client.ProverConfiguration
Definition: prover_client.py:23
zeth.core.constants
Definition: constants.py:1
zeth.core.prover_client.ProverConfiguration.to_json_dict
Dict[str, Any] to_json_dict(self)
Definition: prover_client.py:31
zeth.core.prover_client.ProverClient.get_zksnark_provider
IZKSnarkProvider get_zksnark_provider(self)
Definition: prover_client.py:98
zeth.core.prover_client.ProverClient
Definition: prover_client.py:53
zeth.core.prover_client.ProverClient.prover_config
prover_config
Definition: prover_client.py:78
zeth.api
Definition: __init__.py:1
zeth.core.pairing
Definition: pairing.py:1
zeth.core.prover_client.ProverConfiguration.from_json_dict
ProverConfiguration from_json_dict(Dict[str, Any] json_dict)
Definition: prover_client.py:38
zeth.core.prover_client.ProverClient.get_configuration
ProverConfiguration get_configuration(self)
Definition: prover_client.py:66
zeth.core.prover_client.ProverConfiguration.zksnark_name
zksnark_name
Definition: prover_client.py:28
zeth.core.prover_client.prover_configuration_from_proto
ProverConfiguration prover_configuration_from_proto(prover_pb2.ProverConfiguration prover_config_proto)
Definition: prover_client.py:44
zeth.core.zksnark
Definition: zksnark.py:1
zeth.core.pairing.pairing_parameters_from_proto
PairingParameters pairing_parameters_from_proto(ec_group_messages_pb2.PairingParameters pairing_params_proto)
Definition: pairing.py:167
zeth.core.prover_client.ProverConfiguration.pairing_parameters
pairing_parameters
Definition: prover_client.py:29
zeth.core.prover_client.ProverClient.__init__
def __init__(self, str endpoint, Optional[str] prover_config_file=None)
Definition: prover_client.py:54
zeth.core.prover_client.ProverClient.endpoint
endpoint
Definition: prover_client.py:59