本文介绍了什么是智能合约,以及如何在Fabric下编写一个简单的智能合约Demo。

什么是智能合约?

智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转,Fabric为智能合约提供了一个可信的执行环境。

Fabric下的智能合约

Chaincode是Fabric下智能合约的代码实现,是一段在区块链上验证,存储和执行的代码,只有通过Chaincode才能与Fabric网络进行交互。

在Fabric下又分为系统Chaincode和普通Chaincode。

  • 系统Chaincode运行于peer节点内而非一个隔离的容器中,没有生命周期的概念,用于实现一些系统行为。
  • 普通Chaincode运行在一个单独的容器中,对外提供操作Fabric网络的接口,有打包、安装、实例化和升级四个生命周期并且有相应的函数提供调用,操作更加的灵活也是我们通常所指Chaincode。

Chaincode的运行过程

  • Channel负责连接不同的Peer,同步连接到的Peer对Chaincode的执行结果,相当于将一些节点划分为一个子集同时同步Chaincode的执行结果。
  • Endorser负责执行Chaincode。
  • Orderer负责对Chaincode的执行结果进行共识,目前支持solo/kafka/sBFT三种共识方式。
  • Committer负责将Chaincode经过共识后的结果写入Ledger。

编写Chaincode

Chaincode必须实现两个接口。

type Chaincode interface {  //  初始化⼯作,⼀般情况下仅被调⽤⼀次,升级时也会调用该函数Init(stub ChaincodeStubInterface) pb.Response//  查询或更新world state,可多次被调⽤Invoke(stub    ChaincodeStubInterface) pb.Response
}

下面是一个最小智能合约所需要的结构。

package main
import  (   "fmt" "github.com/hyperledger/fabric/core/chaincode/shim"
)type SimpleAsset struct {}func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {}
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {}func main() {if err := shim.Start(new(SimpleAsset)); err != nil {fmt.Printf("Error starting SimpleAsset chaincode: %s", err)}
}

具体的业务逻辑都在Invoke这个函数里面进行编写。

首先,我们完善一下Init函数

func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {args := stub.GetStringArgs()if len(args) != 2 {return shim.Error("Incorrect arguments. Expecting a key and a value")}// 实例化的时候初始化一下状态err := stub.PutState(args[0], []byte(args[1]))if err != nil {return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0]))}return shim.Success(nil)
}

接着在Invoke里编写业务逻辑

func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {fn, args := stub.GetFunctionAndParameters()var result stringvar err errorif fn == "set" {result, err = set(stub, args)} else {result, err = get(stub, args)}if err != nil {return shim.Error(err.Error())}return shim.Success([]byte(result))
}

Invoke根据不同的参数决定调用查询或者是设置状态。

编写set和get函数

func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {if len(args) != 2 {return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value")}err := stub.PutState(args[0], []byte(args[1]))if err != nil {return "", fmt.Errorf("Failed to set asset: %s", args[0])}return args[1], nil
}func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {if len(args) != 1 {return "", fmt.Errorf("Incorrect arguments. Expecting a key")}value, err := stub.GetState(args[0])if err != nil {return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err)}if value == nil {return "", fmt.Errorf("Asset not found: %s", args[0])}return string(value), nil
}

github上有完整代码,代码非常简单就是根据命令查询或者设置世界状态。

执行效果如下图:

这样就在Fabric上实现了一个简单的智能合约。

https://zhuanlan.zhihu.com/p/33750599

Fabric学习笔记-智能合约相关推荐

  1. Fabric 学习笔记-架构初探

    本文介绍了Fabric的架构,以及通过一个简单的Demo来熟悉整个交易流程. Hyperledger fabric V1.0的架构 如下图所示: application提供各种语言的SDK接口. me ...

  2. Hyperledger fabric学习笔记(一)

    原文链接:https://blog.csdn.net/zhanglingge/article/details/106012703 fabric分为底层的网络层.权限管理模块.区块链应用模块,通过SDK ...

  3. 第146篇 笔记-智能合约介绍

    定义:当满足某些预定义条件时,智能合约是一种在区块链网络上运行的防篡改程序. 1.什么是智能合约 智能合约是在区块链网络上托管和执行的计算机程序.每个智能合约都包含指定预定条件的代码,这些条件在满足时 ...

  4. Hyperledger Fabric学习笔记(三)- 启动网络并测试一个Fabcar的demo

    参考文章:https://blog.csdn.net/jambeau/article/details/107551208 前言:文章底下的$GOPATH即为~/go,也就是当前用户下的go目录,比如我 ...

  5. Hyperledger Fabric学习笔记(二)- Fabric 2.2.1环境搭建

    一.参考文章如下: 1.https://blog.csdn.net/zhanglingge/article/details/106208491 2.https://blog.csdn.net/qq_4 ...

  6. C++学习笔记——智能指针

    c++里不像java等语言设置了垃圾回收的功能,但是c++通过它的王牌指针实现了智能指针这一解决办法. 目录 异常 1.异常 2.异常的使用 3.异常的规则 4.异常安全 智能指针 概念 原理 aut ...

  7. hyperledger fabric 2.2 智能合约开发环境准备

    1.安装golang环境 参考中文官网:https://studygolang.com/articles/5805 Golang设置国内代理,参考:https://blog.csdn.net/liss ...

  8. Fabric学习笔记-PBFT算法

    本文介绍了实用拜占庭容错算法(PBFT). Fabric在v0.6中采用的是PBFT算法,在v1.0.0-preview中是SBFT算法,在v1.0.0-release中文档上说PBFT还在开发中,项 ...

  9. Boost学习笔记-智能指针

    1.  智能指针 scoped_ptr 只在作用域内生效,离开作用域既释放资源,不能复制和赋值.类似于标准库的auto_ptr,但它相对于auto_ptr的优势在于,他的要求更严格,使用起来更安全.a ...

最新文章

  1. 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
  2. 基于AI的便携式神经假肢让截肢14年患者操作自如,高精度、低延迟
  3. 《STL源码剖析》--知识点
  4. HashMap的工作原理
  5. 两端外伸梁内力计算机程序,理解材料力学核心问题:梁的弯曲 剪力弯矩图快速软件绘法...
  6. 计算机在输电线路设计中的应用研究,计算机在输电线路基础设计中的应用原稿(备份存档)...
  7. 简单的循环以及从接口获取数组对象的一个字段集合
  8. python之字符编码(二)
  9. iOS - UITableView reloadData滚动到顶部无效问题解决
  10. C++自学17:goto
  11. Flink开发需要的环境
  12. Windows Server上用命令来起停IIS站点
  13. 解决asp数据库对象只读的办法
  14. Win7任务栏图标大小调整为等宽
  15. 游戏中的物品管理系统
  16. springboot GeoLite2-City.mmdb实现通过IP地址获取经纬度以及该IP的所属地区
  17. 为戴尔服务器下载ESXi
  18. 注册表禁用计算机管理,解除封锁注册表被禁用的几种解决办法
  19. python读取文件并替换字段_python 读取文件并替换字段的实例
  20. Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2

热门文章

  1. typedef的用法
  2. 如何产生QPSK信号
  3. Keras:基于Theano和TensorFlow的深度学习库
  4. 二十万字C/C++、嵌入式软开面试题全集宝典二
  5. php单文件短链接,php实现的短网址算法分享
  6. [云炬创业学笔记]第一章创业是什么测试2
  7. [云炬创业基础笔记]第一章创业环境测试9
  8. 云炬金融每日一题20211008
  9. matlab将脚本导出动态库文件.dll,并被python调用
  10. C++/CLI中的资源清理(Destructor,Finalizer)