共识机制原理
华为云 BCS 提供多种算法以适应不同场景
- 测试策略(SOLO):单节点共识算法,只需一个节点即可提供共识排序功能,不支持容错,启动快速,节约资源,推荐测试时使用。
- 快速拜占庭容错共识算法(FBFT):高性能、高可用容错共识算法,需要至少4个节点才能提供交易共识排序功能,可容忍不大于(节点总数-1)/3个节点发生错误,建议生产环境使用。
- Kafka(CFT):分布式消息队列,实现了对网络中所有交易请求进行排序服务。高速共识算法,能容忍一半以下节点发生错误。建议生产环境使用。
组织通道原理
-
peer 节点:维护账本的网络节点,一个或多个 peer 节点组成 peer 组织。 共识节点:区块链网络中参与交易的节点。
-
通道:通道可以将区块链网络中的账本数据进行隔离和保密,主要用于实现联盟链中业务的隔离,每个通道可视为一条子链,并且对应一套账本,同一个区块链网络,不同通道之间的账本数据不可见。
链码(合约)编写
智能合约在 Hyperledger Fabric 中称为链码。链码一般是由开发人员使用 Go 语言编写。华为云 BCS 目前支持 Golang 和 NodeJS 两种语言来编写链码。
链码提供分布式账本的状态处理逻辑。链码被部署在网络节点中,能够独立运行在具有安全特性的 Docker 容器中,以 RPC 协议与相应的节点进行通信,并操作分布式账本中的数据。可以根据不同的需求开发出不同的应用。
接口定义如下:
type Chaincode interface {
Init(stub ChaincodeStubInterface) peer.Response
Invoke(stub ChaincodeStibInterface) peer.Response
}
实际开发中,开发人员可以定义一个结构体,然后重写 Chaincode 接口的两个函数
import (
// 提供用来访问/操作数据状态、事务上下文和调用其他链代码的 API
"github.com/hyperledger/fabric/core/chaincode/shim"
// 提供链码执行后的响应信息
"github.com/hyperledger/fabric/protos/peer"
)
// 声明一个结构体
type SmartContract struct { }
func (s *SmartContract) Init(stub shim.ChaincodeStubInterface) peer.Response {
// 实现链码初始化或升级时的处理逻辑
// 编写时可灵活使用 stub 中的 API
}
func (s *SmartContract) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
// 实现链码在运行时被调用或查询时的处理逻辑
// 编写时可灵活使用 stub 中的 API
}
使用链码 API 来操作账本数据
-
参数解析 API
GetStringArgs() []string // 返回调用链码时指定提供的参数列表
-
账本数据状态操作 API
GetState(key string) ([]byte, error) // 根据指定的 key 查询相应的数据状态 PutState(key string, value []byte) // 根据指定的 key, 将对应的 value 保存在账本中
-
交易信息 API
GetChannelID() string // 返回交易提案中指定的通道 ID
-
事件处理 API
SetEvent(name string, payload []byte) // 设置事件,包括事件名和内容
应用层JAVA调用链码(合约)机制
fabric-java-sdk
是为了让 Java 应用能够更加方便管理 Fabric 生态的应用开发工具。用户可以通过fabric-sdk-java
的SDK 来管理链码、通道等,也可以通过它来执行链码的数据集读写功能。同时还能够监控在通道上面的事件。
应用通过节点的RPC协议接口访问链码。Java应用可以使用 官方提供的Fabric-sdk-java开发包来实现对链码的访问,开发包封装了Fabric 区块链的GRPC链码访问协议,有利于开发人员聚焦于业务逻辑。
应用层如何获取区块链上的数据
监听通道上的事件