可以只用contractapi写链码?
时间: 2023-05-28 20:02:15 浏览: 86
是的,可以只使用contractapi来编写链码。contractapi是fabric-sdk-go中的一个模块,可以帮助开发者以更简洁和易读的方式编写链码。该模块提供了一些高级功能和便捷的API来执行一些常见的任务,例如访问状态数据库、部署和实例化链码等。但需要注意的是,contractapi是建立在fabric-sdk-go之上的,因此开发者需要先了解和熟悉fabric-sdk-go的基础知识。
相关问题
如何用MockStub调试contractapi链码?
MockStub 是 Chaincode 开发中常用的工具之一,可以在没有实际网络的情况下进行单元测试和本地调试。
以下是使用 MockStub 调试 contractapi 链码的步骤:
1. 引入必要的包
```go
import (
"github.com/hyperledger/fabric-chaincode-go/pkg/contractapi"
"github.com/hyperledger/fabric-chaincode-go/pkg/mocks"
)
```
2. 编写测试代码
```go
func TestMyChaincode(t *testing.T) {
cc := new(MyChaincode)
mockStub := mocks.NewStub("mycc", cc)
// 模拟调用 Init 方法
res := mockStub.MockInit("tx1", [][]byte{[]byte("init"), []byte("100")})
if res.Status != shim.OK {
t.Errorf("Init failed: %s", res.Message)
}
// 模拟调用 Invoke 方法
res = mockStub.MockInvoke("tx2", [][]byte{[]byte("transfer"), []byte("tom"), []byte("50")})
if res.Status != shim.OK {
t.Errorf("Invoke failed: %s", res.Message)
}
// 模拟获取状态
res = mockStub.MockInvoke("tx3", [][]byte{[]byte("query"), []byte("tom")})
if res.Status != shim.OK {
t.Errorf("Query failed: %s", res.Message)
}
if string(res.Payload) != "50" {
t.Errorf("Query result incorrect. Expecting 50, but got %s", string(res.Payload))
}
}
```
3. 运行测试
在终端中运行以下命令,即可执行测试代码:
```shell
go test -v mycc_test.go
```
以上是使用 MockStub 调试 contractapi 链码的方法。注意,MockStub 可能不能完全模拟实际网络环境,因此在实际环境中仍需谨慎测试。
怎么用MockStub调试fabric 2.4的contractapi链码?
MockStub是一个功能强大的工具,它可以帮助我们在不需要实际运行fabric网络的情况下测试和调试链码。
以下是在fabric 2.4中使用MockStub调试链码的步骤:
1. 导入所需的包
```python
import pytest
from unittest.mock import Mock
from contract_api.contracts.my_contract import MyContract
from contract_api.utils import decode_response
from contract_api.constants import HTTPStatusCodes
from contract_api.exceptions import OperationError
from contract_api.models.response import Response
from contract_api.models.operation import Operation
```
2. 创建MockStub实例
```python
chaincode_name = "my_chaincode"
channel_name = "my_channel"
mock = Mock()
mock.name = f"{chaincode_name}:{channel_name}"
contract_stub = MyContract(stub=mock)
```
3. 模拟链码调用
以调用initLedger函数为例:
```python
# 构造函数参数
args = ["1", "张三", "李四", "200", "2021.5.6"]
# 模拟初始化调用
mock.invokeChaincode.return_value = ('{"status": "Success"}', None)
result = contract_stub.initLedger(*args)
# 检查返回结果是否正确
assert result is not None
assert result.status == HTTPStatusCodes.OK
assert result.body == "Ledger initialized successfully"
```
4. 模拟查询调用
以调用getAsset函数为例:
```python
# 构造函数参数
asset_id = "1"
# 模拟查询调用
result_bytes = b'{"id": "1", "owner": "张三", "holder": "李四", "value": "200", "date": "2021.5.6"}'
mock.getState.return_value = result_bytes
result = contract_stub.getAsset(asset_id)
# 检查返回结果是否正确
assert result is not None
assert result.status == HTTPStatusCodes.OK
assert result.body == decode_response(result_bytes)
```
5. 模拟交易调用
以调用transferAsset函数为例:
```python
# 构造函数参数
args = ["1", "李四"]
# 模拟查询调用
transaction_id = "123456"
response = Response(HTTPStatusCodes.OK, "Asset transferred successfully")
operation = Operation(transaction_id, response)
mock.invokeChaincode.return_value = (b"", b"", operation)
result = contract_stub.transferAsset(*args)
# 检查返回结果是否正确
assert result is not None
assert result.status == HTTPStatusCodes.OK
assert result.body == response
```
阅读全文