def auth_user(request):
    user_id = request.POST.get('user_id')
    user_password = request.POST.get('user_password')

    contract_name = "Admin"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "valid_psd",
                      [user_id, user_password])
    client.finish()

    code_map = {
        1: 0,  # success 
        -1: -1,  # user don't exists
        -2: -2,  # wrong password
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #2
0
 def fisco_add_data(self, func_name, args):
     client = BcosClient()
     try:
         print('start')
         # 发送交易
         receipt = client.sendRawTransactionGetReceipt(self.contract_address, self.contract_abi, func_name, args)
         print("receipt:", receipt)
         # 解析receipt里的log
         print("parse receipt and transaction:--------------------------------------")
         tx_hash = receipt['transactionHash']
         print("transaction hash: ", tx_hash)
         log_result = self.data_parser.parse_event_logs(receipt["logs"])
         i = 0
         for log in log_result:
             if func_name in log:
                 i = i + 1
                 print("{}): log name: {} , data: {}".format(i, log[func_name], log['eventdata']))
         # 获取对应的交易数据,解析出调用方法名和参数
         tx_response = client.getTransactionByHash(tx_hash)
         input_result = self.data_parser.parse_transaction_input(tx_response['input'])
         print("transaction input parse:", tx_hash)
         print(input_result)
         # 解析该交易在receipt里输出的output,即交易调用的方法的return值
         output_result = self.data_parser.parse_receipt_output(input_result['name'], receipt['output'])
         print("receipt output :", output_result)
         return output_result,tx_hash
     except:
         pass
     finally:
         # 关闭连接
         client.finish()
def get_transaction_info(request):
    transaction_id = int(request.POST.get('transaction_id'))

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "get_transaction_info",
                      [transaction_id])
    client.finish()

    transaction_info = {
        "user_id_sell": res[1],
        "user_id_buy": res[2],
        "desc": res[3],
        "commodity_id": res[4],
        "price": res[5],
        "state": res[6],
        "id": transaction_id,
    }

    ret_code = 0 if transaction_info["state"] != -999 else -1
    response = {
        "code": ret_code,
    }
    if ret_code == 0:
        response["transaction"] = transaction_info

    return JsonResponse(response)
def get_arbitration_reason(request):
    transaction_id = int(request.POST.get('transaction_id'))

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "get_arbitration_reason",
                      [transaction_id])
    client.finish()

    arbitration_reason = res[0]

    if arbitration_reason == "NULL":
        ret_code = -1  # no such transaction
        arbitration_reason = ""
    else:
        ret_code = 0  # success

    return JsonResponse({
        "code": ret_code,
        "arbitration_reason": arbitration_reason,
    })
def get_commodity_info(request):
    commodity_id = int(request.POST.get('commodity_id'))

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "get_commodity_info",
                      [commodity_id])
    client.finish()

    commodity_info = {
        "owner": res[0],
        "name": res[1],
        "image": res[2],
        "desc": res[3],
        "price": res[4],
        "state": res[5],
        "id": res[6],
        "type": res[7],
    }

    ret_code = 0 if commodity_info["state"] != -999 else -1
    response = {
        "code": ret_code,
    }
    if ret_code == 0:
        response["commodity"] = commodity_info

    return JsonResponse(response)
def get_user_info(request):
    user_id = request.POST.get('user_id')

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "get_user_info",
                      [user_id])
    client.finish()

    user_info = {
        "id": res[0],
        "info": res[1],
        "balance": res[2],
        "state": res[3],
    }

    ret_code = 0 if user_info["state"] != -999 else -1
    response = {
        "code": ret_code,
    }
    if ret_code == 0:
        response["user"] = user_info

    return JsonResponse(response)
def buy_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_id = int(request.POST.get('commodity_id'))
    transaction_desc = request.POST.get('transaction_desc', "")

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "buy_commodity",
        [user_id, commodity_id, transaction_desc])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # commodity state error
        -3: -3,  # no enough money
        -4: -4,  # unable to change owner of commodity
        -5: -5,  # ubable to generate transaction
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
def deal_arbitration(request):
    transaction_id = int(request.POST.get('transaction_id'))
    arbitration_valid = int(request.POST.get('arbitration_valid'))

    contract_name = "Admin"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "deal_arbitration",
        [transaction_id, arbitration_valid])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success
        -1: -1,  # no such transaction
        -2: -2,  # unable to undo transaction
        -3: -3,  # unable to change transaction state
        -4: -4,  # unable to change commodity state
        -5: 0,  # success
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
def main(argv):
    global parser
    global client
    if len(argv) < 3:
        usage()
        exit(0)

    contractname = argv[0]
    address = argv[1]
    event_name = argv[2]
    indexed_value = argv[3:]

    try:
        print("usage input {},{},{},{}".format(contractname, address,
                                               event_name, indexed_value))
        if address == "last":
            cn = ContractNote()
            address = cn.get_last(contractname)
            print("hex address :", address)
        abifile = "contracts/" + contractname + ".abi"
        parser = DatatypeParser(abifile)
        client = BcosClient()
        print(client.getinfo())
        register_event_callback([address], event_name, indexed_value)
    except Exception as e:
        import traceback
        traceback.print_exc()
        client.finish()
        import time
        time.sleep(0.5)
        sys.exit(-1)
