🧭
区块链技术指南
  • 前言
  • 修订记录
  • 如何贡献
  • 区块链的诞生
    • 记账科技的千年演化
    • 分布式记账与区块链
    • 集大成者的比特币
    • 区块链的商业价值
    • 本章小结
  • 核心技术概览
    • 定义与原理
    • 技术的演化与分类
    • 关键问题和挑战
    • 趋势与展望
    • 认识上的误区
    • 本章小结
  • 典型应用场景
    • 应用场景概览
    • 金融服务
    • 征信管理
    • 权属管理与溯源
    • 资源共享
    • 物流与供应链
    • 物联网
    • 数字艺术品和 NFT
    • 其它场景
    • 本章小结
  • 分布式系统核心技术
    • 一致性问题
    • 共识算法
    • FLP 不可能原理
    • CAP 原理
    • ACID 原则与多阶段提交
    • Paxos 算法与 Raft 算法
    • 拜占庭问题与算法
    • 可靠性指标
    • 本章小结
  • 密码学与安全技术
    • 密码学简史
    • Hash 算法与数字摘要
    • 加解密算法
    • 消息认证码与数字签名
    • 数字证书
    • PKI 体系
    • Merkle 树结构
    • Bloom Filter 结构
    • 同态加密
    • 其它技术
    • 本章小结
  • 比特币 —— 初露锋芒的区块链
    • 比特币项目简介
    • 比特币诞生背景
    • 工作原理
    • 挖矿过程
    • 共识机制
    • 闪电网络
    • 侧链
    • 热门问题
    • 相关工具
    • 本章小结
  • 以太坊 —— 挣脱加密货币的枷锁
    • 以太坊项目简介
    • 核心概念
    • 主要设计
    • 相关工具
    • 安装客户端
    • 使用智能合约
    • 智能合约案例:投票
    • 本章小结
  • 超级账本 —— 面向企业的分布式账本
    • 超级账本项目简介
    • 社区组织结构
    • 顶级项目介绍
    • 开发必备工具
    • 贡献代码
    • 本章小结
  • Fabric 安装与部署
    • 简介
    • 本地编译组件
    • 容器方式获取
    • 本地方式启动 Fabric 网络
    • 容器方式启动 Fabric 网络
    • 本章小结
  • 管理 Fabric 网络
    • 简介
    • 使用通道
    • 管理节点
    • 管理链上代码
    • 监听网络事件
    • 自动发现网络信息
    • 使用运维服务
    • 如何升级网络版本
    • 使用 SDK
    • 注意事项与最佳实践
    • 本章小结
  • 智能合约开发
    • 简介
    • 链码概念与结构
    • 示例一:信息公证
    • 示例二:交易资产
    • 示例三:数字货币发行与管理
    • 示例四:学历认证
    • 示例五:社区能源共享
    • 小结
  • Fabric 架构与设计
    • 简介
    • 架构设计
    • 消息协议
    • 小结
  • 区块链服务平台设计
    • 简介
    • IBM Bluemix 云区块链服务
    • 微软 Azure 云区块链服务
    • 使用超级账本 Cello 搭建区块链服务
    • 本章小结
  • 性能与评测
    • 简介
    • Hyperledger Fabric v0.6
    • 小结
  • 附录
    • 术语
    • 常见问题
    • Go 语言开发相关
      • 安装与配置 Golang 环境
      • 编辑器与 IDE
      • 高效开发工具
      • 依赖管理
    • ProtoBuf 与 gRPC
    • 参考资源链接
由 GitBook 提供支持
在本页
  • Chaincode 接口
  • 链码结构
  • 依赖包
  • Init 和 Invoke 方法

这有帮助吗?

在GitHub上编辑
  1. 智能合约开发

链码概念与结构

超级账本 Fabric 中的链码(Chaincode)延伸自智能合约的概念,负责对应用程序发送的请求做出响应,执行代码逻辑,实现与账本进行交互。

区块链网络中成员协商好业务逻辑后,可将其编程到链码中,所有业务流程将遵循合约代码自动执行。

链码执行过程中可以创建状态(State)并写入账本中。状态绑定到链码的命名空间,仅限该链码访问。在合适许可下,链码可以调用另一个链码,间接访问其状态。在一些场景下,不仅需要访问状态当前值,还需要查询状态的历史值。

原生链码默认在 Docker 容器中执行,2.0 版本中开始支持外部链码。链码通过 gRPC 协议与 Peer 节点进行交互,包括读写账本、返回响应结果等。

Fabric 支持多种语言实现的链码,包括 Go、JavaScript、Java 等。下面以 Go 语言为例介绍链码接口和相关结构。

Chaincode 接口

每个链码都需要实现以下 Chaincode 接口,包括 Init 和 Invoke 两个方法。

type Chaincode interface {
	Init(stub ChaincodeStubInterface) pb.Response
	Invoke(stub ChaincodeStubInterface) pb.Response
}
  • Init:当链码收到初始化指令时,Init 方法会被调用。

  • Invoke:当链码收到调用(invoke)或查询(query)调用时,Invoke 方法会被调用。

链码结构

一个链码的必要结构如下所示:

package main

// 引入必要的包
import (
	"github.com/hyperledger/fabric-chaincode-go/shim"
	pb "github.com/hyperledger/fabric-protos-go/peer"
)

// 声明一个结构体
type SimpleChaincode struct {}

// 为结构体添加 Init 方法
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
	// 在该方法中实现链码初始化或升级时的处理逻辑
	// 编写时可灵活使用 stub 中的 API
}

// 为结构体添加 Invoke 方法
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
	// 在该方法中实现链码运行中被调用或查询时的处理逻辑
	// 编写时可灵活使用 stub 中的 API
}

// 主函数,需要调用 shim.Start() 方法
func main() {
	err := shim.Start(new(SimpleChaincode))
	if err != nil {
		fmt.Printf("Error starting Simple chaincode: %s", err)
	}
}

依赖包

从 import 代码段可以看到,链码需要引入如下的依赖包。

  • "github.com/hyperledger/fabric-chaincode-go/shim":shim 包提供了链码与账本交互的中间层。链码通过 shim.ChaincodeStub 提供的方法来读取和修改账本状态。

  • pb "github.com/hyperledger/fabric-protos-go/peer": Init 和 Invoke 方法需要返回 pb.Response 类型。

Init 和 Invoke 方法

编写链码,关键是要实现 Init 和 Invoke 这两个方法。

当初始化链码时,Init 方法会被调用。如同名字所描述的,该方法用来完成一些初始化的工作。当调用链码时,Invoke 方法被调用,主要业务逻辑都需要在该方法中实现。

Init 或 Invoke 方法以 stub shim.ChaincodeStubInterface 作为传入参数,pb.Response 作为返回类型。其中,stub 封装了丰富的 API,功能包括对账本进行操作、读取交易参数、调用其它链码等。

上一页简介下一页示例一:信息公证

最后更新于3年前

这有帮助吗?