Marbles 演示

去年跑了在 fabric 1.0 的版本运行了 marbles,今年再在 fabric 1.1 的环境运行一次。智能合约所做的操作没有太大的变化,不过环境配置有一些变化。

  • 这个应用程序的基础网络是 Hyperledger Fabric,后者是一个 Linux Foundation 项目。 您可能想查阅以下操作说明来稍微了解一下 Hyperledger Fabric。

  • 本演示旨在帮助开发人员了解链代码的基础知识以及如何使用 Fabric 网络开发应用程序。

  • 这是一个非常简单的资产转移演示。多个用户可以创建并相互转移弹珠。

marble-peek

各个版本的 marbles 都存在,本版本兼容 Hyperledger Fabric v1.1x。你可以通过 git branch -a 来查看,git checkout 来切换。

应用程序通信流

comm_flow
  1. 管理员将在他们的浏览器中与我们的 Node.js 应用程序 Marbles 进行交互。
  2. 此客户端 JS 代码将打开一个与后端 Node.js 应用程序的 Websocket 连接。管理员与该站点交互时,客户端 JS 将消息发送到后端。
  3. 读取或写入账本称为提案。这个提案由 Marbles(通过 SDK)构建,然后发送到一个区块链对等节点。
  4. 该对等节点将与它的 Marbles 链代码容器进行通信。链代码将运行/模拟该交易。如果没有问题,它会对该交易进行背书,并将其发回我们的 Marbles 程序。
  5. 然后,Marbles(通过 SDK)将背书后的提案发送到订购服务。 订购方将来自整个网络的许多提案打包到一个区块中。 然后,它将新的区块广播到网络中的对等节点。
  6. 最后,对等节点会验证该区块并将它写入自己的账本中。该交易现在已经生效,所有后续读取都会反映此更改。

这一篇主要写环境搭建, 在搭建区块链网络中有两个选择:

  1. 使用 IBM Cloud IBM Blockchain 服务创建一个网络
  2. 使用本地托管的 Hyperledger Fabric 网络

本文选择用 本地托管的 Hyperledger Fabric 网络

目录

  1. 配置本地环境
  2. 下载 Marbles
  3. 设置区块链网络
  4. 安装和初始化 Chaincode
  5. 运行 Marbles

0. 配置本地环境

  • Bash - Bash scripts are needed to setup installation files
  • GoLang - 1.7.0 or higher
  • Docker CE - v1.13 or higher
  • Docker Compose - v1.8 or higher
  • Node.js - node v6.2+ or v8.1+ (v9 is not supported, v7 support is unknown)
  • Xcode - Mac OSX 需要安装

我的环境

  • 操作系统为:Ubuntu 16.04

  • Golang 版本

# go version
go version go1.7.5 linux/amd64
  • Docker 版本
# docker -v
Docker version 18.03.1-ce, build 9ee9f40
  • Docker-compose 版本
# docker-compose -v
docker-compose version 1.21.0, build 5920eb0
  • Node.js 版本
# node -v
v6.10.1
  • NPM 版本
# npm -v
3.10.10

1. 下载 Marbles

  • 使用 release-1.1 的分支
