一步一步入门Hyperledger-composer-学习Playground

Playground 教程:

介绍:

我们将使用定义的fabric网络,并且把使用Hyperledger Composer 基于我们的fabric网络构建一个业务网络(business network ),同时我们一步一步完成从创建资产、创建参与者、编写智能合约把一个用户的资产转让给另外一个用户。在这个教程,将会使用Hyperledger Composer里面的套件——composer-playground。

目标:

  1. 使用Fabric搭建一个简单的网络
  2. 启动composer-playground并使用web沙盒编写和调试代码
  3. 创建资产(Asset)
  4. 创建参与者(Participants)
  5. 编写智能合约代码(Logic)用于资产的归属权更改
  6. 测试完成后把.bna文件导出,部署到刚刚的Fabric真实网络
  7. 使用composer-playground去连接部署上去的业务网络

实践:

一、使用Fabric搭建一个简单的网络:

  1. 进入fabric网络一键脚本的repo,然后执行startFarbic.sh

    1
    ./startFabric.sh

    此时会刷新出类似一下的信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Creating network "composer_default" with the default driver
    Creating orderer.example.com ... done
    Creating ca.org1.example.com ... done
    Creating couchdb ... done
    Creating mongodb ... done
    Creating peer0.org1.example.com ... done
    sleeping for 15 seconds to wait for fabric to complete start up
    2018-08-21 22:31:08.469 CST [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
    2018-08-21 22:31:08.469 CST [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
    2018-08-21 22:31:08.471 CST [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
    .........................................................
    2018-08-21 22:31:08.958 CST [channelCmd] executeJoin -> INFO 006 Successfully submitted proposal to join channel
    2018-08-21 22:31:08.958 CST [main] main -> INFO 007 Exiting.....

    只需要看到最后面出现了successfully即可

  2. 等待网络完全启动完成,执行createPeerAdminCard.sh:

    1
    ./createPeerAdminCard.sh

    这步会把创建composer的PeerAdmin Card(具体用途将在以后章节详细讲解),只需知道,需要有这个card才能接下来完成composer业务网络部署到真实的fabric网络。这个脚本会自动完成这一系列操作,执行了这个脚本,将会有类似以下的输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Development only script for Hyperledger Fabric control
    Running 'createPeerAdminCard.sh'
    FABRIC_VERSION is unset, assuming hlfv11
    FABRIC_START_TIMEOUT is unset, assuming 15 (seconds)

    Using composer-cli at v0.19.12

    Successfully created business network card file to
    Output file: /tmp/PeerAdmin@hlfv1.card

    Command succeeded


    Successfully imported business network card
    Card file: /tmp/PeerAdmin@hlfv1.card
    Card name: PeerAdmin@hlfv1

    Command succeeded

    The following Business Network Cards are available:

    Connection Profile: hlfv1
    ┌─────────────────┬───────────┬──────────────────┐
    │ Card Name │ UserId │ Business Network │
    ├─────────────────┼───────────┼──────────────────┤
    │ PeerAdmin@hlfv1 │ PeerAdmin │ │
    └─────────────────┴───────────┴──────────────────┘


    Issue composer card list --card <Card Name> to get details a specific card

    Command succeeded

    我们可以使用 composer card list 去验证一下,同时使用composer card list --card PeerAdmin@hlfv1 可以返回具体的card信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ➜  fabric-dev-servers git:(master) ✗ composer card list --card PeerAdmin@hlfv1
    userName: PeerAdmin
    description:
    businessNetworkName:
    identityId: 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457
    roles:
    - PeerAdmin
    - ChannelAdmin
    connectionProfile:
    name: hlfv1
    x-type: hlfv1
    credentials: Credentials set

    Command succeeded

二、启动composer-playground:

只需要在命令行输入composer-playground:

1
composer-playground

会有以下的输出:

1
2
3
➜  fabric-dev-servers git:(master) ✗ composer-playground
info: [Hyperledger-Composer] :LoadModule :loadModule() Loading composer-wallet-filesystem from /home/wwb/xinou-network/node_modules/composer-wallet-filesystem
info: [Hyperledger-Composer] :PlaygroundAPI :createServer() Playground API started on port 8080

说明

正确启动,并且监听**8080**端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

然后访问浏览器的http://localhost:8080 即可访问composer-playground的web页面

![composer-playground-overview](http://storage.ywandy.top/yewei-photo/180821/lm1GgaFf4G.png)

### 三、启动web沙盒环境并调试代码:

1. 点击进入如图所示区域,就是web沙盒的区域:

![mark](http://storage.ywandy.top/yewei-photo/180821/5B03hl3aeI.png)

2. 按照以下填写我们的**tutorial-network**,并且点击**depoly**

1. 这一步将会启动一个空的业务网络

2. 这个业务网络的名字叫做**turtorial-network**

3. 这个业务被**depoly**,默认的业务网卡(暂时有且只有一个)的是**admin@turtorial-network**

(业务网卡这边以后会有专门的章节讲解)

![mark](http://storage.ywandy.top/yewei-photo/180821/AeBbdAamfi.png)

3. 此时等depoly完成后,点击connect即可进入在线的沙盒环境:

![mark](http://storage.ywandy.top/yewei-photo/180821/BdeCbB5kA5.png)

![mark](http://storage.ywandy.top/yewei-photo/180821/1C9K5hAl2j.png)

### 三、创建资产和参与者:

#### 文件目录:

- 模型文件 (.cto)

(定义 Assets, Participants 和Transactions)

- 智能合约(.js)

(使用JavaScript定义执行Transaction)

- Query查询文件(.qry)

(定义couchdb的queries查询语句)

- 访问权限控制文件(permissions.acl)

(定义权限访问控制的文件)

#### 编写模型文件代码:

1. 在`model.cto`文件里面输入以下代码:

```js
namespace org.example.mynetwork //定义网络名
asset Commodity identified by tradingSymbol { //定义一个资产
o String tradingSymbol
o String description
o String mainExchange
o Double quantity
--> Trader owner
}
participant Trader identified by tradeId { //定义一个参与者
o String tradeId
o String firstName
o String lastName
}
transaction Trade { //定义一个transaction的数据结构
--> Commodity commodity
--> Trader newOwner
}

编写一个智能合约代码:

我们需要一个交易资产的智能合约,需要使用js实现这个。目前我们的composer-playground并没有这个script.js

  1. 我们点击add file,然后选择script file

mark

  1. 随后我们会进入script.js,这时候可以把代码编写进那个在线的IDE

mark

  1. 把以下代码复制进入script.js
1
2
3
4
5
6
7
8
9
10
/**
* Track the trade of a commodity from one trader to another
* @param {org.example.mynetwork.Trade} trade - the trade to be processed
* @transaction
*/
async function tradeCommodity(trade) {
trade.commodity.owner = trade.newOwner; //通过把原本资产的owner设置成传参的新的owner
let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity'); //获取资产的对象
await assetRegistry.update(trade.commodity); //资产更新
}

四、部署网络并且测试:

沙盒部署:

  1. 点击右下角的Depoly changes

  2. 这时候会提示部署成功,然后点击正上方的标签栏Test 进入测试的页面,如图:

    mark

沙盒调试:

  1. 选中Trader,然后点击右上角的 Create new participant,然后会弹出界面,输入以下的代码:

    1
    2
    3
    4
    5
    6
    {
    "$class": "org.example.mynetwork.Trader",
    "tradeId": "TRADER1",
    "firstName": "Jenny",
    "lastName": "Jones"
    }

    点击确认后,再次重复刚刚步骤,并输入以下的代码:

    1
    2
    3
    4
    5
    6
    {
    "$class": "org.example.mynetwork.Trader",
    "tradeId": "TRADER2",
    "firstName": "Amy",
    "lastName": "Williams"
    }

    以上的代码作用是创建两个交易者,一个是Jenny Jones,他的tradeid是TRADER1,另一个是Williams Amy ,他的tradeid是TRADER2(在这个定义交易者的数据结构,是使用tradeID作为主键的,关于模型文件的讲解会在以后的章节讲解到)

  2. 选中Commdity然后点击右上角的Create new asset,并输入以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9

    {
    "$class": "org.example.mynetwork.Commodity",
    "tradingSymbol": "ABC",
    "description": "Test commodity",
    "mainExchange": "Euronext",
    "quantity": 72.297,
    "owner": "resource:org.example.mynetwork.Trader#TRADER1"
    }

    这时候会创建一个叫做ABC的资产,属于TRADER1的,也就是Jenny Jones的

  3. 提交transaction,把物品ABC从TRADER1交易给TRADER2

    点击Submit Transaction,然后确保Type选中Trade,然后输入以下代码:

    1
    2
    3
    4
    5
    {
    "$class": "org.example.mynetwork.Trade",
    "commodity": "resource:org.example.mynetwork.Commodity#ABC",
    "newOwner": "resource:org.example.mynetwork.Trader#TRADER2"
    }

    如图:

    mark

    当点击submit后,成功后会有以下提示:

mark

说明交易已经成功了,我们看这条ABC的条目,发现owner已经变成TRADER2了,说明提交智能合约成功了,并且实现了智能合约更改物品的归属权。

打包并且导出当前业务网络为.bna文件:

.bna文件可以用于使用composer命令行工具,实现业务网络的安装和更新,因此我们在沙盒测试完成后,需要导出这个.bna,才能用于后续的命令行部署到真实的fabric网络

  1. 点击Define,回到原来编写代码的标签页
  2. 点击新增文件右边的export,即可获得当前业务网络的.bna文件
生活再忙,也不要忘记生活原本简单的样子
0%