集成OSS应用示例

为了保证数据或文件的不变性,我们提供了一个应用示例程序,将文件存储在OSS上,并在Hyperledger Fabric上记录文件的哈希值。

该示例程序基于Hyperledger Fabric Go SDK,运行示例程序前请确保Go开发环境已经正确配置。具体配置方法可以参考Go SDK使用示例

创建OSS存储空间

示例程序会把文件上传到 OSS 存储空间中,所以在运行示例程序前需要先创建存储空间。 假设存储空间的名称为“new-bucket”,稍后我们将使用它。

下载示例程序

将示例程序 go-oss-demo-1.4.5 下载到本地目录: $GOPATH/src, 并解压缩。将配置文件 connection-profile.yaml 复制到目录下 $GOPATH/src/go-oss-democonnection-profile.yaml的获取方法可以参考Go SDK使用示例

部署链码

将链码文件 chaincode/sacc.out 上传到阿里云 BaaS,并实例化。具体的操作方法可以参考部署链码

运行示例程序

首先,执行如下命令编译出两个可执行文件pushfetch

./build.sh
  • push 读取本地文件并计算文件的哈希值,通过调用Fabric链码将哈希值记录在账本中,最后将文件上传到OSS。

  • fetch 读取文件哈希值,通过查询Fabric链码确认哈希值存在于账本中,然后从OSS下载对应的文件到本地。

push and fetch 依赖一些环境变量,需预先进行设置:

export baas_user="user"  # 在阿里巴巴 BaaS 控制台中创建的用户名。
export baas_secret="password"  # 用户的密码。
export baas_channel="first-channel"  # 通道名
export oss_ak="ak"   # 用于上传至OSS的AK
export oss_ak_secret="secret"  # 用于上传至OSS的AK密码
export oss_endpoint="oss-cn-hangzhou.aliyuncs.com"  # OSS的访问域名
export oss_bucket="new-bucket"  # 之前创建的OSS存储空间名

准备完成,开始上传文件:

$ ./push README.md
Going to enroll user
 [fabsdk/fab] 2019/02/19 07:39:26 UTC - lib.(*Client).initHTTPClient -> INFO TLS Enabled
 [fabsdk/fab] 2019/02/19 07:39:26 UTC - util.BCCSPKeyRequestGenerate -> INFO generating key: &{A:ecdsa S:256}
 [fabsdk/fab] 2019/02/19 07:39:26 UTC - log.print -> INFO encoded CSR
Success enroll user: appuser1
======================================================
[-] Uploading README.md to Alibaba Cloud OSS, MD5: 9218e8b37fabdc50bb6eca8597ffce22
[-] Upload MD5 to chaincode...
[-] Done.

命令行输出表示文件的哈希值为:9218e8b37fabdc50bb6eca8597ffce22,接下来示例程序将使用该哈希值下载文件:

$ ./fetch 9218e8b37fabdc50bb6eca8597ffce22
User appuser1 already enrolled, skip enrollment.
======================================================
[-] Fetch file info from chaincode...
Chaincode status:  200
Payload:  baas-sdk-test1.9218e8b37fabdc50bb6eca8597ffce22
[-] Downloading to 9218e8b37fabdc50bb6eca8597ffce22
[-] Done.

新下载的文件名为:9218e8b37fabdc50bb6eca8597ffce22,并且我们可验证文件的内容和上传的文件完全一致。

更多关于Hyperledger Fabric Go SDK的使用方法可以参考Go SDK使用示例