华为云用户手册

  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 serviceID 否 String 服务的标识符
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 items Array of VCOrder objects 列表 表3 VCOrder 参数 参数类型 描述 applyer String 申请者身份标识 orderSeq String 订单序列号 applyTime String 申请时间 price String 价格 status String 状态 service String 服务 reason String 理由信息 dataUri String 凭证数据URI encryptedAesKey String 加密的AES密钥 uriType String URI类型 dataHash String 数据的hash lockProof String 锁定证明 vcIndex String 凭证索引 状态码: 500 表4 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512
  • 请求示例 { "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", "orderIndex" : 1}
  • 响应示例 状态码: 200 UntreatedVCOrder Information List { "items" : [ { "applyer" : "string", "orderSeq" : "string", "applyTime" : "string", "price" : "string", "status" : "string", "service" : "string", "reason" : "string", "dataUri" : "string", "encryptedAesKey" : "string", "uriType" : "string", "dataHash" : "string", "lockProof" : "string", "vcIndex" : "string" } ]} 状态码: 500 失败响应 { "errorCode" : "stringst", "errorMsg" : "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" : 0}
  • 响应示例 状态码: 200 VerifiableCredential Information { "context" : "https://www.w3.org/2018/credentials/v1", "sequence" : "x00123456", "type" : [ "VerifiableCredential", "AlumniCredential" ], "issuer" : "https://example.edu/issuers/565049", "issuanceDate" : "1606720551", "expirationDate" : "1606720551", "credentialSubject" : { "owner" : "did:example:ebfeb1f712ebc6f1c276e12ec21", "type" : "professional", "schemaID" : "did:example:ebfeb1f712ebc6f1c276e12ec21_IDCard", "dataURI" : "string", "encryptedAeskey" : "string", "uriType" : "index", "dataHash" : "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85" }, "revocation" : { "id" : "string", "type" : "string" }} 状态码: 500 失败响应 { "errorCode" : "stringst", "errorMsg" : "string"}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 vcIndex 是 String 凭证索引
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 context String 内容 sequence String 颁发机构对应凭证的序列号 type Array of strings 可验证凭证类型 issuer String 签发者身份标识 issuanceDate String 签发日期 expirationDate String 凭证有效期 credentialSubject CredentialSubject object 凭证主题 revocation Revocation object 撤销 表3 CredentialSubject 参数 参数类型 描述 owner String 申请者的身份标识 type String 凭证类型 schemaID String schema ID dataURI String 数据URI encryptedAeskey String 加密对称密钥 uriType String 数据索引类型 dataHash String 数据hash值 表4 Revocation 参数 参数类型 描述 id String 撤销API或者撤销列表的url type String 撤销类型 状态码: 500 表5 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512
  • 请求参数 表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"}
  • 概述 用户的应用程序通过链代码与账本数据进行交互。应用程序开发可使用的语言比较广泛,如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使用指导。 父主题: 应用程序开发
  • 简介 在使用 区块链 服务时,您需要开发自己的链代码和应用。本文档主要介绍链代码的开发及其应用配置,支持具备Go/Java开发经验的开发人员使用。 区块链服务使用流程如下: 图1 使用流程 购买区块链实例 Fabric架构版本的区块链实例支持在CCE集群和边缘集群上部署,具体可参见基于CCE集群。 开发链代码 链代码是用Go、Java或Node.js语言编写的程序,主要用于操作账本上的数据,具体可参见链代码开发。 安装、实例化链代码 区块链服务为您提供界面化链代码管理功能,包括链代码安装、实例化等,具体可参见链代码管理。 下载SDK配置和证书 应用程序开发前,您需要获取对应实例的SDK配置文件和证书,具体可参见下载SDK配置和证书。 开发应用程序 您需要自行开发应用程序业务逻辑代码。针对Fabric架构版本的区块链实例,应用开发过程中可使用 BCS 提供的国密加密SDK,也可使用Fabric官方社区提供的和您自身的实例版本匹配的SDK,具体可参见应用程序开发。 另外,Fabric架构版本的区块链实例提供同态加密库供您使用,相关资料及资源请参见同态加密。 如果您对业务链代码和客户端APP的设计和开发有需求,可以联系华为云区块链合作伙伴提供进一步服务,华为云区块链合作伙伴会结合您的业务以及华为云的优势和特点为您提供完善的解决方案,联系邮箱如下:sales@huaweicloud.com
  • 配置SDK文件 您需要修改应用程序中SDK配置文件相关代码,如下面示例所示,您需要填写正确的SDK配置文件绝对路径。 var ( configFile = "/root/gosdkdemo/config/go-sdk-demo-channel-sdk-config.yaml" org = " 6c448740d50d6197dc86b36b0abd0bc639a788a7" )
  • 开发前准备 用户的应用程序通过链代码与账本数据进行交互。应用程序开发可使用的语言比较广泛,如Golang、Solidity、Java、C++、Python、Node.js等。应用程序和链代码开发语言无强对应关系,只要应用程序能通过SDK来调用链代码即可。 您需要购买区块链实例。 Fabric架构版本的区块链实例支持在CCE集群和边缘集群上部署,具体可参见基于CCE集群。 您需要获取对应实例的SDK配置文件,具体可参见下载SDK配置和证书。 父主题: 应用程序开发
  • 配置组织ID Fabric架构版本的区块链实例: 您需要修改应用程序中配置实例组织ID的相关代码,下载证书文件解压后的peer文件包括目录名和对应组织ID。 如下图所示,仅供示例参考,请以实际操作的证书文件为准。 证书文件解压后目录名是6c448740d50d6197dc86b36b0abd0bc639a788a7.peer,组织ID为6c448740d50d6197dc86b36b0abd0bc639a788a7。 图1 证书文件解压
  • 概述 目前区块链智能合约编写门槛高,开发人员需要掌握区块链基础知识以及对底层区块链支持的合约语言有所了解,同时编写出高效和安全的智能合同需要拥有丰富的经验;并且在处理业务合约时,操作人员需实时监控链上交易以获取业务流程进展,增加了业务管理流程和编程人员的开发工作量。 本功能旨在提升区块链的易用性,消除开发人员对区块链知识和智能合约编程的依赖,同时创新性地以业务为维度提供流程管理功能,让区块链操作人员更多地关注于业务本身,提供简单便捷、安全可靠的区块链业务开发和流程管理功能。 图1 系统逻辑 若需要使用该功能,请联系技术支持工程师。 父主题: 区块链应用低代码开发功能
  • 实现流程 各个角色可通过企业身份注册(带有service)和注册DID生成完全由自己控制的分布式身份,并将身份文档发布到区块链上完成身份的注册。企业用户的DID身份中可以包含其所能提供的服务信息,以支持多样的应用场景。 主要有三种角色:签发者、持有者和验证者,其中每个角色都可以是设备、应用、个人或者组织。 具备基础的身份标识之后,通过可验证凭证架设起身份与身份之间的认证体系。凭证的模板会由相关主体注册发布到区块链上,并持续维护。持有者便可以向签发者发起认证申请,获得凭证后出示给验证者完成校验。 验证者可以通过接口验证持有者出示的“可验证凭证”,确保其是否有权限和资质开展后续业务。
  • 低代码合约开发 传统的智能合约开发需要开发人员使用底层区块链支持的合约语言进行相关业务开发和测试,开发人员不仅要求具备一定的编程能力,还需具备区块链等相关知识以保障合约的安全性。华为区块链提供低代码开发能力,开发人员仅需要根据实际业务画出业务流程建模符号(Business Process Modeling Notation,简称BPMN)和少量辅助功能代码的开发,即可完成安全可靠的智能合约编写。 通过设计以下模块实现低代码开发和部署: BPMN业务图绘制 B CS 提供的BPMN绘制页面简单易用,用户通过拖拽方式将开始事件、活动、网关、连接对象、结束事件、泳道等组合起来,通过实际业务逻辑绘制定制化BPMN业务图。其中,用户仅需编写少量业务需要的代码和查询功能代码即可完成智能合约的制作。通过绘制页面可实时验证BPMN的有效性,验证无误后单击构建,生成智能合约。 智能合约部署 Package Management界面用于智能合约的管理,用户登录业务管理页面后跳转到该界面,可查看和管理已生成的智能合约。通过对生成的智能合约选择背书策略、安装合约的组织等配置,完成合约的安装和实例化,智能合约最终运行在背书节点中的一个Docker容器内。 智能合约触发 实例化后的智能合约,可以通过外部条件来触发合约执行过程,支持事件触发和交易触发的方式,两种模式均会触发背书节点进行一致性共识,避免恶意节点作恶。 智能合约变更 业务更替升级后,用户绘制新的BPMN业务图并改变版本号,构建新版本的智能合约,重新部署合约即完成智能合约的变更。为保证安全性,合约的变更需要一定数量的背书节点达成共识后才能完成。 父主题: 区块链应用低代码开发功能
  • 业务流程管理 常见的区块链业务开发管理需要操作人员监控链上交易数据来掌握该笔业务的流程走向,即使使用区块链浏览器也需操作人员对浏览器中的数据进行筛选过滤,无疑增加了操作人员的工作量以及需要操作人员无一遗漏的筛选出正确交易才能开展下一步业务流程。 BCS提供以业务为维度的管理流程,操作人员通过界面更加直观地查看该笔业务的当前进展和历史交易数据。并且针对用户管理,提供了以角色和群组的细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中),不同角色或群组的用户授予不同的权限,例如仓库管理员仅可处理货物的发放、货物收件人员仅可确认货物的签收。该功能使用户更多的精力放在处理业务,丰富了区块链上层业务和人员管理,极大地增加了区块链的易用性。 用户权限管理 智能合约的发起者作为该合约的管理员,可通过用户管理页面User Management进行用户权限管理。首先根据实际业务设置角色,例如买家、卖家和仓库管理员等角色。然后设置群组,每个群组可包含多个或单个角色。最后添加用户,管理员为其设置用户名和登录密码,并选择对应的群组。 业务监控 用户可通过用户名和密码登录到业务监控页面,查看当前业务流程和业务历史交易数据,通过图形化呈现业务进展和下一步流程走向。并且通过状态标识,可直观的查看当前业务是否完成。 业务处理 业务处理包括接口调用业务处理、自动业务处理和人工处理三种业务处理方式。接口调用业务处理指用户通过调用合约SDK发起交易进行业务处理;自动业务处理指根据业务逻辑判断,满足一定要求后自动发起交易进行业务处理;人工处理指根据用户角色,不同用户拥有特定的权限执行相应的人工处理业务,以角色为维度进行细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中)。 父主题: 区块链应用低代码开发功能
  • 功能介绍 可信数据交换基于分布式身份实现,参与数据交换的用户需要注册分布式身份,详细方法请参见分布式身份(公测)。 可信数据涉及两个主要数据结构:数据集和数据订单。数据集包括数据描述信息、访问控制信息(属性加密中的策略)等。数据订单包括数据申请、审核信息等。 可信数据交换支持三种模式:申请-授权、主动分享和细粒度访问控制。详细请参见模式介绍。 可信交换中的 数据加密 后支持多种存储服务,用户可以根据业务需要自己选择。调用者负责将密文数据存储到公开可访问的存储设备中。
  • 请求示例 { "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", "did" : "did:example:ebfeb1f712ebc6f1c276e12ec21", "service" : [ { "type" : "VerifiableCredentialService", "serviceEndpoint" : "https://example.com/vc/", "credentialApplySchema" : { "type" : "file", "name" : "Test Enterprise Certification", "description" : "this is test apply info", "attributes" : [ { "name" : "bob", "type" : "string", "description" : "Attribute's description" } ] } } ]}
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 did 是 String 分布式身份标识 service 否 Array of DIDService objects 服务列表 表2 DIDService 参数 是否必选 参数类型 描述 type 是 String 类型 serviceEndpoint 是 String 接入点 credentialApplySchema 否 CredentialApplySchema object 申请凭证所需数据的Schema 表3 CredentialApplySchema 参数 是否必选 参数类型 描述 type 否 String 类型 name 否 String 名称 description 否 String 描述信息 attributes 否 Array of Attribute objects 属性列表 表4 Attribute 参数 是否必选 参数类型 描述 name 否 String 名称 type 否 String 类型 description 否 String 描述信息
  • 响应参数 状态码: 200 表5 响应Body参数 参数 参数类型 描述 context String context id String 分布式身份标识 publicKey Array of DocPublicKey objects 公钥列表 authentication Array of strings did主公钥标识 recovery String 备用公钥标识,可用于修改主密钥 service Array of Service objects 服务列表 proof Proof object 证明结构,可为空 created String 创建时间 updated String 更新时间 status String 状态 表6 DocPublicKey 参数 参数类型 描述 id String 公钥标识 type String 公钥类型 controller String 公钥的控制者标识 publicKeyPem String 公钥证书 表7 Service 参数 参数类型 描述 id String 服务标识 type String 服务类型 serviceEndpoint String 服务介绍网址 credentialApplySchema CredentialApplySchema object 申请凭证所需数据的Schema 表8 CredentialApplySchema 参数 参数类型 描述 type String 类型 name String 名称 description String 描述信息 attributes Array of Attribute objects 属性列表 表9 Attribute 参数 参数类型 描述 name String 名称 type String 类型 description String 描述信息 表10 Proof 参数 参数类型 描述 creator String 创建者身份标识 type String 签名类型 created String 签名创建时间 signatureValue String 签名值 状态码: 500 表11 响应Body参数 参数 参数类型 描述 errorCode String 错误码 最小长度:8 最大长度:36 errorMsg String 错误描述 最小长度:2 最大长度:512
  • 响应参数 状态码: 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
  • 请求示例 { "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"}
  • 响应示例 状态码: 200 VCVerifyResponeParams Information { "isOwned" : true} 状态码: 400 失败响应 { "errorCode" : "BCS.4002030", "errorMsg" : "Owner(bol) does not have credential ..."} 状态码: 500 失败响应 { "errorCode" : "BCS.5002014", "errorMsg" : "Internal Server Error"}
  • 运行Client程序 Client程序运行时一般要设定其使用的配置文件路径、通道名称、链代码名称、组织ID等。 配置文件路径即用户下载配置文件的存放路径。 通道名称即BCS实例中的通道名称。 链代码名称即BCS实例中安装链代码时设定的名称。 组织ID,以如下示例配置文件内容为例,组织ID为02f23ab00f6e1ffcde8a27bfd3ac2290edc18127 client:organization: 02f23ab00f6e1ffcde8a27bfd3ac2290edc18127
  • 请求参数 表1 请求Body参数 参数 是否必选 参数类型 描述 orgID 是 String 组织id channelID 是 String 通道id cryptoMethod 是 String 加密方法,目前固定为SW cert 是 String 用户证书,每行末尾均需要增加显式换行符\n sk 是 String 用户私钥,每行末尾均需要增加显式换行符\n timestamp 是 String 时间戳 vcIndex 是 String 凭证索引 owner 是 String 凭证所有者身份标识
  • 操作步骤 实例订购及文件下载。 订购BCS实例时,安全机制选择使用“ECDSA”同态加密。完成订购后,下载同态加密库ahex.x.x.tar.gz,客户端开发套件国密SDK包sdkx.x.x.tar.gz,peer与orderer用户证书,配置文件等。 安装客户端SDK库。 将下载的国密SDK包sdkx.x.x.tar.gz解压到用户的$GOPATH目录下。 安装同态加密库。 将下载的ahex.x.x.tar.gz解压到用户的$GOPATH目录下。 安装依赖库(仅针对Fabric1.1)。 依赖的库文件位于同态加密库目录下,当同态加密库被解压到用户的$GOPATH目录后,该文件位于$GOPATH/src/ahe/PSW/deps/lib,请将该目录下的所有文件复制至本地的/usr/local/include/openssl/目录下(如果没有该目录,请自行创建该目录),然后设置环境变量: export LD_LIBRARY_PATH=/usr/local/include/openssl:$LD_LIBRARY_PATH //以项目路径为/usr/local/include/openssl为例,若自行创建目录,请以实际创建目录为准 若提示缺少libgmp,则需要用户安装gmp库。安装方法可以参考linux操作系统包管理工具(例如ubuntu系统可以使用apt-get install libgmp10命令来安装,也可在https://gmplib.org/下载源码进行编译安装)。 开发Client程序与链代码。 请参考AHE Lib库接口和Chaincode库接口进行具体的应用和链代码(智能合约)的开发。 例如App客户端和链代码端的逻辑过程参考如下: App客户端的典型逻辑过程是: 注册用户 注册用户时可以调用密钥生成函数为用户生成公私钥。 初始化余额 初始化余额时可以调用初始余额准备函数生成具有隐私保护的初始余额信息。 发起交易 交易时可以调用交易准备函数生成具有隐私保护的交易数据。 链代码端对应的逻辑过程是: 保存用户公钥与地址的映射关系。 验证初始余额的有效性并生成初始交易。 验证交易数据的有效性并生成交易结果。 链码端可以通过调用初始余额校验函数来验证初始余额的有效性。 调用交易校验函数来验证交易数据的有效性。 安装链代码。 通过管理界面,将开发的链代码安装到用户订购的BCS实例中并实例化。 部署应用。 用户根据业务需求开发app应用,app应用可以调用同态加密库来对交易信息进行隐私保护。开发完成后,将app部署在购买的服务器上。app部署完成后,确保环境中具有配置文件、证书文件(peer和orderer的用户证书)、openssl库。
  • 部署应用 下载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四个方法,向区块链存入多对键值对;可以通过区块链浏览器可以查看交易记录。
共100000条