前情提要
上次部署了网络,现在开始对智能合约(链码)的调用,主要参考教程。
使用版本,还是2.2
开始
有3种语言,go,js,java
每个链码方法都传入一个参数ctx,代表事务上下文(transaction context),可获取链码的stub,可以和账本交互GetState/PutState
例子是一个最简单的资产转移(前面其他教程用过的)
全部功能:我们的应用程序是一个基本的样本链码
- 初始化带有资产的分类账
- 创建、读取、更新和删除资产
- 检查资产是否存在
- 将资产从一个所有者转移到另一个所有者
创建项目(go)。
mkdir atcc && cd atcc #项目目录
go mod init atcc # 创建一个go.mod文件
touch atcc.go # 创建文件
要从实现fabric-contract-api interface接口开始:
// SmartContract provides functions for managing an Asset
type SmartContract struct {
contractapi.Contract
}
然后定义资产
// 定义一个简单资产
type Asset struct {
ID string `json:"ID"` // json标记会进行json序列化,可以存进账本
Color string `json:"color"`
Size int `json:"size"`
OWner string `json:"owner"`
AppraisedValue int `json:"appraisedValue"`
}
然后实现初始化方法
好像链码里不支持中文,最好还是不要写中文
//
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
assets := []Asset{
{ID: "asset1", Color: "blue", Size: 5, Owner: "Tomoko", AppraisedValue: 300},
{ID: "asset2", Color: "red", Size: 5, Owner: "Brad", AppraisedValue: 400},
{ID: "asset3", Color: "green", Size: 10, Owner: "Jin Soo", AppraisedValue: 500},
{ID: "asset4", Color: "yellow", Size: 10, Owner: "Max", AppraisedValue: 600},
{ID: "asset5", Color: "black", Size: 15, Owner: "Adriana", AppraisedValue: 700},
{ID: "asset6", Color: "white", Size: 15, Owner: "Michel", AppraisedValue: 800},
}
for _, asset := range assets {
assetJSON, err := json.Marshal(asset)
if err != nil {
return err
}
err = ctx.GetStub().PutState(asset.ID, assetJSON)
if err != nil {
return fmt.Errorf("failed to put to world state. %v", err)
}
}
return nil
}
然后写一个查询所有资产的函数
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Asset, error) {
// range query with empty string for startKey and endKey does an
// open-ended query of all assets in the chaincode namespace.
resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
if err != nil {
return nil, err
}
defer resultsIterator.Close()
var assets []*Asset
for resultsIterator.HasNext() {
queryResponse, err := resultsIterator.Next()
if err != nil {
return nil, err
}
var asset Asset
err = json.Unmarshal(queryResponse.Value, &asset)
if err != nil {
return nil, err
}
assets = append(assets, &asset)
}
return assets, nil
}
有这个就足够了。可以将其打包,并上传了。
具体过程可以参考前面的步骤,也可以看教程
https://hyperledger-fabric.readthedocs.io/en/release-2.2/deploy_chaincode.html
fabric的这个教程并不是从头一步一步的。感觉更像是倒叙的。所以有时候看了几个例子,会产生更多的疑问。当然,这样也有好处,可以运行简单的几行命令就看到结果。
现在的重点依然是把链码搞清楚。网络只要能用就行。
参考
- https://hyperledger-fabric.readthedocs.io/en/release-2.2/deploy_chaincode.html
- https://hyperledger-fabric.readthedocs.io/en/release-2.2/chaincode4ade.html
本文介绍Hyperledger Fabric 2.2版本下智能合约(链码)的开发流程,包括使用Go语言创建基本的资产转移链码,实现资产的创建、读取、更新和删除等功能。
1011

被折叠的 条评论
为什么被折叠?



