BCS

162 阅读3分钟

共识机制原理

华为云 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 来操作账本数据

  1. 参数解析 API

    GetStringArgs() []string // 返回调用链码时指定提供的参数列表
    
  2. 账本数据状态操作 API

    GetState(key string) ([]byte, error) // 根据指定的 key 查询相应的数据状态
    PutState(key string, value []byte) // 根据指定的 key, 将对应的 value 保存在账本中
    
  3. 交易信息 API

    GetChannelID() string // 返回交易提案中指定的通道 ID
    
  4. 事件处理 API

    SetEvent(name string, payload []byte) // 设置事件,包括事件名和内容
    

应用层JAVA调用链码(合约)机制

fabric-java-sdk 是为了让 Java 应用能够更加方便管理 Fabric 生态的应用开发工具。用户可以通过fabric-sdk-java的SDK 来管理链码、通道等,也可以通过它来执行链码的数据集读写功能。同时还能够监控在通道上面的事件。

应用通过节点的RPC协议接口访问链码。Java应用可以使用 官方提供的Fabric-sdk-java开发包来实现对链码的访问,开发包封装了Fabric 区块链的GRPC链码访问协议,有利于开发人员聚焦于业务逻辑。

应用层如何获取区块链上的数据

监听通道上的事件

节点通讯机制(晚一些分享)