示例#1
0
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)}")
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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)
示例#6
0
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)