华为云用户手册

  • 什么是MAS 企业在应用发展的过程中会面临诸多难题,如: 使用单个AZ/Region无法满足高可靠诉求; 系统容量达到瓶颈或者访问时延无法达到要求; 云厂商技术绑定,无法获得先进技术和价格优势; 业务爆炸式增长带来的技术瓶颈。 多活高可用服务(Multi-Site High Availability Service,简称MAS)源自华为消费者多活应用高可用方案,提供从流量入口、数据到应用层的端到端的业务故障切换及容灾演练能力,保障故障场景下的业务快速恢复,提升业务连续性。 MAS=多活接入服务+应用层SDK+数据同步管道+统一管控中心;完整可落地方案=技术产品(MAS)+咨询服务+生态伙伴+容灾规范。 MAS产品优势如下: 业务级高可用保障。 流量、业务、数据端到端可用。 秒级RTO、RPO,保证业务连续性。 低成本容灾演练能力。 MAS核心能力包括: 端到端(管理-流量-应用-数据仲裁)和多活容灾管控。 安全可靠的数据同步管道。 可落地的多活容灾标准规范。 咨询+专业实施服务。 MAS架构如图1所示。 图1 MAS服务架构示图 区域(Region):从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 可用区(AZ,Availability Zone):一个AZ是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 软件开发工具包(SDK):SDK 的全称是 Software Development Kit,是一种被用来辅助开发某类软件而编写的特定软件包。 RPO(Recovery Point Objective):即数据恢复点目标,主要指的是业务系统所能容忍的数据丢失量。 RTO(Recovery Time Objective):即恢复时间目标,主要指的是所能容忍的业务停止服务的最长时间,也就是从灾难发生到业务系统恢复服务功能所需要的最短时间周期。
  • 计费项 MAS根据您开通的功能模块和购买的多活管理中心以及多活管理中心关联的节点数进行计费。具体收费介绍,请参考价格详情。 表1 MAS计费项 计费项 计费说明 功能模块 根据功能模块版本、功能点数量以及开通时长进行计费。 多活管理中心 根据多活管理中心规格、购买时长以及购买的实例数量进行计费。 节点数 根据多活管理中心关联的节点数以及购买时长进行计费。 说明: 节点数是多活管理中心所监控的应用的进程个数。
  • 计费模式 提供包年包月、按需共2种计费模式供您灵活选择。 包年包月:多活管理中心根据订单的购买周期计费,目前仅多活管理中心支持包年包月计费模式。 按需计费: 功能模块根据您开通的多活版本和功能点进行按需(天)计费。 多活管理中心根据您购买的实例规格按需(小时)计费。 节点数根据多活管理中心关联的节点数按需(天)计费。 计费模式变更:多活管理中心实例支持包年包月和按需计费模式相互转换。 如需变更计费模式,请参考按需转包年包月和包年包月转按需章节进行计费模式转换。
  • 常用接口 Fabric-sdk-java的使用主要分为:加密套件配置,通道操作,链码操作。 加密套件配置部分,根据配置文件内容,设置SDK里面的加密套件服务提供者、 加密类型、安全级别等。 通道操作包括:通道查询、通道创建、通道加入、通道删除等。 链码操作包括:链码安装、链码实例化、链码查询、链码调用等。 使用Fabric-sdk-java主要会使用HFClient和Channel两个类,其导入路径分别为:org.hyperledger.fabric.sdk.HFClient和org.hyperledger.fabric.sdk.Channel。 更多的api接口请参考Fabric官网。
  • 通过内存传入私钥 如果用户需要对私钥文件进行加密,并在demo中解密后传入FabricSDK。 对于MSP私钥:在FabricHelper文件的genFabricUser函数中,按如下方式调用函数: //从配置文件指定路径下读取加密过的MSP私钥String adminPrivateKeyString = extractPemString(msp, "keystore"); //对adminPrivateKeyString 进行解密得到decryptedKey字符串//将解密后的MSP私钥重新赋值给变量adminPrivateKeyString String adminPrivateKeyString = decryptedKey; 当前不支持通过内存传入TLS私钥。
  • 准备工作 开通CloudIDE(或者用户自己准备JDK、maven和eclipse/IntelliJ IDEA)。 CloudIDE是软件开发生产线 CodeArts的云端开发环境服务,向开发者提供按需配置、快速获取的工作空间(包含编辑器和运行环境)。 在CloudIDE上创建一个空的Java工程,如图1所示。 图1 CloudIDE上创建一个空的Java工程 下载Java SDK示例源码,获取方法:登录区块链服务管理控制台,进入“应用案例”,在“Java示例Demo-Java SDK Demo”下方,单击“App_Java_Src_Demo”中Java项目源码的“下载”按钮。 购买区块链实例、安装链代码及实例化链代码操作,请参见《快速入门》。
  • Init初始化余额 当用户注册成功后,需要初始化该用户的余额,默认为0。 输入说明 参数名 类型 描述 是否必须 PubKey string 公钥 是 Balance string 初始金额 是 处理 调用ValidateInitBalance,校验balance范围有效性,完成余额背书。 PubKey := string(args[0])BalanceInfo := string(args[1]) //PubKey := string(args[2])hashPubkey, err := t.calcAddr(PubKey)logger.Debug("encrypt initial balance")//validate balancecipherBalance,err := pswapi_cc.ValidateInitBalance(BalanceInfo,PubKey) if err != nil { logger.Error("fail to Validate InitBalance ") return shim.Error("fail toValidate InitBalance") } 输出说明 参数名 类型 描述 newCipherBalance string 余额密文
  • Transfer转账 输入说明 参数名 类型 描述 是否必须 AddrA string A-转账者地址 是 AddrB string B-收账者地址 是 txinfo String 交易信息PrepareTxInfo 是 处理说明 根据账户地址获取账本中A,B的当前余额cipherBalanceAKeyABlock, cipherBalanceBKeyBBlock。 校验证明有效性。 newCipherBalanceA,newCipherBalanceB,newCipherTxA,newCipherTxB, err := pswapi_cc.ValidateTxInfo(txInfo, cipherBalanceAKeyABlock, cipherBalanceBKeyBBlock) if err != nil { logger.Error("fail to validate trans information") return shim.Error("fail to validate trans information") } 输出更新后的余额(密文) 业务的账本内容需要用户定制,将上面加密的金额合入到用户的账本中保存,demo中定义了一个存储结构,保存完后通过json序列化为一个交易记录对象进行保存。 type TransRecord struct { FromAddr string ToAddr string TXType string Balance string TX string remark string }
  • 依赖配置 该内容仅适用于Fabric架构版本的区块链实例的Java语言链代码开发。 请使用Gradle或Maven构建管理工具组织链代码项目。若链代码项目中包含非本地依赖,请确保对应区块链实例的节点均绑定了弹性ip。若链代码容器将运行在受限网络环境,请确保项目中的所有依赖已配置为本地依赖。示例链代码获取方法:登录区块链服务BCS控制台,进入“应用案例”,单击“Java示例Demo-Java SDK Demo”中“Chaincode_Java_Local_Demo”的“下载”按钮。
  • 防止出现panic后链代码容器异常 该内容仅适用于Fabric架构版本的区块链实例的Go语言链代码开发。 为避免出现panic异常时链代码容器异常重启,找不到日志,导致问题无法及时定位,可在Invoke函数入口处添加defer语句时,出现panic异常时返回错误给客户端。 // 定义命名返回值,发生panic在defer里面赋值,确保客户端可以收到返回值// 使用debug.PrintStack()将错误的堆栈信息打印到标准输出,方便问题定位func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) (pr pb.Response) { defer func() { if err:=recover(); err != nil { fmt.Println("recover from invoke:", err) debug.PrintStack() pr = shim.Error(fmt.Sprintf("invoke painc. err: %v",err)) } }() fmt.Println("ex02 Invoke") function, args := stub.GetFunctionAndParameters() if function == "invoke" { // Make payment of X units from A to B return t.invoke(stub, args) } else if function == "delete" { // Deletes an entity from its state return t.delete(stub, args) } else if function == "query" { // the old "Query" is now implemented in invoke return t.query(stub, args) } pr = shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"") return pr}
  • 下载用户证书 进行API调用前,需要下载区块链服务中已经配置生成的用户证书。 登录华为云区块链服务控制台。 进入“实例管理”界面,可以看到已经购买的区块链实例卡片。 单击卡片上的“获取客户端配置”,勾选“Peer节点证书”。选择指定节点组织,勾选“用户证书”。 单击“下载”,下载相应组织的用户证书。 解压证书,其中msp文件夹中,keystore文件夹存储的是组织用户私钥,signcerts文件夹存储的是用户证书(公钥)。
  • 请求消息 表1 请求参数 参数 是否必选 参数类型 描述 channelId 是 String 区块链通道ID chaincodeId 是 String 链代码ID chaincodeVersion 否 String 链代码版本 userId 是 String 由组织CA签发的用户ID,目前区块链服务默认生成的都为User1 orgId 是 String 区块链组织ID orgPeers 是 String 由组织中每个节点的组织ID和域名组成的数组,形如: [{"orgId":"7258adda1803f4137eff4813e7aba323018200c5","peerDomainName":"peer-7258adda1803f4137eff4813e7aba323018200c5-0.peer-7258adda1803f4137eff4813e7aba323018200c5.default.svc.cluster.local"}] opmethod 是 String 区块链链码调用类型,目前只有两类调用方法:invoke和query。 args 是 String 链码调用参数,形如:["invoke","a","b","1"] timestamp 是 String 格式为2018-10-31T17:28:16+08:00 cert 是 String 用户的证书文件,以字符串形式上传 以上参数获取方式,详细参见用户指南中的链代码管理和区块浏览器章节。 在链代码管理页面中,单击链代码名称前的,展开链代码详细信息,您可以查看当前链代码的版本列表、安装列表和实例化情况。 在区块浏览器页面中,在通道下拉框中选择一个通道,下方的数据即可实时刷新供您查看多项数据。区块链相关信息的查询功能,包括区块数量、交易数量、区块详细信息、交易详细信息、性能数据及节点状态等。 为了保证交易安全性,需要使用Fabric用户证书(证书获取方式请见下载用户证书)中的私钥对请求消息体进行签名(目前只支持椭圆曲线,暂不支持国密等其他加密算法),并将签名结果放到消息头部x-bcs-signature-sign字段。 链码REST API自定义了一些消息头,请参见表2。 表2 自定义消息头 名称 是否必选 描述 x-bcs-signature-sign 是 链码调用请求消息体签名。 x-bcs-signature-method 是 加密类型,目前固定是SW。 x-bcs-signature-sign-gzip 是 Sign是否选择Gzip压缩。0表示否,1表示是。 x-bcs-signature-sign:为了保证只允许有权限的调用端才能够进行合法的链码调用,需要使用下载用户证书中下载的用户私钥以ECDSA椭圆曲线的加密方式对整个请求消息体的SHA256摘要进行加密签名,x-bcs-signature-sign值即为签名结果。
  • 示例 下面是调用invoke类型的链代码示例。 请求示例 { "channelId": "testchannel", "chaincodeId": "zmmcode", "chaincodeVersion": "1.0", "userId": "User1", "orgId": "7258adda1803f4137eff4813e7aba323018200c5", "orgPeers": "[{\"orgId\":\"7258adda1803f4137eff4813e7aba323018200c5\",\"peerDomainName\":\"peer-7258adda1803f4137eff4813e7aba323018200c5-0.peer-7258adda1803f4137eff4813e7aba323018200c5.default.svc.cluster.local\"}]", "opmethod": "invoke", "args": "[\"invoke\",\"a\",\"b\",\"1\"]", "timestamp": "2018-10-31T17:28:16+08:00", "cert": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAq2gAwIBAgIQEXPZlMsReamxVtVNnKwCCzAKBggqhkjOPQQDAjCCAQQx\nDjAMBgNVBAYTBUNISU5BMRAwDgYDVQQIEwdCRUlKSU5HMRAwDgYDVQQHEwdCRUlK\nSU5HMXkwdwYDVQQKE3A3MjU4YWRkYTE4MDNmNDEzN2VmZjQ4MTNlN2FiYTMyMzAx\nODIwMGM1LnBlZXItNzI1OGFkZGExODAzZjQxMzdlZmY0ODEzZTdhYmEzMjMwMTgy\nMDBjNS5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsMVMwUQYDVQQDE0pjYS5wZWVy\nLTcyNThhZGRhMTgwM2Y0MTM3ZWZmNDgxM2U3YWJhMzIzMDE4MjAwYzUuZGVmYXVs\ndC5zdmMuY2x1c3Rlci5sb2NhbDAeFw0xODEwMzAwMjQ5MjZaFw0yODEwMjcwMjQ5\nMjZaMIG1MQ4wDAYDVQQGEwVDSElOQTEQMA4GA1UECBMHQkVJSklORzEQMA4GA1UE\nBxMHQkVJSklORzF/MH0GA1UEAwx2VXNlcjFANzI1OGFkZGExODAzZjQxMzdlZmY0\nODEzZTdhYmEzMjMwMTgyMDBjNS5wZWVyLTcyNThhZGRhMTgwM2Y0MTM3ZWZmNDgx\nM2U3YWJhMzIzMDE4MjAwYzUuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDBZMBMG\nByqGSM49AgEGCCqGSM49AwEHA0IABPMrzoJL/MHeSFPFOJWLqnJ0sqB0it7wDIOq\n+eTSvvPpGk1BIDmb2n13K5V04RO8xNezDQ7I6rW4LF2elq14eH+jTTBLMA4GA1Ud\nDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFBXQ5TC4acFeTlT\nJuDZg62XkXCdnOfvbejSeKI2TXoIMAoGCCqGSM49BAMCA0gAMEUCIQCadHIKl0Mk\nYn0WZizyDZYR4rT2q0nzjFaiW+YfV5FBjAIgNalKUe3rIwXJvXORV4ZXurEua2Ag\nQmhcjRnVwPTjpTE=\n-----END CERTIFICATE-----\n"} 响应示例 After invoke the count of a is 188 b is 262
  • 下载源码包 下载Fabric源码包作为三方库。仅适用于Fabric架构版本的区块链实例。 请根据实际需求,选择下载对应版本的Fabric源码包: https://github.com/hyperledger/fabric/tree/release-2.2 Fabric源码包选择和创建的区块链实例版本对应,即如果创建区块链实例时,Hyperledger Fabric增强版内核是v2.2(4.X.X版本),则Fabric源码包对应选择2.2版本。
  • 链代码接口 Fabric架构版本的区块链实例: 链代码启动必须通过1.4风格(调用shim包)中的Start函数,入参为shim包中定义的Chaincode接口类型。实际开发中, 您需要自行定义一个结构体,实现Chaincode接口。 type Chaincode interface { Init(stub ChaincodeStubInterface) pb.Response Invoke(stub ChaincodeStubInterface) pb.Response } 2.2风格(使用fabric-contract-api-go包)的链代码实际开发中, 您需要自行定义一个结构体,实现Chaincode接口。 type Chaincode interface { Init(ctx contractapi.TransactionContextInterface, args…) error Invoke(ctx contractapi.TransactionContextInterface, args…) error }
  • 开发环境准备 请根据自身业务选择Go或Java开发环境。推荐使用CloudIDE(支持在线、快速地构建链代码开发环境)。 Go开发环境准备: 安装Go开发环境。安装包下载地址为:https://go.dev/dl/。(请选择1.9.2之后的版本) 各个系统对应的包名(以1.11.12版本为例): 操作系统 包名 Windows go1.11.12.windows-amd64.msi Linux go1.11.12.linux-amd64.tar.gz Windows下您可以使用.msi后缀的安装包来安装。默认情况下.msi文件会安装在“C:\Go”目录下。您可以将“C:\Go\bin”目录添加到Path环境变量中。添加后您需要重启命令窗口才能生效。 Linux下,您需要将下载的二进制包解压至/usr/local目录。将/usr/local/go/bin目录添加至Path环境变量: export PATH=$PATH:/usr/local/go/bin 安装完go语言后可以通过命令go version查看版本信息,以及通过go env命令来查看相关路径配置。 安装Go编辑器。编辑器可自行选择,推荐使用Goland:https://www.jetbrains.com/go/download。 Java开发环境准备: 仅适用于Fabric架构版本的区块链实例。 安装Java开发环境。下载JDK并安装(建议选择最新版本):https://www.oracle.com/technetwork/java/javase/downloads/index.html。 各个系统对应的包名(以15.0.2版本为例): 操作系统 包名 Windows jdk-15.0.2_windows-x64_bin.exe Linux jdk-15.0.2_linux-x64_bin.tar.gz Windows下您可以使用 .exe后缀的安装包来安装。 Linux下,您需要将下载的二进制包解压至/usr/local目录。 export PATH=$PATH:/usr/local/go/bin 配置环境变量(若无则新建): JAVA_HOME为jdk安装目录如“C:\Program Files (x86)\Java\jdk1.8.0_91”或“/usr/java/jdk1.8.0_91”(以下均略去双引号); CLASSPATH为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; ”; 在Path中新增两条“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”。 安装完jdk后,可以通过命令java -version查看版本信息。 安装Java编辑器。编辑器可自行选择,推荐使用IntelliJ IDEA。
  • 链代码结构 Fabric架构版本的区块链实例1.4风格Go语言的链代码结构如下: package main // 引入必要的包 import ( "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/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) } } Fabric架构版本的区块链实例2.2风格Go语言的链代码结构如下: package main // 引入必要的包 import ( "github.com/hyperledger/fabric/plugins/fabric-contract-api-go/contractapi") // 声明一个结构体 type Chaincode struct { contractapi.Contract} // 为结构体添加Init方法 func (ch * Chaincode) Init(ctx contractapi.TransactionContextInterface, args…) error { // 在该方法中实现链代码初始化或升级时的处理逻辑 }// 为结构体添加Invoke方法 func (ch * Chaincode) Invoke(ctx contractapi.TransactionContextInterface, args…) error { // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 } //主函数func main() { cc, err := contractapi.NewChaincode(new(ABstore)) if err != nil { panic(err.Error()) } if err := cc.Start(); err != nil { fmt.Printf("Error starting ABstore chaincode: %s", err) }}
  • 链代码相关的API Fabric源码包中的shim包提供了如下几种类型的接口,您可以参考使用: 参数解析API:调用链代码时需要给被调用的目标函数/方法传递参数,该API提供解析这些参数的方法。 账本状态数据操作API:该API提供了对账本数据状态进行操作的方法,包括对状态数据的查询及事务处理等。 交易信息获取API:获取提交的交易信息的相关API。 对PrivateData操作的API: Hyperledger Fabric在1.2.0版本中新增的对私有数据操作的相关API。 其他API:其他的API,包括事件设置、调用其他链代码操作。 父主题: Go语言链代码开发
  • 链代码示例(2.0风格) Fabric架构版本的区块链实例: 如下是一个账户转账的链代码示例(2.0风格)仅供安装实例化,若您需要调测请参考Fabric官方示例中的链代码。 package main import ( "errors" "fmt" "strconv" "github.com/hyperledger/fabric-contract-api-go/contractapi") // 链码实现type ABstore struct { contractapi.Contract} // 初始化链码数据,实例化或者升级链码时自动调用func (t *ABstore) Init(ctx contractapi.TransactionContextInterface, A string, Aval int, B string, Bval int) error { // 使用println函数输出的信息会记录在链码容器日志中 fmt.Println("ABstore Init") var err error fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval) // 将状态数据写入账本 err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return err } err = ctx.GetStub().PutState(B, []byte(strconv.Itoa(Bval))) if err != nil { return err } return nil} // A转账X给Bfunc (t *ABstore) Invoke(ctx contractapi.TransactionContextInterface, A, B string, X int) error { var err error var Aval int var Bval int // 从账本获取状态数据 Avalbytes, err := ctx.GetStub().GetState(A) if err != nil { return fmt.Errorf("Failed to get state") } if Avalbytes == nil { return fmt.Errorf("Entity not found") } Aval, _ = strconv.Atoi(string(Avalbytes)) Bvalbytes, err := ctx.GetStub().GetState(B) if err != nil { return fmt.Errorf("Failed to get state") } if Bvalbytes == nil { return fmt.Errorf("Entity not found") } Bval, _ = strconv.Atoi(string(Bvalbytes)) // 执行转账 Aval = Aval - X Bval = Bval + X fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval) // 将状态数据重新写回账本 err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return err } err = ctx.GetStub().PutState(B, []byte(strconv.Itoa(Bval))) if err != nil { return err } return nil} // 账户注销func (t *ABstore) Delete(ctx contractapi.TransactionContextInterface, A string) error { // 从账本中删除账户状态 err := ctx.GetStub().DelState(A) if err != nil { return fmt.Errorf("Failed to delete state") } return nil} // 账户查询func (t *ABstore) Query(ctx contractapi.TransactionContextInterface, A string) (string, error) { var err error // 从账本获取状态数据 Avalbytes, err := ctx.GetStub().GetState(A) if err != nil { jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}" return "", errors.New(jsonResp) } if Avalbytes == nil { jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}" return "", errors.New(jsonResp) } jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}" fmt.Printf("Query Response:%s\n", jsonResp) return string(Avalbytes), nil} func main() { cc, err := contractapi.NewChaincode(new(ABstore)) if err != nil { panic(err.Error()) } if err := cc.Start(); err != nil { fmt.Printf("Error starting ABstore chaincode: %s", err) }} 父主题: Go语言链代码开发
  • 请求示例 { "orgID": "ce0ac69b0c8648cd25b44a551780409767c8890b", "channelID": "mychannel", "cryptoMethod": "SW", "cert": "-----BEGIN CERTIFICATE-----\\n...\\n-----END CERTIFICATE-----", "sk": "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----", "timestamp": “2020-10-27T17:28:16+08:00”, "applyer": "did:example:Mb4SshJeN5ukWXkbMJK8xC", "provider": "did:example:Mb4SshJeN5ukWXkbMJK8xC", "attrJson": "[{\"name\":\"att1\",\"type\":\"plain\",\"value\":\"att1name\"},{\"name\":\"att2\",\"type\":\"plain\",\"value\":\"att2name\"},{\"name\":\"att3\",\"type\":\"plain\",\"value\":\"5\"}]"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 证书 sk 是 String 私钥 timestamp 是 String 时间戳 applyer 是 String 申请者的身份标识 provider 是 String 授权者的身份标识 attrJson 是 Array of attribute objects 属性列表 表2 attribute 参数 是否必选 参数类型 描述 name 是 String 属性名 type 是 String 属性类型(plain,comparable) value 是 String 属性值(当type为plain时,value为属性值。当type为comparable时,value必须是整数。) maxValue 否 String 属性值上限,value可能取到的最大值。只在type为comparable时可选使用
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 applyer String 申请者的身份标识 applyerName String 申请者的名称 provider String 授权者的身份标识 providerName String 授权者的名称 service String 授权者的服务名 price Integer 价格 applyTime String 申请时间 encryptedABEKey String 被加密的ABE密钥 status String 申请状态,request表示未授权;ready表示申请已处理 reason String 原因 lockProof String 证明 attributesJson String 属性 状态码: 500 表4 响应Body参数 参数 参数类型 描述 errorCode String 错误码 errorMsg String 错误描述
  • 响应示例 状态码: 200 ABE用户密钥订单信息 { "applyer" : "did:example:Mb4SshJeN5ukWXkbMJK8xC", "provider" : "did:example:Mb4SshJeN5ukWXkbMJK8xC", "applyTime" : "1622166512", "status" : "ready", "attributesJson" : "{\"att1\": \"YXR0MW5hbWU=\",\"att2\": \"YXR0Mm5hbWU=\",\"att3\": \"NQ==\"}"} 状态码: 500 失败响应 { "errorCode" : "BCS.5002046", "errorMsg" : "Incorrect number of arguments"}
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 consumer String 订单消费者身份标识 consumerName String 订单消费者名称 orderSeq String 订单序列号 provider String 订单提供者身份标识 providerName String 订单提供者名称 productID String 数据集产品id productName String 数据集产品名称 price String 订单价钱 applyTime String 订单申请时间 encryptedAesKey String 密钥 status String 订单状态 reason String 订单申请原因 lockProof String 订单锁定证明 creatorDID String 流程创建者DID,如果没有加入任何流程,为“” processID String 当前订单所属流程ID,如果没有加入任何流程,为“” 状态码: 500 表3 响应Body参数 参数 参数类型 描述 errorCode String 错误码 errorMsg String 错误描述
  • 请求示例 { "orgID" : "ce0ac69b0c8648cd25b44a551780409767c8890b", "channelID" : "mychannel", "cryptoMethod" : "SW", "cert" : "-----BEGIN CERTIFICATE-----\\n...\\n-----END CERTIFICATE-----", "sk" : "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----", "timestamp" : "2020-10-27T17:28:16+08:00", "consumer" : "did:example:3TMWx8owKHARgNwbj4ywmG", "orderSeq" : "1", "provider" : "did:example:DHkJjyD5wZwya6sd6BNBnG", "productID" : "product2", "reason" : "apply dataset for AI", "consumerName" : "user1"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 证书 sk 是 String 私钥 timestamp 是 String 时间戳 consumer 是 String 订单申请者身份标识 orderSeq 是 String 订单序列号 provider 是 String 数据集发布者身份标识 productID 是 String 数据集产品id reason 否 String 申请原因 consumerName 否 String 数据集申请者名称
  • 响应示例 状态码: 200 订单信息 { "consumer" : "did:example:3TMWx8owKHARgNwbj4ywmG", "consumerName" : "Tyler", "orderSeq" : "1", "provider" : "did:example:DHkJjyD5wZwya6sd6BNBnG", "providerName" : "hw", "productID" : "product1", "productName" : "prodname1", "price" : "0", "applyTime" : "1607332359", "encryptedAesKey" : "BNGhPwjaTgpM+V7czzw1i4mH21KKN+XLKXHLqVsRIfybUCncqZNfomkRfzX4WEHj+oty1X9oCd4h6xMnRvs8BWE5Tvg6BJ6QTW/km9EO/FSYqzJf2GqQzAleAcLJrTBZ3LRbPaF87CgJ114ae7R+VK9VvfXQ8exuH2KMRD305dXieGpM4VPVv9u1BbL15Jpd/g==", "status" : "ready", "reason" : "I want product1", "lockProof" : ""} 状态码: 500 失败响应 { "errorCode" : "BCS.5002046", "errorMsg" : "Incorrect number of arguments"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 applyer 是 String 申请者的身份标识 serviceID 是 String 服务的标识符。服务提供者did中声明的service的id data 否 String data
  • 请求示例 { "orgID" : "4f1439758ebb41f7411b5f684b67713c08b89198", "channelID" : "mychannel", "cryptoMethod" : "SW", "cert" : "-----BEGIN CERTIFICATE-----\n...\n...\n-----END CERTIFICATE-----", "sk" : "------BEGIN PRIVATE KEY-----\n...\n...\n-----END PRIVATE KEY-----", "timestamp" : "2020-10-27T17:28:16+08:00", "applyer" : "did:example:ebfeb1f712ebc6f1c276e12ec21", "serviceID" : "did:example:ebfeb1f712ebc6f1c276e12ec21#service1", "data" : "abcdefg"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 证书 sk 是 String 私钥 timestamp 是 String 时间戳 provider 是 String 数据集提供者身份标识 productID 是 String 数据产品id
共100000条