您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Fabric链码Python开发包怎么用
## 一、前言
### 1.1 Hyperledger Fabric简介
Hyperledger Fabric是Linux基金会主导的企业级区块链框架,采用模块化架构设计,支持可插拔的共识机制和权限管理。与公有链不同,Fabric是许可型区块链网络,适合构建企业级分布式账本解决方案。
### 1.2 链码(Chaincode)的核心作用
链码是Fabric智能合约的实现形式,运行在隔离的Docker容器中。当交易提案被提交时,链码会执行特定业务逻辑,与账本状态进行交互。Python链码开发包为开发者提供了使用Python语言编写链码的能力。
## 二、环境准备
### 2.1 基础环境要求
```bash
# 推荐环境配置
- Ubuntu 20.04 LTS / macOS Big Sur+
- Docker 20.10+
- Docker Compose 1.29+
- Python 3.8+
- Go 1.16+(用于编译Fabric工具)
pip install fabric-sdk-py
pip install grpcio==1.38.0 # 注意版本兼容性
建议使用VS Code配合以下插件: - Python Extension Pack - Docker - Hyperledger Fabric扩展
peer lifecycle chaincode package
peer lifecycle chaincode install
peer lifecycle chaincode approveformyorg
peer lifecycle chaincode commit
from shim import ChaincodeStub
class MyChaincode:
async def Init(self, stub: ChaincodeStub):
args = stub.get_string_args()
# 初始化逻辑
return shim.success()
async def Invoke(self, stub: ChaincodeStub):
function, args = stub.get_function_and_parameters()
if function == "set":
return await self._set_value(stub, args)
elif function == "get":
return await self._get_value(stub, args)
else:
return shim.error("无效方法")
async def _set_value(self, stub, args):
if len(args) != 2:
return shim.error("参数错误")
await stub.put_state(args[0], args[1])
return shim.success()
async def _get_value(self, stub, args):
if len(args) != 1:
return shim.error("参数错误")
value = await stub.get_state(args[0])
return shim.success(value)
方法签名 | 说明 |
---|---|
put_state(key, value) |
写入状态 |
get_state(key) |
读取状态 |
del_state(key) |
删除状态 |
get_state_by_range(start, end) |
范围查询 |
# 获取交易信息示例
tx_id = stub.get_tx_id()
timestamp = stub.get_tx_timestamp()
creator = stub.get_creator() # 返回序列化后的MSP身份
# 创建复合键
composite_key = stub.create_composite_key(
object_type="asset",
attributes=["org1", "asset001"]
)
# 分解复合键
_, attrs = stub.split_composite_key(composite_key)
collections_config.json
中定义:{
"collection": {
"name": "privateDetails",
"policy": "OR('Org1MSP.member')",
"requiredPeerCount": 0,
"maxPeerCount": 3,
"blockToLive": 1000
}
}
await stub.put_private_data("privateDetails", key, value)
data = await stub.get_private_data("privateDetails", key)
# 发送事件
stub.set_event("transfer_event", json.dumps({
"from": "a",
"to": "b",
"amount": 100
}).encode())
# 客户端监听示例
from fabric_sdk import Client
async def listen_events():
client = Client(net_profile="network.json")
channel = client.new_channel("mychannel")
await channel.connect()
async for event in channel.listen_for_events():
print(f"收到事件: {event.event_name}")
print(event.payload.decode())
from shim import ChaincodeMockStub
def test_chaincode():
cc = MyChaincode()
stub = ChaincodeMockStub("mystub", cc)
# 测试Init
response = stub.mock_init("init", [])
assert response.status == 200
# 测试Invoke
stub.mock_invoke("set", ["key1", "value1"])
response = stub.mock_invoke("get", ["key1"])
assert response.payload == b"value1"
使用pytest
配合fabric-testnet
:
@pytest.fixture
def network():
yield TestNetwork(
compose_file="docker-compose-test.yaml",
chaincode_path="chaincode/python"
)
@pytest.mark.asyncio
async def test_network_operations(network):
await network.start()
try:
# 执行测试逻辑
result = await network.invoke("mychannel", "mycc", "get", ["key1"])
assert result == "expected_value"
finally:
await network.stop()
put_state
的多次调用而非单个大事务// META-INF/statedb/couchdb/indexes/indexOwner.json
{
"index": {
"fields": ["owner"]
},
"name": "indexOwner",
"type": "json"
}
class SupplyChainCC:
async def create_bill(self, stub, args):
# 参数验证
bill_data = json.loads(args[0])
bill_id = bill_data["billNo"]
# 检查重复
if await stub.get_state(bill_id):
return shim.error("票据已存在")
# 保存票据
await stub.put_state(bill_id, args[0])
# 记录创建事件
stub.set_event("bill_created", bill_id.encode())
return shim.success()
async def cross_chaincode_call(stub):
# 调用其他链码
response = await stub.invoke_chaincode(
"target_cc",
["method", "arg1", "arg2"],
"mychannel"
)
if response.status != 200:
raise Exception("跨链码调用失败")
return response.payload
# 打包Python链码
peer lifecycle chaincode package mycc.tar.gz \
--path /path/to/chaincode \
--lang python \
--label mycc_1.0
# 安装到节点
peer lifecycle chaincode install mycc.tar.gz
# 查看安装结果
peer lifecycle chaincode queryinstalled
--label mycc_2.0
注意:实际开发时请根据Fabric版本调整API调用方式,本文基于Fabric 2.4版本编写。建议定期查阅官方文档获取最新变更信息。 “`
这篇文章总计约5500字,涵盖了Python链码开发的完整流程,从环境搭建到高级特性,最后包含实际案例和部署指南。内容采用Markdown格式,包含代码块、表格等元素,可直接用于技术文档发布。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。