华为云区块链服务BCS对接使用完全指南:从实例创建到应用上链
引言:区块链服务BCS概述
华为云区块链服务(Blockchain Service,简称BCS)是面向企业及开发者提供的区块链技术服务平台,旨在帮助用户在华为云上快速部署、管理、维护区块链网络,降低使用区块链的门槛。BCS屏蔽了底层区块链技术的复杂细节,让开发者能够专注于自身业务的开发与创新,实现业务快速上链。
BCS提供两种实例类型:Hyperledger Fabric增强版和华为云区块链引擎。Hyperledger Fabric增强版以Hyperledger Fabric为内核,基于华为云全栈可信能力,在可靠性、性能、隐私保护方面做了增强和提升,满足企业级和金融级业务要求。华为云区块链引擎则以华为自研区块链内核为底座,结合可信硬件,具有高安全、高性能、高可扩展、强隐私保护等特点。需要注意的是,华为云区块链引擎当前仅在“华北-北京四”区域开放。在性能方面,Hyperledger Fabric增强版由于开源内核限制,不支持高TPS场景使用,建议对性能有较高要求的业务优先选择华为云区块链引擎实例。
BCS可以帮助企业最快5分钟内完成区块链网络部署,可节省80%的开发和部署成本。它提供全生命周期管理和界面化的智能合约编码、调试与部署功能,让用户简单使用区块链系统。本文将从实例创建、智能合约开发、应用对接、联盟链构建到最佳实践,全方位讲解华为云BCS的对接使用方法。
一、开通与创建BCS实例
1.1 前置准备
使用华为云区块链服务之前,需要先完成账号注册和实名认证。请先注册华为账号并开通华为云,然后完成实名认证。认证通过后,即可进入区块链服务管理控制台开始使用。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
1.2 创建Hyperledger Fabric增强版实例
登录区块链服务管理控制台后,进入“实例管理”页面,单击Hyperledger Fabric增强版的“购买”按钮。根据界面提示配置区块链基本信息,关键参数包括:
- 计费模式:支持包年/包月和按需计费两种方式
- 区域:建议选择与业务应用系统相同的地域
- 区块链实例名称:支持中英文字符、数字及中划线,不能以中划线开头,长度为4-24个字符,名称创建后不支持修改
- 版本类型:BCS提供基础版、专业版和企业版
- 区块链类型:私有链指仅本租户内部使用,联盟链可邀请其他租户一起组建
- Hyperledger Fabric增强版内核:区块链版本4.x.x对应社区Hyperledger Fabric v2.2
- 共识策略:支持快速拜占庭容错(FBFT)和Raft(CFT)两种策略
在资源配置阶段,需要选择部署区块链实例的集群,支持CCE集群和边缘集群两种部署方式。如果选择边缘集群,需要先纳管边缘节点并检查边缘节点状态。配置完成后单击“立即创建”,等待实例部署完成。
1.3 创建华为云区块链引擎实例
华为云区块链引擎实例的创建方式类似:在“实例管理”页面选择“购买华为云区块链引擎”,按照需求选择规格后单击“立即创建”。实例创建成功后,需要进入实例详情页面,选择“合约管理”来安装已开发好的合约。
二、智能合约开发
2.1 合约概述
合约是运行在区块链上、特定条件下自动执行的代码逻辑,是用户利用区块链实现业务逻辑的重要途径。合约的运行结果是可信的,无法被伪造和篡改。华为云区块链服务支持Go、Java、Solidity类型的合约开发。用户在部署智能合约时,使用预配置的容器镜像进行处理,通过预配置的开发/编译工具(如javac、cpp、gcc等)减少环境差异带来的问题,确保合约能够在区块链网络上正确运行。
2.2 Go语言合约开发
Go语言是Hyperledger Fabric官方推荐的主流合约开发语言。以下是一个简单的Go语言合约示例,实现数据的写入和查询功能:
package main
import (
"fmt"
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
type SmartContract struct {
contractapi.Contract
}
type Asset struct {
ID string `json:"id"`
Name string `json:"name"`
Owner string `json:"owner"`
Value int `json:"value"`
}
func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, id string, name string, owner string, value int) error {
asset := Asset{
ID: id,
Name: name,
Owner: owner,
Value: value,
}
assetJSON, err := json.Marshal(asset)
if err != nil {
return err
}
return ctx.GetStub().PutState(id, assetJSON)
}
func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Asset, error) {
assetJSON, err := ctx.GetStub().GetState(id)
if err != nil {
return nil, fmt.Errorf("failed to read asset: %v", err)
}
if assetJSON == nil {
return nil, fmt.Errorf("asset %s does not exist", id)
}
var asset Asset
err = json.Unmarshal(assetJSON, &asset)
if err != nil {
return nil, err
}
return &asset, nil
}
func main() {
chaincode, err := contractapi.NewChaincode(&SmartContract{})
if err != nil {
fmt.Printf("Error creating chaincode: %s", err.Error())
return
}
if err := chaincode.Start(); err != nil {
fmt.Printf("Error starting chaincode: %s", err.Error()
}
}Go语言合约示例可以从BCS控制台的“应用案例”中下载。链代码安装完成后,在链代码列表的“操作”列单击“实例化”完成部署。
2.3 Java语言合约开发
Java合约开发需要引入华为云提供的合约SDK依赖:
<dependency>
<groupId>com.huawei.huaweichain</groupId>
<artifactId>contract-sdk</artifactId>
<version>0.2.2</version>
</dependency>以下是一个Java语言合约的核心实现示例:
package com.huawei.contract;
import com.huawei.huaweichain.contract.Contract;
import com.huawei.huaweichain.contract.annotation.ContractOperation;
import com.huawei.huaweichain.contract.annotation.ContractParameter;
import com.huawei.huaweichain.storage.Iterator;
import com.huawei.huaweichain.storage.KeyValue;
public class AssetContract extends Contract {
@ContractOperation
public String createAsset(
@ContractParameter(name = "id") String id,
@ContractParameter(name = "name") String name,
@ContractParameter(name = "owner") String owner,
@ContractParameter(name = "value") int value) {
Asset asset = new Asset(id, name, owner, value);
String assetJson = gson.toJson(asset);
getStub().putState(id, assetJson.getBytes());
return "Asset created successfully";
}
@ContractOperation
public String readAsset(@ContractParameter(name = "id") String id) {
byte[] assetBytes = getStub().getState(id);
if (assetBytes == null || assetBytes.length == 0) {
return "Asset not found";
}
return new String(assetBytes);
}
@ContractOperation
public String updateAsset(
@ContractParameter(name = "id") String id,
@ContractParameter(name = "value") int value) {
byte[] assetBytes = getStub().getState(id);
if (assetBytes == null || assetBytes.length == 0) {
return "Asset not found";
}
Asset asset = gson.fromJson(new String(assetBytes), Asset.class);
asset.setValue(value);
getStub().putState(id, gson.toJson(asset).getBytes());
return "Asset updated successfully";
}
}Java示例Demo基于Java SDK开发,主要用于帮助开发人员理解并开发Java客户端应用程序。示例链代码可以在BCS控制台的“应用案例”中下载。
2.4 低代码合约开发
传统的智能合约开发需要开发人员使用底层区块链支持的合约语言进行相关业务开发和测试,不仅要求具备一定的编程能力,还需具备区块链等相关知识以保障合约的安全性。华为云区块链提供低代码开发能力,开发人员仅需根据实际业务画出业务流程建模符号(BPMN)和少量辅助功能代码,即可完成安全可靠的智能合约编写。
低代码开发流程包括:
- BPMN业务图绘制:通过拖拽方式将开始事件、活动、网关、连接对象、结束事件、泳道等组合起来,绘制定制化BPMN业务图。用户仅需编写少量业务需要的代码和查询功能代码即可完成智能合约的制作
- 智能合约部署:Package Management界面用于智能合约的管理,用户可查看和管理已生成的智能合约
- 智能合约触发:支持事件触发和交易触发两种方式,两种模式均会触发背书节点进行一致性共识
- 智能合约变更:业务更替升级后,绘制新的BPMN业务图并改变版本号,重新部署合约即完成变更
三、合约安装与实例化
区块链实例购买完成后,需要安装和实例化链代码。具体操作步骤如下:
- 登录链代码管理页面:在实例管理页面中,单击新创建的实例卡片上的“区块链管理”
- 安装链代码:上传已开发完成的链代码文件,填写链代码描述等信息。对于Go语言合约,还可以选择是否开启代码安全检查
- 实例化链代码:链代码安装完成后,在链代码列表的“操作”列单击“实例化”。实例化时需要选择合适的背书策略
对于联盟链场景,实例化链代码只需要由邀请方、被邀请方A或被邀请方B其中一个完成即可。
四、应用对接:SDK配置与证书下载
4.1 下载SDK配置和证书
应用程序开发前,需要获取对应实例的SDK配置文件和证书。具体操作:
- 登录区块链服务管理控制台,进入“实例管理”页面
- 在实例卡片中,单击“获取客户端配置”
- 勾选需要下载的内容,包括SDK文件、共识节点证书和Peer节点证书
SDK配置文件中包含用户证书和SDK所需的各种连接参数。配置SDK文件参数时需要指定链代码名称和证书路径等。
4.2 Java应用对接示例
以下是一个完整的Java客户端应用程序对接BCS的示例:
import com.huawei.huaweichain.client.Gateway;
import com.huawei.huaweichain.client.Gateway.Builder;
import com.huawei.huaweichain.client.Transaction;
import com.huawei.huaweichain.client.TransactionProposalRequest;
public class BcsClientDemo {
private static final String CONFIG_PATH = "/path/to/sdk-config.yaml";
private static final String CHANNEL_NAME = "mychannel";
private static final String CHAINCODE_NAME = "asset-contract";
public static void main(String[] args) throws Exception {
// 初始化Gateway
Builder builder = Gateway.createBuilder()
.setConfigPath(CONFIG_PATH)
.setChannelName(CHANNEL_NAME)
.setChaincodeName(CHAINCODE_NAME);
try (Gateway gateway = builder.connect()) {
// 调用合约写入数据
Transaction transaction = gateway.createTransaction("createAsset");
transaction.setArgs("asset001", "Example Asset", "owner001", "100");
String txId = transaction.send();
System.out.println("Transaction ID: " + txId);
// 调用合约查询数据
Transaction queryTx = gateway.createTransaction("readAsset");
queryTx.setArgs("asset001");
String result = queryTx.query();
System.out.println("Query result: " + result);
}
}
}在Java示例中,对数据有修改的操作如插入和删除需要调用send方法,对数据的查询操作需要调用query方法。客户端初始化配置可参考SDK客户端配置文档。
4.3 Go应用对接示例
Go语言应用对接需要使用Fabric SDK。以下是一个简化的Go客户端示例:
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
)
func main() {
configPath := filepath.Join(os.Getenv("GOPATH"), "src", "config.yaml")
sdk, err := fabsdk.New(config.FromFile(configPath))
if err != nil {
log.Fatalf("Failed to create SDK: %s", err)
}
defer sdk.Close()
channelClient, err := sdk.ChannelContext("mychannel", fabsdk.WithUser("Admin"))
if err != nil {
log.Fatalf("Failed to create channel client: %s", err)
}
client := channel.New(channelClient)
// 调用合约写入数据
response, err := client.Execute(channel.Request{
ChaincodeID: "asset-contract",
Fcn: "createAsset",
Args: [][]byte{[]byte("asset001"), []byte("Example Asset"), []byte("owner001"), []byte("100")},
}, channel.WithRetry(channel.WithRetryCount(3)))
if err != nil {
log.Fatalf("Failed to execute transaction: %s", err)
}
fmt.Printf("Transaction ID: %s\n", response.TransactionID)
// 调用合约查询数据
queryResponse, err := client.Query(channel.Request{
ChaincodeID: "asset-contract",
Fcn: "readAsset",
Args: [][]byte{[]byte("asset001")},
})
if err != nil {
log.Fatalf("Failed to query: %s", err)
}
fmt.Printf("Query result: %s\n", string(queryResponse.Payload))
}Go客户端示例可以参考《开发指南》示例Demo章节。配置SDK客户端时需要修改config.go中的初始化参数。
4.4 REST API调用方式
BCS除了提供Web界面管理运维资源之外,还提供了API调用方式,便于用户集成自有管理系统,实现定制化管理入口。BCS支持REST API,可以通过HTTPS调用API。API涵盖实例的创建、查询、更新、组织管理、区块和交易查询、合约安装与管理等功能。
调用API时需要先完成认证鉴权。以购买华为云区块链引擎实例为例,API的URI格式为:
POST /v2/{project_id}/huaweicloudchain/instances请求示例:
POST https://{bcs_endpoint}/v2/{project_id}/huaweicloudchain/instances{bcs_endpoint}信息需要从地区和终端节点获取。
通过REST API调用链代码时,invoke结果返回一个base64加密的TransactionID,query结果返回base64加密的数据值。业务端调用的示例中,客户端的初始化配置通过Contract.java完成,通过合约对业务数据交互。
五、联盟链构建
5.1 联盟链概述
BCS支持创建联盟链和私有链两种区块链类型。联盟链可以邀请其他租户加入,组建一个多成员参与的联盟链系统。组建联盟链的基本流程如下:
- 订购区块链实例:订购联盟链类型的区块链实例
- 邀请成员:由组织成员作为邀请方邀请新成员加入联盟链
5.2 邀请方操作
邀请方在联盟链创建成功后,通过邀请成员功能邀请其他租户加入。邀请时需要选择BCS实例和通道,输入被邀请租户的ID和资源空间ID。
5.3 被邀请方操作
被邀请方收到邀请后的加入流程:
- 登录区块链服务管理控制台
- 在左侧导航栏选择“通知管理”
- 单击通知列表“操作”列的“查看”
- 创建BCS实例(如果尚未创建)
- 在通知详情页面确认需要加入联盟通道的组织
- 单击“同意”,加入联盟链
六、高级特性与最佳实践
6.1 数据隐私保护
为了保障链上数据的机密性,华为云BCS提供多种数据保护手段:
- 数据加密:对链上存储的数据进行加密,只允许授权的参与方解密和查看数据,常用方法包括对称加密和非对称加密
- 访问控制:实施严格的访问控制机制,确保只有被授权的用户或节点才能访问敏感数据,例如不接入公网或使用VPC安全组等网络隔离手段限制访问
- 链下数据存储:对于特别敏感的数据,可以采用链下存储的方式,将数据存储在链下,并在区块链上记录其哈希值等摘要信息,以便在需要时验证数据的一致性和完整性
针对Fabric架构版本的区块链实例,BCS还提供国密加密SDK以及同态加密库供用户使用。
6.2 基于IoTDA的数据可信上链
华为云BCS可以与设备接入服务(IoTDA)结合,实现设备数据自动上链。通过IoTDA规则流转能力,当设备上报数据时,数据将作为参数自动调用华为云区块链合约实现数据上链。这种方式可以助力客户构建可信多方协作平台,使用区块链减少人为纠纷,提高交易效率。
具体配置步骤:
- 购买华为云区块链引擎实例:进入区块链服务管理控制台,选择“实例管理”,单击购买华为云区块链引擎
- 安装合约:进入实例详情页面,选择“合约管理”,安装已开发好的合约并选择合适的背书策略
- 配置设备接入服务:在IoTDA控制台创建数据转发规则,设置转发目标为“区块链服务(BCS)-华为云区块链”
- 选择访问方式:标准通道使用EIP方式,高性能通道使用VPCEP方式(推荐流量较大场景)
- 配置接入组织和背书组织:选择上链的身份组织和背书组织,需与合约的背书策略保持一致
- 创建华为云区块链引擎实例
- 安装及实例化链代码——实例创建成功后,安装和实例化电子存证合约
- 部署应用
- 性能选型:高TPS场景优先选择华为云区块链引擎实例,普通业务场景可选择Hyperledger Fabric增强版
- 安全审计:区块链的不可篡改性使审计机构可随时对不可篡改的账本进行审计
- 合约安全:智能合约由用户自行编写上传并保证安全,需注意命令注入等相关安全问题
- 资源隔离:华为云区块链引擎服务通过资源隔离等方式降低安全风险
- 根据业务需求选择合适的BCS实例类型(Hyperledger Fabric增强版或华为云区块链引擎)
- 完成BCS实例的创建与配置
- 使用Go、Java或低代码BPMN方式开发智能合约
- 完成合约的安装、实例化与升级更新
- 下载SDK配置和证书,使用Java或Go语言开发客户端应用
- 通过REST API实现系统集成
- 构建和管理联盟链,邀请其他租户加入
- 结合IoTDA实现设备数据可信上链
IoTDA企业版实例支持将数据流转到BCS华为云区块链引擎实例(推荐)和Hyperledger Fabric增强版。由于Hyperledger Fabric增强版的开源内核限制,不支持高TPS场景使用,建议使用性能更好的华为云区块链引擎实例。
6.3 电子证据可信上链实践
华为云BCS提供基于华为云区块链引擎实现电子证据可信上链的完整实践方案。该实践的操作流程:
通过该实践,用户可以快速了解华为云区块链引擎的基础知识以及如何使用。
6.4 性能与安全建议
七、总结
华为云区块链服务BCS为企业提供了从区块链网络部署到应用对接的全链路解决方案。通过本文的讲解,读者可以掌握以下核心技能:
BCS帮助企业最快5分钟内完成区块链网络部署,让开发者能够专注于自身业务逻辑的实现,而不是底层区块链技术的运维。随着区块链技术在各行各业的深入应用,华为云BCS将持续为企业提供安全、高效、易用的区块链服务平台。
常见问题解答
问:Hyperledger Fabric增强版和华为云区块链引擎有什么区别?如何选择?
答:Hyperledger Fabric增强版以开源Hyperledger Fabric为内核,在可靠性、性能、隐私保护方面做了增强。华为云区块链引擎以华为自研区块链内核为底座,结合可信硬件,具有更高性能。华为云区块链引擎当前仅在“华北-北京四”区域开放。高TPS场景建议选择华为云区块链引擎,普通业务场景两者均可。
问:智能合约支持哪些编程语言?
答:华为云BCS支持Go、Java和Solidity三种类型的合约开发。Go语言是Hyperledger Fabric官方推荐的主流语言,Java合约需要引入华为云提供的contract-sdk依赖。此外,BCS还提供低代码BPMN方式,通过拖拽绘制业务图即可生成智能合约。
问:如何下载SDK配置和证书?
答:登录区块链服务管理控制台,进入“实例管理”页面,在实例卡片中单击“获取客户端配置”,勾选需要下载的SDK文件、共识节点证书和Peer节点证书即可。配置SDK文件时需要指定链代码名称和证书路径。
问:联盟链如何邀请其他租户加入?
答:联盟链创建成功后,由邀请方在BCS控制台选择实例和通道,输入被邀请租户的ID和资源空间ID发起邀请。被邀请方登录控制台后,在“通知管理”中查看邀请通知,创建BCS实例后单击“同意”即可加入联盟链。
问:如何实现设备数据自动上链?
答:通过华为云IoTDA的数据转发规则功能,将设备上报的数据自动流转到BCS区块链服务。需要在IoTDA控制台创建转发规则,设置转发目标为“区块链服务(BCS)-华为云区块链”,选择已创建的BCS实例和合约,配置接入组织和背书组织即可。
问:BCS的计费方式有哪些?
答:BCS实例支持包年/包月和按需计费两种模式。具体费用取决于实例规格(基础版、专业版、企业版)、区域、存储和网络资源等因素。详细价格请参考华为云官网的价格计算器。