def down_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_id = int(request.POST.get('commodity_id'))

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(contract_address,
                                                  contract_abi,
                                                  "putdown_commodity",
                                                  [user_id, commodity_id])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        1: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # unknown error
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #11
0
def fisco_add_data_demo():
    try:
        client = BcosClient()
        print(client.getinfo())

        abi_file = os.path.join(settings.SITE_ROOT, "contracts",
                                "HelloWorld.abi")
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        # 发送交易,调用一个改写数据的接口
        print(
            "\n>>sendRawTransaction:----------------------------------------------------"
        )
        to_address = '0x548fd1e8af9ca9131c04ab7e1031579f6498ddaf'  # use new deploy address
        args = ["xy1211ddd"]

        receipt = client.sendRawTransactionGetReceipt(to_address, contract_abi,
                                                      "set", args)
        print("receipt:", receipt)

        # 解析receipt里的log
        print(
            "\n>>parse receipt and transaction:--------------------------------------"
        )
        tx_hash = receipt['transactionHash']
        print("transaction hash: ", tx_hash)
        log_result = data_parser.parse_event_logs(receipt["logs"])
        i = 0
        for log in log_result:
            if 'eventname' in log:
                i = i + 1
                print("{}): log name: {} , data: {}".format(
                    i, log['eventname'], log['eventdata']))
        # 获取对应的交易数据,解析出调用方法名和参数

        tx_response = client.getTransactionByHash(tx_hash)
        input_result = data_parser.parse_transaction_input(
            tx_response['input'])
        print("transaction input parse:", tx_hash)
        print(input_result)

        # 解析该交易在receipt里输出的output,即交易调用的方法的return值
        output_result = data_parser.parse_receipt_output(
            input_result['name'], receipt['output'])
        print("receipt output :", output_result)

        # 调用一下call,获取数据
        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "get")
        print("call get result:", res)

        # 关闭连接
        client.finish()

    except:
        pass
def initiate_arbitration(request):
    user_id = request.POST.get('user_id')
    transaction_id = int(request.POST.get('transaction_id'))
    arbitration_reason = request.POST.get('arbitration_reason')

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "initiate_arbitration",
        [user_id, transaction_id, arbitration_reason])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # no such transaction
        -3: -3,  # unable to change state
        -4: -4,  # arbitration timeout
        -5: -5,  # unknown error
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
def user_transaction_sell_list(request):
    user_id = request.POST.get('user_id')

    max_item_count = request.POST.get("page_max_items")
    page_id = request.POST.get("page_id")
    if max_item_count is None or page_id is None:
        max_item_count = page_id = None
    else:
        max_item_count = int(max_item_count)
        page_id = int(page_id)
        if max_item_count < 1 or page_id < 0:
            max_item_count = page_id = None

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    sell_res = client.call(contract_address, contract_abi,
                           "get_transaction_sell_list", [user_id])

    transaction_sell_list = []
    transaction_sell_count = 0
    for transaction_id in sell_res[0]:
        res = client.call(contract_address, contract_abi,
                          "get_transaction_info", [transaction_id])
        transaction_info = {
            "user_id_sell": res[1],
            "user_id_buy": res[2],
            "desc": res[3],
            "commodity_id": res[4],
            "price": res[5],
            "state": res[6],
            "id": transaction_id,
        }
        ret_code = 0 if transaction_info["state"] != -999 else -1
        if ret_code == 0:
            transaction_sell_list.append(transaction_info)
            transaction_sell_count += 1

    client.finish()

    if max_item_count is None:
        page_num = 1 if len(transaction_sell_list) > 0 else 0
    else:
        page_num = (len(transaction_sell_list) + max_item_count -
                    1) // max_item_count
        transaction_sell_list = transaction_sell_list[page_id *
                                                      max_item_count:(page_id +
                                                                      1) *
                                                      max_item_count]

    return JsonResponse({
        "transaction_list": transaction_sell_list,
        "page_num": page_num,
    })
