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, })
class HelloWorld: # name of abi address = None contract_abi_string = '''[{"constant": false, "inputs": [{"name": "n", "type": "string"}], "name": "set", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [], "name": "get", "outputs": [{"name": "", "type": "string"}], "payable": false, "stateMutability": "view", "type": "function"}, {"inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "newname", "type": "string"}], "name": "onset", "type": "event", "topic": "0xafb180742c1292ea5d67c4f6d51283ecb11e49f8389f4539bef82135d689e118"}]''' contract_abi = None data_parser = DatatypeParser() client = None def __init__(self, address): self.client = BcosClient() self.address = address self.contract_abi = json.loads(self.contract_abi_string) self.data_parser.set_abi(self.contract_abi) def deploy(self, contract_bin_file): result = self.client.deployFromFile(contract_bin_file) self.address = result["contractAddress"] return result # ------------------------------------------ def set(self, n): func_name = 'set' args = [n] receipt = self.client.sendRawTransactionGetReceipt( self.address, self.contract_abi, func_name, args) outputresult = self.data_parser.parse_receipt_output( func_name, receipt['output']) return outputresult, receipt # ------------------------------------------ def get(self): func_name = 'get' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result
def EventEmitter(stub, initHeight): data_parser = DatatypeParser() try: client = BcosClient() lastHeight = initHeight while 1: currHeight = client.getBlockNumber() if currHeight > lastHeight: for height in range(lastHeight + 1, currHeight + 1): result = client.getBlockByNumber( height, _includeTransactions=False) for hash in result["transactions"]: receipt = client.getTransactionReceipt(hash) logs = data_parser.parse_event_logs(receipt["logs"]) for log in logs: print(log) if log["eventname"] == "Task1Finished": stub.PublishMessage( gateway_pb2.PublishMessageRequest( name="task1", correlationKey="task1", variables=json.dumps( {"contract": receipt["to"]}))) elif log["eventname"] == "Task2Finished": stub.PublishMessage( gateway_pb2.PublishMessageRequest( name="task2", correlationKey=receipt["to"])) except BcosException as e: print("execute demo_transaction failed for: {}".format(e)) except BcosError as e: print("execute demo_transaction failed for: {}".format(e))
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})
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 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 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 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 __init__(self, address: str): abi_file = "contracts/Con.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 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 __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 __init__(self, sol_file, abi_file, bin_file, DEBUG=True): # 实例化client self.client = BcosClient() self.sol_file = sol_file self.abi_file = abi_file self.bin_file = bin_file self.DEBUG = DEBUG self.data_parser = DatatypeParser() if not os.path.isfile(self.abi_file): self.compile() self.data_parser.load_abi_file(self.abi_file)
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 deploy(): client = BcosClient() #从文件加载abi定义 abi_file ="contracts/SoftwareTransaction.abi" data_parser = DatatypeParser() data_parser.load_abi_file(abi_file) contract_abi = data_parser.contract_abi #部署合约 with open("contracts/SoftwareTransaction.bin", 'r') as load_f: contract_bin = load_f.read() load_f.close() result = client.deploy(contract_bin) print("contract address:", result["contractAddress"])
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 start(self): print('client '+str(self.id)+" start") bcos_event = BcosEventCallback() bcos_event.setclient(BcosClient()) cn = ContractNote() address = cn.get_last('gmodel') abifile = "contracts/gmodel.abi" abiparser = DatatypeParser(abifile) eventcallback01 = EventCallbackImpl01(self.model,self.Update,self.Gmodel,self.cur_round,self.fdfs) eventcallback01.abiparser = abiparser print("register events") result = bcos_event.register_eventlog_filter( eventcallback01, abiparser, [address], 'modelupdate', None) print( "after register ,event_name:{},result:{},all:{}".format( 'modelupdate', result['result'], result)) #获取全局模型轮次 cur_round = self.Gmodel.get_round()[1][0] while(cur_round<5): print("the "+str(cur_round)+" th round") print("client "+str(self.id)+" waiting gmodel_update...") cur_round = self.Gmodel.get_round()[1][0] time.sleep(10)
def main(argv): if len(argv) < 2: usage() exit(0) contractname = argv[0] address = argv[1] event_name = None indexed_value = None if len(argv) > 2: event_name = argv[2] indexed_value = argv[3:] try: bcos_event = BcosEventCallback() if client_config.client_protocol is not client_config.PROTOCOL_CHANNEL: print( "** using event callback, client prototol MUST be client_config.PROTOCOL_CHANNEL!!" ) print("** please check the configure file") sys.exit(-1) bcos_event.setclient(BcosClient()) print(bcos_event.client.getinfo()) print("usage input {},{},{},{}".format(contractname, address, event_name, indexed_value)) print(address) if address == "last" or address == "latest": cn = ContractNote() address = cn.get_last(contractname) print("hex address :", address) abifile = "contracts/" + contractname + ".abi" abiparser = DatatypeParser(abifile) eventcallback01 = EventCallbackImpl01() eventcallback02 = EventCallbackImpl02() eventcallback01.abiparser = abiparser eventcallback02.abiparser = abiparser result = bcos_event.register_eventlog_filter(eventcallback01, abiparser, [address], event_name, indexed_value) #result = bcos_event.register_eventlog_filter(eventcallback02,abiparser, [address], "on_number") print("after register ,event_name:{},result:{},all:{}".format( event_name, result['result'], result)) while True: print("waiting event...") time.sleep(10) except Exception as e: print("Exception!") import traceback traceback.print_exc() finally: print("event callback finished!") if bcos_event.client is not None: bcos_event.client.finish() sys.exit(-1)
def Task2(job, stub): print(job) data_parser = DatatypeParser() data_parser.load_abi_file(public.abi_file) contract_abi = data_parser.contract_abi client = BcosClient() address = json.loads(job.variables)["contract"] receipt = client.sendRawTransactionGetReceipt(address, contract_abi, "Task2") stub.SetVariables( gateway_pb2.SetVariablesRequest( elementInstanceKey=job.workflowInstanceKey, variables=json.dumps({"tx": receipt["transactionHash"]}))) if bool(receipt["output"]): stub.CompleteJob(gateway_pb2.CompleteJobRequest(jobKey=job.key)) else: stub.FailJob(gateway_pb2.FailJobRequest(jobKey=job.Key))
def deploySmartContract(): data_parser = DatatypeParser() data_parser.load_abi_file(abi_file) contract_abi = data_parser.contract_abi try: client = BcosClient() # 部署合约 with open("contracts/v1_2.bin", 'r') as load_f: contract_bin = load_f.read() load_f.close() result = client.deploy(contract_bin) # init client.sendRawTransactionGetReceipt(result["contractAddress"], contract_abi, "Init") return result["contractAddress"] except BcosException as e: print("execute demo_transaction failed for: {}".format(e)) except BcosError as e: print("execute demo_transaction failed for: {}".format(e))
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
def exec_command(self, cmd, params): """ exec_command """ self.client = BcosClient() function_name = self.get_func_name(cmd) # execute function ret_json = eval(function_name)(*params) common.print_info("INFO", self.cmd) common.print_result(ret_json) return ret_json
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 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 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 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})
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 exec_command(self, cmd, params): """ exec_command """ self.client = BcosClient() function_name = self.get_func_name(cmd) # execute function ret_json = eval(function_name)(*params) common.print_info("INFO", self.cmd) if cmd in RPCConsole.functions["human_friendly_output"]: ret_json = self.convertHexToDec(cmd, ret_json) common.print_result(ret_json) return ret_json
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()
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, })