git clone https://github.com/hyperledger/fabric-samples.git --depth 1
cd fabric-samples
  • 下载各个 fabric 组件的 dockcer 镜像(时间较长
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/release-1.1/scripts/bootstrap-1.1.0-preview.sh -o setup_script.sh
sudo bash setup_script.sh
  • 配置环境变量
export PATH=$PWD/bin:$PATH
  • 启动 fabric 网络
cd ./fabcar
sudo ./startFabric.sh
  • docker ps 查看正在运行的 docker containers
CONTAINER ID        IMAGE                                                                                                    COMMAND                  CREATED             STATUS              PORTS                                            NAMES
5d7de60a9e1f        dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba   "chaincode -peer.add…"   5 minutes ago       Up 5 minutes                                                         dev-peer0.org1.example.com-fabcar-1.0
315fab21d09d        hyperledger/fabric-tools                                                                                 "/bin/bash"              5 minutes ago       Up 5 minutes                                                         cli
fb0b6a24c3db        hyperledger/fabric-peer                                                                                  "peer node start"        5 minutes ago       Up 5 minutes        0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
282b58bbab8a        hyperledger/fabric-ca                                                                                    "sh -c 'fabric-ca-se…"   5 minutes ago       Up 5 minutes        0.0.0.0:7054->7054/tcp                           ca.example.com
470be2a50a98        hyperledger/fabric-couchdb                                                                               "tini -- /docker-ent…"   5 minutes ago       Up 5 minutes        4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
77902325eaab        hyperledger/fabric-orderer                                                                               "orderer"                5 minutes ago       Up 5 minutes        0.0.0.0:7050->7050/tcp                           orderer.example.com
#

安装测试的依赖环境

为 fabcar 例子安装  node.js 的依赖环境
    sudo npm install

测试 fabcar 的网络

仅用于测试 fabcar 网络
  • 运行 node enrollAdmin.js

输出信息为:

 Store path:/home/mark/code/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store
Successfully enrolled admin user "admin"
Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"396ca37170df33d72071f6c00641426470b6c0db357214b5f115a695603b5f16","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB8TCCAZegAwIBAgIUWBOmnR58dv7huW7BXD09V6/8/O0wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwNTA3MDIwNjAwWhcNMTkwNTA3MDIw\nNjAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBMxT8+XWa2xiuqTF8H2SxjJ6lQK09Ze08lygtuWzHpkUn0g8YtGre2GsLRJKW8uB\nYPAewYJjZp4ZEv+EuiFj7B+jbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E\nAjAAMB0GA1UdDgQWBBT8DgkbbdWWECju+2vXnPhjWpV0yzArBgNVHSMEJDAigCBC\nOaoNzXba7ri6DNpwGFHRRQTTGq0bLd3brGpXNl5JfDAKBggqhkjOPQQDAgNIADBF\nAiEA2Ov6V8+Yem1q0w6WLmyq/wTf+9R7riRE6yBtUUqWZlICIA8y+iso2IQFQdhp\nQyoO+vrKS3MAgTup43m4jm8dj8Ou\n-----END CERTIFICATE-----\n"}}}
  • 运行 node registerUser.js

输出信息为:

 Store path:/home/mark/code/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store
Successfully loaded admin from persistence
Successfully registered user1 - secret:UnRcFtOWqboS
Successfully enrolled member user "user1"
User1 was successfully registered and enrolled and is ready to intreact with the fabric network
  • 运行 node query.js

输出信息为:

Store path:/home/mark/code/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Query has completed, checking results
Response is  [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

安装和初始化 Chaincode

配置

cd ../../marbles
npm install

获取必要的文件: 密钥 和 admin 证书

  1. 验证连接文件中的路径与安装环境的路径是否匹配
    • 打开连接文件 <marbles root>/config/connection_profile_local.json
    • 主要包括下面三个方面:
      • organizations -> x-adminCert -> path
      • organizations -> x-adminKeyStore -> path
      • client -> credentialStore -> path
    • 每个目录中的 path 需要与你的环境相匹配
  2. cd ../../marbles

安装 chaincode

  • 安装 marbles chaincode, 命令如下:
cd ./scripts
node install_chaincode.js
  • 初始化 chaincode
node instantiate_chaincode.js

本地运行 marbles

在本地运行 marbles 之前请确认你是否已经运行了 ../fabric-samples/fabcar 中的 node enrollAdmin.jsnode registerUser.js
如果运行了,请重启网络后跳过测试的步骤,命令如下:

$ docker rm -f $(docker ps -aq)
$ cd ../fabric-samples/fabcar
$ ./startFabric.sh

然后再回到 marbles 的根目录

  • 安装 marbles 的 npm 环境依赖( warn 可以忽略)
 npm install gulp -g
 npm install
  • 本地运行 marbles
gulp marbles_local

现在就可以使用浏览器访问 http://localhost.com:3001 查看了

如果需要将 localhost 修改为 主机 ip, 请在 marbles 根目录 app.js 中修改 host 变量。


注:阿里云配置环境时请在 docker-compser.yaml 的 environment 中添加环境变量 - GODEBUG=netdns=go

命令提示:

  • 终止网络运行:
    cd ../basic-network
    ./stop.sh
  • 重启网络运行:
  cd ../basic-network
    ./teardown.sh
  • 查看 logs 日志 docker logs [OPTIONS] CONTAINER
sudo docker logs -f peer0
# control + c will exit the process
sudo docker logs -f orderer0

参考 :

  1. https://github.com/IBM-Blockchain/marbles/blob/master/README-cn.md

推荐阅读更多精彩内容