zoukankan      html  css  js  c++  java
  • Python SDK 与Fisco Bcos交互 -2

    (使用 python-sdk ,把区块链作为数据库使用,查询历史数据)

    需求:查询通过智能合约存储的历史信息。如

    • 开始存储的是 "xsmile",通过 Fisco 提供的 call 方法,当前可以查询到 "xsmile"
    • 再次调用合约存储的是 "root", 通过 call 方法查询得到的是 root

    那怎么再查询到 "xsmile" 呢?call 方法是不能解决问题的。

    官方文档未指明方法,可参考源代码样例:python-sdk/tests/testclient.py

     1 # 获取对应的交易数据,解析出调用方法名和参数
     2 txhash = receipt['transactionHash']
     3 txresponse = client.getTransactionByHash(txhash)
     4 inputresult = abi_parser.parse_transaction_input(txresponse['input'])
     5 print("transaction input parse:", txhash)
     6 print(inputresult)
     7 
     8 # 解析该交易在receipt里输出的output,即交易调用的方法的return值
     9 outputresult = abi_parser.parse_receipt_output(inputresult['name'], receipt['output'])
    10 print("receipt output :", outputresult)

    Fisco 是通过智能合约 setAttr() 方法写入数据改变区块链的状态。根据交易哈希 transactionHash 获取交易信息,根据交易信息进而解析输入的参数和返回的参数。和以太坊有所区别,不需要有 getAttr() , 或者说 getttr() 方法是无法获取使用的。

    合约文件(此文件需要在 python-sdk/ contracts文件夹下):

     1 pragma solidity ^0.4.25;
     2 
     3     contract BoardTrace {
     4         string productId;
     5         string pClass;
     6         string pSize;
     7         string bClass;
     8         string designStaff;
     9         string designCompanyName;
    10         string customerName;
    11         string customerAddress;
    12         string customerTelePhone;
    13         
    14         function setAttr(string memory _productId, string memory _pClass, string memory _bClass, string memory _designStaff, string memory _designCompanyName, string memory _customerName) public returns (string memory, string memory, string memory, string memory, string memory, string memory){
    15             productId = _productId;
    16             pClass = _pClass;
    17             bClass = _bClass;
    18             designStaff = _designStaff;
    19             designCompanyName = _designCompanyName;
    20             customerName = _customerName;
    21             
    22             return (productId, pClass, bClass, designStaff, designCompanyName, customerName);
    23         }
    24     }
    25     
    sol

    代码(此文件需要在 python-sdk 文件夹下):

      1 import sys
      2 import os
      3 from client.bcosclient import BcosClient
      4 from client_config import client_config
      5 from client.datatype_parser import DatatypeParser
      6 from client.common.compiler import Compiler
      7 from utils.abi import *
      8 import json
      9 import traceback
     10     
     11 class FiscoBcosTest:
     12     
     13     # _contractFilePath = "/home/xsmile/fisco/python-sdk/contracts/"
     14     _contractFilePath = "/home/xsmile/software/boardTrace/easyarron/tracewood/python_sdk/contracts/"
     15 
     16     def __init__(self):
     17         self.client = BcosClient()
     18 
     19     # 编译合约
     20     # .sol 编译会自动生成 .abi, .bin 文件(当前文件下,contracts/ 下面)
     21     def compileContract(self, contractName):
     22 
     23         if os.path.isfile(client_config.solc_path) or os.path.isfile(client_config.solcjs_path):
     24             Compiler.compile_file(self._contractFilePath + contractName + ".sol")
     25 
     26         abi_file = self._contractFilePath + contractName + ".abi"
     27         data_parser = DatatypeParser()
     28         data_parser.load_abi_file(abi_file)
     29         contract_abi = data_parser.contract_abi
     30         
     31         return contract_abi, data_parser
     32 
     33     # 部署合约
     34     def deployContract(self, contractName):
     35         #contract_abi = self.compileContract(contractName)
     36         with open(self._contractFilePath + contractName + ".bin", 'r') as fi:
     37             contract_bin = fi.read()
     38     
     39         contract_result = self.client.deploy(contract_bin)
     40         contract_address = contract_result['contractAddress']
     41         
     42         return contract_address
     43         
     44     # 获取合约数据内容
     45     def getInfo(self, contract_address, contract_abi, func):
     46         res = self.client.call(contract_address, contract_abi, func)
     47         return res
     48     
     49     # 发送交易, 调用改写接口
     50     def setInfo(self, contract_address, contract_abi, func, *args):
     51         receipt = self.client.sendRawTransactionGetReceipt(contract_address, contract_abi, func,  *args)
     52         # txhash = receipt['transactionHash']
     53         # return txhash
     54         return receipt
     55         
     56     
     57     # 根据交易哈希获取交易回执
     58     def getReceipt(self, tx_hash):
     59         res_receipt = self.client.getTransactionReceipt(tx_hash)
     60         return res_receipt
     61         
     62     # 根据交易哈希获取交易信息
     63     def getTransactionInfo(self, tx_hash):
     64         txInfo = self.client.getTransactionByHash(tx_hash)
     65         return txInfo
     66         
     67     def finishClient(self):
     68         self.client.finish()
     69 
     70     def __str__(self):
     71         return self.client.getinfo()
     72 
     73 
     74 
     75 def run():
     76     
     77     fisco = FiscoBcosTest()
     78     print('生成实例: ', fisco)
     79     contract_name = 'BoardTrace'
     80     print('--------------编译合约----------------------------')
     81     contract_abi, abi_parser = fisco.compileContract(contract_name)
     82     
     83     '''
     84     
     85     print('--------------部署合约----------------------------')
     86     contract_address = fisco.deployContract(contract_name)
     87     print('--------->>', type(contract_abi))
     88     print('合约地址: {} 
    abi: {}'.format(contract_address, contract_abi))
     89     
     90     return ;
     91     '''
     92     
     93     contract_address = '0xb7a506877cd874b0dc0ed1a43762193b60a7b6d4'
     94     
     95     '''
     96     # 通过合约写入数据
     97     contract_args = ['2020082911', '书桌', '沉香木', '远阪凛', '斗牛家具有限公司', '张阿喵']
     98     receipt = fisco.setInfo(contract_address, contract_abi, 'setAttr', contract_args)
     99     print('--------------交易内容----------------------------')
    100     print('receipt: ', receipt)
    101     print('transacitonHash:', receipt['transactionHash'])
    102     '''
    103     
    104     
    105     
    106     # input ['2020082910', '橱柜', '沉香木', '远阪凛', '斗牛家具有限公司', '张阿喵']
    107     transaction_hash = '0x13e1bcaeff87a41090f486fad4c5ab1ddc5c87d852984520303169a60e33149e'
    108     
    109     # input ['2020082911', '书桌', '沉香木', '远阪凛', '斗牛家具有限公司', '张阿喵']
    110     # transaction_hash = '0xc5160839282dd05fda120b8b1a67a47890ef6b493de6a79a9b6bc18c80248733'
    111     
    112     
    113     # 根据交易 hash 获取交易回执
    114     res_receipt = fisco.getReceipt(transaction_hash)
    115     print('res_receipt: {}'.format(json.dumps(res_receipt, indent=4)))
    116     
    117     
    118     # 根据交易 hash 获取交易信息
    119     txInfo = fisco.getTransactionInfo(transaction_hash)
    120     print('txInfo: {}'.format(json.dumps(txInfo, indent=4)))
    121     
    122     # 获取对应的交易数据,解析出调用方法名和参数
    123     # print('--------------获取对应的交易输入数据----------------------------')
    124     inputresult = abi_parser.parse_transaction_input(txInfo['input'])
    125     # print(inputresult)
    126 
    127     # 解析该交易在receipt里输出的output,即交易调用的方法的return值
    128     print('--------------获取对应的交易输出数据----------------------------')
    129     outputresult = abi_parser.parse_receipt_output(inputresult['name'], res_receipt['output'])
    130     print("receipt output :", type(outputresult), outputresult)
    131     
    132     '''
    133     # 获取合约数据
    134     res = fisco.getInfo(contract_address, contract_abi, 'getAttr')
    135     print('--------------获取合约数据存储信息----------------------------')
    136     print('res: ', res)
    137     '''
    138     
    139     fisco.finishClient()
    140     
    141 if __name__ == '__main__':
    142     run()
    Code

    运行结果:

     1 xsmile@xsmile:~/software/boardTrace/easyarron/tracewood/python_sdk$ python3 fiscoTest.py 
     2 生成实例:  channel 127.0.0.1:20200,groupid :1
     3 --------------编译合约----------------------------
     4 INFO >> compile with solc compiler :  ./bin/solc/v0.4.25/solc --bin --abi /home/xsmile/software/boardTrace/easyarron/tracewood/python_sdk/contracts/BoardTrace.sol -o contracts --overwrite
     5 res_receipt: {
     6     "blockHash": "0x12517a791649ddaa7308a95fa47c15b7f2616192ed313179034804b402d6775d",
     7     "blockNumber": "0x23",
     8     "contractAddress": "0x0000000000000000000000000000000000000000",
     9     "from": "0x95198b93705e394a916579e048c8a32ddfb900f7",
    10     "gasUsed": "0x18c2a",
    11     "input": "0x67a2ef5f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4b9a6e6a18c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    12     "logs": [],
    13     "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    14     "output": "0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4b9a6e6a18c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    15     "root": "0xec7a40e8c0b4117e2ab1994b20f6f5c209990d429fa79cf5f5cdabc250a48651",
    16     "status": "0x0",
    17     "to": "0xb7a506877cd874b0dc0ed1a43762193b60a7b6d4",
    18     "transactionHash": "0xc5160839282dd05fda120b8b1a67a47890ef6b493de6a79a9b6bc18c80248733",
    19     "transactionIndex": "0x0"
    20 }
    21 txInfo: {
    22     "blockHash": "0x12517a791649ddaa7308a95fa47c15b7f2616192ed313179034804b402d6775d",
    23     "blockNumber": "0x23",
    24     "from": "0x95198b93705e394a916579e048c8a32ddfb900f7",
    25     "gas": "0x1c9c380",
    26     "gasPrice": "0x1c9c380",
    27     "hash": "0xc5160839282dd05fda120b8b1a67a47890ef6b493de6a79a9b6bc18c80248733",
    28     "input": "0x67a2ef5f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4b9a6e6a18c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    29     "nonce": "0x1a79cba2",
    30     "to": "0xb7a506877cd874b0dc0ed1a43762193b60a7b6d4",
    31     "transactionIndex": "0x0",
    32     "value": "0x0"
    33 }
    34 --------------获取对应的交易输出数据----------------------------
    35 receipt output : <class 'tuple'> ('2020082911', '书桌', '沉香木', '远阪凛', '斗牛家具有限公司', '张阿喵')
    36 xsmile@xsmile:~/software/boardTrace/easyarron/tracewood/python_sdk$ python3 fiscoTest.py 
    37 生成实例:  channel 127.0.0.1:20200,groupid :1
    38 --------------编译合约----------------------------
    39 INFO >> compile with solc compiler :  ./bin/solc/v0.4.25/solc --bin --abi /home/xsmile/software/boardTrace/easyarron/tracewood/python_sdk/contracts/BoardTrace.sol -o contracts --overwrite
    40 res_receipt: {
    41     "blockHash": "0x02d0e02c03513bfebfe9205bb954bd7f0adcd188bbad320b71c77ea4d7b4ebf7",
    42     "blockNumber": "0x22",
    43     "contractAddress": "0x0000000000000000000000000000000000000000",
    44     "from": "0x95198b93705e394a916579e048c8a32ddfb900f7",
    45     "gasUsed": "0x27534",
    46     "input": "0x67a2ef5f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e6a9b1e69f9c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    47     "logs": [],
    48     "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    49     "output": "0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e6a9b1e69f9c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    50     "root": "0x9ba5787752ab25d50b2dcf6e16d333af9f8904458d4439a2c77dc97ddd6f978f",
    51     "status": "0x0",
    52     "to": "0xb7a506877cd874b0dc0ed1a43762193b60a7b6d4",
    53     "transactionHash": "0x13e1bcaeff87a41090f486fad4c5ab1ddc5c87d852984520303169a60e33149e",
    54     "transactionIndex": "0x0"
    55 }
    56 txInfo: {
    57     "blockHash": "0x02d0e02c03513bfebfe9205bb954bd7f0adcd188bbad320b71c77ea4d7b4ebf7",
    58     "blockNumber": "0x22",
    59     "from": "0x95198b93705e394a916579e048c8a32ddfb900f7",
    60     "gas": "0x1c9c380",
    61     "gasPrice": "0x1c9c380",
    62     "hash": "0x13e1bcaeff87a41090f486fad4c5ab1ddc5c87d852984520303169a60e33149e",
    63     "input": "0x67a2ef5f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a32303230303832393130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e6a9b1e69f9c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6b289e9a699e69ca800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e8bf9ce998aae5879b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e69697e7899be5aeb6e585b7e69c89e99990e585ace58fb800000000000000000000000000000000000000000000000000000000000000000000000000000009e5bca0e998bfe596b50000000000000000000000000000000000000000000000",
    64     "nonce": "0x101f2919",
    65     "to": "0xb7a506877cd874b0dc0ed1a43762193b60a7b6d4",
    66     "transactionIndex": "0x0",
    67     "value": "0x0"
    68 }
    69 --------------获取对应的交易输出数据----------------------------
    70 receipt output : <class 'tuple'> ('2020082910', '橱柜', '沉香木', '远阪凛', '斗牛家具有限公司', '张阿喵')
    result
  • 相关阅读:
    8.1 管道符| 使用技巧
    7.1 elementui的radio无法选中问题
    2.0 es6数组操作
    小练习-双数日期
    匿名函数、三元表达式、列表生成式
    sys.argv
    常用模块 os,sys,
    Python操作数据库
    Python time模块
    加密模块hashlib
  • 原文地址:https://www.cnblogs.com/xsmile/p/13581425.html
Copyright © 2011-2022 走看看