学习记录:fabric(2)-写链码

本文介绍Hyperledger Fabric 2.2版本下智能合约(链码)的开发流程,包括使用Go语言创建基本的资产转移链码,实现资产的创建、读取、更新和删除等功能。

前情提要

上次部署了网络,现在开始对智能合约(链码)的调用,主要参考教程

使用版本,还是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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值