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 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
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 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 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 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 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))
class Evidence_Contract: def __init__(self, address: str): abi_file = "contracts/EvidenceFactory.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 new_evidence_by_evi(self, evi: str): new_evidence = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, "newEvidence", [evi]) return {"result": new_evidence["logs"]} def get_evidence_by_address(self, address: str): addr = Web3.toChecksumAddress(address) evidence_msg = self.client.call(self.to_address, self.contract_abi, "getEvidence", [addr]) return {"result": evidence_msg} def add_signatures_by_evi_address(self, address: str): addr = Web3.toChecksumAddress(address) signature = self.client.sendRawTransactionGetReceipt(self.to_address, self.contract_abi, "addSignatures", [addr]) return { "result": signature["logs"] } def verifySigner_by_address(self, address: str): try: addr = Web3.toChecksumAddress(address) signature = self.client.call(self.to_address, self.contract_abi, "verify", [addr]) return { "result": signature[0] } except: return { "address": False } def get_signer_by_index(self, index: int): signature = self.client.call(self.to_address, self.contract_abi, "getSigner", [index]) return { "address": signature[0] } def get_signers_size(self): signers_size = self.client.call(self.to_address, self.contract_abi, "getSignersSize", []) return { "size": signers_size[0] } def get_signers(self): signers = self.client.call(self.to_address, self.contract_abi, "getSigners", []) return { "signers": signers[0] } # contract_address = "0xa2a9d06c3478778e2302bac12115c128334915f4" # a = Evidence_Contract(contract_address) # # # a.client.set_account_by_keystorefile("fengfeng.keystore") # # a.client.set_account_by_keystorefile("fengfeng2.keystore") # fengfeng_privkey = "d6f8c8f9106835ccc8f8d0bbc4b5bf32ff5f8941e69f9f50d075684d10dda7be" # fengfeng2_privkey = "619834a32f41fc9dce7809c3063070af3d78fac577a0c12705984eed0b1a3cb" # # a.client.set_account_by_privkey(fengfeng2_privkey) # # print(a.client.keypair.address) # print("new evidence") # # t = a.new_evidence_by_evi("Hello, world") # print(t) # print(a.get_evidence_by_address(t["result"][0]["address"])) # # print(a.add_signatures_by_evi_address(t["result"][0]["address"])) # print(a.get_evidence_by_address(t["result"][0]["address"])) # # print("==================== 切换账户 ====================") # print("==================== 添加多签用户 ====================") # # a.client.set_account_by_keystorefile("fengfeng.keystore") # # print(a.add_signatures_by_evi_address(t["result"][0]["address"])) # print(a.get_evidence_by_address(t["result"][0]["address"]))
"nonpayable", "type": "constructor" } bin = '0x60806040523480156200001157600080fd5b50604051620025a4380380620025a4833981016040819052620000349162000479565b8787818060208114620000645760405162461bcd60e51b81526004016200005b9062000590565b60405180910390fd5b50620000786001600160e01b036200025a16565b50600080800154600081815264020000000060205260409020805460ff1916600117905564020000000280546001600160a01b0385166001600160a01b03199091161790559050505050604051806040016040528087600060028110620000db57fe5b6020020151815260200187600160028110620000f357fe5b602090810291909101519091528151640200000003559081015164020000000455604080516080808201835288518083528985015183860181905289518486018190528a87015160609586018190526402000000059390935564020000000691909155640200000007556402000000085582519081018352865180825287850151828601819052875194830185905294870151919092018190526402000000099190915564020000000a9290925564020000000b5564020000000c5560005b6002825181620001be57fe5b64020000000d54919004146200024b57640200000003600a016040518060400160405280848481518110620001ef57fe5b602002602001015181526020018484600101815181106200020c57fe5b602090810291909101810151909152825460018181018555600094855293829020835160029283029091019081559290910151919092015501620001b2565b5050505050505050506200064b565b60006401fffffffe81905563800000005b8015620002b357620002898283620002b760201b62000ef41760201c565b91506001196002820201826000826401ffffffff8110620002a657fe5b015550600290046200026b565b5050565b60007fdec937b7fa8db3de380427a8cc947bfab68514522c3439cfa2e99655098368146000527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284828282088381820984858383098683840909925060005b605a8112156200034f57602060002080600052868688838808089350868485099250868488858a878809090994505060010162000317565b508484868a88888808080898975050505050505050565b8051620003738162000626565b92915050565b600082601f8301126200038b57600080fd5b6002620003a26200039c82620005c9565b620005a2565b91508183856020840282011115620003b957600080fd5b60005b83811015620003e95781620003d288826200046c565b8452506020928301929190910190600101620003bc565b5050505092915050565b600082601f8301126200040557600080fd5b8151620004166200039c82620005e7565b915081818352602084019350602081019050838560208402820111156200043c57600080fd5b60005b83811015620003e957816200045588826200046c565b84525060209283019291909101906001016200043f565b8051620003738162000640565b6000806000806000806000806101a0898b0312156200049757600080fd5b6000620004a58b8b6200046c565b9850506020620004b88b828c0162000366565b9750506040620004cb8b828c0162000379565b9650506080620004de8b828c0162000379565b95505060c0620004f18b828c0162000379565b945050610100620005058b828c0162000379565b935050610140620005198b828c0162000379565b9250506101808901516001600160401b038111156200053757600080fd5b620005458b828c01620003f3565b9150509295985092959890939650565b600062000564601f8362000608565b7f496e76616c696420646570746820696e20426173654d65726b6c655472656500815260200192915050565b60208082528101620003738162000555565b6040518181016001600160401b0381118282101715620005c157600080fd5b604052919050565b60006001600160401b03821115620005e057600080fd5b5060200290565b60006001600160401b03821115620005fe57600080fd5b5060209081020190565b90815260200190565b60006001600160a01b03821662000373565b90565b620006318162000611565b81146200063d57600080fd5b50565b620006318162000623565b611f49806200065b6000396000f3fe60806040526004361061007b5760003560e01c806397e004891161004e57806397e0048914610126578063c0ee0b8a14610139578063f9eb943f14610159578063fc0c546a1461017d5761007b565b806305ceb93c146100805780631f40927c146100b65780632d287e43146100e4578063354d06fd14610106575b600080fd5b34801561008c57600080fd5b506100a061009b3660046113e9565b61019f565b6040516100ad9190611c7d565b60405180910390f35b3480156100c257600080fd5b506100d66100d136600461138e565b61022d565b6040516100ad929190611dbf565b3480156100f057600080fd5b506101046100ff3660046113ad565b610256565b005b34801561011257600080fd5b506100a061012136600461138e565b6102ad565b6101046101343660046112d5565b6102cc565b34801561014557600080fd5b50610104610154366004611270565b61043f565b34801561016557600080fd5b5061016e610526565b6040516100ad93929190611dcd565b34801561018957600080fd5b50610192610530565b6040516100ad9190611c2c565b6000600283106101ca5760405162461bcd60e51b81526004016101c190611ccf565b60405180910390fd5b60036001840102608081019060830160fd10156101f95760405162461bcd60e51b81526004016101c190611d1f565b610100830151607182011b60fd1c60006003858782016009811061021957fe5b6020020151901b9190910195945050505050565b610100015164e8d4a5100067ffffffffffffffff604f83901c8116820293600f9390931c160290565b6401ffffffff54640100000000116102805760405162461bcd60e51b81526004016101c190611d0f565b6401ffffffff80546001810182559063ffffffff8201908390600090839081106102a657fe5b0155505050565b61010081015160a09091015160031b6007600c9290921c919091160190565b6102d4610fa1565b6102df858483610543565b815160208084015160405160009360029361030693339390918f918f918f918d9101611bb8565b60408051601f198184030181529082905261032091611ba1565b602060405180830381855afa15801561033d573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061036091908101906113cb565b86516020880151604089015160608a015193945061037f9389866106a4565b61039b5760405162461bcd60e51b81526004016101c190611d8f565b6103a789898987610743565b6103c35760405162461bcd60e51b81526004016101c190611d5f565b6103cb610fa1565b6103d58582610860565b60006103e160026108ad565b90506103ec816108ee565b7f36ed7c3f2ecfb5a5226c478b034d33144c060afe361be291e948f861dcddc618818584886040516104219493929190611c8b565b60405180910390a16104328661090d565b5050505050505050505050565b610447610fbf565b6001600160a01b0384168152602081018390526040810182905281516000906018908490600390811061047657fe5b016020015184516001600160f81b031990911690911c60e01c90601090859060029081106104a057fe5b016020015185516001600160f81b031990911690911c60e01c90600890869060019081106104ca57fe5b016020015186516001600160f81b031990911690911c60e01c9086906000906104ef57fe5b01602001516001600160e01b031963ff00000060e092831c16929092019290920192909201901b1660609092019190915250505050565b6002908190600990565b640200000002546001600160a01b031681565b81516000908152640200000000602052604090205460ff166105775760405162461bcd60e51b81526004016101c190611d2f565b60005b60028110156105fd57600061058f828561019f565b6000818152640200000001602052604090205490915060ff16156105c55760405162461bcd60e51b81526004016101c190611cdf565b600081815264020000000160205260409020805460ff19166001179055808383600281106105ef57fe5b60200201525060010161057a565b50600060028285604051602001610615929190611b7b565b60408051601f198184030181529082905261062f91611ba1565b602060405180830381855afa15801561064c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061066f91908101906113cb565b9050600061067c846102ad565b905080821461069d5760405162461bcd60e51b81526004016101c190611d3f565b5050505050565b60006106ae610ffa565b6107d05a038682528560208301528360408301526020608083016060846000600286f150604082018981528860208201526040816060836000600787f1506040836080856000600687f15060016040840152600260608401528560808401526040816060836000600787f150505060408101518151148015610737575060608101516020820151145b98975050505050505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076e611018565b86518152602080880151828201528651604080840191909152878201516060808501919091528189015160808501528089015160a0850152875160c08501528783015160e0850152815160098082526101408201909352909290919082016101208038833901905050905060005b600981101561084457838682600981106107f257fe5b6020020151106108145760405162461bcd60e51b81526004016101c190611d7f565b85816009811061082057fe5b602002015182828151811061083157fe5b60209081029190910101526001016107dc565b5061084f8183610b60565b60011493505050505b949350505050565b60005b60028110156108a857600083826001016009811061087d57fe5b602002015190508083836002811061089157fe5b602002015261089f81610256565b50600101610863565b505050565b6401ffffffff546000908281036401000000005b60018111156108e2576108d5818385610e2b565b93509150600290046108c1565b50506000549392505050565b600090815264020000000060205260409020805460ff19166001179055565b6000806109198361022d565b909250905081156109cf57640200000002546001600160a01b0316156109ab57640200000002546040516323b872dd60e01b81526001600160a01b039091169081906323b872dd9061097390339030908890600401611c3a565b600060405180830381600087803b15801561098d57600080fd5b505af11580156109a1573d6000803e3d6000fd5b50505050506109ca565b8134146109ca5760405162461bcd60e51b81526004016101c190611d6f565b610a53565b3415610a53576000336001600160a01b0316346040516109ee90611bad565b60006040518083038185875af1925050503d8060008114610a2b576040519150601f19603f3d011682016040523d82523d6000602084013e610a30565b606091505b5050905080610a515760405162461bcd60e51b81526004016101c190611cef565b505b80156108a857640200000002546001600160a01b031615610ade576402000000025460405163a9059cbb60e01b81526001600160a01b0390911690819063a9059cbb90610aa69033908690600401611c62565b600060405180830381600087803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b50505050506108a8565b6000336001600160a01b031682604051610af790611bad565b60006040518083038185875af1925050503d8060008114610b34576040519150601f19603f3d011682016040523d82523d6000602084013e610b39565b606091505b5050905080610b5a5760405162461bcd60e51b81526004016101c190611cff565b50505050565b64020000000d548251600091600190910114610b8e5760405162461bcd60e51b81526004016101c190611d4f565b610b9661105d565b60016107d05a03600a6402000000030183526020832060208701875160200281018254865260018301546020870152600283019250604086015b81831015610c1e57835481526001840154602082015282516040820152604081606083600060078af160408860808a600060068bf11695909516946002939093019260209290920191610bd0565b505050505080610c405760405162461bcd60e51b81526004016101c190611daf565b7f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a08301526402000000035460c08301526001640200000003015460e08301526002640200000003015461010083015260036402000000030154610120830152600464020000000301546101408301526005640200000003015461016083015283516101808301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47602085015181810682036101a085015260408601516101c085015260608601516101e0850152608086015161020085015260a086015161022085015260c086015161024085015260e086015161026085015260066402000000030154610280850152600764020000000301546102a0850152600864020000000301546102c0850152600964020000000301546102e085015260208461030086600060086107d05a03f19250505080610e205760405162461bcd60e51b81526004016101c190611d9f565b505190505b92915050565b600080600019808601906001198616870101826001861615610e9f575060001982860101610e806000826401ffffffff8110610e6357fe5b01546000856002026401ffffffff8110610e7957fe5b0154610ef4565b600060026000198401046401ffffffff8110610e9857fe5b0155610ea4565b508185015b81811115610eda5760011901610e806000826401ffffffff8110610ec457fe5b01546000836001016401ffffffff8110610e7957fe5b600287046002600188010494509450505050935093915050565b60007fdec937b7fa8db3de380427a8cc947bfab68514522c3439cfa2e99655098368146000527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284828282088381820984858383098683840909925060005b605a811215610f8a57602060002080600052868688838808089350868485099250868488858a8788090909945050600101610f54565b508484868a88888808080898975050505050505050565b60405180604001604052806002906020820280388339509192915050565b604051806080016040528060006001600160a01b03168152602001600081526020016060815260200160006001600160e01b03191681525090565b6040518060a001604052806005906020820280388339509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061030001604052806018906020820280388339509192915050565b8035610e2581611ee6565b600082601f83011261109857600080fd5b60026110ab6110a682611e0f565b611de8565b9150818360005b838110156110de57813586016110c88882611221565b84525060209283019291909101906001016110b2565b5050505092915050565b600082601f8301126110f957600080fd5b60026111076110a682611e0f565b9150818385602084028201111561111d57600080fd5b60005b838110156110de5781611133888261120b565b8452506020928301929190910190600101611120565b600082601f83011261115a57600080fd5b60046111686110a682611e0f565b9150818385602084028201111561117e57600080fd5b60005b838110156110de5781611194888261120b565b8452506020928301929190910190600101611181565b600082601f8301126111bb57600080fd5b60096111c96110a682611e0f565b915081838560208402820111156111df57600080fd5b60005b838110156110de57816111f5888261120b565b84525060209283019291909101906001016111e2565b8035610e2581611efd565b8051610e2581611efd565b600082601f83011261123257600080fd5b81356112406110a682611e2d565b9150808252602083016020830185838301111561125c57600080fd5b611267838284611ea4565b50505092915050565b60008060006060848603121561128557600080fd5b6000611291868661107c565b93505060206112a28682870161120b565b925050604084013567ffffffffffffffff8111156112bf57600080fd5b6112cb86828701611221565b9150509250925092565b60008060008060008060006102e0888a0312156112f157600080fd5b60006112fd8a8a6110e8565b975050604061130e8a828b01611149565b96505060c061131f8a828b016110e8565b9550506101006113318a828b01611149565b9450506101806113438a828b0161120b565b9350506101a06113558a828b016111aa565b9250506102c088013567ffffffffffffffff81111561137357600080fd5b61137f8a828b01611087565b91505092959891949750929550565b600061012082840312156113a157600080fd5b600061085884846111aa565b6000602082840312156113bf57600080fd5b6000610858848461120b565b6000602082840312156113dd57600080fd5b60006108588484611216565b60008061014083850312156113fd57600080fd5b6000611409858561120b565b925050602061141a858286016111aa565b9150509250929050565b60006114308383611655565b505060200190565b6000611444838361168d565b9392505050565b61145481611e93565b82525050565b61145481611e82565b61146c81611e58565b6114768184611e74565b925061148182611e55565b8060005b838110156114af5781516114998782611424565b96506114a483611e6e565b925050600101611485565b505050505050565b6114c081611e58565b6114ca8184611e74565b92506114d582611e55565b8060005b838110156114af5781516114ed8782611424565b96506114f883611e6e565b9250506001016114d9565b600061150e82611e58565b6115188185611e74565b93508360208202850161152a85611e55565b8060005b8581101561156457848403895281516115478582611438565b945061155283611e6e565b60209a909a019992505060010161152e565b5091979650505050505050565b61157a81611e58565b6115848184611e74565b925061158f82611e55565b8060005b838110156114af5781516115a78782611424565b96506115b283611e6e565b925050600101611593565b6115c681611e5e565b6115d08184611e74565b92506115db82611e55565b8060005b838110156114af5781516115f38782611424565b96506115fe83611e6e565b9250506001016115df565b61161281611e64565b61161c8184611e74565b925061162782611e55565b8060005b838110156114af57815161163f8782611424565b965061164a83611e6e565b92505060010161162b565b61145481611e55565b600061166982611e6a565b6116738185611e74565b9350611683818560208601611eb0565b9290920192915050565b600061169882611e6a565b6116a28185611e79565b93506116b2818560208601611eb0565b6116bb81611edc565b9093019392505050565b60006116d2601883611e79565b7f6e756c6c696669657220696e646578206f766572666c6f770000000000000000815260200192915050565b600061170b603783611e79565b7f496e76616c6964206e756c6c69666965723a2054686973206e756c6c6966696581527f722068617320616c7265616479206265656e2075736564000000000000000000602082015260400192915050565b600061176a601e83611e79565b7f767075625f696e2072657475726e207472616e73666572206661696c65640000815260200192915050565b60006117a3601883611e79565b7f767075625f6f7574207472616e73666572206661696c65640000000000000000815260200192915050565b60006117dc602783611e79565b7f4d65726b6c6520747265652066756c6c3a2043616e6e6f7420617070656e6420815266616e796d6f726560c81b602082015260400192915050565b6000611825603083611e79565b7f6e756c6c6966696572207772697474656e20696e20646966666572656e74207281526f32b9b4b23ab0b6103134ba103317329760811b602082015260400192915050565b6000611877602583611e79565b7f496e76616c696420726f6f743a205468697320726f6f7420646f65736e277420815264195e1a5cdd60da1b602082015260400192915050565b60006118be604983611e79565b7f496e76616c696420687369673a2054686973206873696720646f6573206e6f7481527f20636f72726573706f6e6420746f207468652068617368206f6620766b20616e6020820152686420746865206e667360b81b604082015260600192915050565b600061192f602283611e79565b7f496e707574206c656e67746820646966666572732066726f6d20657870656374815261195960f21b602082015260400192915050565b6000611973603383611e79565b7f496e76616c69642070726f6f663a20556e61626c6520746f20766572696679208152727468652070726f6f6620636f72726563746c7960681b602082015260400192915050565b60006119c8602a83611e79565b7f57726f6e67206d73672e76616c75653a2056616c75652070616964206973206e8152691bdd0818dbdc9c9958dd60b21b602082015260400192915050565b6000611a14601c83611e79565b7f496e707574206973206e6f7420696e207363616c6172206669656c6400000000815260200192915050565b6000611a4d603b83611e79565b7f496e76616c6964207369676e61747572653a20556e61626c6520746f2076657281527f69667920746865207369676e617475726520636f72726563746c790000000000602082015260400192915050565b6000610e25600083611e74565b6000611ab9603783611e79565b7f43616c6c20746f20626e3235364164642c20626e3235365363616c61724d756c81527f206f7220626e32353650616972696e67206661696c6564000000000000000000602082015260400192915050565b6000611b18603983611e79565b7f43616c6c20746f2074686520626e323536416464206f7220626e32353653636181527f6c61724d756c20707265636f6d70696c6564206661696c656400000000000000602082015260400192915050565b611454611b7682611e55565b611e55565b6000611b8782856114b7565b604082019150611b9782846115bd565b5060800192915050565b6000611444828461165e565b6000610e2582611a9f565b6000611bc4828a611b6a565b602082019150611bd4828961165e565b9150611be0828861165e565b9150611bec8287611571565b604082019150611bfc82866115bd565b608082019150611c0c8285611571565b604082019150611c1c8284611609565b5061012001979650505050505050565b60208101610e25828461145a565b60608101611c48828661144b565b611c55602083018561145a565b6108586040830184611655565b60408101611c70828561144b565b6114446020830184611655565b60208101610e258284611655565b60c08101611c998287611655565b611ca66020830186611463565b611cb36060830185611463565b81810360a0830152611cc58184611503565b9695505050505050565b60208082528101610e25816116c5565b60208082528101610e25816116fe565b60208082528101610e258161175d565b60208082528101610e2581611796565b60208082528101610e25816117cf565b60208082528101610e2581611818565b60208082528101610e258161186a565b60208082528101610e25816118b1565b60208082528101610e2581611922565b60208082528101610e2581611966565b60208082528101610e25816119bb565b60208082528101610e2581611a07565b60208082528101610e2581611a40565b60208082528101610e2581611aac565b60208082528101610e2581611b0b565b60408101611c708285611655565b60608101611ddb8286611655565b611c556020830185611655565b60405181810167ffffffffffffffff81118282101715611e0757600080fd5b604052919050565b600067ffffffffffffffff821115611e2657600080fd5b5060200290565b600067ffffffffffffffff821115611e4457600080fd5b506020601f91909101601f19160190565b90565b50600290565b50600490565b50600990565b5190565b60200190565b919050565b90815260200190565b60006001600160a01b038216610e25565b6000610e25826000610e2582611e82565b82818337506000910152565b60005b83811015611ecb578181015183820152602001611eb3565b83811115610b5a5750506000910152565b601f01601f191690565b611eef81611e82565b8114611efa57600080fd5b50565b611eef81611e5556fea365627a7a72315820e42326a4694c17436c7722fd4a82ac810b74162de26e7fd1035ac3ef5d5a29d16c6578706572696d656e74616cf564736f6c63430005110040' argbin = (encode_abi(fn_abi, fn_args)) totalbin = bin + argbin fo = open("./temp.bin", "w") fo.write(bin) fo.close() print("totalbin: ", totalbin) # Greeter = eth.contract(abi, bin) # si1.constructor # result1 = si1.deploy("./temp.bin") client = BcosClient() info = client.init() print(info) result1 = client.sendRawTransactionGetReceipt("", abi, None, fn_args, bin, 30000000, 15) address = result1['contractAddress'] si1 = Groth16Mixer(address) print("token address: ", si1.token()) print("new address = ", address)
class SimpleInfo: # name of abi address = None contract_abi_string = '''[{"constant": false, "inputs": [{"name": "b", "type": "uint256"}], "name": "add", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [], "name": "getaddress", "outputs": [{"name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "getbalance", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"name": "b", "type": "uint256"}], "name": "setbalance", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [{"name": "plus", "type": "uint256"}], "name": "getbalance1", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "getall", "outputs": [{"name": "", "type": "string"}, {"name": "", "type": "uint256"}, {"name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "getname", "outputs": [{"name": "", "type": "string"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"name": "n", "type": "string"}, {"name": "b", "type": "uint256"}, {"name": "a", "type": "address"}], "name": "set", "outputs": [{"name": "", "type": "int256"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [], "name": "reset", "outputs": [{"name": "", "type": "int256"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [], "name": "getcounter", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [], "name": "setempty", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}, {"payable": false, "stateMutability": "nonpayable", "type": "fallback"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "retcode", "type": "int256"}, {"indexed": false, "name": "name", "type": "string"}, {"indexed": false, "name": "balance", "type": "uint256"}, {"indexed": false, "name": "addr", "type": "address"}, {"indexed": false, "name": "memo", "type": "string"}], "name": "on_set", "type": "event", "topic": "0xf2dd11606b57e733a74ee877736d9c8a3da833d5129301d100669eff223a3829"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "retcode", "type": "int256"}, {"indexed": true, "name": "name", "type": "string"}, {"indexed": false, "name": "balance", "type": "uint256"}, {"indexed": true, "name": "addr", "type": "address"}, {"indexed": false, "name": "memo", "type": "string"}], "name": "on_change", "type": "event", "topic": "0x1c6cf3c083b623fd9a108d037161265f6a736e368fc345d3d8ee6fe3f94cf39f"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "retcode", "type": "int256"}, {"indexed": false, "name": "name", "type": "string"}, {"indexed": false, "name": "balance", "type": "uint256"}, {"indexed": false, "name": "addr", "type": "address"}, {"indexed": false, "name": "memo", "type": "string"}], "name": "on_sender", "type": "event", "topic": "0x37c87e74ec29efa2615574aeb214b87c3bb72c1e1fa9fee2892dce36a7e7f3b2"}, {"anonymous": true, "inputs": [{"indexed": false, "name": "retcode", "type": "int256"}, {"indexed": true, "name": "name", "type": "string"}], "name": "on_reset", "type": "event", "topic": "0x9540f234b204da235110a66168f5feb9940a8551da5172974c67392c147630d0"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "msg", "type": "string"}], "name": "on_set_empty", "type": "event", "topic": "0x447fb56343d9108e0b2708a0aa57837bc8f847356d9119daae2d724f6f0724e1"}]''' 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 add(self, b): func_name = 'add' args = [b] 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 getaddress(self): func_name = 'getaddress' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def getbalance(self): func_name = 'getbalance' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def setbalance(self, b): func_name = 'setbalance' args = [b] 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 getbalance1(self, plus): func_name = 'getbalance1' args = [plus] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def getall(self): func_name = 'getall' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def getname(self): func_name = 'getname' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def set(self, n, b, a): func_name = 'set' args = [n, b, to_checksum_address(a)] 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 reset(self): func_name = 'reset' args = [] 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 getcounter(self): func_name = 'getcounter' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def setempty(self): func_name = 'setempty' args = [] 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
print(usage) while True: choice = input("请输入数字:(1键发布软件,2键提供官方验证为软件背书,3键查询软件价格, 4键购买软件,其他键退出)") if choice == '1': file_name = input('''请输入待提交软件所在路径 路径:''') new_file = ipfs_api.add(file_name) print("软件提交到ipfs成功,哈希值为", new_file, type(new_file), new_file['Hash']) # software_name = input("请输入软件名:") software_price = input("请输入软件价格:") args = [ software_name.encode('utf8'), int(software_price), new_file['Hash'] ] receipt = client.sendRawTransactionGetReceipt(to_address, contract_abi, "publish", args) #print("receipt:",receipt) #解析receipt里的log txhash = receipt['transactionHash'] #获取对应的交易数据,解析出调用方法名和参数 txresponse = client.getTransactionByHash(txhash) inputresult = data_parser.parse_transaction_input(txresponse['input']) #print("transaction input parse:",txhash) #print(inputresult, "\n") #解析该交易在receipt里输出的output,即交易调用的方法的return值 outputresult = data_parser.parse_receipt_output( inputresult['name'], receipt['output']) #print("receipt output :",outputresult) print("软件已发布到 Fisco, 交易哈希为", txhash)
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
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
class HelloEvent: # name of abi address = None contract_abi_string = '''[{"constant": false, "inputs": [{"name": "n", "type": "string"}, {"name": "i", "type": "int256"}, {"name": "key", "type": "string"}], "name": "settwo", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"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"}, {"constant": false, "inputs": [{"name": "n", "type": "string"}, {"name": "i", "type": "bool"}], "name": "setbool", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"name": "n", "type": "string"}, {"name": "i", "type": "int256"}], "name": "setnum", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "newname", "type": "string"}], "name": "on_set", "type": "event", "topic": "0xc86dd792cb0df852949fd9d6a7b5a0d8b1cd57ba9066ad4c8da6a1e5c51c9b9a"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "name", "type": "string"}, {"indexed": true, "name": "age", "type": "int256"}], "name": "on_number", "type": "event", "topic": "0x5b6dab5d6200c978aea486370c307cd2e56212d2cd7326b6879fe6a32dd1dc15"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "name", "type": "string"}, {"indexed": true, "name": "age", "type": "int256"}, {"indexed": true, "name": "key", "type": "string"}], "name": "on_two_indexed", "type": "event", "topic": "0x3913a7a6879be541cb82067407c4976bdf08f9243ea1f2da9b552e490484f7d0"}, {"anonymous": false, "inputs": [{"indexed": false, "name": "addr", "type": "address"}], "name": "on_address", "type": "event", "topic": "0x23ec7e97005133e2ecacfedd26b164f27c5b90bc5fe00a552a4c54eeeea8b40c"}]''' 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 settwo(self, n, i, key): func_name = 'settwo' args = [n, i, key] 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 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 setbool(self, n, i): func_name = 'setbool' args = [n, i] 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 setnum(self, n, i): func_name = 'setnum' args = [n, i] 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
class ContractManager(object): 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 compile(self): if os.path.isfile(client_config.solc_path) or os.path.isfile( client_config.solcjs_path): try: Compiler.compile_file(self.sol_file, output_path="contracts/") except CompileError: print(CompileError) else: print(client_config.solc_path) print(client_config.solcjs_path) def checkContractExit(self, contract_name): #address = ContractNote.get_contract_addresses(contract_name) address = ContractNote.get_last(contract_name) if address is None: return False, None else: # 暂时返回低一个就可以了 return True, address def getContractInfo(self, contractAddress): contract_abi = self.data_parser.contract_abi return contract_abi, contractAddress def deploy(self): contract_abi = self.data_parser.contract_abi # 部署合约 if self.DEBUG: print( "\n>>Deploy:---------------------------------------------------------------------" ) with open(self.bin_file, 'r') as load_f: contract_bin = load_f.read() load_f.close() contract_info = self.client.deploy(contract_bin) if self.DEBUG: print("deploy", contract_info) print("new address : ", contract_info["contractAddress"]) contract_name = os.path.splitext(os.path.basename(self.abi_file))[0] memo = "tx:" + contract_info["transactionHash"] # 把部署结果存入文件备查 ContractNote.save_address(contract_name, contract_info["contractAddress"], int(contract_info["blockNumber"], 16), memo) ContractNote.save_contract_address(contract_name, contract_info["contractAddress"]) return contract_abi, contract_info # url = "http://47.113.185.200/group1/M00/00/00/rBjqU16nnLiASd4YAMVnXomRO6M785.mp4" # hashvalue = "c3c93aae6dbed266a0dc55a517960273bc0b79c5ca13afe9ca5ab2d3825540f4" # args = [url, hashvalue] def transaction(self, contract_abi, to_address, method, args): # 发送交易,调用一个改写数据的接口 if self.DEBUG: print( "\n>>sendRawTransaction:----------------------------------------------------------" ) print("to_address", to_address) print("contract_abi", contract_abi) receipt = self.client.sendRawTransactionGetReceipt( to_address, contract_abi, method, args) #receipt = self.client.sendRawTransaction(to_address, contract_abi, method, args) #print(receipt) txhash = receipt['transactionHash'] #if self.DEBUG: # 解析receipt里的log # print("\n>>parse receipt and transaction:----------------------------------------------------------") # print("transaction hash: ", txhash) #logresult = self.data_parser.parse_event_logs(receipt["logs"]) #i = 0 #for log in logresult: # if 'eventname' in log: # i = i + 1 # print("{}): log name: {} , data: {}".format(i, log['eventname'], log['eventdata'])) return receipt def call(self, contract_address, contract_abi, method, args=None): # 调用一下call,获取数据 try: response = self.client.call(contract_address, contract_abi, method, args) return True, response except: import traceback traceback.print_exc() return False, "call contract error"
contract_abi = abi_parser.contract_abi print(client.getNodeVersion()) #如合约未部署,用python console.py deploy TestStruct 部署一次 #或者自行定位链上既有的合约地址 #address = "0x901250d3fcb6cf282134b12acdd0f1d67f265566" address = ContractNote.get_last(contractname) print(address) res = client.call(address, contract_abi, "getUser", ["alice"]) print("call:", res) # User结构体参数示例。合约接口里的结构体,对应python的tuple数据类型 # 注:调用合约时的入参一定是个python数组,因为合约接口参数可能有一到多个 args = [("zero", 78)] res = client.sendRawTransactionGetReceipt(address, contract_abi, "addUser", args) #print("addUser",res) print_receipt_logs_and_txoutput(client, res, contractname) res = client.call(address, contract_abi, "getUser", ["zero"]) print("call:", res) #对应第一个参数User[] memory _users,这个参数本身是个数组,所以,_users是参数数组里的’数组‘ [[]] args = [[("zero", 78), ("yark", 55), ("xar", 23)]] res = client.sendRawTransactionGetReceipt(address, contract_abi, "addUsers", args) print_receipt_logs_and_txoutput(client, res, contractname) res = client.call(address, contract_abi, "getUser", ["yark"]) print("call:", res)
class Car_Contract: 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 balanceOf(self, addr: str): addr = Web3.toChecksumAddress(addr) new_carowner = self.client.call(self.to_address, self.contract_abi, "balanceOf", [addr]) return new_carowner def tokenURI(self, tokenid: int): # amount = Web3.toChecksumAddress(amount) new_user = self.client.call(self.to_address, self.contract_abi, "tokenURI", [tokenid]) return new_user def transferTo(self, addr: str, tokenid: int): addr = Web3.toChecksumAddress(addr) car_message = self.client.sendRawTransactionGetReceipt( self.to_address, self.contract_abi, "transferTo", [addr, tokenid]) return car_message def tokenOfOwnerByIndex(self, addr: str, index: int): addr = Web3.toChecksumAddress(addr) car_list = self.client.call(self.to_address, self.contract_abi, "tokenOfOwnerByIndex", [addr, index]) return car_list def ownerOf(self, tokenid: int): # amount = Web3.toChecksumAddress(amount) is_carowner = self.client.call(self.to_address, self.contract_abi, "ownerOf", [tokenid]) return is_carowner def is_user(self, amount: str): amount = Web3.toChecksumAddress(amount) is_user = self.client.call(self.to_address, self.contract_abi, "isUser", [amount]) return is_user def new_vehicle(self, chainNumber: int, number: str, brand: str, color: str, quality: str, price: int, day: int): new_vehicle = self.client.sendRawTransactionGetReceipt( self.to_address, self.contract_abi, "newVehicle", [chainNumber, number, brand, color, quality, price, day]) return new_vehicle def reback_vehicle(self, chainNumber: int): reback_vehicle = self.client.sendRawTransactionGetReceipt( self.to_address, self.contract_abi, "rebackVehicle", [chainNumber]) return reback_vehicle def sign_vehicle(self, chainNumber: int): sign_vehicle = self.client.sendRawTransactionGetReceipt( self.to_address, self.contract_abi, "signVehicle", [chainNumber]) return sign_vehicle
class ERC20Mintable: # name of abi address = None contract_abi_string = '''[{"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event", "topic": "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "account", "type": "address"}], "name": "MinterAdded", "type": "event", "topic": "0x6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f6"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "account", "type": "address"}], "name": "MinterRemoved", "type": "event", "topic": "0xe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb66692"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event", "topic": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"}, {"constant": false, "inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "addMinter", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "subtractedValue", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "isMinter", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "account", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "mint", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [], "name": "renounceMinter", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "payable": false, "stateMutability": "nonpayable", "type": "function"}]''' 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 addMinter(self, account): func_name = 'addMinter' args = [to_checksum_address(account)] 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 allowance(self, owner, spender): func_name = 'allowance' args = [to_checksum_address(owner), to_checksum_address(spender)] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def approve(self, spender, amount): func_name = 'approve' args = [to_checksum_address(spender), amount] 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 balanceOf(self, account): func_name = 'balanceOf' args = [to_checksum_address(account)] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def decreaseAllowance(self, spender, subtractedValue): func_name = 'decreaseAllowance' args = [to_checksum_address(spender), subtractedValue] 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 increaseAllowance(self, spender, addedValue): func_name = 'increaseAllowance' args = [to_checksum_address(spender), addedValue] 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 isMinter(self, account): func_name = 'isMinter' args = [to_checksum_address(account)] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def mint(self, account, amount): func_name = 'mint' args = [to_checksum_address(account), amount] 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 renounceMinter(self): func_name = 'renounceMinter' args = [] 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 totalSupply(self): func_name = 'totalSupply' args = [] result = self.client.call(self.address, self.contract_abi, func_name, args) return result # ------------------------------------------ def transfer(self, recipient, amount): func_name = 'transfer' args = [to_checksum_address(recipient), amount] 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 transferFrom(self, sender, recipient, amount): func_name = 'transferFrom' args = [ to_checksum_address(sender), to_checksum_address(recipient), amount ] 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