|
| 1 | +# Hyperledger Fabric - Interactive Asset Management App |
| 2 | + |
| 3 | +## Overview |
| 4 | + |
| 5 | +The *Interactive Asset Management App* consists of three separate applications which test the behavior of the standard *asset management* chaincode example. The apps each bootstrap a non-validating peer and construct fabric confidential transactions to deploy, invoke, and/or query the asset management chaincode as described below. |
| 6 | + |
| 7 | +In particular, we consider a scenario in which we have the following parties: |
| 8 | + |
| 9 | +1. *Alice* is the chaincode deployer, represented by `app1` |
| 10 | +2. *Bob* is the chaincode administrator, represented by `app2` |
| 11 | +3. *Charlie*, *Dave*, and *Edwina* are asset owners, each represented by a separate instance of `app3` |
| 12 | + |
| 13 | +that interact in the following way: |
| 14 | + |
| 15 | +1. *Alice* deploys and assigns the administrator role to *Bob* |
| 16 | +2. *Bob* assigns the assets listed in [assets.txt](app2/assets.txt) to *Charlie*, *Dave*, and *Edwina* |
| 17 | +3. *Charlie*, *Dave*, and *Edwina* can transfer the ownership of their assets between each other |
| 18 | + |
| 19 | +In the following sections, we describe in more detail the interactions |
| 20 | +described above that the asset management app exercises. |
| 21 | + |
| 22 | +### Alice deploys and assigns the administrator role to Bob via `app1` |
| 23 | + |
| 24 | +The following actions take place: |
| 25 | + |
| 26 | +1. *Alice* obtains, via an out-of-band channel, the ECert of Bob, let us call these certificates *BobCert* |
| 27 | +2. Alice constructs a deploy transaction, as described in *application-ACL.md*, setting the transaction metadata to *DER(BobCert)* |
| 28 | +3. Alice submits the deploy transaction to the fabric network |
| 29 | + |
| 30 | +*Bob* is now the administrator of the chaincode. |
| 31 | + |
| 32 | +### Bob assigns ownership of all the assets via `app2` |
| 33 | + |
| 34 | +1. *Bob* obtains, via out-of-band channels, the ECerts of *Charlie*, *Dave*, and *Edwina*; let us call these certificates *CharlieCert*, *DaveCert*, and *EdwinaCert*, respectively |
| 35 | +2. *Bob* constructs an invoke transaction, as described in *application-ACL.md* using *BobCert* to gain access, to invoke the *assign* function passing as parameters *('ASSET_NAME_HERE', Base64(DER(CharlieCert)))* |
| 36 | +3. *Bob* submits the transaction to the fabric network |
| 37 | +4. *Bob* repeates the above steps for every asset listed in [assets.txt](app2/assets.txt), rotating between *Charlie*, *Dave*, and *Edwina* as the assigned owner |
| 38 | + |
| 39 | +*Charlie*, *Dave*, and *Edwina* are now each the owners of 1/3 of the assets. |
| 40 | + |
| 41 | +Notice that, to assign ownership of assets, *Bob* has to use *BobCert* to authenticate his invocations. |
| 42 | + |
| 43 | +### Charlie, Dave, and Edwina transfer the ownership of their assets between each other via separate instances of `app3` |
| 44 | + |
| 45 | +1. *Charlie*, *Dave*, and *Edwina* each obtain, via out-of-band channels, the ECerts of the other owners; let us call these certificates *CharlieCert*, *DaveCert*, and *EdwinaCert*, respectively |
| 46 | +2. Owner *X* constructs an invoke transaction, as described in *application-ACL.md* using *XCert*, to invoke the *transfer* function passing as parameters *('ASSET_NAME_HERE', Base64(DER(YCert)))*. |
| 47 | +3. *X* submits the transaction to the fabric network. |
| 48 | +4. These steps can be repeated for any asset to be transferred between any two users *X* -> *Y*, if and only if *X* is the current owner of the asset |
| 49 | + |
| 50 | +*Y* is now the owner of the asset. |
| 51 | + |
| 52 | +Notice that, to transfer the ownership of a given asset, user *X* has to use *XCert* to authenticate his/her invocations. |
| 53 | + |
| 54 | +## How To run the Interactive Asset Management App |
| 55 | + |
| 56 | +In order to run the Interactive Asset Management App, the following steps are required. |
| 57 | + |
| 58 | +### Setup the fabric network and create app's configuration file |
| 59 | + |
| 60 | +Follow the [create](https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/asset_management/app/README.md#create-apps-configuration-file) and [setup](https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/asset_management/app/README.md#setup-the-fabric-network) steps from the original asset management demo instructions. Note that the `core.yaml` that is described should be placed in this directory on the CLI node. |
| 61 | + |
| 62 | +### Build the apps |
| 63 | + |
| 64 | +Follow the first two instructions of the [run step](https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/asset_management/app/README.md#run-the-app) from the original asset management demo instructions, but change into the following directory instead: |
| 65 | + |
| 66 | +``` |
| 67 | +cd $GOPATH/src/github.com/hyperldger/fabric/examples/chaincode/go/asset_management_interactive |
| 68 | +``` |
| 69 | + |
| 70 | +Then build all three applications by issuing the following command: |
| 71 | + |
| 72 | +``` |
| 73 | +./build.sh |
| 74 | +``` |
| 75 | + |
| 76 | +### Run `app1` |
| 77 | + |
| 78 | +Run `app1` by issuing the following command: |
| 79 | + |
| 80 | +``` |
| 81 | +cd app1 |
| 82 | +./app1 |
| 83 | +``` |
| 84 | + |
| 85 | +Wait for `app1` to complete, and note the output value of `ChaincodeName`, which needs to be supplied to the following applications. For the rest of these instructions, we will use `8bc69f84aa55195b9eba6aed6261a01ba528acd3413f37b34df580f96e0d8a525e0fe8d41f967b38f192f7a731d63596eedcbd08ee636afdadb96be02d5d150d` as the `ChaincodeName` value. |
| 86 | + |
| 87 | +### Run `app2` |
| 88 | + |
| 89 | +Run `app2` by issuing the following command: |
| 90 | + |
| 91 | +``` |
| 92 | +cd ../app2 |
| 93 | +./app2 8bc69f84aa55195b9eba6aed6261a01ba528acd3413f37b34df580f96e0d8a525e0fe8d41f967b38f192f7a731d63596eedcbd08ee636afdadb96be02d5d150d |
| 94 | +``` |
| 95 | + |
| 96 | +### Run `app3` for each owner |
| 97 | + |
| 98 | +Run `app3` for each owner by issuing the following commands (note that a separate terminal window for each owner is recommended): |
| 99 | + |
| 100 | +``` |
| 101 | +cd ../app3 |
| 102 | +``` |
| 103 | + |
| 104 | +Run as *Charlie*: |
| 105 | + |
| 106 | +``` |
| 107 | +./app3 8bc69f84aa55195b9eba6aed6261a01ba528acd3413f37b34df580f96e0d8a525e0fe8d41f967b38f192f7a731d63596eedcbd08ee636afdadb96be02d5d150d charlie |
| 108 | +``` |
| 109 | + |
| 110 | +Run as *Dave*: |
| 111 | + |
| 112 | +``` |
| 113 | +./app3 8bc69f84aa55195b9eba6aed6261a01ba528acd3413f37b34df580f96e0d8a525e0fe8d41f967b38f192f7a731d63596eedcbd08ee636afdadb96be02d5d150d dave |
| 114 | +``` |
| 115 | + |
| 116 | +Run as *Edwina*: |
| 117 | + |
| 118 | +``` |
| 119 | +./app3 8bc69f84aa55195b9eba6aed6261a01ba528acd3413f37b34df580f96e0d8a525e0fe8d41f967b38f192f7a731d63596eedcbd08ee636afdadb96be02d5d150d edwina |
| 120 | +``` |
| 121 | + |
| 122 | +Each app will then provide a simple console interface for perfoming one of two actions: listing owned assets and transferring an asset to another owner. |
| 123 | + |
| 124 | +#### List Assets |
| 125 | + |
| 126 | +List an owner's assets by issuing the `list` command. For example, this is the expected output of *Charlie's* first `list`: |
| 127 | + |
| 128 | +``` |
| 129 | +charlie$ list |
| 130 | +... |
| 131 | +'charlie' owns the following 16 assets: |
| 132 | +'Lot01: BERNARD LEACH VASE WITH 'LEAPING FISH' DESIGN' |
| 133 | +'Lot04: PETER LANYON TREVALGAN' |
| 134 | +'Lot07: DAVID BOMBERG MOORISH RONDA, ANDALUCIA' |
| 135 | +'Lot10: HAROLD GILMAN INTERIOR (MRS MOUNTER)' |
| 136 | +'Lot13: WILLIAM SCOTT, R.A. GIRL SEATED AT A TABLE' |
| 137 | +'Lot16: JACK BUTLER YEATS, R.H.A. SLEEP SOUND' |
| 138 | +'Lot19: SIR EDUARDO PAOLOZZI, R.A. WEDDING OF THE ROCK AND DYNAMO' |
| 139 | +'Lot22: JEAN-MICHEL BASQUIAT AIR POWER' |
| 140 | +'Lot25: KENNETH ARMITAGE, R.A. MODEL FOR DIARCHY (SMALL VERSION)' |
| 141 | +'Lot28: FRANK AUERBACH E.O.W'S RECLINING HEAD' |
| 142 | +'Lot31: SIR EDUARDO PAOLOZZI, R.A. FORMS ON A BOW NO. 2' |
| 143 | +'Lot34: MARCEL DUCHAMP WITH HIDDEN NOISE (A BRUIT SECRET)' |
| 144 | +'Lot37: FRANCIS PICABIA MENDICA' |
| 145 | +'Lot40: DAVID BOMBERG PLAZUELA DE LA PAZ, RONDA' |
| 146 | +'Lot43: PATRICK CAULFIELD, R.A., C.B.E. FOYER' |
| 147 | +'Lot46: DAMIEN HIRST UNTITLED FISH FOR DAVID' |
| 148 | +``` |
| 149 | + |
| 150 | +#### Transfer Assets |
| 151 | + |
| 152 | +Transfer an asset to another owner by issuing the `transfer LotXX owner_here` command. For example, this is the command to transfer *Lot01* from *Charlie* to *Dave*. |
| 153 | + |
| 154 | +``` |
| 155 | +charlie$ transfer Lot01 dave |
| 156 | +... |
| 157 | +'dave' is the new owner of 'Lot01: BERNARD LEACH VASE WITH 'LEAPING FISH' DESIGN'! |
| 158 | +------------- Done! |
| 159 | +``` |
| 160 | + |
| 161 | +## Compatibility |
| 162 | + |
| 163 | +This demo application has been successfully tested against the |
| 164 | +[v0.6.0-preview](https://github.com/hyperledger/fabric/releases/tag/v0.6.0-preview) and |
| 165 | +[v0.6.1-preview](https://github.com/hyperledger/fabric/releases/tag/v0.6.1-preview) releases. |
| 166 | + |
| 167 | +## Copyright Note |
| 168 | + |
| 169 | +The new source code files retain `Copyright IBM Corp.` because they are closely adopted from a preexisting example that contains an IBM copyright. |
0 commit comments