def user_commodity_list(request):
    user_id = request.POST.get('user_id')

    max_item_count = request.POST.get("page_max_items")
    page_id = request.POST.get("page_id")
    if max_item_count is None or page_id is None:
        max_item_count = page_id = None
    else:
        max_item_count = int(max_item_count)
        page_id = int(page_id)
        if max_item_count < 1 or page_id < 0:
            max_item_count = page_id = None

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, "get_commodity_list",
                      [user_id])

    commodity_id_list, commodity_count = res
    commodity_list = []
    for commodity_id in commodity_id_list:
        commodity_info = client.call(contract_address, contract_abi,
                                     "get_commodity_info", [commodity_id])
        commodity_info = {
            "owner": commodity_info[0],
            "name": commodity_info[1],
            "image": commodity_info[2],
            "desc": commodity_info[3],
            "price": commodity_info[4],
            "state": commodity_info[5],
            "id": commodity_info[6],
            "type": commodity_info[7],
        }
        if commodity_info["state"] != -999:
            commodity_list.append(commodity_info)

    client.finish()

    if max_item_count is None:
        page_num = 1 if len(commodity_list) > 0 else 0
    else:
        page_num = (len(commodity_list) + max_item_count - 1) // max_item_count
        commodity_list = commodity_list[page_id *
                                        max_item_count:(page_id + 1) *
                                        max_item_count]

    return JsonResponse({
        "commodity_list": commodity_list,
        "page_num": page_num,
    })
Beispiel #15
0
 def fisco_select_data(self, func_name, args):
     client = BcosClient()
     try:
         print('start')
         res = client.call(self.contract_address, self.contract_abi, func_name, args)
         print("call get result:", res)
         # 关闭连接
         client.finish()
         return res
     except:
         return None
def create_user(request):
    user_id = request.POST.get('user_id')
    user_password = request.POST.get('user_password')
    balance = int(request.POST.get('balance'))
    info = request.POST.get('info')

    contract_name = "Admin"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "create_user",
        [user_id, user_password, balance, info])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user already exists
        -2: -2,  # unknown error
    }
    ret_code = code_map[res[0]]

    if ret_code == 0:  # success create user
        contract_name = "Admin"
        contract_address = ContractNote.get_last(contract_name)

        abi_file = f"contracts/{contract_name}.abi"
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        client = BcosClient()
        receipt = client.sendRawTransactionGetReceipt(contract_address,
                                                      contract_abi, "login",
                                                      [user_id, user_password])
        client.finish()

    return JsonResponse({"code": ret_code})
def create_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_name = request.POST.get('commodity_name')
    commodity_desc = request.POST.get('commodity_desc')
    commodity_image = request.FILES.get('commodity_image')

    static_dir = settings.STATICFILES_DIRS[0]
    image_id = get_random_id(length=18)
    ext = os.path.splitext(commodity_image.name)[-1]
    image_name = image_id + ext
    image_save_path = os.path.join(static_dir, image_name)
    with open(image_save_path, 'wb') as f:
        for content in commodity_image.chunks():
            f.write(content)
    scale_image_too_big(image_save_path)
    commodity_image = "/static/" + image_name

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "create_commodity",
        [user_id, commodity_name, commodity_image, commodity_desc])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        1: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # unknown error
    }

    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #18
0
def call_contract2(contract_addr: str,
                   contract_name: str,
                   fn_name: str,
                   args: List = None,
                   signer: Signer_Impl = None):
    client = BcosClient()
    if signer is not None:
        client.default_from_account_signer = signer

    data_parser: DatatypeParser = DatatypeParser()
    data_parser.load_abi_file(f"Contracts/{contract_name}.abi")
    contract_abi = data_parser.contract_abi

    ret = client.call(contract_addr, contract_abi, fn_name, args)
    app.logger.info(
        f"call contract {contract_name} at {contract_addr}. {fn_name} ({args}) -> {ret}"
    )
    client.finish()
    return ret
Beispiel #19
0
def deploy_contract(contract,
                    is_compile: bool = False,
                    signer: Signer_Impl = None,
                    fn_args=None):
    """
    Args:
        contract: the contract's name, e.g.: "EngineerList"
        is_compile (bool): compile or not
    Returns:
        the contract address
    """
    if is_compile and (os.path.isfile(client_config.solc_path)
                       or os.path.isfile(client_config.solcjs_path)):
        Compiler.compile_file(f"Contracts/{contract}.sol",
                              output_path="Contracts")

    data_parser = DatatypeParser()
    data_parser.load_abi_file(f"Contracts/{contract}.abi")

    client = BcosClient()
    try:
        with open(f"Contracts/{contract}.bin", 'r') as load_f:
            contract_bin = load_f.read()
            load_f.close()
        result = client.deploy(contract_bin,
                               contract_abi=data_parser.contract_abi,
                               fn_args=fn_args,
                               from_account_signer=signer)
        addr = result["contractAddress"]
    except BcosError:
        traceback.print_exc()
        return None
    except BcosException:
        traceback.print_exc()
        return None
    except Exception:
        traceback.print_exc()
        return None
    finally:
        client.finish()
    app.logger.info(f"deploy contract {contract} at {addr}")
    return addr
