chainmaker


Namechainmaker JSON
Version 3.0.7 PyPI version JSON
download
home_pagehttps://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-python.git
SummaryChainMaker Python SDK
upload_time2023-10-25 07:16:26
maintainer
docs_urlNone
authorTHL chainmaker developers
requires_python
licenseApache License
keywords chainmaker blockchain chainmaker-sdk-python chainmaker-sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Chainmaker-Python-SDK

[[长安链]](https://chainmaker.org.cn/)Python SDK。基于gRPC及[chainmaker/pb](https://git.chainmaker.org.cn/chainmaker/sdk-python)(protos)的链客户端。
提供链查询、链配置、用户合约管理、证书管理、公钥管理、订阅管理、多签管理、归档、Gas管理、交易池查询、DPos Erc20、DPos Stake、隐私计算等操作。

[sdk-python开源仓库地址](https://git.chainmaker.org.cn/chainmaker/sdk-python)

## 特性
- [x] 支持PermissionedWithCert、PermissionedWithKey、Public三种模式
- [x] 支持链查询,查询区块信息、区块头、区块高度、交易信息等
- [x] 支持查询链配置,更新核心配置、区块配置,增加修改删除信任根证书,增加修改共识节点等
- [x] 支持用户合约操作,合约查询、创建、更新、调用、查询、冻结、解冻、吊销等
- [x] 支持证书管理、证书哈希、证书别名管理及公钥管理
- [x] 支持Gas管理,查询设置Gas管理员,查询Gas账户状态、余额,Gas充值、退款等操作
- [x] 支持DPos Erc20、DPos权益、DPos惩罚、DPos奖励等相关操作
- [x] 支持交易池状态查询
- [x] 支持区块订阅、交易合约及订阅合约事件
- [x] 支持多签请求、投票、查询等,支持多签手动运行及自动运行
- [x] 支持交易黑名单功能
- [x] 支持隐私计算
- [x] 支持国密非TLS场景(如,Public模式+国密)
- [x] 支持共识高度、共识状态等查询


## 安装方法

> chainmaker-python-sdk支持 python3.6~python3.10, 已知python3.11安装pysha3存在问题

**在线安装**

```shell
$ pip install chainmaker
```

## 使用方法

### 以配置文件形式创建ChainClient
> [配置文件sdk_config.yml格式参考](https://docs.chainmaker.org.cn/operation/配置文件一览.html#sdk-config-yml)


配置文件`./testdata/sdk_config.yml`参考内容
```yaml
chain_client:
  chain_id: "chain1"
  org_id: "wx-org1.chainmaker.org"
  user_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key"
  user_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt"
  user_sign_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key"
  user_sign_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt"

  nodes:
    - node_addr: "127.0.0.1:12301"  # 节点rpc服务地址
      enable_tls: true
      conn_cnt: 1
      trust_root_paths:
        - "./testdata/crypto-config/wx-org1.chainmaker.org/ca"
        - "./testdata/crypto-config/wx-org2.chainmaker.org/ca"
      tls_host_name: "chainmaker.org" 
```
> 注: sdk_config.yml中私钥/证书等如果使用相对路径应相对于当前运行起始目录,建议使用绝对路径

使用配置文件创建链客户端
```python
from chainmaker import ChainClient
# 创建链客户端
cc = ChainClient.from_conf('./testdata/sdk_config.yml')
# 获取链版本
print(cc.get_chainmaker_server_version())
```
> 使用管理台生成的链由于生成的证书未包含部署服务器的域名使用sdk-python可能导致连接不上,参见[已知问题](#已知问题)

### 以参数形式创建ChainClient

```python
from chainmaker import Node, User, ChainClient

crypto_config_path = './testdata/crypto-config'
node_addr = '127.0.0.1:12301'

def read_file_bytes(file_path):
    return open(file_path, 'rb').read()

# 创建签名用户
user = User(
    org_id='wx-org1.chainmaker.org',
    sign_key_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.tls.key'),
    sign_cert_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.tls.crt'),
    tls_key_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.sign.key'),
    tls_cert_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.sign.crt')
)

# 创建连接节点
node = Node(
    node_addr=node_addr,
    conn_cnt=1,
    enable_tls=True,
    trust_cas=[read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/ca'),
               read_file_bytes(f'{crypto_config_path}/wx-org2.chainmaker.org/ca')],
    tls_host_name='chainmaker.org'
)

# 创建链客户端
cc = ChainClient(chain_id='chain1', user=user, nodes=[node])
# 获取链版本
print(cc.get_chainmaker_server_version())
```

### 创建wasm合约

```python

from chainmaker import ChainClient, RuntimeType

crypto_config_path = './testdata/crypto-config'

# 背书用户配置
endorsers_config = [
    {'org_id': 'wx-org1.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.key'},
    {'org_id': 'wx-org2.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.key'},
    {'org_id': 'wx-org3.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.key'},
]

cc = ChainClient.from_conf('./testdata/sdk_config.yml')


# 创建WASM合约,本地合约文件./testdata/contracts/rust-fact-2.0.0.wasm应存在
payload = cc.create_contract_create_payload(
    contract_name='fact', 
    version='1.0', 
    byte_code_or_file_path='./testdata/contracts/rust-fact-2.0.0.wasm',
    runtime_type=RuntimeType.WASMER, 
    params={})
# 创建背书
endorsers = cc.create_endorsers(payload, endorsers_config)
# 发送创建合约请求
tx_response = cc.send_contract_manage_request(payload, endorsers=endorsers, with_sync_result=True)
print(tx_response)
```
### 创建evm合约

```python
from chainmaker import ChainClient, RuntimeType

crypto_config_path = './testdata/crypto-config'

# 背书用户配置
endorsers_config = [
    {'org_id': 'wx-org1.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.key'},
    {'org_id': 'wx-org2.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.key'},
    {'org_id': 'wx-org3.chainmaker.org',
     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt',
     'user_sign_key_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.key'},
]

cc = ChainClient.from_conf('./testdata/sdk_config.yml')
# 创建EVM合约,本地合约文件./testdata/contracts/ledger_balance.bin应存在
payload = cc.create_contract_create_payload(
    contract_name='balance001', 
    version='1.0', 
    byte_code_or_file_path='./testdata/contracts/ledger_balance.bin',
    runtime_type=RuntimeType.EVM)
# 创建背书
endorsers = cc.create_endorsers(payload, endorsers_config)
# 发送创建合约请求
tx_response = cc.send_contract_manage_request(payload, endorsers=endorsers, with_sync_result=True)
print(tx_response)
```

### 调用wasm合约

```python
from chainmaker.chain_client import ChainClient
from chainmaker.utils.evm_utils import calc_evm_method_params

# 创建客户端
cc = ChainClient.from_conf('./testdata/sdk_config.yml')

# 调用WASM合约
tx_response = cc.invoke_contract(
    contract_name='fact',
    method='save',
    params={"file_name": "name007", "file_hash": "ab3456df5799b87c77e7f88", "time": "6543234"},
    with_sync_result=True)

print(tx_response)
```

### 调用evm合约

```python
from chainmaker.chain_client import ChainClient
from chainmaker.utils.evm_utils import calc_evm_method_params

# 创建客户端
cc = ChainClient.from_conf('./testdata/sdk_config.yml')
# 调用EVM合约
evm_contract_name = 'balance001'  # EVM合约名不再需要进行转换
evm_method, evm_params = calc_evm_method_params(
    method='updateBalance', 
    params=[{"uint256": "10000"}, {"address": "0xa166c92f4c8118905ad984919dc683a7bdb295c1"}])

tx_response = cc.invoke_contract(
    contract_name=evm_contract_name, 
    method=evm_method, 
    params=evm_params, 
    with_sync_result=True)

print(tx_response)
```

### 更多示例和用法

> 更多示例和用法,请参考单元测试用例

| 功能    | 单测代码                            |
|-------|---------------------------------|
| 用户合约  | `tests/test_user_contract.py`   |
| 系统合约  | `tests/test_system_contract.py` |
| 链配置   | `tests/test_chain_config.py`    |
| 证书管理  | `tests/test_cert_manage.py`     |
| 消息订阅  | `tests/test_user_contract.py`   |


## 接口说明

详细参考: [SDK接口文档](SDK_INTERFACES.md)

## 变更纪录

详细参考[CHANGELOG](CHANGELOG.md)

## 如何运行测试


1. 安装测试需要的依赖
```shell
pip install -r requirements-test.txt
```
2. 下载并拷贝被测环境的crypto-config到tests/resources/目录下

3. 修改tests/resources/sdk_config.yml中的节点地址或修改tests/pytest.ini中是sdk_config配置指定sdk_config.yml路径

4. 运行测试
```shell
pytest tests
```

## 如何进行开发

1. 安装依赖
```shell
pip install requirements-dev
```

更新protos
```shell
make proto
```


测试覆盖率
```shell
make coverage
```

检查代码
```shell
make lint
```

发布
```shell
make release
```

## TODO
- [ ] 支持国密TLS
- [ ] 实现Hibe加密

## 已知问题
- [ ] 使用Python3.11安装时,pysha3会build失败,可以改为Python3.6~python3.10,建议使用Python3.9
- [ ] 使用管理台部署的链,使用sdk-python连接报错(使用sdk-go能连接),可能原因为管理台生成的证书扩展SAN(SubjectAlternativeName)中不包含部署服务的域名导致OpenSSL验证失败所致(sdk-go不验证该项),可以尝试在sdk_config.yml的tls_host_name修改为你的域名,或尝试使用
[chainmaker-cryptogen](https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen)项目生成证书。

## 参考

- [chainmaker-docs](https://docs.chainmaker.org.cn/index.html)
- [gRPC Python](https://grpc.github.io/grpc/python)
- [grpcio](https://grpc.io/docs/languages/python/quickstart/)
- [cryptography](https://cryptography.io/)
- [eth-abi](https://eth-abi.readthedocs.io/en/latest/)




            

Raw data

            {
    "_id": null,
    "home_page": "https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-python.git",
    "name": "chainmaker",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "chainmaker,blockchain,chainmaker-sdk-python,chainmaker-sdk",
    "author": "THL chainmaker developers",
    "author_email": "operation@chainmaker.org",
    "download_url": "https://files.pythonhosted.org/packages/a1/22/8bd3b28f14cf241eb697dbfc63e170c907fa75a061f0afab7cb47e420660/chainmaker-3.0.7.tar.gz",
    "platform": null,
    "description": "# Chainmaker-Python-SDK\n\n[[\u957f\u5b89\u94fe]](https://chainmaker.org.cn/)Python SDK\u3002\u57fa\u4e8egRPC\u53ca[chainmaker/pb](https://git.chainmaker.org.cn/chainmaker/sdk-python)(protos)\u7684\u94fe\u5ba2\u6237\u7aef\u3002\n\u63d0\u4f9b\u94fe\u67e5\u8be2\u3001\u94fe\u914d\u7f6e\u3001\u7528\u6237\u5408\u7ea6\u7ba1\u7406\u3001\u8bc1\u4e66\u7ba1\u7406\u3001\u516c\u94a5\u7ba1\u7406\u3001\u8ba2\u9605\u7ba1\u7406\u3001\u591a\u7b7e\u7ba1\u7406\u3001\u5f52\u6863\u3001Gas\u7ba1\u7406\u3001\u4ea4\u6613\u6c60\u67e5\u8be2\u3001DPos Erc20\u3001DPos Stake\u3001\u9690\u79c1\u8ba1\u7b97\u7b49\u64cd\u4f5c\u3002\n\n[sdk-python\u5f00\u6e90\u4ed3\u5e93\u5730\u5740](https://git.chainmaker.org.cn/chainmaker/sdk-python)\n\n## \u7279\u6027\n- [x] \u652f\u6301PermissionedWithCert\u3001PermissionedWithKey\u3001Public\u4e09\u79cd\u6a21\u5f0f\n- [x] \u652f\u6301\u94fe\u67e5\u8be2,\u67e5\u8be2\u533a\u5757\u4fe1\u606f\u3001\u533a\u5757\u5934\u3001\u533a\u5757\u9ad8\u5ea6\u3001\u4ea4\u6613\u4fe1\u606f\u7b49\n- [x] \u652f\u6301\u67e5\u8be2\u94fe\u914d\u7f6e,\u66f4\u65b0\u6838\u5fc3\u914d\u7f6e\u3001\u533a\u5757\u914d\u7f6e,\u589e\u52a0\u4fee\u6539\u5220\u9664\u4fe1\u4efb\u6839\u8bc1\u4e66,\u589e\u52a0\u4fee\u6539\u5171\u8bc6\u8282\u70b9\u7b49\n- [x] \u652f\u6301\u7528\u6237\u5408\u7ea6\u64cd\u4f5c,\u5408\u7ea6\u67e5\u8be2\u3001\u521b\u5efa\u3001\u66f4\u65b0\u3001\u8c03\u7528\u3001\u67e5\u8be2\u3001\u51bb\u7ed3\u3001\u89e3\u51bb\u3001\u540a\u9500\u7b49\n- [x] \u652f\u6301\u8bc1\u4e66\u7ba1\u7406\u3001\u8bc1\u4e66\u54c8\u5e0c\u3001\u8bc1\u4e66\u522b\u540d\u7ba1\u7406\u53ca\u516c\u94a5\u7ba1\u7406\n- [x] \u652f\u6301Gas\u7ba1\u7406,\u67e5\u8be2\u8bbe\u7f6eGas\u7ba1\u7406\u5458,\u67e5\u8be2Gas\u8d26\u6237\u72b6\u6001\u3001\u4f59\u989d,Gas\u5145\u503c\u3001\u9000\u6b3e\u7b49\u64cd\u4f5c\n- [x] \u652f\u6301DPos Erc20\u3001DPos\u6743\u76ca\u3001DPos\u60e9\u7f5a\u3001DPos\u5956\u52b1\u7b49\u76f8\u5173\u64cd\u4f5c\n- [x] \u652f\u6301\u4ea4\u6613\u6c60\u72b6\u6001\u67e5\u8be2\n- [x] \u652f\u6301\u533a\u5757\u8ba2\u9605\u3001\u4ea4\u6613\u5408\u7ea6\u53ca\u8ba2\u9605\u5408\u7ea6\u4e8b\u4ef6\n- [x] \u652f\u6301\u591a\u7b7e\u8bf7\u6c42\u3001\u6295\u7968\u3001\u67e5\u8be2\u7b49\uff0c\u652f\u6301\u591a\u7b7e\u624b\u52a8\u8fd0\u884c\u53ca\u81ea\u52a8\u8fd0\u884c\n- [x] \u652f\u6301\u4ea4\u6613\u9ed1\u540d\u5355\u529f\u80fd\n- [x] \u652f\u6301\u9690\u79c1\u8ba1\u7b97\n- [x] \u652f\u6301\u56fd\u5bc6\u975eTLS\u573a\u666f(\u5982,Public\u6a21\u5f0f+\u56fd\u5bc6)\n- [x] \u652f\u6301\u5171\u8bc6\u9ad8\u5ea6\u3001\u5171\u8bc6\u72b6\u6001\u7b49\u67e5\u8be2\n\n\n## \u5b89\u88c5\u65b9\u6cd5\n\n> chainmaker-python-sdk\u652f\u6301 python3.6~python3.10, \u5df2\u77e5python3.11\u5b89\u88c5pysha3\u5b58\u5728\u95ee\u9898\n\n**\u5728\u7ebf\u5b89\u88c5**\n\n```shell\n$ pip install chainmaker\n```\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n### \u4ee5\u914d\u7f6e\u6587\u4ef6\u5f62\u5f0f\u521b\u5efaChainClient\n> [\u914d\u7f6e\u6587\u4ef6sdk_config.yml\u683c\u5f0f\u53c2\u8003](https://docs.chainmaker.org.cn/operation/\u914d\u7f6e\u6587\u4ef6\u4e00\u89c8.html#sdk-config-yml)\n\n\n\u914d\u7f6e\u6587\u4ef6`./testdata/sdk_config.yml`\u53c2\u8003\u5185\u5bb9\n```yaml\nchain_client:\n  chain_id: \"chain1\"\n  org_id: \"wx-org1.chainmaker.org\"\n  user_key_file_path: \"./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key\"\n  user_crt_file_path: \"./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt\"\n  user_sign_key_file_path: \"./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key\"\n  user_sign_crt_file_path: \"./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt\"\n\n  nodes:\n    - node_addr: \"127.0.0.1:12301\"  # \u8282\u70b9rpc\u670d\u52a1\u5730\u5740\n      enable_tls: true\n      conn_cnt: 1\n      trust_root_paths:\n        - \"./testdata/crypto-config/wx-org1.chainmaker.org/ca\"\n        - \"./testdata/crypto-config/wx-org2.chainmaker.org/ca\"\n      tls_host_name: \"chainmaker.org\" \n```\n> \u6ce8: sdk_config.yml\u4e2d\u79c1\u94a5/\u8bc1\u4e66\u7b49\u5982\u679c\u4f7f\u7528\u76f8\u5bf9\u8def\u5f84\u5e94\u76f8\u5bf9\u4e8e\u5f53\u524d\u8fd0\u884c\u8d77\u59cb\u76ee\u5f55,\u5efa\u8bae\u4f7f\u7528\u7edd\u5bf9\u8def\u5f84\n\n\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u521b\u5efa\u94fe\u5ba2\u6237\u7aef\n```python\nfrom chainmaker import ChainClient\n# \u521b\u5efa\u94fe\u5ba2\u6237\u7aef\ncc = ChainClient.from_conf('./testdata/sdk_config.yml')\n# \u83b7\u53d6\u94fe\u7248\u672c\nprint(cc.get_chainmaker_server_version())\n```\n> \u4f7f\u7528\u7ba1\u7406\u53f0\u751f\u6210\u7684\u94fe\u7531\u4e8e\u751f\u6210\u7684\u8bc1\u4e66\u672a\u5305\u542b\u90e8\u7f72\u670d\u52a1\u5668\u7684\u57df\u540d\u4f7f\u7528sdk-python\u53ef\u80fd\u5bfc\u81f4\u8fde\u63a5\u4e0d\u4e0a\uff0c\u53c2\u89c1[\u5df2\u77e5\u95ee\u9898](#\u5df2\u77e5\u95ee\u9898)\n\n### \u4ee5\u53c2\u6570\u5f62\u5f0f\u521b\u5efaChainClient\n\n```python\nfrom chainmaker import Node, User, ChainClient\n\ncrypto_config_path = './testdata/crypto-config'\nnode_addr = '127.0.0.1:12301'\n\ndef read_file_bytes(file_path):\n    return open(file_path, 'rb').read()\n\n# \u521b\u5efa\u7b7e\u540d\u7528\u6237\nuser = User(\n    org_id='wx-org1.chainmaker.org',\n    sign_key_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.tls.key'),\n    sign_cert_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.tls.crt'),\n    tls_key_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.sign.key'),\n    tls_cert_bytes=read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/user/client1/client1.sign.crt')\n)\n\n# \u521b\u5efa\u8fde\u63a5\u8282\u70b9\nnode = Node(\n    node_addr=node_addr,\n    conn_cnt=1,\n    enable_tls=True,\n    trust_cas=[read_file_bytes(f'{crypto_config_path}/wx-org1.chainmaker.org/ca'),\n               read_file_bytes(f'{crypto_config_path}/wx-org2.chainmaker.org/ca')],\n    tls_host_name='chainmaker.org'\n)\n\n# \u521b\u5efa\u94fe\u5ba2\u6237\u7aef\ncc = ChainClient(chain_id='chain1', user=user, nodes=[node])\n# \u83b7\u53d6\u94fe\u7248\u672c\nprint(cc.get_chainmaker_server_version())\n```\n\n### \u521b\u5efawasm\u5408\u7ea6\n\n```python\n\nfrom chainmaker import ChainClient, RuntimeType\n\ncrypto_config_path = './testdata/crypto-config'\n\n# \u80cc\u4e66\u7528\u6237\u914d\u7f6e\nendorsers_config = [\n    {'org_id': 'wx-org1.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.key'},\n    {'org_id': 'wx-org2.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.key'},\n    {'org_id': 'wx-org3.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.key'},\n]\n\ncc = ChainClient.from_conf('./testdata/sdk_config.yml')\n\n\n# \u521b\u5efaWASM\u5408\u7ea6\uff0c\u672c\u5730\u5408\u7ea6\u6587\u4ef6./testdata/contracts/rust-fact-2.0.0.wasm\u5e94\u5b58\u5728\npayload = cc.create_contract_create_payload(\n    contract_name='fact', \n    version='1.0', \n    byte_code_or_file_path='./testdata/contracts/rust-fact-2.0.0.wasm',\n    runtime_type=RuntimeType.WASMER, \n    params={})\n# \u521b\u5efa\u80cc\u4e66\nendorsers = cc.create_endorsers(payload, endorsers_config)\n# \u53d1\u9001\u521b\u5efa\u5408\u7ea6\u8bf7\u6c42\ntx_response = cc.send_contract_manage_request(payload, endorsers=endorsers, with_sync_result=True)\nprint(tx_response)\n```\n### \u521b\u5efaevm\u5408\u7ea6\n\n```python\nfrom chainmaker import ChainClient, RuntimeType\n\ncrypto_config_path = './testdata/crypto-config'\n\n# \u80cc\u4e66\u7528\u6237\u914d\u7f6e\nendorsers_config = [\n    {'org_id': 'wx-org1.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org1.chainmaker.org/user/admin1/admin1.sign.key'},\n    {'org_id': 'wx-org2.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org2.chainmaker.org/user/admin1/admin1.sign.key'},\n    {'org_id': 'wx-org3.chainmaker.org',\n     'user_sign_crt_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt',\n     'user_sign_key_file_path': f'{crypto_config_path}/wx-org3.chainmaker.org/user/admin1/admin1.sign.key'},\n]\n\ncc = ChainClient.from_conf('./testdata/sdk_config.yml')\n# \u521b\u5efaEVM\u5408\u7ea6\uff0c\u672c\u5730\u5408\u7ea6\u6587\u4ef6./testdata/contracts/ledger_balance.bin\u5e94\u5b58\u5728\npayload = cc.create_contract_create_payload(\n    contract_name='balance001', \n    version='1.0', \n    byte_code_or_file_path='./testdata/contracts/ledger_balance.bin',\n    runtime_type=RuntimeType.EVM)\n# \u521b\u5efa\u80cc\u4e66\nendorsers = cc.create_endorsers(payload, endorsers_config)\n# \u53d1\u9001\u521b\u5efa\u5408\u7ea6\u8bf7\u6c42\ntx_response = cc.send_contract_manage_request(payload, endorsers=endorsers, with_sync_result=True)\nprint(tx_response)\n```\n\n### \u8c03\u7528wasm\u5408\u7ea6\n\n```python\nfrom chainmaker.chain_client import ChainClient\nfrom chainmaker.utils.evm_utils import calc_evm_method_params\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\ncc = ChainClient.from_conf('./testdata/sdk_config.yml')\n\n# \u8c03\u7528WASM\u5408\u7ea6\ntx_response = cc.invoke_contract(\n    contract_name='fact',\n    method='save',\n    params={\"file_name\": \"name007\", \"file_hash\": \"ab3456df5799b87c77e7f88\", \"time\": \"6543234\"},\n    with_sync_result=True)\n\nprint(tx_response)\n```\n\n### \u8c03\u7528evm\u5408\u7ea6\n\n```python\nfrom chainmaker.chain_client import ChainClient\nfrom chainmaker.utils.evm_utils import calc_evm_method_params\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\ncc = ChainClient.from_conf('./testdata/sdk_config.yml')\n# \u8c03\u7528EVM\u5408\u7ea6\nevm_contract_name = 'balance001'  # EVM\u5408\u7ea6\u540d\u4e0d\u518d\u9700\u8981\u8fdb\u884c\u8f6c\u6362\nevm_method, evm_params = calc_evm_method_params(\n    method='updateBalance', \n    params=[{\"uint256\": \"10000\"}, {\"address\": \"0xa166c92f4c8118905ad984919dc683a7bdb295c1\"}])\n\ntx_response = cc.invoke_contract(\n    contract_name=evm_contract_name, \n    method=evm_method, \n    params=evm_params, \n    with_sync_result=True)\n\nprint(tx_response)\n```\n\n### \u66f4\u591a\u793a\u4f8b\u548c\u7528\u6cd5\n\n> \u66f4\u591a\u793a\u4f8b\u548c\u7528\u6cd5\uff0c\u8bf7\u53c2\u8003\u5355\u5143\u6d4b\u8bd5\u7528\u4f8b\n\n| \u529f\u80fd    | \u5355\u6d4b\u4ee3\u7801                            |\n|-------|---------------------------------|\n| \u7528\u6237\u5408\u7ea6  | `tests/test_user_contract.py`   |\n| \u7cfb\u7edf\u5408\u7ea6  | `tests/test_system_contract.py` |\n| \u94fe\u914d\u7f6e   | `tests/test_chain_config.py`    |\n| \u8bc1\u4e66\u7ba1\u7406  | `tests/test_cert_manage.py`     |\n| \u6d88\u606f\u8ba2\u9605  | `tests/test_user_contract.py`   |\n\n\n## \u63a5\u53e3\u8bf4\u660e\n\n\u8be6\u7ec6\u53c2\u8003: [SDK\u63a5\u53e3\u6587\u6863](SDK_INTERFACES.md)\n\n## \u53d8\u66f4\u7eaa\u5f55\n\n\u8be6\u7ec6\u53c2\u8003[CHANGELOG](CHANGELOG.md)\n\n## \u5982\u4f55\u8fd0\u884c\u6d4b\u8bd5\n\n\n1. \u5b89\u88c5\u6d4b\u8bd5\u9700\u8981\u7684\u4f9d\u8d56\n```shell\npip install -r requirements-test.txt\n```\n2. \u4e0b\u8f7d\u5e76\u62f7\u8d1d\u88ab\u6d4b\u73af\u5883\u7684crypto-config\u5230tests/resources/\u76ee\u5f55\u4e0b\n\n3. \u4fee\u6539tests/resources/sdk_config.yml\u4e2d\u7684\u8282\u70b9\u5730\u5740\u6216\u4fee\u6539tests/pytest.ini\u4e2d\u662fsdk_config\u914d\u7f6e\u6307\u5b9asdk_config.yml\u8def\u5f84\n\n4. \u8fd0\u884c\u6d4b\u8bd5\n```shell\npytest tests\n```\n\n## \u5982\u4f55\u8fdb\u884c\u5f00\u53d1\n\n1. \u5b89\u88c5\u4f9d\u8d56\n```shell\npip install requirements-dev\n```\n\n\u66f4\u65b0protos\n```shell\nmake proto\n```\n\n\n\u6d4b\u8bd5\u8986\u76d6\u7387\n```shell\nmake coverage\n```\n\n\u68c0\u67e5\u4ee3\u7801\n```shell\nmake lint\n```\n\n\u53d1\u5e03\n```shell\nmake release\n```\n\n## TODO\n- [ ] \u652f\u6301\u56fd\u5bc6TLS\n- [ ] \u5b9e\u73b0Hibe\u52a0\u5bc6\n\n## \u5df2\u77e5\u95ee\u9898\n- [ ] \u4f7f\u7528Python3.11\u5b89\u88c5\u65f6,pysha3\u4f1abuild\u5931\u8d25\uff0c\u53ef\u4ee5\u6539\u4e3aPython3.6\uff5epython3.10\uff0c\u5efa\u8bae\u4f7f\u7528Python3.9\n- [ ] \u4f7f\u7528\u7ba1\u7406\u53f0\u90e8\u7f72\u7684\u94fe\uff0c\u4f7f\u7528sdk-python\u8fde\u63a5\u62a5\u9519(\u4f7f\u7528sdk-go\u80fd\u8fde\u63a5)\uff0c\u53ef\u80fd\u539f\u56e0\u4e3a\u7ba1\u7406\u53f0\u751f\u6210\u7684\u8bc1\u4e66\u6269\u5c55SAN(SubjectAlternativeName)\u4e2d\u4e0d\u5305\u542b\u90e8\u7f72\u670d\u52a1\u7684\u57df\u540d\u5bfc\u81f4OpenSSL\u9a8c\u8bc1\u5931\u8d25\u6240\u81f4(sdk-go\u4e0d\u9a8c\u8bc1\u8be5\u9879),\u53ef\u4ee5\u5c1d\u8bd5\u5728sdk_config.yml\u7684tls_host_name\u4fee\u6539\u4e3a\u4f60\u7684\u57df\u540d,\u6216\u5c1d\u8bd5\u4f7f\u7528\n[chainmaker-cryptogen](https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen)\u9879\u76ee\u751f\u6210\u8bc1\u4e66\u3002\n\n## \u53c2\u8003\n\n- [chainmaker-docs](https://docs.chainmaker.org.cn/index.html)\n- [gRPC Python](https://grpc.github.io/grpc/python)\n- [grpcio](https://grpc.io/docs/languages/python/quickstart/)\n- [cryptography](https://cryptography.io/)\n- [eth-abi](https://eth-abi.readthedocs.io/en/latest/)\n\n\n\n",
    "bugtrack_url": null,
    "license": "Apache License",
    "summary": "ChainMaker Python SDK",
    "version": "3.0.7",
    "project_urls": {
        "Homepage": "https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-python.git"
    },
    "split_keywords": [
        "chainmaker",
        "blockchain",
        "chainmaker-sdk-python",
        "chainmaker-sdk"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "87bb22c511d43b165d27b0e4d11c20dccc528eeb88b92c83a4b57a9eca0fe880",
                "md5": "563ccc5a1d651954e844c9c9e2688985",
                "sha256": "6f104179ed632cc1247164661504fbf08db30e88ff6189ece5b2458d7a1a0ae4"
            },
            "downloads": -1,
            "filename": "chainmaker-3.0.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "563ccc5a1d651954e844c9c9e2688985",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 334346,
            "upload_time": "2023-10-25T07:16:24",
            "upload_time_iso_8601": "2023-10-25T07:16:24.274177Z",
            "url": "https://files.pythonhosted.org/packages/87/bb/22c511d43b165d27b0e4d11c20dccc528eeb88b92c83a4b57a9eca0fe880/chainmaker-3.0.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a1228bd3b28f14cf241eb697dbfc63e170c907fa75a061f0afab7cb47e420660",
                "md5": "74e5e6fe45fbf43878137216a279bb01",
                "sha256": "75ab71b0d1262c872bf8db3c5bb4dac04cb684fce4f4ebe3a5f302f66bc45a47"
            },
            "downloads": -1,
            "filename": "chainmaker-3.0.7.tar.gz",
            "has_sig": false,
            "md5_digest": "74e5e6fe45fbf43878137216a279bb01",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 233422,
            "upload_time": "2023-10-25T07:16:26",
            "upload_time_iso_8601": "2023-10-25T07:16:26.455463Z",
            "url": "https://files.pythonhosted.org/packages/a1/22/8bd3b28f14cf241eb697dbfc63e170c907fa75a061f0afab7cb47e420660/chainmaker-3.0.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-10-25 07:16:26",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "chainmaker"
}
        
Elapsed time: 0.13594s