def ls_commits(ctx: Context) -> None: """ List all commitments in the joinsplit contract """ client_ctx = ctx.obj zeth_client, _mixer_desc = create_zeth_client_and_mixer_desc(client_ctx) zeth_address = load_zeth_address(client_ctx) wallet = open_wallet(zeth_client.mixer_instance, zeth_address.addr_sk, client_ctx) print("COMMITMENTS:") for commit in wallet.merkle_tree.get_leaves(): print(f" {short_commitment(commit)}")
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, mid, next_addr)) return wallet_list
def mix( mixer_addr: str, username: str, password: str, vin_pub: EtherValue, vout_pub: EtherValue, inputs: List[Tuple[int, ZethNote]], outputs: List[Tuple[ZethAddressPub, EtherValue]], mids: List[int] ) : """ Generic mix function """ # Some sanity checks if len(inputs) > JS_INPUTS: raise ClickException(f"too many inputs (max {JS_INPUTS})") if len(outputs) > JS_OUTPUTS: raise ClickException(f"too many outputs (max {JS_OUTPUTS})") 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( merkle_trees, zeth_address.ownership_keypair(), fisco_bcos_address, inputs, outputs, vin_pub, vout_pub, tx_value) print("receipt status: {},receipt output: {}", receipt['status'], receipt['output']) if receipt['status'] == '0x0': return True else: return False
def ls_commits(username: str) -> None: """ List all commitments in the joinsplit contract """ #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(None, zeth_address.addr_sk, username) #print("COMMITMENTS:") commits = [] for commit in wallet.merkle_tree.get_leaves(): #print(f" {short_commitment(commit)}") commits.append(commit) return commits
def mix( ctx: Context, vin: str, vout: str, input_notes: List[str], output_specs: List[str], eth_addr: Optional[str], wait: bool) -> None: """ Generic mix function """ # Some sanity checks if len(input_notes) > JS_INPUTS: raise ClickException(f"too many inputs (max {JS_INPUTS})") if len(output_specs) > JS_OUTPUTS: raise ClickException(f"too many outputs (max {JS_OUTPUTS})") print(f"vin = {vin}") print(f"vout = {vout}") vin_pub = EtherValue(vin) vout_pub = EtherValue(vout) client_ctx = ctx.obj zeth_client, mixer_desc = create_zeth_client_and_mixer_desc(client_ctx) zeth_address = load_zeth_address(client_ctx) wallet = open_wallet( zeth_client.mixer_instance, zeth_address.addr_sk, client_ctx) inputs: List[Tuple[int, ZethNote]] = [ wallet.find_note(note_id).as_input() for note_id in input_notes] outputs: List[Tuple[ZethAddressPub, EtherValue]] = [ parse_output(out_spec) for out_spec in output_specs] # Compute input and output value total and check that they match input_note_sum = from_zeth_units( sum([int(note.value, 16) for _, note in inputs])) output_note_sum = sum([value for _, value in outputs], EtherValue(0)) if vin_pub + input_note_sum != vout_pub + output_note_sum: raise ClickException("input and output value mismatch") eth_address = load_eth_address(eth_addr) # If instance uses an ERC20 token, tx_value can be 0 not default vin_pub. tx_value: Optional[EtherValue] = None if mixer_desc.token: tx_value = EtherValue(0) tx_hash = zeth_client.joinsplit( wallet.merkle_tree, zeth_address.ownership_keypair(), eth_address, inputs, outputs, vin_pub, vout_pub, tx_value) if wait: do_sync(zeth_client.web3, wallet, tx_hash) else: print(tx_hash)
def depositBac(request) -> None: result = {} req = json.loads(request.body) if req['token_amount'] != (req['value1'] + req['value2']): result['status'] = 1 result[ 'text'] = 'deposit token_amount is not equal to output value1 plus value2' return JsonResponse(result) keystore_file = "{}/{}/{}".format(USER_DIR, req['username'], FISCO_ADDRESS_FILE) addr_file = "{}/{}/{}".format(USER_DIR, req['username'], ADDRESS_FILE_DEFAULT) if exists(keystore_file) and exists(addr_file): ''' while (merkletree.objects.all().count() and not merkletree.objects.all().last().is_new): time.sleep(1) print("sleep") sqlResult = merkletree.objects.all().last() blockNumber = 1; if sqlResult: sqlResult.is_new = False sqlResult.save() blockNumber = sqlResult.blockNumber ''' outputapprove = token_approve(req['token_amount'], req['mixer_address'], req['token_address'], req['username'], req['password']) if outputapprove: zeth_address = load_zeth_address(req['username']) output_specs = [] print(str(zeth_address.addr_pk) + ',' + str(req['value1'])) output_specs.append( str(zeth_address.addr_pk) + ',' + str(req['value1'])) output_specs.append( str(zeth_address.addr_pk) + ',' + str(req['value2'])) outputdeposit = deposit(req['mixer_address'], req['username'], req['password'], req['token_amount'], output_specs) # todo if outputdeposit: ''' event_sync(req['mixer_address'], blockNumber) js_secret = load_zeth_address_secret(req['username']) wallet = open_wallet(None, js_secret, req['username']) total = EtherValue(0) commits = [] for addr, short_commit, value in wallet.note_summaries(): total = total + value commits.append(short_commit) result['status'] = 0 result['commits'] = commits result['total_value'] = total.ether() ''' traType = "deposit" output_specstr = output_specs[0] + ';' + output_specs[1] sqlInsert = "insert into transactions (traType, username, vin, vout, output_specs) values (%s, %s, %s, %s, %s);" db.ping(reconnect=True) cursor.execute(sqlInsert, [ traType, req['username'], req['token_amount'], 0, output_specstr ]) db.commit() result['status'] = 0 result['text'] = 'deposit success' return JsonResponse(result) else: ''' if models.merkletree.objects.all().count(): sqlResult.is_new = True sqlResult.save() ''' result['status'] = 1 result['text'] = 'deposit failed' return JsonResponse(result) else: result['status'] = 1 result['text'] = 'token approve failed' return JsonResponse(result) result['status'] = 1 result[ 'text'] = 'your account is not recorded in server, please import it firstly or create a new one' return JsonResponse(result)