华为云用户手册

  • 响应示例 状态码: 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" : "B CS .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) }}
  • 防止出现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}
  • 利用交易ID查询交易详情 消息构建。 接口方法 func (msg *QueryRawMessage) BuildTxRawMessage(chainID string, txHash []byte) (*common.RawMessage, error) 参数说明 参数 类型 说明 chainID string 链ID。 txHash []byte 交易哈希。 返回值 类型 说明 *common.RawMessage 根据交易ID查询交易详情需发送的消息。 error 构建成功返回类型为nil,反之返回error。 消息发送。 接口方法 QueryAction.class func (action *QueryAction) GetTxByHash(rawMsg *common.RawMessage) (*common.RawMessage, error) 参数说明 参数 类型 说明 rawMsg *common.RawMessage 上述根据交易Hash查询交易详情消息。 返回值 类型 说明 *common.RawMessage 用于获取包含发送结果的消息。 error 发送成功返回类型为nil,反之返回error。 父主题: 其他查询
  • 链代码接口 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 }
  • SDK配置 linux环境,SDK的编译、运行,需要手动下载并配置openssl,单击链接下载openssl[链接] 解压openssl,复制openssl文件夹到目录/usr/local/include/下 执行库的导入命令:export LD_LIBRARY_PATH=/usr/local/include/openssl 引用SDK的步骤如下: 单击链接下载Go SDK[链接]。 解压到应用程序所在目录,具体可参考Go应用程序开发的示例Demo。 父主题: Go SDK介绍
  • 示例2:A向B转账 执行如下命令,A向B转账,金额为10。 ./appdemo transaction -u A -p XXXXXXA -b b22edf18d64f57954640c8f3f6cf67d9401f262daead588ddfe8178xxxx -t 10 -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea 其中-b后的参数为接收方的地址。示例中为注册B用户时的返回值,即B用户注册数据的地址信息。 返回值为A账户的地址:2efc4639bc281060ce013dfea33a47b647b6f4a20103a6321c33d67d5xxxx
  • 示例3:查询账户余额 执行如下命令查询A账户的余额,返回值为A账户余额。 ./appdemo querybalance -p XXXXXX -u A -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea 执行如下名查询B账户的余额,返回值为B账户余额。 ./appdemo querybalance -p XXXXXX -u B -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
  • 示例1:注册账户 执行如下命令注册B账户,账户金额为100。 ./appdemo register -u B -p XXXXXX -i 100 -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea -u:为注册的用户名B、-p:为B用户密码XXXXXX,密码必须包含大写、小写、数字、特殊字符中的至少两种,-c:为sdk配置文件名,-C:为安装链代码的通道名,-I:为安装示例链代码IDChaincode的实际安装链代码名,-T:为安装示例链代码Transaction的实际安装链代码名,-o:为peer节点组织的ID,可在通道管理界面查询。参数下同。 返回值为一串加密地址,示例: b22edf18d64f57954640c8f3f6cf67d9401f262daead588ddfexxxxx 以相同的方法注册A账户,账户金额为200。 ./appdemo register -u A -p XXXXXX -i 200 -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea 返回值为一串加密地址,示例: 2efc4639bc281060ce013dfea33a47b647b6f4a20103a6321c33dxxxxxx
  • 示例5:测试同态乘法 执行如下命令测试同态乘法。 ./appdemo homomulti -c ./test-sdk-config.yaml -a 100 -b 5 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea 其中-a和-b后的参数为进行同态乘的乘数和被乘数,其中-a后的参数会被加密,-b后的参数是明文。
  • 请求示例 { "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"}
  • 响应示例 状态码: 200 Success { "user" : "admin", "token" : "ACiUxRlk2Jcu2d5bp2SyfP7abHV1nVKlo9Mm2AxI9dDN7mdHXXHBdg=kaIglHeZLTu6UeIu5YRcXTlpUPXylEG3ESNu0vIukrikG6SVhO393ds8rG+aRnZ+mMyookApP", "expire_time" : 1605867860701} 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 证书 sk 是 String 私钥 timestamp 是 String 时间戳 consumer 是 String 订单申请者身份标识 orderSeq 是 String 订单序列号
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 result Array of PeerInstallInfo objects 节点链代码安装信息 表4 PeerInstallInfo 参数 参数类型 描述 org_name String 节点所在组织名称 org_id String 节点所在组织ID peer_name String 节点名称 peer_id String 节点ID install_status String 链代码安装情况:installed / uninstalled version String 链代码版本号 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_message String 错误描述 error_msg String 错误描述
  • 响应示例 状态码: 200 Success { "result" : [ { "org_name" : "org1", "org_id" : "65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3", "peer_name" : "peer-0", "peer_id" : "peer-65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3-0.peer-65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3.default.svc.cluster.local", "install_status" : "uninstalled", "version" : "" }, { "org_name" : "org1", "org_id" : "65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3", "peer_name" : "peer-1", "peer_id" : "peer-65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3-1.peer-65cfb1c760f24058c865ffcfd8ce1cdb690bf2a3.default.svc.cluster.local", "install_status" : "installed", "version" : "1.0" } ]} 状态码: 400 Bad Request { "error_code" : "BCS.4000013", "error_message" : "request body is too large"}
  • 响应示例 状态码: 200 数据集信息 { "provider" : "did:example:DHkJjyD5wZwya6sd6BNBnG", "providerName" : "aws", "productName" : "prodname2", "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" : "mydata", "description" : "this is second prod", "price" : "0", "encryptedAesKey" : "BA4Ub3t3IskN8uKcEMa+4cbtsDS8OzF4V/qqb4OcPMeMvp7IL+HClzAbL6lPnhbDg/AnrStBlf0qFzRj+qvk6ZH0c7wP0aS48fSoNtecG79aFpFx0dg7rFdVYXWWzgeyI03eD3gFdXlQ/ovpxKJG5ALK39OCazUqDrawZHSDGyIlw0hGh88Q+GVORVSp+6V5Ag==", "status" : "ready", "publishTime" : "1607157244", "dataFiles" : [ { "fileType" : "csv", "dataUrl" : "http://hwcloud.com/prodname2", "dataHash" : "2282ba7a1a2ef5700609214a997d3d4237a03bfd3632c6d089e57e7b6f467969", "dataSize" : "100MB", "dataName" : "mydata" } ], "sampleFiles" : [ { "fileType" : "csv", "dataUrl" : "http://hwcloud.com/prodname2", "dataHash" : "2282ba7a1a2ef5700609214a997d3d4237a03bfd3632c6d089e57e7b6f467969", "dataSize" : "100MB", "dataName" : "mydata" } ], "category" : "string", "encryptData" : "string"} 状态码: 500 失败响应 { "errorCode" : "BCS.5002046", "errorMsg" : "Incorrect number of arguments"}
  • 响应参数 状态码: 200 表5 响应Body参数 参数 参数类型 描述 provider String 数据集提供者身份标识 providerName String 数据集提供者名称 productName String 数据集产品名称 productID String 数据集产品id sampleUrl String 样例数据url sampleSize String 样例数据大小 sampleType String 样例数据类型 sampleName String 样例数据名称 fileType String 文件类型 dataUrl String 数据url dataHash String 数据哈希值 dataSize String 数据大小 dataName String 数据名称 description String 数据描述 price String 数据价格 encryptedAesKey String 密钥 status String 状态 publishTime String 数据发布时间 dataFiles Array of DataFile objects 数据文件列表 sampleFiles Array of DataFile objects 样例文件列表 category String 加密类型 encryptData String 加密后的数据 表6 DataFile 参数 参数类型 描述 fileType String 文件类型 dataUrl String 数据url dataHash String 数据哈希 dataSize String 数据大小 dataName String 数据名称 状态码: 500 表7 响应Body参数 参数 参数类型 描述 errorCode String 错误码 errorMsg String 错误描述
  • 示例Demo 应用程序开发需要使用go mod,因此请确保GO111MODULE为on、镜像源配置。请确保可正常访问华为云镜像网站,环境设置命令如下 go env -w GO111MODULE=ongo env -w GOPROXY=https://repo.huaweicloud.com/repository/goproxy/go env -w GONOSUMDB=* Go语言示例Demo基于Go SDK开发,主要用于帮助开发人员理解并开发Go客户端应用程序,使用步骤如下: 单击链接下载客户端示例[链接]。 单击链接下载客户端所使用的Go SDK[链接]。 添加Go SDK文件到客户端示例Demo目录下,完成Go SDK配置。 完成客户端初始化参数配置(utils/config.go),详情可参考SDK客户端配置。 示例Demo项目结构如下: 表1 示例Demo目录结构 文件 介绍 huaweichain Go语言客户端SDK,相关介绍请参考Go SDK介绍。 main.go Go语言客户端主程序。 contract.go 通过合约对业务数据交互。对数据有修改的操作如插入和删除,需要调用其中的send方法。对数据的查询操作如查询某个键的历史,需要调用其中的query方法。 block.go 用于从区块上获取数据。 tx.go 用于从交易上获取数据。 config.go 客户端的初始化配置。 readme.md 提供详细的接口调用示例。 父主题: Go应用程序开发
  • 组织解密 接口方法 func (client *GatewayClient) DecryptDataWithE2EE(consensusOrgID, decOrgID string, txID string) (data string, err error) 参数说明 参数 类型 说明 consensusOrgID string 共识组织ID decOrgID string 执行解密操作的组织ID。 txID string 密文对应的交易ID。 返回值 参数 类型 说明 data string 解密后的明文信息。 err error 解密成功返回nil,否则返回error。 父主题: Go SDK介绍
共99354条