华为云用户手册

  • Decrypt 接口原型 func Decrypt(ciphertext string, privKeyStr string, pwd string) (plainText *big.Int, err error) 功能描述 同态解密。 输入说明 参数名 类型 描述 是否必须 ciphertext string 需要解密的密文 是 privKeyStr string 同态加密的私钥串(被pwd加密保护 是 pwd string 用于保护私钥的字符串 否 输出说明 参数名 类型 描述 plainText *big.int 解密后的数据 err error 返回错误 注意事项 无。
  • 附录 fabric-sdk-client/go依赖的第三方包列表: 序号 包名 1 github.com/Knetic/govaluate 2 github.com/VividCortex/gohistogram 3 github.com/cloudflare/cfssl 4 github.com/go-kit/kit 5 github.com/golang/mock 6 github.com/golang/protobuf 7 github.com/hashicorp/hcl 8 github.com/hyperledger/fabric-config 9 github.com/hyperledger/fabric-lib-go 10 github.com/hyperledger/fabric-protos-go 11 github.com/magiconair/properties 12 github.com/miekg/pkcs11 13 github.com/mitchellh/mapstructure 14 github.com/pelletier/go-toml 15 github.com/pkg/errors 16 github.com/prometheus/client_golang 17 github.com/spf13/afero 18 github.com/spf13/cast 19 github.com/spf13/jwalterweatherman 20 github.com/spf13/pflag 21 github.com/spf13/viper 22 github.com/stretchr/testify 23 github.com/tjfoc/gmsm 24 google.golang.org/grpc 25 gopkg.in/yaml.v2 父主题: 国密加密
  • 部署应用 下载SDK和证书。 在“实例管理”页面,选择“Hyperledger Fabric增强版”页签,单击对应实例卡片上的“获取客户端配置”。 勾选“SDK文件”,SDK配置参数如下: 参数名称 说明 链代码名称 chaincodedemo 证书存放路径 /home/user/gatewayjavademo/config 通道名称 channel 组织&Peer节点 选择通道中所有节点组织 勾选“共识节点证书”。 勾选“Peer节点证书”,指定节点组织选择organization,勾选“管理员证书”。 单击“下载”,下载SDK配置文件、demo-orderer组织的管理员证书和organization组织的管理员证书。 复制并解压。 先下载工程源代码gatewayjavademo.zip文件并解压。 获取方法:登录 区块链 服务管理控制台,进入“应用案例”,在“Java示例Demo-Java SDK Demo”下方,单击“App_Gateway_Java_Demo”中Java项目源码的“下载”按钮。 将1步骤中的zip文件解压,把configs文件夹中的orderer文件夹、peer文件夹、sdk-config.json、sdk-config.yaml文件全部复制到gatewayjavademo目录下的config目录下。然后再将gatewayjavademo目录压缩成gatewayjavademo.zip包。 部署应用。 将新压缩的gatewayjavademo工程源代码gatewayjavademo.zip文件上传到CloudIDE开发环境中。 CloudIDE编译工程如下所示: 打开工程后等待一会,会自动下载工程依赖的包,然后按下图操作执行Run,就会得到预期结果。 gatewayjavademo工程中config目录下demo-channel-sdk-config.yaml文件,必须与gatewayjavademo/src/main/java/handler/Main.java和MainForMultiTask文件中helper.setConfigCtx("config/demo-channel-sdk-config.yaml")代码路径相同,保证可以正常运行Main.java。 客户端app交易的时候,如果指定了未实例化的组织和peer,那么首次交易会超时失败,请您重新运行即可正常交易。 每次成功执行Main.java,将会执行basicTransactionSample、commitListenerSample、contractListenerSample、blockListenerSample四个方法,向区块链存入多对键值对;可以通过区块链浏览器可以查看交易记录。
  • 准备工作 开通CloudIDE(或者用户自己准备JDK、maven和eclipse/IntelliJ IDEA)。 CloudIDE是软件开发生产线 CodeArts的云端开发环境服务,向开发者提供按需配置、快速获取的工作空间(包含编辑器和运行环境)。 在CloudIDE上创建一个空的Java工程,如图1所示。 图1 CloudIDE上创建一个空的Java工程 下载Java SDK示例源码,获取方法:登录区块链服务管理控制台,进入“应用案例”,在“Java示例Demo-Java SDK Demo”下方,单击“App_Gateway_Java_Demo”中Java项目源码的“下载”按钮。 购买区块链实例、安装链代码及实例化链代码操作,请参见《快速入门》。
  • 概述 用户的应用程序通过链代码与账本数据进行交互。应用程序开发可使用的语言比较广泛,如Golang、Solidity、Java、C++、Python、Node.js等。应用程序和链代码开发语言无强对应关系,只要应用程序能通过SDK来调用链代码即可。 Hyperledger Fabric增强版对应用程序开放的接口均为gRPC协议,与开源版本保持一致,通常使用SDK进行调用,详情可参考Hyperledger Fabric增强版SDK接口定义。 Java语言,请参考Java SDK使用指导。 Python语言,请参考Python使用指导。 Node.js语言,请参考Node.js SDK使用指导。 Go语言,请参考Go SDK使用指导。 父主题: 应用程序开发
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 channel_id String 通道id block_height Integer 区块高度 transaction_num Integer 交易数量 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
  • 请求示例 { "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", "vcIndex" : 1, "owner" : "did:example:ebfeb1f712ebc6f1c276e12ec21"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 vcIndex 是 String 凭证索引 owner 是 String 凭证所有者身份标识
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 isOwned Boolean 是否拥有 状态码: 400 表3 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512 状态码: 500 表4 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512
  • 响应示例 状态码: 200 VCVerifyResponeParams Information { "isOwned" : true} 状态码: 400 失败响应 { "errorCode" : " BCS .4002030", "errorMsg" : "Owner(bol) does not have credential ..."} 状态码: 500 失败响应 { "errorCode" : "B CS .5002014", "errorMsg" : "Internal Server Error"}
  • 合约编译 下载Node.js软件并安装,安装成功后,执行如下命令查看对应版本(软件对应版本无强制要求)。 node -vnpm -v 设置新目录assembly,在该目录下执行 npm init 命令,其中package name输入为assembly(目录名、package name建议保持一致,具体名称无强制要求,可自行定义)。 执行如下命令通过npm安装加载器和编译器 npm install --save @assemblyscript/loader npm install --save-dev assemblyscript 若安装过程中出现“ idealTree:assembly: sill idealTree buildDeps”,请确认npm使用镜像源可正常访问。 查看npm镜像源配置命令 npm config get registry 设置npm镜像源配置命令 npm config set registry 国内镜像源地址 执行如下命令,利用编译器提供的脚手架设置新项目 npx asinit . 参考示例Demo完成合约文件contract.ts编写与合约SDK文件index.ts引用后,执行build命令编译AssemblyScript类型的合约文件,编译成功后在build目录下生成optimized.wasm字节码文件(该字节码文件可重新命名)。 npm run asbuild 父主题: 示例Demo
  • Demo工程目录 合约开发和调测可参考合约示例Demo,单击链接获取AssemblyScript语言合约工程Demo。 build目录下optimized.wasm为合约编译后对应的wasm字节码文件(最终合约类型文件为optimized.wasm压缩成的*.zip包,合约示例Demo)。 assembly/index.ts 为开发智能合约文件(contract.ts)依赖的合约SDK。 assembly/contract.ts 为智能合约文件,本Demo中合约仅进行简单展示(实际合约文件contract.ts需自行开发)。 合约文件的安装请参考合约管理。 AssemblyScript语言类型合约不支持查询指定键的历史数据。 父主题: 示例Demo
  • 资源下载 表1 库列表 配套社区Hyperledger Fabric版本 库版本 下载链接 Fabric 1.1.0、Fabric 1.4.0、Fabric 2.2 1.8.5 同态加密库 1.9.2 同态加密库 1.11.5 同态加密库 同态加密链代码下载 IDChaincode.go Chaincode库接口文件下载 api_ahe_cc.tar.gz 须知: 需要选择与本地编译环境相一致版本的包。例如本地使用的go编译器为1.8.5,则下载1.8.5版本的库。 使用同态加密库需要提前安装好国密SDK。 api_ahe_cc.tar.gz包仅用于本地编译。
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 证书 sk 是 String 私钥 timestamp 是 String 时间戳 consumer 是 String 订单申请者身份标识 orderSeq 是 String 订单序列号 orderStatus 是 Integer 设置订单状态(0完成,1失败,2取消) reason 否 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", "orderStatus" : 0, "reason" : "string"}
  • 响应示例 状态码: 200 Success { "transaction_summary" : { "block_number" : 29, "transaction_id" : "6d704b217e17e16de71029b70f17a1ced35c055279f655dfd096bebf978a0546", "channelName" : "channel", "creator_msp" : "282f3c713ea1cec646aa7c640defca9c4f64bd88MSP", "type" : "ENDORSER_TRANSACTION", "chaincode_name" : "kvtest", "chaincode_version" : "1.0", "timestamp" : "2021-01-20T19:30:28+08:00", "organization_name" : "organization" }, "validation_code" : "VALID", "endorser_organizations" : [ "282f3c713ea1cec646aa7c640defca9c4f64bd88MSP" ], "proposal_hash" : "k1h2ewweWGrWNmmcu7UvzJ8Aw2G190SQzV+lBAAl4gw=", "read_set" : { "kvtest" : null, "lscc" : [ { "key" : "kvtest", "version" : { "block_num" : 2 } } ] }, "write_set" : { "kvtest" : [ { "key" : "a1", "is_delete" : false, "value" : "1" } ], "lscc" : [ ] }} 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large"}
  • 请求示例 { "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", "provider" : "did:example:DHkJjyD5wZwya6sd6BNBnG", "providerName" : "huawei", "productName" : "prodname", "productID" : "product2", "sampleUrl" : "http://hwcloud.com/sample.com/prodname2", "sampleSize" : "10KB", "sampleType" : "csv", "sampleName" : "data_sub1", "fileType" : "csv", "dataUrl" : "http://hwcloud.com/prodname2", "dataHash" : "2282ba7a1a2ef5700609214a997d3d4237a03bfd3632c6d089e57e7b6f467969", "dataSize" : "100MB", "dataName" : "mydata1", "description" : "this is my second prod", "plainData" : "base64 encoding string", "consumer" : "did:example:3TMWx8owKHARgNwbj4ywmG", "orderSeq" : "1", "watermarkType" : "string", "file" : "string", "productIDKeywords" : "[{\"value\":\"taiyuan\"},{\"value\":\"renmin_hospital\"},{\"value\":\"medicine\"}]", "onChainStore" : "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" : "", "encryptData" : "base64 encoding string"} 状态码: 500 失败响应 { "errorCode" : "BCS.5002046", "errorMsg" : "Incorrect number of arguments"}
  • 响应参数 状态码: 200 表6 响应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,如果没有加入任何流程,为“” encryptData String base64编码的数据密文 状态码: 500 表7 响应Body参数 参数 参数类型 描述 errorCode String 错误码 errorMsg String 错误描述
  • 查询区块块高 消息构建。 接口方法 func (msg *QueryRawMessage) BuildLatestChainStateRawMessage(chainID string) (*common.RawMessage, error) 参数说明 参数 类型 说明 chainID string 链ID。 返回值 类型 说明 *common.RawMessage 查询链状态需要发送的消息 error 查询成功返回类型为nil,反之返回error。 消息发送。 接口方法 QueryAction.class func (action *QueryAction) GetLatestChainState(rawMsg *common.RawMessage) (*common.RawMessage, error) 参数说明 参数 类型 说明 rawMsg *common.RawMessage 上述查询链状态消息。 返回值 类型 说明 *common.RawMessage 用于获取包含发送结果的消息。 error 发送成功返回类型为nil,反之返回error。 父主题: 其他查询
  • 响应示例 状态码: 200 Success { "versions" : [ { "version" : "1.0", "hash_code" : "1473b4807fe9f970d1ba56192e41d39c7d621d07d80e603cf75ed3982b81034d", "description" : "", "install_time" : "2021-01-11T11:27:12.093454567+08:00", "update_time" : "2021-01-11T11:27:12.093454789+08:00", "instantiate_status" : false, "uninstantiated_peer_infos" : [ { "org_name" : "organization", "org_id" : "57e7914450b098771f5106acaf02be8a61894fae", "peer_name" : "peer-0", "peer_id" : "peer-57e7914450b098771f5106acaf02be8a61894fae-0.peer-57e7914450b098771f5106acaf02be8a61894fae.default.svc.cluster.local" }, { "org_name" : "organization", "org_id" : "57e7914450b098771f5106acaf02be8a61894fae", "peer_name" : "peer-1", "peer_id" : "peer-57e7914450b098771f5106acaf02be8a61894fae-1.peer-57e7914450b098771f5106acaf02be8a61894fae.default.svc.cluster.local" } ], "security_check_status" : 2 } ]} 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large"}
  • 合约结构 Go语言合约由合约文件及依赖包构成,包含包声明、依赖包导入、智能合约的结构体定义和方法定义。 合约文件中,用户可自定义结构体以及合约函数。以下内容不可更改: package名:package usercontract 函数的签名:NewSmartContract()、Init(stub contractapi.ContractStub)、Invoke(stub contractapi.ContractStub) 合约的结构如下: package usercontract// 引入必要的包 import ( "git.huawei.com/poissonsearch/wienerchain/contract/docker-container/contract-go/contractapi") // 声明合约的结构体 type example01 struct {}// 创建合约func NewSmartContract() contractapi.Contract { return &example01{}}// 合约的初始化(Init)接口。将合约启动时,需要首先执行且只需要执行一次的逻辑放到此方法中。func (e *example01) Init(stub contractapi.ContractStub) ([]byte, error) { // 编写时可灵活使用stub中的API } // 合约被调用(invoke)接口。将主要的合约执行逻辑,放到此方法内,供合约使用者调用。func (e *example01) Invoke(stub contractapi.ContractStub) ([]byte, error) { // 编写时可灵活使用stub中的API } 父主题: Go合约开发
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 versions Array of ChaincodeVersion objects 链码版本信息 表4 ChaincodeVersion 参数 参数类型 描述 version String 链码版本 hash_code String 链码版本哈希值 description String 链码版本描述 install_time String 链码版本安装时间 update_time String 链码版本更新时间 instantiate_status Boolean 链码版本实例化状态 security_check_status Integer 链代码安全检查状态(0:不存在,1:运行中,2:完成,3:失败) uninstantiated_peer_infos Array of PeerInfo objects 未实例化的peer信息 表5 PeerInfo 参数 参数类型 描述 org_name String 组织名称 org_id String 组织id peer_name String 节点名称 peer_id String 节点id status String 节点状态 channels Array of strings 未实例化的peer信息 url String Peer节点的url信息 peer String Peer节点的内部 域名 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 schemaIndex String 模板存储在链上的索引 credentialSchema CredentialSchema object CredentialSchema 表4 CredentialSchema 参数 参数类型 描述 creator String 创建者身份标识 title String 名称 identifier String 凭证模板标识 attributes Array of Attribute objects 属性信息 version Integer 版本 表5 Attribute 参数 参数类型 描述 name String 名称 type String 类型 description String 描述信息 状态码: 500 表6 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512
  • 响应示例 状态码: 200 VCSchemaResponeParams { "schemaIndex" : "string", "credentialSchema" : { "creator" : "string", "title" : "string", "identifier" : "string", "attributes" : [ { "name" : "name", "type" : "someType", "description" : "Identity number" } ], "version" : 0 }} 状态码: 500 失败响应 { "errorCode" : "BCS.5002035", "errorMsg" : "Schema Already Exist"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 title 否 String 名称 identifier 是 String 标识 attributes 否 Array of Attribute objects 属性信息 issuer 是 String 签发者身份标识 表2 Attribute 参数 是否必选 参数类型 描述 name 否 String 名称 type 否 String 类型 description 否 String 描述信息
  • 请求示例 { "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", "title" : "string", "identifier" : "string", "attributes" : [ { "name" : "name", "type" : "someType", "description" : "Identity number" } ], "issuer" : "did:example:ebfeb1f712ebc6f1c276e12ec21"}
  • 依赖配置 该内容仅适用于Fabric架构版本的区块链实例的Java语言链代码开发。 请使用Gradle或Maven构建管理工具组织链代码项目。若链代码项目中包含非本地依赖,请确保对应区块链实例的节点均绑定了弹性ip。若链代码容器将运行在受限网络环境,请确保项目中的所有依赖已配置为本地依赖。示例链代码获取方法:登录 区块链服务BCS 控制台,进入“应用案例”,单击“Java示例Demo-Java SDK Demo”中“Chaincode_Java_Local_Demo”的“下载”按钮。
  • 文件下载 接口方法 func (bc *BsClient) DownloadFile(filePath, fileName string, versionId int) error 参数说明 参数 类型 说明 filePath string 文件下载到本地的路径。 fileName string 待下载文件在链上的名称。不允许包含 "/" versionId int 待下载文件的版本号。版本号要求大于等于1,可以通过查询文件历史版本获取文件的版本号信息。 返回值 类型 说明 error 下载成功返回类型为nil,反之返回error。 父主题: Go SDK介绍
  • 链代码结构 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) }}
共99269条