Beispiel #20
0
    def test():
        # 初始化bcos客户端
        try:
            client = BcosClient()

            while True:
                model, epoch = client.call(to_address, contract_abi,
                                           "QueryGlobalModel")
                model = deserialize(model)
                ser_W, ser_b = model['ser_W'], model['ser_b']

                nonlocal test_epoch
                if epoch > test_epoch:
                    test_acc = global_testing(ser_W, ser_b)
                    print("Epoch: {:03}, test_acc: {:.4f}"\
                        .format(test_epoch, test_acc))
                    test_epoch = epoch

                wait()

        except Exception as e:
            client.finish()
            traceback.print_exc()
Beispiel #21
0
def call_contract(contract_addr: str,
                  contract_name: str,
                  fn_name: str,
                  args: List = None,
                  signer: Signer_Impl = None,
                  gasPrice=30000000):
    client = BcosClient()

    data_parser: DatatypeParser = DatatypeParser()
    data_parser.load_abi_file(f"Contracts/{contract_name}.abi")
    contract_abi = data_parser.contract_abi

    receipt = client.sendRawTransactionGetReceipt(to_address=contract_addr,
                                                  contract_abi=contract_abi,
                                                  fn_name=fn_name,
                                                  args=args,
                                                  from_account_signer=signer,
                                                  gasPrice=gasPrice)

    if receipt["status"] != "0x0":
        msg = receipt.get("statusMsg", "")
        app.logger.warn(
            f"call contract {contract_name} at {contract_addr}. {fn_name} ({args}) error:{msg}"
        )
        app.logger.warn(f"receipt: {receipt}")
        print(msg)
        raise Exception(f"contract error: {msg}")
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    outputresult = data_parser.parse_receipt_output(inputresult['name'],
                                                    receipt['output'])
    client.finish()
    app.logger.info(
        f"call contract {contract_name} at {contract_addr}. {fn_name} ({args}) -> {outputresult}"
    )
    return outputresult
def search_commodity(request):
    keywords = request.POST.get("keywords")
    keywords = [keyword for keyword in keywords.split(' ') if len(keyword) > 0]
    commodity_type = request.POST.get("commodity_type")

    reverse = bool(int(request.POST.get("reverse", '0')))

    max_item_count = request.POST.get("page_max_items")
    page_id = request.POST.get("page_id")
    if max_item_count is None or page_id is None:
        max_item_count = page_id = None
    else:
        max_item_count = int(max_item_count)
        page_id = int(page_id)
        if max_item_count < 1 or page_id < 0:
            max_item_count = page_id = None

    if commodity_type is None:
        query_method = "get_onsale_list"
        query_args = []
    else:
        commodity_type = int(commodity_type)
        query_method = "get_onsale_type_list"
        query_args = [commodity_type]

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, query_method, query_args)

    commodity_id_list, commodity_count = res
    commodity_list = []
    for commodity_id in commodity_id_list:
        commodity_info = client.call(contract_address, contract_abi,
                                     "get_commodity_info", [commodity_id])
        commodity_info = {
            "owner": commodity_info[0],
            "name": commodity_info[1],
            "image": commodity_info[2],
            "desc": commodity_info[3],
            "price": commodity_info[4],
            "state": commodity_info[5],
            "id": commodity_info[6],
            "type": commodity_info[7],
        }
        if commodity_info["state"] != -999:
            commodity_list.append(commodity_info)

    client.finish()

    commodity_match_score_list = []
    for commodity_info in commodity_list:
        score = 0
        for keyword in keywords:
            score += int(keyword.lower() in commodity_info["name"].lower())
            score += int(keyword.lower() in commodity_info["desc"].lower())
        commodity_match_score_list.append(score)

    commodity_list = [
        item[0] for item in sorted(iter(
            i for i in zip(commodity_list, commodity_match_score_list)
            if i[1] > 0),
                                   key=lambda x: x[1],
                                   reverse=True)
    ]

    if reverse:
        commodity_list.reverse()

    if max_item_count is None:
        page_num = 1 if len(commodity_list) > 0 else 0
    else:
        page_num = (len(commodity_list) + max_item_count - 1) // max_item_count
        commodity_list = commodity_list[page_id *
                                        max_item_count:(page_id + 1) *
                                        max_item_count]

    return JsonResponse({
        "commodity_list": commodity_list,
        "page_num": page_num,
    })
i = 0
for log in logresult:
    if 'eventname' in log:
        i = i + 1
        print("{}): log name: {} , data: {}".format(i,log['eventname'],log['eventdata']))
#获取对应的交易数据,解析出调用方法名和参数

txresponse = client.getTransactionByHash(txhash)
inputresult = data_parser.parse_transaction_input(txresponse['input'])
print("transaction input parse:",txhash)
print(inputresult)

#解析该交易在receipt里输出的output,即交易调用的方法的return值
outputresult  = data_parser.parse_receipt_output(inputresult['name'], receipt['output'])
print("receipt output :",outputresult)


