Skip to content

Commit

Permalink
support multi-tree
Browse files Browse the repository at this point in the history
  • Loading branch information
youwenbusi committed Aug 19, 2020
1 parent aee9646 commit 7e6a262
Show file tree
Hide file tree
Showing 20 changed files with 211 additions and 132 deletions.
10 changes: 5 additions & 5 deletions api/zeth_messages_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions api/zeth_messages_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class JoinsplitInput(google___protobuf___message___Message):

class ProofInputs(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
mk_root = ... # type: typing___Text
mk_roots = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text]
pub_in_value = ... # type: typing___Text
pub_out_value = ... # type: typing___Text
h_sig = ... # type: typing___Text
Expand All @@ -98,7 +98,7 @@ class ProofInputs(google___protobuf___message___Message):

def __init__(self,
*,
mk_root : typing___Optional[typing___Text] = None,
mk_roots : typing___Optional[typing___Iterable[typing___Text]] = None,
js_inputs : typing___Optional[typing___Iterable[JoinsplitInput]] = None,
js_outputs : typing___Optional[typing___Iterable[ZethNote]] = None,
pub_in_value : typing___Optional[typing___Text] = None,
Expand All @@ -111,6 +111,6 @@ class ProofInputs(google___protobuf___message___Message):
def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def ClearField(self, field_name: typing_extensions___Literal[u"h_sig",u"js_inputs",u"js_outputs",u"mk_root",u"phi",u"pub_in_value",u"pub_out_value"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"h_sig",u"js_inputs",u"js_outputs",u"mk_roots",u"phi",u"pub_in_value",u"pub_out_value"]) -> None: ...
else:
def ClearField(self, field_name: typing_extensions___Literal[u"h_sig",b"h_sig",u"js_inputs",b"js_inputs",u"js_outputs",b"js_outputs",u"mk_root",b"mk_root",u"phi",b"phi",u"pub_in_value",b"pub_in_value",u"pub_out_value",b"pub_out_value"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"h_sig",b"h_sig",u"js_inputs",b"js_inputs",u"js_outputs",b"js_outputs",u"mk_roots",b"mk_roots",u"phi",b"phi",u"pub_in_value",b"pub_in_value",u"pub_out_value",b"pub_out_value"]) -> None: ...
12 changes: 10 additions & 2 deletions commands/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"""

FISCO_RPC_ENDPOINT_DEFAULT = "http://119.23.46.126:8545"
PROVER_SERVER_ENDPOINT_DEFAULT = "139.9.222.236:50051"
PROVER_SERVER_ENDPOINT_DEFAULT = "116.85.72.123:50051"

FISCO_ADDRESS_FILE = "fisco_account.keystore"
ADDRESS_FILE_DEFAULT = "zeth-address.json"
Expand All @@ -19,8 +19,16 @@
WALLET_USERNAME = "zbac"
USER_DIR = "user"

"""
DATABASE_DEFAULT_ADDRESS = "39.108.248.156"
DATABASE_DEFAULT_PORT = 3306
DATABASE_DEFAULT_USER = "root"
DATABASE_DEFAULT_PASSWORD = "xBj2019"
DATABASE_DEFAULT_PASSWORD = "******"
DATABASE_DEFAULT_DATABASE = "zkclient"
"""

DATABASE_DEFAULT_ADDRESS = "127.0.0.1"
DATABASE_DEFAULT_PORT = 3306
DATABASE_DEFAULT_USER = "root"
DATABASE_DEFAULT_PASSWORD = "8614"
DATABASE_DEFAULT_DATABASE = "merkletree"
48 changes: 33 additions & 15 deletions commands/event_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
from python_web3.client.event_callback import EventCallbackHandler
from zeth.contracts import _event_args_to_mix_result
from zeth.wallet import Wallet
from zeth.merkle_tree import sqlMerkleTree
from zeth.constants import ZETH_MERKLE_TREE_DEPTH
import math

'''
def usage():
Expand Down Expand Up @@ -51,24 +54,26 @@ def usage():
class LogMixEvent(object):
def __init__(
self,
mid: int,
root: bytes,
nullifiers: bytes(2),
commitments: bytes(2),
ciphertexts: bytes(2)):
self.mid = mid
self.root = root
self.nullifiers = nullifiers
self.commitments = commitments
self.ciphertexts = ciphertexts

def make_wallet() -> List[Wallet]:
def make_wallet(mid: int, next_addr: int) -> List[Wallet]:
'''
Return all the wallet in local server
'''
wallet_list = []
for username in os.listdir(USER_DIR):
wallet_dir = "{}/{}/{}".format(USER_DIR, username, WALLET_DIR_DEFAULT)
zeth_address = load_zeth_address(username)
wallet_list.append(Wallet(None, username, wallet_dir, zeth_address.addr_sk))
wallet_list.append(Wallet(None, username, wallet_dir, zeth_address.addr_sk, mid, next_addr))
return wallet_list

class EventCallbackImpl(EventCallbackHandler):
Expand All @@ -85,25 +90,39 @@ def on_event(self, eventdata):
logresult = self.abiparser.parse_event_logs(eventdata["logs"])
print("--------------------EventCallbackImpl--------------------\n")
blockNumber = eventdata["logs"][0]['blockNumber']
print("the blockNumber in log is :", blockNumber)
logMix = logresult[0]['eventdata']
logMixEvent = LogMixEvent(logMix[0],logMix[1], logMix[2], logMix[3])
logMixEvent = LogMixEvent(logMix[0],logMix[1], logMix[2], logMix[3], logMix[4])
mix_result = _event_args_to_mix_result(logMixEvent)
mid = mix_result.mid
# load merkletree from database
merkle_tree = sqlMerkleTree.open(int(math.pow(2, ZETH_MERKLE_TREE_DEPTH)), mid)
#print("init root: ", merkle_tree.get_root())
# check merkel root whether is new or not
new_merkle_root = mix_result.new_merkle_root
print("new_merkle_root in log: ", new_merkle_root)
for wallet in make_wallet():
# check merkel root
if new_merkle_root==wallet.merkle_tree.get_root():
return
print("new_merkle_roots in log: ", new_merkle_root)
if new_merkle_root == merkle_tree.get_root():
return

# get the next_address of updated tree
next_addr = merkle_tree.get_num_entries()

# update each merkletree
for out_ev in mix_result.output_events:
print("commitment: ", out_ev.commitment)
merkle_tree.insert(out_ev.commitment)
merkle_tree.recompute_root()
merkle_tree.save(blockNumber,mid)
print(f"The update_merkle_root of {mid} is {merkle_tree.get_root()}")

# update each user's wallet
for wallet in make_wallet(mid, next_addr):
# received_notes
wallet.blockNumber = blockNumber
print("blockNumber:", blockNumber)
wallet.receive_notes(mix_result.output_events)
spent_commits = wallet.mark_nullifiers_used(mix_result.nullifiers)
for commit in spent_commits:
print(f"{wallet.username} spent commits: {commit}")
wallet.update_and_save_state()
update_merkle_root = wallet.merkle_tree.get_root()
print(f"The update_merkle_root in wallet of {wallet.username} is {update_merkle_root}")


@command()
Expand All @@ -127,11 +146,12 @@ def event_sync(mixer_addr: str):
eventcallback = EventCallbackImpl()
eventcallback.abiparser = abiparser
blockNumber = 0
# maybe change to use cursor.lastrowid to get the last row
sqlSearch = "select * from merkletree"
cursor.execute(sqlSearch)
results = cursor.fetchall()
if results:
blockNumber = results[0][2]
blockNumber = results[-1][2]
print("blockNumber: ", blockNumber)
result = bcos_event.register_eventlog_filter(
eventcallback, abiparser, [mixer_addr], "LogMix", indexed_value, str(blockNumber+1))
Expand All @@ -148,12 +168,10 @@ def event_sync(mixer_addr: str):
print("Exception!")
import traceback
traceback.print_exc()
db.close()
finally:
print("event callback finished!")
if bcos_event.client is not None:
bcos_event.client.finish()
db.close()
sys.exit(-1)


Expand Down
6 changes: 4 additions & 2 deletions commands/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,13 +165,15 @@ def load_zeth_address(username: str) -> ZethAddress:
def open_wallet(
mixer_instance: Any,
js_secret: ZethAddressPriv,
username: str
username: str,
mids: List[int],
next_addrs: List[int]
) -> Wallet:
"""
Load a wallet using a secret key.
"""
wallet_dir = "{}/{}/{}".format(USER_DIR, username, WALLET_DIR_DEFAULT)
return Wallet(mixer_instance, username, wallet_dir, js_secret)
return Wallet(mixer_instance, username, wallet_dir, js_secret, mids, next_addrs)


def do_sync(
Expand Down
5 changes: 3 additions & 2 deletions commands/zeth_deploy.py

Large diffs are not rendered by default.

15 changes: 10 additions & 5 deletions commands/zeth_deposit.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@
load_zeth_address, open_wallet, parse_output, do_sync
from zeth.constants import JS_INPUTS, JS_OUTPUTS
from commands.constants import PROVER_SERVER_ENDPOINT_DEFAULT
from zeth.constants import ZETH_MERKLE_TREE_DEPTH
from zeth.mixer_client import ZethAddressPub
from zeth.utils import EtherValue, from_zeth_units
from zeth.merkle_tree import sqlMerkleTree
from api.zeth_messages_pb2 import ZethNote
from click import ClickException
from typing import List, Tuple, Optional
from contract.Groth16Mixer import Groth16Mixer
from python_web3.eth_account.account import Account

import math

def deposit(
mixer_addr: str,
Expand All @@ -35,9 +37,10 @@ def deposit(
zeth_client = create_zeth_client_and_mixer_desc(PROVER_SERVER_ENDPOINT_DEFAULT, mixer_addr, username, password)

zeth_address = load_zeth_address(username)
'''
wallet = open_wallet(
zeth_client.mixer_instance, zeth_address.addr_sk, username)

zeth_client.mixer_instance, zeth_address.addr_sk, username, )
'''
outputs: List[Tuple[ZethAddressPub, EtherValue]] = [
parse_output(out_spec) for out_spec in output_specs]

Expand All @@ -52,9 +55,11 @@ def deposit(
tx_value: Optional[EtherValue] = EtherValue(0)
#if mixer_desc.token:
# tx_value = EtherValue(0)

merkle_trees = []
for i in range(2):
merkle_trees.append(sqlMerkleTree.open(int(math.pow(2, ZETH_MERKLE_TREE_DEPTH)), 0))
(outputresult, receipt) = zeth_client.deposit(
wallet.merkle_tree,
merkle_trees,
zeth_address,
fisco_bcos_address,
vin_pub,
Expand Down
2 changes: 1 addition & 1 deletion commands/zeth_ls_notes.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def ls_notes(username: str):
#mixer_instance = mixer_desc.mixer.instantiate(web3)
#mixer_instance = Groth16Mixer(mixer_addr)
js_secret = load_zeth_address_secret(username)
wallet = open_wallet(None, js_secret, username)
wallet = open_wallet(None, js_secret, username,None, None)

total = EtherValue(0)
commits = []
Expand Down
20 changes: 15 additions & 5 deletions commands/zeth_mix.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# SPDX-License-Identifier: LGPL-3.0+

from commands.utils import create_zeth_client_and_mixer_desc, \
load_zeth_address, open_wallet, parse_output, do_sync
load_zeth_address, parse_output, do_sync
from zeth.constants import JS_INPUTS, JS_OUTPUTS
from commands.constants import PROVER_SERVER_ENDPOINT_DEFAULT
from zeth.mixer_client import ZethAddressPub
Expand All @@ -13,6 +13,9 @@
from typing import List, Tuple, Optional
from contract.Groth16Mixer import Groth16Mixer
from python_web3.eth_account.account import Account
from zeth.merkle_tree import sqlMerkleTree
from zeth.constants import ZETH_MERKLE_TREE_DEPTH
import math

def mix(
mixer_addr: str,
Expand All @@ -21,7 +24,8 @@ def mix(
vin_pub: EtherValue,
vout_pub: EtherValue,
inputs: List[Tuple[int, ZethNote]],
outputs: List[Tuple[ZethAddressPub, EtherValue]]
outputs: List[Tuple[ZethAddressPub, EtherValue]],
mids: List[int]
) :
"""
Generic mix function
Expand All @@ -34,18 +38,24 @@ def mix(
zeth_client = create_zeth_client_and_mixer_desc(PROVER_SERVER_ENDPOINT_DEFAULT, mixer_addr, username, password)

zeth_address = load_zeth_address(username)
'''
wallet = open_wallet(
zeth_client.mixer_instance, zeth_address.addr_sk, username)

'''
#eth_address = load_eth_address(eth_addr)
fisco_bcos_address = zeth_client.mixer_instance.client.ecdsa_account.address
# If instance uses an ERC20 token, tx_value can be 0 not default vin_pub.
tx_value: Optional[EtherValue] = EtherValue(0)
#if mixer_desc.token:
# tx_value = EtherValue(0)

if len(mids) < JS_INPUTS:
mids.append(0)
print("mids: ", mids)
merkle_trees = []
for mid in mids:
merkle_trees.append(sqlMerkleTree.open(int(math.pow(2, ZETH_MERKLE_TREE_DEPTH)), mid))
(outputresult, receipt) = zeth_client.joinsplit(
wallet.merkle_tree,
merkle_trees,
zeth_address.ownership_keypair(),
fisco_bcos_address,
inputs,
Expand Down
Loading

0 comments on commit 7e6a262

Please sign in to comment.