Fabric学习笔记-智能合约
本文介绍了什么是智能合约,以及如何在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学习笔记-智能合约相关推荐
- Fabric 学习笔记-架构初探
本文介绍了Fabric的架构,以及通过一个简单的Demo来熟悉整个交易流程. Hyperledger fabric V1.0的架构 如下图所示: application提供各种语言的SDK接口. me ...
- Hyperledger fabric学习笔记(一)
原文链接:https://blog.csdn.net/zhanglingge/article/details/106012703 fabric分为底层的网络层.权限管理模块.区块链应用模块,通过SDK ...
- 第146篇 笔记-智能合约介绍
定义:当满足某些预定义条件时,智能合约是一种在区块链网络上运行的防篡改程序. 1.什么是智能合约 智能合约是在区块链网络上托管和执行的计算机程序.每个智能合约都包含指定预定条件的代码,这些条件在满足时 ...
- Hyperledger Fabric学习笔记(三)- 启动网络并测试一个Fabcar的demo
参考文章:https://blog.csdn.net/jambeau/article/details/107551208 前言:文章底下的$GOPATH即为~/go,也就是当前用户下的go目录,比如我 ...
- Hyperledger Fabric学习笔记(二)- Fabric 2.2.1环境搭建
一.参考文章如下: 1.https://blog.csdn.net/zhanglingge/article/details/106208491 2.https://blog.csdn.net/qq_4 ...
- C++学习笔记——智能指针
c++里不像java等语言设置了垃圾回收的功能,但是c++通过它的王牌指针实现了智能指针这一解决办法. 目录 异常 1.异常 2.异常的使用 3.异常的规则 4.异常安全 智能指针 概念 原理 aut ...
- hyperledger fabric 2.2 智能合约开发环境准备
1.安装golang环境 参考中文官网:https://studygolang.com/articles/5805 Golang设置国内代理,参考:https://blog.csdn.net/liss ...
- Fabric学习笔记-PBFT算法
本文介绍了实用拜占庭容错算法(PBFT). Fabric在v0.6中采用的是PBFT算法,在v1.0.0-preview中是SBFT算法,在v1.0.0-release中文档上说PBFT还在开发中,项 ...
- Boost学习笔记-智能指针
1. 智能指针 scoped_ptr 只在作用域内生效,离开作用域既释放资源,不能复制和赋值.类似于标准库的auto_ptr,但它相对于auto_ptr的优势在于,他的要求更严格,使用起来更安全.a ...
最新文章
- 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
- 基于AI的便携式神经假肢让截肢14年患者操作自如,高精度、低延迟
- 《STL源码剖析》--知识点
- HashMap的工作原理
- 两端外伸梁内力计算机程序,理解材料力学核心问题:梁的弯曲 剪力弯矩图快速软件绘法...
- 计算机在输电线路设计中的应用研究,计算机在输电线路基础设计中的应用原稿(备份存档)...
- 简单的循环以及从接口获取数组对象的一个字段集合
- python之字符编码(二)
- iOS - UITableView reloadData滚动到顶部无效问题解决
- C++自学17:goto
- Flink开发需要的环境
- Windows Server上用命令来起停IIS站点
- 解决asp数据库对象只读的办法
- Win7任务栏图标大小调整为等宽
- 游戏中的物品管理系统
- springboot GeoLite2-City.mmdb实现通过IP地址获取经纬度以及该IP的所属地区
- 为戴尔服务器下载ESXi
- 注册表禁用计算机管理,解除封锁注册表被禁用的几种解决办法
- python读取文件并替换字段_python 读取文件并替换字段的实例
- Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2
热门文章
- typedef的用法
- 如何产生QPSK信号
- Keras:基于Theano和TensorFlow的深度学习库
- 二十万字C/C++、嵌入式软开面试题全集宝典二
- php单文件短链接,php实现的短网址算法分享
- [云炬创业学笔记]第一章创业是什么测试2
- [云炬创业基础笔记]第一章创业环境测试9
- 云炬金融每日一题20211008
- matlab将脚本导出动态库文件.dll,并被python调用
- C++/CLI中的资源清理(Destructor,Finalizer)