#调用一下call,获取数据
print("\n>>Call:------------------------------------------------------------------------")
res = client.call(to_address,contract_abi,"getbalance")
print("call getbalance result:",res)
res = client.call(to_address,contract_abi,"getbalance1",[100])
print("call getbalance1 result:",res)
res = client.call(to_address,contract_abi,"getname")
print("call getname:",res)
res = client.call(to_address,contract_abi,"getall")
print("call getall result:",res)
print("demo_tx,total req {}".format(client.request_counter))
client.finish()

Beispiel #24
0
def fisco_add_data_demo1():
    try:
        client = BcosClient()
        print(client.getinfo())
        print(client.client_account)
        abi_file = os.path.join(settings.SITE_ROOT, "contracts",
                                "UserTempInfo.abi")
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        # 发送交易,调用一个改写数据的接口
        # print("\n>>sendRawTransaction:----------------------------------------------------")
        to_address = '0x2b042831e72894e292507629bec3ae4886f6fe06'  # use new deploy address
        args = ['99999', '武汉', '38.9度', 20000]

        receipt = client.sendRawTransactionGetReceipt(to_address, contract_abi,
                                                      "insert", args)
        print("receipt:", receipt)

        # # 调用一下call,获取数据
        # args = ['99']
        # print("\n>>Call:------------------------------------------------------------------------")
        # res = client.call(to_address, contract_abi, "select", args)
        # print("call get result:", res)

        # 解析receipt里的log
        print(
            "\n>>parse receipt and transaction:--------------------------------------"
        )
        tx_hash = receipt['transactionHash']
        print("transaction hash: ", tx_hash)
        log_result = data_parser.parse_event_logs(receipt["logs"])
        i = 0
        for log in log_result:
            if 'eventname' in log:
                i = i + 1
                print("{}): log name: {} , data: {}".format(
                    i, log['eventname'], log['eventdata']))
        # 获取对应的交易数据,解析出调用方法名和参数

        tx_response = client.getTransactionByHash(tx_hash)
        input_result = data_parser.parse_transaction_input(
            tx_response['input'])
        print("transaction input parse:", tx_hash)
        print(input_result)

        # 解析该交易在receipt里输出的output,即交易调用的方法的return值
        output_result = data_parser.parse_receipt_output(
            input_result['name'], receipt['output'])
        print("receipt output :", output_result)

        # 调用一下call,获取数据
        args = ['99999']
        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "select", args)
        print("call get result:", res)

        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "selectLatest", args)
        print("call get result:", res)

        # 关闭连接
        client.finish()

    except:
        pass
Beispiel #25
0
class Loan_Contract:
    def __init__(self, address: str):
        # 从文件加载abi定义
        # Now file has been complied. Use .abi directly.

        if os.path.isfile(client_config.solc_path) or os.path.isfile(
                client_config.solcjs_path):
            Compiler.compile_file("contracts/Loan.sol")

        abi_file = "contracts/Loan.abi"
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        self.contract_abi = data_parser.contract_abi

        self.client = BcosClient()

        self.to_address = address

    def get_bank_info_by_index(self, index: int):
        bank_inf = self.client.call(self.to_address, self.contract_abi,
                                    "banks", [index])
        return {"bankName": bank_inf[0]}

    def get_company_info_by_index(self, index: int):
        cp_inf = self.client.call(self.to_address, self.contract_abi,
                                  "companies", [index])
        return {
            "companyName": cp_inf[0],
            "companyType": cp_inf[1],
            "isTrusted": cp_inf[2],
            "creditAsset": cp_inf[3],
            "realMoney": cp_inf[4]
        }

    def get_receipt_info_by_index(self, index: int):
        receipt_inf = self.client.call(self.to_address, self.contract_abi,
                                       "receipts", [index])
        return {
            "Name_A": receipt_inf[0],
            "Name_B": receipt_inf[1],
            "bankParticipation": receipt_inf[2],
            "isRealMoney": receipt_inf[3],
            "amount": receipt_inf[4]
        }

    def get_bank_inf_by_name(self, bName: str):
        bank_inf = self.client.call(self.to_address, self.contract_abi,
                                    "getBankInfoByName", [bName])
        return {"bankName": bank_inf[0]}

    def get_company_inf_by_name(self, cpName: str):
        cp_inf = self.client.call(self.to_address, self.contract_abi,
                                  "getCompanyInfoByName", [cpName])
        return {
            "companyName": cp_inf[0],
            "companyType": cp_inf[1],
            "isTrusted": cp_inf[2],
            "creditAsset": cp_inf[3],
            "realMoney": cp_inf[4]
        }

    def get_AmountOfCreditAsset_bank_GiveTo_TrustedCompany(
            self, bName: str, cpName: str):
        result = self.client.call(
            self.to_address, self.contract_abi,
            "getAmountOfCreditAsset_bankGiveToTrustedCompany", [bName, cpName])
        return {"amount": result[0]}

    def get_company_num(self):
        result = self.client.call(self.to_address, self.contract_abi,
                                  "getCompanyNum")
        return {"companyNum": result[0]}

    def get_bank_num(self):
        result = self.client.call(self.to_address, self.contract_abi,
                                  "getBankNum")
        return {"bankNum": result[0]}

    def get_receipt_num(self):
        result = self.client.call(self.to_address, self.contract_abi,
                                  "getReceiptNum")
        return {"receiptNum": result[0]}

    def exit(self):
        self.client.finish()
Beispiel #26
0
def run_one_node(node_id):
    """指定一个node id,并启动一个进程"""

    batch_size = 100
    learning_rate = 0.001
    trained_epoch = -1
    node_index = int(node_id.split('_')[-1])

    # 初始化bcos客户端
    try:
        client = BcosClient()
        # 为了更好模拟真实多个客户端场景,给不同的客户端分配不同的地址
        client.set_from_account_signer(node_id)
        print("{} initializing....".format(node_id))
    except Exception as e:
        client.finish()
        traceback.print_exc()

    def local_training():
        print("{} begin training..".format(node_id))
        try:
            model, epoch = client.call(to_address, contract_abi,
                                       "QueryGlobalModel")
            model = deserialize(model)

            tf.reset_default_graph()

            n_samples = X_train[node_index].shape[0]

            x = tf.placeholder(tf.float32, [None, n_features])
            y = tf.placeholder(tf.float32, [None, n_class])

            ser_W, ser_b = model['ser_W'], model['ser_b']
            W = tf.Variable(ser_W)
            b = tf.Variable(ser_b)

            pred = tf.matmul(x, W) + b

            # 定义损失函数
            cost = tf.reduce_mean(
                tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

            # 梯度下降
            # optimizer = tf.train.AdamOptimizer(learning_rate)
            optimizer = tf.train.GradientDescentOptimizer(learning_rate)

            gradient = optimizer.compute_gradients(cost)
            train_op = optimizer.apply_gradients(gradient)

            # 初始化所有变量
            init = tf.global_variables_initializer()

            # 训练模型
            with tf.Session(config=tf.ConfigProto(
                    device_count={'cpu': 0})) as sess:
                sess.run(init)

                avg_cost = 0
                total_batch = int(n_samples / batch_size)
                for i in range(total_batch):
                    _, c = sess.run(
                        [train_op, cost],
                        feed_dict={
                            x:
                            X_train[node_index][i * batch_size:(i + 1) *
                                                batch_size],
                            y:
                            y_train[node_index][i * batch_size:(i + 1) *
                                                batch_size, :]
                        })
                    avg_cost += c / total_batch

                # 获取更新量
                val_W, val_b = sess.run([W, b])

            delta_W = (ser_W - val_W) / learning_rate
            delta_b = (ser_b - val_b) / learning_rate
            delta_model = {
                'ser_W': delta_W.tolist(),
                'ser_b': delta_b.tolist()
            }
            meta = {'n_samples': n_samples, 'avg_cost': avg_cost}
            update_model = {'delta_model': delta_model, 'meta': meta}
            update_model = serialize(update_model)

            receipt = client.sendRawTransactionGetReceipt(
                to_address, contract_abi, "UploadLocalUpdate",
                [update_model, epoch])

            nonlocal trained_epoch
            trained_epoch = epoch

        except Exception as e:
            client.finish()
            traceback.print_exc()

        return

    def local_testing(ser_W, ser_b):
        tf.reset_default_graph()

        x = tf.placeholder(tf.float32, [None, n_features])
        y = tf.placeholder(tf.float32, [None, n_class])

        W = tf.Variable(ser_W)
        b = tf.Variable(ser_b)
        pred = tf.matmul(x, W) + b

        correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

        # 初始化所有变量
        init = tf.global_variables_initializer()

        # 训练模型
        with tf.Session(config=tf.ConfigProto(
                device_count={'cpu': 0})) as sess:
            sess.run(init)
            acc = accuracy.eval({
                x: X_train[node_index],
                y: y_train[node_index]
            })

        return acc

    def local_scoring():
        try:
            res = client.call(to_address, contract_abi, "QueryAllUpdates")
            updates = res[0]

            # 如果获取不了任何更新信息,则认为还不能开始评分
            if len(updates) == 0:
                return

            updates = deserialize(updates)

            model, epoch = client.call(to_address, contract_abi,
                                       "QueryGlobalModel")
            model = deserialize(model)

            print("{} begin scoring..".format(node_id))
            scores = {}
            for trainer_id, update in updates.items():
                update = deserialize(update)
                delta_model, meta = update['delta_model'], update['meta']
                ser_W = [
                    a - learning_rate * b
                    for a, b in zip(np.array(model['ser_W']),
                                    np.array(delta_model['ser_W']))
                ]
                ser_b = [
                    a - learning_rate * b
                    for a, b in zip(np.array(model['ser_b']),
                                    np.array(delta_model['ser_b']))
                ]
                scores[trainer_id] = np.asscalar(
                    local_testing(
                        np.array(ser_W).astype(np.float32),
                        np.array(ser_b).astype(np.float32)))

            receipt = client.sendRawTransactionGetReceipt(
                to_address, contract_abi, "UploadScores",
                [epoch, serialize(scores)])

            nonlocal trained_epoch
            trained_epoch = epoch

        except Exception as e:
            client.finish()
            traceback.print_exc()

        return

    def wait():
        time.sleep(random.uniform(QUERY_INTERVAL, QUERY_INTERVAL * 3))
        return

    def main_loop():

        # 注册节点
        try:
            receipt = client.sendRawTransactionGetReceipt(
                to_address, contract_abi, "RegisterNode", [])
            print("{} registered successfully".format(node_id))

            while True:

                (role, global_epoch) = client.call(to_address, contract_abi,
                                                   "QueryState")

                # print("{} role: {}, local e: {}, up_c: {}, sc_c: {}"\
                #     .format(node_id, role, trained_epoch,
                #             update_count, score_count))

                if global_epoch > MAX_EPOCH:
                    break

                if global_epoch <= trained_epoch:
                    # print("{} skip.".format(node_id))
                    wait()
                    continue

                if role == ROLE_TRAINER:
                    local_training()

                if role == ROLE_COMM:
                    local_scoring()

                wait()

        except Exception as e:
            client.finish()
            traceback.print_exc()

        return

    main_loop()

    # 关闭客户端
    client.finish()
def market_commodity_list_order_by_price(request):
    commodity_type = request.POST.get("commodity_type")
    reverse = bool(int(request.POST.get("reverse", '0')))

    max_item_count = request.POST.get("page_max_items")
    page_id = request.POST.get("page_id")
    if max_item_count is None or page_id is None:
        max_item_count = page_id = None
    else:
        max_item_count = int(max_item_count)
        page_id = int(page_id)
        if max_item_count < 1 or page_id < 0:
            max_item_count = page_id = None

    if commodity_type is None:
        query_method = "get_onsale_list"
        query_args = []
    else:
        commodity_type = int(commodity_type)
        query_method = "get_onsale_type_list"
        query_args = [commodity_type]

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    res = client.call(contract_address, contract_abi, query_method, query_args)

    commodity_id_list, commodity_count = res
    commodity_list = []
    for commodity_id in commodity_id_list:
        commodity_info = client.call(contract_address, contract_abi,
                                     "get_commodity_info", [commodity_id])
        commodity_info = {
            "owner": commodity_info[0],
            "name": commodity_info[1],
            "image": commodity_info[2],
            "desc": commodity_info[3],
            "price": commodity_info[4],
            "state": commodity_info[5],
            "id": commodity_info[6],
            "type": commodity_info[7],
        }
        if commodity_info["state"] != -999:
            commodity_list.append(commodity_info)

    client.finish()

    commodity_list.sort(key=lambda commodity_info: commodity_info["price"],
                        reverse=reverse)

    if max_item_count is None:
        page_num = 1 if len(commodity_list) > 0 else 0
    else:
        page_num = (len(commodity_list) + max_item_count - 1) // max_item_count
        commodity_list = commodity_list[page_id *
                                        max_item_count:(page_id + 1) *
                                        max_item_count]

    return JsonResponse({
        "commodity_list": commodity_list,
        "page_num": page_num,
    })
Beispiel #28
0
class ChainManager:

    def __init__(self):        
        self.client = BcosClient()
        self.dataparser = DatatypeParser()

        self.dataparser.load_abi_file("./pythonsdk/contracts/Receipt2.abi")
        self.RECEIPT_ABI = self.dataparser.contract_abi
        self.dataparser.load_abi_file("./pythonsdk/contracts/Company.abi")
        self.COMPANY_ABI = self.dataparser.contract_abi
        self.COMPANY_ADDRESS = "0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce"
        self.RECEIPT_ADDRESS = "0x98bc6df6b170d66fb5de93cf69b1f8746908f6d5"
        # res = self.client.load_default_account()
        self.BANK_ADDRESS = "0x3e4bf936a2ede27947a2c161abbdfc39df4619ab"

    def __del__(self):
        self.client.finish()

    def hexstr2int(self, hexstr):
        bit = (len(hexstr) - 2) * 4
        num = int(hexstr, 16)
        # hex str to int
        if num > 2 ** (bit - 1) - 1:
            num = 2 ** bit - num
            num = 0 - num
        return num

    def login(self, username, password):
        keystore_file = "{}/{}".format(client_config.account_keyfile_path,
                                            username + ".keystore")
        if os.path.exists(keystore_file) is False:
            return -1
        try:
            with open(keystore_file, "r") as dump_f:
                keytext = json.load(dump_f)
                privkey = Account.decrypt(keytext, password)
                self.client.client_account = Account.from_key(privkey)
        except Exception as e:
            return -1
        return 0
    
    def register(self, username, password):
        ac = Account.create(password)
        kf = Account.encrypt(ac.privateKey, password)
        keyfile = "{}/{}.keystore".format(client_config.account_keyfile_path, username)
        
        # file is exist, account is registed
        if os.access(keyfile, os.F_OK):
            return -1
        try:
            with open(keyfile, "w") as dump_f:
                json.dump(kf, dump_f)
                dump_f.close()

            with open(keyfile, "r") as dump_f:
                keytext = json.load(dump_f)
                privkey = Account.decrypt(keytext, password)
                client_account = Account.from_key(privkey)
                ps = PermissionService("./pythonsdk/contracts/precompile")
                ps.grant("t_rep1", client_account.address)
                ps.grant("t_company", client_account.address)
                del ps
        # write file failed
        except Exception as e:
            return -2
        return 0

    def sign(self, username, password, info):
        keystore_file = "{}/{}".format(client_config.account_keyfile_path,
                                            username + ".keystore")
        if os.path.exists(keystore_file) is False:
            return -1
        try:
            with open(keystore_file, "r") as dump_f:
                keytext = json.load(dump_f)
                privkey = Account.decrypt(keytext, password)
                msg = encode_defunct(text=info)
                signed_msg = Account.sign_message(msg, privkey)
                v = signed_msg['v']
                r = signed_msg['r']
                s = signed_msg['s']
                return v, r, s
        except Exception as e:
            print(e)
            return -1

    def registerCom(self, username, name, addr, credit, comtype, vrs):
        ''' authority '''
        info = username + name + addr + credit + comtype
        msg = encode_defunct(text=info)
        bank_addr = Account.recover_message(msg, vrs=vrs)

        # 没有授权
        if not bank_addr.lower() == self.BANK_ADDRESS:
            return -4

        ''' register company '''
        log = self.client.sendRawTransactionGetReceipt(self.COMPANY_ADDRESS, self.COMPANY_ABI, "register", [name,addr,credit,comtype])
        output = log['output']
        ret = self.hexstr2int(output)
        return ret

    def queryCom(self, name):
        info = self.client.call(self.COMPANY_ADDRESS, self.COMPANY_ABI, "queryCompanyByName", [name])
        if info[0] == "此公司不存在":
            return -1
        return info

    def eraseCom(self, name):
        log = self.client.sendRawTransactionGetReceipt(self.COMPANY_ADDRESS, self.COMPANY_ABI, "erase", [name])
        ret = log['output']
        ret = self.hexstr2int(ret)
        return ret

    def createReceipt(self, title, fromc, toc, amount, lastTime, comment, vrs=None):
        bankConfirm = 0
        if vrs:
            info = title+fromc+toc+str(amount)+str(lastTime)
            msg = encode_defunct(text=info)
            bank_addr = Account.recover_message(msg, vrs=vrs)
            if bank_addr.lower() == self.BANK_ADDRESS:
                bankConfirm = 1
        
        info = self.client.call(self.COMPANY_ADDRESS, self.COMPANY_ABI, "queryCompanyByName", [fromc])
        owner = info[1]
        # 账款必须由欠款方创建
        if self.client.client_account.address.lower() != owner.lower():
            return -5

        log = self.client.sendRawTransactionGetReceipt(self.RECEIPT_ADDRESS, self.RECEIPT_ABI, "insert", [title, fromc, toc, amount, lastTime, bankConfirm, comment])
        output = log['output']
        ret = self.hexstr2int(output)
        return ret
    
    def queryReceipt(self, title):
        info = self.client.call(self.RECEIPT_ADDRESS, self.RECEIPT_ABI, "queryReceiptByTitle", [title])
        if info[0] == "此账款不存在":
            return -1
        return info

    def queryReceiptOfCom(self, company, isfrom):
        receipts = self.client.call(self.RECEIPT_ADDRESS, self.RECEIPT_ABI, "queryReceiptByCompany", [company, isfrom])
        receipts = receipts[0]
        res = []
        for receipt in receipts:
            tmp = str(receipt, encoding='utf8').strip('\x00')
            res.append(tmp)
        return res

    def transferReceipt(self, title, fromc, middle, to, amount, newtitle):
        ret = self.client.sendRawTransactionGetReceipt(self.RECEIPT_ADDRESS, self.RECEIPT_ABI, "transferReceipt", [title, fromc, middle, to, amount, newtitle])
        ret = ret['output']
        ret = self.hexstr2int(ret)
        return ret

    def deleteReceipt(self, title):
        ret = self.client.sendRawTransactionGetReceipt(self.RECEIPT_ADDRESS, self.RECEIPT_ABI, "removeReceipt", [title])
        ret = ret['output']
        ret = self.hexstr2int(ret)
        return ret