From a299e18e263d012d17ec2c0b22f4db35af2e9eda Mon Sep 17 00:00:00 2001 From: jkneubuh <86427252+jkneubuh@users.noreply.github.com> Date: Thu, 10 Nov 2022 10:40:27 -0500 Subject: [PATCH] Moves the Full Stack Asset Transfer Development Guide to fabric-samples (#852) * Import Full Stack Asset Transfer Guide at commit fb554befdbbeff9e69159b54fce0b811603f29c7 Signed-off-by: Josh Kneubuhl * Update the workshop with a new WORKSHOP_PATH under fabric-samples Signed-off-by: Josh Kneubuhl * Update the workshop with a new WORKSHOP_PATH under fabric-samples Signed-off-by: Josh Kneubuhl * missed a .git ignored directory on add Signed-off-by: Josh Kneubuhl * Updates to run the workshop on the Apple M1 Signed-off-by: Josh Kneubuhl * Workaround for https://github.com/eslint/eslint/issues/15299 in the contract tslinter Signed-off-by: Josh Kneubuhl * Build an arch-specific CC images on M1 Signed-off-by: Josh Kneubuhl * empty commit - force a build Signed-off-by: Josh Kneubuhl * revert an accidental commit that was building the top-level asset-transfer as arm64 Signed-off-by: Josh Kneubuhl Signed-off-by: Josh Kneubuhl --- .github/settings.yml | 1 + .gitignore | 3 + .../asset-tx-typescript-contract-image.yaml | 24 + .../.github/workflows/docker-build.yaml | 78 ++ .../.github/workflows/test-ansible.yaml | 49 ++ .../.github/workflows/test-appdev.yaml | 49 ++ .../.github/workflows/test-chaincode.yaml | 49 ++ .../.github/workflows/test-cloud.yaml | 49 ++ .../.github/workflows/test-console.yaml | 49 ++ full-stack-asset-transfer-guide/.gitignore | 17 + full-stack-asset-transfer-guide/LICENSE | 201 +++++ full-stack-asset-transfer-guide/README.md | 108 +++ full-stack-asset-transfer-guide/SETUP.md | 138 ++++ .../applications/conga-cards/.eslintrc.js | 12 + .../applications/conga-cards/.gitignore | 18 + .../applications/conga-cards/.npmrc | 1 + .../applications/conga-cards/README.md | 73 ++ .../conga-cards/assets/appleplectic.png | Bin 0 -> 64230 bytes .../conga-cards/assets/bananomatopoeia.png | Bin 0 -> 113103 bytes .../conga-cards/assets/block-norris.png | Bin 0 -> 63532 bytes .../conga-cards/assets/blockbert.png | Bin 0 -> 52261 bytes .../conga-cards/assets/count-blockula.png | Bin 0 -> 54899 bytes .../conga-cards/assets/darth-conga.png | Bin 0 -> 51057 bytes .../conga-cards/assets/no-pun-intended.png | Bin 0 -> 60247 bytes .../conga-cards/assets/template.png | Bin 0 -> 52421 bytes .../conga-cards/hooks/captain-hook.json | 5 + .../conga-cards/images/interaction.png | Bin 0 -> 355869 bytes .../applications/conga-cards/package.json | 37 + .../applications/conga-cards/src/app.ts | 54 ++ .../conga-cards/src/commands/create.ts | 26 + .../conga-cards/src/commands/delete.ts | 20 + .../conga-cards/src/commands/discord.ts | 175 ++++ .../conga-cards/src/commands/getAllAssets.ts | 20 + .../conga-cards/src/commands/index.ts | 24 + .../conga-cards/src/commands/read.ts | 23 + .../conga-cards/src/commands/transfer.ts | 20 + .../applications/conga-cards/src/config.ts | 45 + .../applications/conga-cards/src/connect.ts | 66 ++ .../applications/conga-cards/src/contract.ts | 104 +++ .../conga-cards/src/expectedError.ts | 12 + .../applications/conga-cards/src/utils.ts | 75 ++ .../applications/conga-cards/tsconfig.json | 19 + .../applications/frontend/.browserslistrc | 16 + .../applications/frontend/.editorconfig | 16 + .../applications/frontend/.gitignore | 42 + .../applications/frontend/Dockerfile | 11 + .../applications/frontend/README.md | 18 + .../applications/frontend/angular.json | 112 +++ .../applications/frontend/karma.conf.js | 44 + .../applications/frontend/package.json | 40 + .../frontend/screenshots/Create.png | Bin 0 -> 125795 bytes .../frontend/screenshots/list.png | Bin 0 -> 109676 bytes .../frontend/src/app/app-routing.module.ts | 10 + .../frontend/src/app/app.component.html | 66 ++ .../frontend/src/app/app.component.scss | 6 + .../frontend/src/app/app.component.spec.ts | 35 + .../frontend/src/app/app.component.ts | 82 ++ .../frontend/src/app/app.module.ts | 32 + .../asset-dialog/asset-dialog.component.html | 51 ++ .../asset-dialog/asset-dialog.component.scss | 3 + .../asset-dialog.component.spec.ts | 23 + .../asset-dialog/asset-dialog.component.ts | 74 ++ .../applications/frontend/src/app/urls.ts | 8 + .../applications/frontend/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 + .../frontend/src/environments/environment.ts | 16 + .../applications/frontend/src/favicon.ico | Bin 0 -> 948 bytes .../applications/frontend/src/index.html | 19 + .../applications/frontend/src/main.ts | 12 + .../applications/frontend/src/polyfills.ts | 53 ++ .../applications/frontend/src/styles.scss | 4 + .../applications/frontend/src/test.ts | 26 + .../applications/frontend/tsconfig.app.json | 15 + .../applications/frontend/tsconfig.json | 32 + .../applications/frontend/tsconfig.spec.json | 18 + .../applications/ping-chaincode/.gitignore | 2 + .../applications/ping-chaincode/app.env | 7 + .../applications/ping-chaincode/package.json | 36 + .../applications/ping-chaincode/src/app.ts | 98 +++ .../src/fabric-connection-profile.ts | 85 ++ .../ping-chaincode/src/jsonid-adapter.ts | 131 +++ .../applications/ping-chaincode/tsconfig.json | 18 + .../applications/rest-api/.gitignore | 2 + .../applications/rest-api/Dockerfile | 6 + .../applications/rest-api/LICENSE | 17 + .../applications/rest-api/README.md | 37 + .../asset-transfer.postman_collection.json | 145 ++++ .../applications/rest-api/deployment.yaml | 81 ++ .../applications/rest-api/package.json | 36 + .../applications/rest-api/renovate.json | 5 + .../applications/rest-api/src/app.ts | 27 + .../rest-api/src/assets.router.ts | 110 +++ .../applications/rest-api/src/connection.ts | 101 +++ .../applications/rest-api/src/server.ts | 6 + .../applications/rest-api/tsconfig.json | 14 + .../trader-typescript/.eslintrc.js | 99 +++ .../applications/trader-typescript/.gitignore | 18 + .../applications/trader-typescript/.npmrc | 1 + .../applications/trader-typescript/README.md | 43 + .../trader-typescript/package.json | 34 + .../applications/trader-typescript/src/app.ts | 51 ++ .../trader-typescript/src/commands/create.ts | 26 + .../trader-typescript/src/commands/delete.ts | 20 + .../src/commands/getAllAssets.ts | 20 + .../trader-typescript/src/commands/index.ts | 26 + .../trader-typescript/src/commands/listen.ts | 64 ++ .../trader-typescript/src/commands/read.ts | 23 + .../src/commands/transact.ts | 72 ++ .../src/commands/transfer.ts | 20 + .../trader-typescript/src/config.ts | 45 + .../trader-typescript/src/connect.ts | 66 ++ .../trader-typescript/src/contract.ts | 103 +++ .../trader-typescript/src/expectedError.ts | 12 + .../trader-typescript/src/utils.ts | 75 ++ .../trader-typescript/tsconfig.json | 19 + full-stack-asset-transfer-guide/check.sh | 167 ++++ .../checks/check-chaincode.sh | 30 + .../checks/check-kube.sh | 40 + .../checks/check-network.sh | 72 ++ .../checks/utils.sh | 39 + .../asset-transfer-typescript/.eslintrc.js | 101 +++ .../asset-transfer-typescript/.gitignore | 19 + .../asset-transfer-typescript/.npmrc | 1 + .../asset-transfer-typescript/Dockerfile | 69 ++ .../asset-transfer-chaincode-vars.yml | 11 + .../docker/docker-entrypoint.sh | 21 + .../asset-transfer-typescript/package.json | 62 ++ .../asset-transfer-typescript/src/asset.ts | 45 + .../src/assetTransfer.ts | 225 +++++ .../asset-transfer-typescript/src/index.ts | 9 + .../src/untyped.d.ts | 10 + .../asset-transfer-typescript/tsconfig.json | 19 + .../docs/ApplicationDev/01-FabricGateway.md | 76 ++ .../02-Exercise-RunApplication.md | 43 + .../ApplicationDev/03-ApplicationOverview.md | 132 +++ .../04-Exercise-AssetTransfer.md | 23 + .../docs/ApplicationDev/05-ChaincodeEvents.md | 20 + .../06-Exercise-ChaincodeEvents.md | 46 ++ .../docs/ApplicationDev/README.md | 10 + .../docs/CloudReady/00-setup.md | 112 +++ .../docs/CloudReady/10-kube.md | 68 ++ .../docs/CloudReady/11-kube-multipass.md | 110 +++ .../docs/CloudReady/12-kube-ec2-vm.md | 136 +++ .../docs/CloudReady/13-kube-public-cloud.md | 118 +++ .../docs/CloudReady/20-fabric.md | 118 +++ .../21-fabric-operations-console.md | 46 ++ .../22-fabric-ansible-collection.md | 144 ++++ .../docs/CloudReady/30-chaincode.md | 225 +++++ .../CloudReady/31-fabric-ansible-chaincode.md | 182 ++++ .../docs/CloudReady/40-bananas.md | 159 ++++ .../CloudReady/50-OpenShift-Deployment.md | 41 + .../docs/CloudReady/90-teardown.md | 56 ++ .../docs/CloudReady/README.md | 15 + .../docs/SmartContractDev/00-Introduction.md | 119 +++ .../01-Exercise-Getting-Started.md | 351 ++++++++ .../02-Exercise-Adding-tx-function.md | 52 ++ .../03-Test-And-Debug-Reference.md | 134 +++ .../docs/images/ApplicationDev.pptx | Bin 0 -> 55266 bytes .../fabric-gateway-deployment.png | Bin 0 -> 28063 bytes .../ApplicationDev/fabric-gateway-model.png | Bin 0 -> 35408 bytes .../ApplicationDev/legacy-sdk-model.png | Bin 0 -> 34162 bytes .../transaction-submit-flow.png | Bin 0 -> 18965 bytes .../docs/images/CloudReady.pptx | Bin 0 -> 294469 bytes .../images/CloudReady/00-cloud-ready-2.png | Bin 0 -> 90315 bytes .../docs/images/CloudReady/10-kube.png | Bin 0 -> 86274 bytes .../docs/images/CloudReady/12-kube-ec2-vm.png | Bin 0 -> 95455 bytes .../docs/images/CloudReady/20-fabric.png | Bin 0 -> 116063 bytes .../docs/images/CloudReady/30-chaincode.png | Bin 0 -> 224186 bytes .../CloudReady/40-gateway-client-app.png | Bin 0 -> 168232 bytes .../docs/images/CloudReady/kube-ec2-vm.png | Bin 0 -> 71008 bytes .../images/cloud-vm-with-operator-network.png | Bin 0 -> 138856 bytes .../images/multipass-operator-network.png | Bin 0 -> 142107 bytes .../docs/images/multipass-test-network.png | Bin 0 -> 144440 bytes .../docs/images/readme_diagram.png | Bin 0 -> 220327 bytes .../docs/tips-for-windows-dev.md | 56 ++ .../configuration/fabric-common-vars.yml | 23 + .../fabric-ordering-org-vars.yml | 13 + .../configuration/fabric-org1-vars.yml | 17 + .../configuration/fabric-org2-vars.yml | 17 + .../configuration/fabric-sail.yaml | 36 + .../configuration/operator-console-vars.yml | 39 + .../infrastructure/ec2-cloud-config.yaml | 59 ++ .../fabric_network_playbooks/00-complete.yml | 22 + ...reate-ordering-organization-components.yml | 16 + ...eate-endorsing-organization-components.yml | 18 + .../05-enable-capabilities.yml | 84 ++ .../06-add-organization-to-consortium.yml | 89 ++ .../09-admins-policy.json.j2 | 24 + .../09-create-channel.yml | 79 ++ .../09-endorsement-policy.json.j2 | 24 + .../09-lifecycle-endorsement-policy.json.j2 | 24 + .../09-readers-policy.json.j2 | 24 + .../09-writers-policy.json.j2 | 24 + .../10-join-peer-to-channel.yml | 39 + .../11-add-anchor-peer-to-channel.yml | 91 ++ ...eate-endorsing-organization-components.yml | 18 + .../15-add-organization-to-channel.yml | 124 +++ .../15-admins-policy.json.j2 | 34 + .../15-endorsement-policy.json.j2 | 34 + .../15-lifecycle-endorsement-policy.json.j2 | 34 + .../15-readers-policy.json.j2 | 34 + .../15-writers-policy.json.j2 | 34 + .../16-import-ordering-service.yml | 18 + .../17-join-peer-to-channel.yml | 39 + .../18-add-anchor-peer-to-channel.yml | 91 ++ .../kind_console_ingress/90-KIND-ingress.yml | 37 + .../templates/coredns/coredns.yaml.j2 | 33 + .../ingress/ingress-nginx-controller.yaml | 39 + .../templates/ingress/kustomization.yaml | 37 + .../infrastructure/kind_with_nginx.sh | 191 +++++ .../multipass-cloud-config.yaml | 133 +++ .../01-operator-install.yml | 13 + .../02-console-install.yml | 13 + .../infrastructure/pkgcc.sh | 103 +++ .../19-install-and-approve-chaincode.yml | 44 + .../20-install-and-approve-chaincode.yml | 44 + .../21-commit-chaincode.yml | 33 + .../22-register-application.yml | 57 ++ .../asset-transfer_appid.json | 7 + .../infrastructure/sample-network/.gitignore | 4 + .../config/cas/kustomization.yaml | 25 + .../sample-network/config/cas/org0-ca.yaml | 135 +++ .../sample-network/config/cas/org1-ca.yaml | 128 +++ .../sample-network/config/cas/org2-ca.yaml | 130 +++ .../config/configtx-template.yaml | 428 ++++++++++ .../console/hlf-operations-console.yaml | 80 ++ .../config/console/kustomization.yaml | 5 + .../sample-network/config/core.yaml | 775 ++++++++++++++++++ .../config/gateway/kustomization.yaml | 24 + .../config/gateway/org1-peer-gateway.yaml | 76 ++ .../config/gateway/org2-peer-gateway.yaml | 76 ++ .../manager/fabric-operator-manager.yaml | 123 +++ .../config/manager/kustomization.yaml | 22 + .../config/orderers/kustomization.yaml | 24 + .../config/orderers/org0-orderers.yaml | 151 ++++ .../config/peers/kustomization.yaml | 27 + .../config/peers/org1-peer1.yaml | 103 +++ .../config/peers/org1-peer2.yaml | 103 +++ .../config/peers/org2-peer1.yaml | 103 +++ .../config/peers/org2-peer2.yaml | 103 +++ .../rbac/fabric-operator-clusterrole.yaml | 205 +++++ .../fabric-operator-clusterrolebinding.yaml | 36 + .../config/rbac/fabric-operator-psp.yaml | 48 ++ .../rbac/fabric-operator-serviceaccount.yaml | 22 + .../config/rbac/kustomization.yaml | 25 + .../infrastructure/sample-network/network | 201 +++++ .../sample-network/scripts/channel.sh | 269 ++++++ .../sample-network/scripts/console.sh | 50 ++ .../sample-network/scripts/frontend_build.sh | 16 + .../scripts/frontend_deployment.yaml | 67 ++ .../sample-network/scripts/prereqs.sh | 58 ++ .../scripts/rest_deployment.yaml | 72 ++ .../sample-network/scripts/rest_sample.sh | 47 ++ .../sample-network/scripts/sample_network.sh | 197 +++++ .../sample-network/scripts/utils.sh | 158 ++++ .../infrastructure/setup_storage_classes.sh | 45 + full-stack-asset-transfer-guide/justfile | 517 ++++++++++++ .../tests/00-chaincode-e2e.sh | 12 + .../tests/10-appdev-e2e.sh | 59 ++ .../tests/20-cloud-e2e.sh | 439 ++++++++++ .../tests/30-ansible-e2e.sh | 113 +++ .../tests/40-console.sh | 88 ++ 262 files changed, 15259 insertions(+) create mode 100644 full-stack-asset-transfer-guide/.github/workflows/asset-tx-typescript-contract-image.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/docker-build.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/test-ansible.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/test-appdev.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/test-chaincode.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/test-cloud.yaml create mode 100644 full-stack-asset-transfer-guide/.github/workflows/test-console.yaml create mode 100644 full-stack-asset-transfer-guide/.gitignore create mode 100644 full-stack-asset-transfer-guide/LICENSE create mode 100644 full-stack-asset-transfer-guide/README.md create mode 100644 full-stack-asset-transfer-guide/SETUP.md create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/.eslintrc.js create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/.gitignore create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/.npmrc create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/README.md create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/appleplectic.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/bananomatopoeia.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/block-norris.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/blockbert.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/count-blockula.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/darth-conga.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/no-pun-intended.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/assets/template.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/hooks/captain-hook.json create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/images/interaction.png create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/package.json create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/app.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/create.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/delete.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/discord.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/getAllAssets.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/index.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/read.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/commands/transfer.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/config.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/connect.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/contract.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/expectedError.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/src/utils.ts create mode 100644 full-stack-asset-transfer-guide/applications/conga-cards/tsconfig.json create mode 100644 full-stack-asset-transfer-guide/applications/frontend/.browserslistrc create mode 100644 full-stack-asset-transfer-guide/applications/frontend/.editorconfig create mode 100644 full-stack-asset-transfer-guide/applications/frontend/.gitignore create mode 100644 full-stack-asset-transfer-guide/applications/frontend/Dockerfile create mode 100644 full-stack-asset-transfer-guide/applications/frontend/README.md create mode 100644 full-stack-asset-transfer-guide/applications/frontend/angular.json create mode 100644 full-stack-asset-transfer-guide/applications/frontend/karma.conf.js create mode 100644 full-stack-asset-transfer-guide/applications/frontend/package.json create mode 100644 full-stack-asset-transfer-guide/applications/frontend/screenshots/Create.png create mode 100644 full-stack-asset-transfer-guide/applications/frontend/screenshots/list.png create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app-routing.module.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app.component.html create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app.component.scss create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app.component.spec.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app.component.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/app.module.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/asset-dialog/asset-dialog.component.html create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/asset-dialog/asset-dialog.component.scss create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/asset-dialog/asset-dialog.component.spec.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/asset-dialog/asset-dialog.component.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/app/urls.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/assets/.gitkeep create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/environments/environment.prod.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/environments/environment.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/favicon.ico create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/index.html create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/main.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/polyfills.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/styles.scss create mode 100644 full-stack-asset-transfer-guide/applications/frontend/src/test.ts create mode 100644 full-stack-asset-transfer-guide/applications/frontend/tsconfig.app.json create mode 100644 full-stack-asset-transfer-guide/applications/frontend/tsconfig.json create mode 100644 full-stack-asset-transfer-guide/applications/frontend/tsconfig.spec.json create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/.gitignore create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/app.env create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/package.json create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/src/app.ts create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/src/fabric-connection-profile.ts create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/src/jsonid-adapter.ts create mode 100644 full-stack-asset-transfer-guide/applications/ping-chaincode/tsconfig.json create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/.gitignore create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/Dockerfile create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/LICENSE create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/README.md create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/asset-transfer.postman_collection.json create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/deployment.yaml create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/package.json create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/renovate.json create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/src/app.ts create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/src/assets.router.ts create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/src/connection.ts create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/src/server.ts create mode 100644 full-stack-asset-transfer-guide/applications/rest-api/tsconfig.json create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/.eslintrc.js create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/.gitignore create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/.npmrc create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/README.md create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/package.json create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/app.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/create.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/delete.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/getAllAssets.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/index.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/listen.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/read.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/transact.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/commands/transfer.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/config.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/connect.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/contract.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/expectedError.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/src/utils.ts create mode 100644 full-stack-asset-transfer-guide/applications/trader-typescript/tsconfig.json create mode 100755 full-stack-asset-transfer-guide/check.sh create mode 100755 full-stack-asset-transfer-guide/checks/check-chaincode.sh create mode 100755 full-stack-asset-transfer-guide/checks/check-kube.sh create mode 100755 full-stack-asset-transfer-guide/checks/check-network.sh create mode 100644 full-stack-asset-transfer-guide/checks/utils.sh create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/.eslintrc.js create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/.gitignore create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/.npmrc create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/Dockerfile create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/asset-transfer-chaincode-vars.yml create mode 100755 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/docker/docker-entrypoint.sh create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/package.json create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/src/asset.ts create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/src/assetTransfer.ts create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/src/index.ts create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/src/untyped.d.ts create mode 100644 full-stack-asset-transfer-guide/contracts/asset-transfer-typescript/tsconfig.json create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/01-FabricGateway.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/02-Exercise-RunApplication.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/03-ApplicationOverview.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/04-Exercise-AssetTransfer.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/05-ChaincodeEvents.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/06-Exercise-ChaincodeEvents.md create mode 100644 full-stack-asset-transfer-guide/docs/ApplicationDev/README.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/00-setup.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/10-kube.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/11-kube-multipass.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/12-kube-ec2-vm.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/13-kube-public-cloud.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/20-fabric.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/21-fabric-operations-console.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/22-fabric-ansible-collection.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/30-chaincode.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/31-fabric-ansible-chaincode.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/40-bananas.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/50-OpenShift-Deployment.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/90-teardown.md create mode 100644 full-stack-asset-transfer-guide/docs/CloudReady/README.md create mode 100644 full-stack-asset-transfer-guide/docs/SmartContractDev/00-Introduction.md create mode 100644 full-stack-asset-transfer-guide/docs/SmartContractDev/01-Exercise-Getting-Started.md create mode 100644 full-stack-asset-transfer-guide/docs/SmartContractDev/02-Exercise-Adding-tx-function.md create mode 100644 full-stack-asset-transfer-guide/docs/SmartContractDev/03-Test-And-Debug-Reference.md create mode 100644 full-stack-asset-transfer-guide/docs/images/ApplicationDev.pptx create mode 100644 full-stack-asset-transfer-guide/docs/images/ApplicationDev/fabric-gateway-deployment.png create mode 100644 full-stack-asset-transfer-guide/docs/images/ApplicationDev/fabric-gateway-model.png create mode 100644 full-stack-asset-transfer-guide/docs/images/ApplicationDev/legacy-sdk-model.png create mode 100644 full-stack-asset-transfer-guide/docs/images/ApplicationDev/transaction-submit-flow.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady.pptx create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/00-cloud-ready-2.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/10-kube.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/12-kube-ec2-vm.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/20-fabric.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/30-chaincode.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/40-gateway-client-app.png create mode 100644 full-stack-asset-transfer-guide/docs/images/CloudReady/kube-ec2-vm.png create mode 100644 full-stack-asset-transfer-guide/docs/images/cloud-vm-with-operator-network.png create mode 100644 full-stack-asset-transfer-guide/docs/images/multipass-operator-network.png create mode 100644 full-stack-asset-transfer-guide/docs/images/multipass-test-network.png create mode 100644 full-stack-asset-transfer-guide/docs/images/readme_diagram.png create mode 100644 full-stack-asset-transfer-guide/docs/tips-for-windows-dev.md create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/fabric-common-vars.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/fabric-ordering-org-vars.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/fabric-org1-vars.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/fabric-org2-vars.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/fabric-sail.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/configuration/operator-console-vars.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/ec2-cloud-config.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/00-complete.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/01-create-ordering-organization-components.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/02-create-endorsing-organization-components.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/05-enable-capabilities.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/06-add-organization-to-consortium.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-admins-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-create-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-endorsement-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-lifecycle-endorsement-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-readers-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/09-writers-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/10-join-peer-to-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/11-add-anchor-peer-to-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/12-create-endorsing-organization-components.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-add-organization-to-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-admins-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-endorsement-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-lifecycle-endorsement-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-readers-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/15-writers-policy.json.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/16-import-ordering-service.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/17-join-peer-to-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/fabric_network_playbooks/18-add-anchor-peer-to-channel.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/kind_console_ingress/90-KIND-ingress.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/kind_console_ingress/templates/coredns/coredns.yaml.j2 create mode 100644 full-stack-asset-transfer-guide/infrastructure/kind_console_ingress/templates/ingress/ingress-nginx-controller.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/kind_console_ingress/templates/ingress/kustomization.yaml create mode 100755 full-stack-asset-transfer-guide/infrastructure/kind_with_nginx.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/multipass-cloud-config.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/operator_console_playbooks/01-operator-install.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/operator_console_playbooks/02-console-install.yml create mode 100755 full-stack-asset-transfer-guide/infrastructure/pkgcc.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/production_chaincode_playbooks/19-install-and-approve-chaincode.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/production_chaincode_playbooks/20-install-and-approve-chaincode.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/production_chaincode_playbooks/21-commit-chaincode.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/production_chaincode_playbooks/22-register-application.yml create mode 100644 full-stack-asset-transfer-guide/infrastructure/production_chaincode_playbooks/asset-transfer_appid.json create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/.gitignore create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/cas/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/cas/org0-ca.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/cas/org1-ca.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/cas/org2-ca.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/configtx-template.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/console/hlf-operations-console.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/console/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/core.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/gateway/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/gateway/org1-peer-gateway.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/gateway/org2-peer-gateway.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/manager/fabric-operator-manager.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/manager/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/orderers/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/orderers/org0-orderers.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/peers/kustomization.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/peers/org1-peer1.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/peers/org1-peer2.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/peers/org2-peer1.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/peers/org2-peer2.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/rbac/fabric-operator-clusterrole.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/rbac/fabric-operator-clusterrolebinding.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/rbac/fabric-operator-psp.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/rbac/fabric-operator-serviceaccount.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/config/rbac/kustomization.yaml create mode 100755 full-stack-asset-transfer-guide/infrastructure/sample-network/network create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/channel.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/console.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/frontend_build.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/frontend_deployment.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/prereqs.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/rest_deployment.yaml create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/rest_sample.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/sample_network.sh create mode 100644 full-stack-asset-transfer-guide/infrastructure/sample-network/scripts/utils.sh create mode 100755 full-stack-asset-transfer-guide/infrastructure/setup_storage_classes.sh create mode 100644 full-stack-asset-transfer-guide/justfile create mode 100755 full-stack-asset-transfer-guide/tests/00-chaincode-e2e.sh create mode 100755 full-stack-asset-transfer-guide/tests/10-appdev-e2e.sh create mode 100755 full-stack-asset-transfer-guide/tests/20-cloud-e2e.sh create mode 100755 full-stack-asset-transfer-guide/tests/30-ansible-e2e.sh create mode 100755 full-stack-asset-transfer-guide/tests/40-console.sh diff --git a/.github/settings.yml b/.github/settings.yml index 85a3d0da..fb74bdb5 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -12,3 +12,4 @@ repository: allow_squash_merge: true allow_merge_commit: false allow_rebase_merge: true + diff --git a/.gitignore b/.gitignore index f5102b7d..3fbf0f49 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ builders/ config/ external-chaincode/ install-fabric.sh + +# override the ignore of all config/ folders +!full-stack-asset-transfer-guide/infrastructure/sample-network/config \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/asset-tx-typescript-contract-image.yaml b/full-stack-asset-transfer-guide/.github/workflows/asset-tx-typescript-contract-image.yaml new file mode 100644 index 00000000..c65bb790 --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/asset-tx-typescript-contract-image.yaml @@ -0,0 +1,24 @@ +name: Asset Tx Contract Image CI + +on: + push: + branches: + - 'main' + tags: + - 'v*' + paths: + - 'contracts/asset-transfer-typescript/**' + pull_request: + branches: + - 'main' + paths: + - 'contracts/asset-transfer-typescript/**' + +jobs: + docker_build: + name: Docker build + uses: ./.github/workflows/docker-build.yaml + with: + imagename: full-stack-asset-transfer-guide/contracts/asset-transfer-typescript + path: contracts/asset-transfer-typescript + chaincode-label: asset-transfer-typescript diff --git a/full-stack-asset-transfer-guide/.github/workflows/docker-build.yaml b/full-stack-asset-transfer-guide/.github/workflows/docker-build.yaml new file mode 100644 index 00000000..894aedc2 --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/docker-build.yaml @@ -0,0 +1,78 @@ +name: Docker CI + +on: + workflow_call: + inputs: + imagename: + description: 'A Docker image name passed from the caller workflow' + required: true + type: string + path: + description: 'A path containing a Dockerfile passed from the caller workflow' + required: true + type: string + chaincode-label: + description: 'An optional chaincode package label passed from the caller workflow. If present, will prepare a chaincode package.' + required: false + type: string + +jobs: + build: + runs-on: ubuntu-latest + outputs: + image_digest: ${{ steps.publish_image.outputs.image_digest }} + + steps: + - uses: actions/checkout@v3 + - name: Build Docker image + run: | + docker build ${DOCKER_BUILD_PATH} --file ${DOCKER_BUILD_PATH}/Dockerfile --label "org.opencontainers.image.revision=${GITHUB_SHA}" --tag ${IMAGE_NAME} + docker tag ${IMAGE_NAME} ghcr.io/hyperledgendary/${IMAGE_NAME}:${GITHUB_SHA} + if [ "${GITHUB_REF:0:10}" = "refs/tags/" ]; then + docker tag ${IMAGE_NAME} ghcr.io/hyperledgendary/${IMAGE_NAME}:${GITHUB_REF_NAME} + docker tag ${IMAGE_NAME} ghcr.io/hyperledgendary/${IMAGE_NAME}:latest + fi + env: + DOCKER_BUILD_PATH: ${{ inputs.path }} + IMAGE_NAME: ${{ inputs.imagename }} + - name: Publish Docker image + id: publish_image + if: github.event_name != 'pull_request' + run: | + echo ${DOCKER_PW} | docker login ghcr.io -u ${DOCKER_USER} --password-stdin + docker push ghcr.io/hyperledgendary/${IMAGE_NAME}:${GITHUB_SHA} + if [ "${GITHUB_REF:0:10}" = "refs/tags/" ]; then + docker push ghcr.io/hyperledgendary/${IMAGE_NAME}:${GITHUB_REF_NAME} + docker push ghcr.io/hyperledgendary/${IMAGE_NAME}:latest + fi + echo ::set-output name=image_digest::$(docker inspect --format='{{index .RepoDigests 0}}' ghcr.io/hyperledgendary/${IMAGE_NAME}:${GITHUB_SHA} | cut -d'@' -f2) + env: + IMAGE_NAME: ${{ inputs.imagename }} + DOCKER_USER: ${{ github.actor }} + DOCKER_PW: ${{ secrets.GITHUB_TOKEN }} + + package: + if: inputs.chaincode-label != '' && needs.build.outputs.image_digest != '' + needs: build + runs-on: ubuntu-latest + + steps: + - name: Create package + uses: hyperledgendary/package-k8s-chaincode-action@ba10aea43e3d4f7991116527faf96e3c2b07abc7 + with: + chaincode-label: ${{ inputs.chaincode-label }} + chaincode-image: ghcr.io/hyperledgendary/${{ inputs.imagename }} + chaincode-digest: ${{ needs.build.outputs.image_digest }} + + - name: Rename package + if: startsWith(github.ref, 'refs/tags/v') + run: mv ${{ inputs.chaincode-label }}.tgz ${{ inputs.chaincode-label }}-${CHAINCODE_VERSION}.tgz + env: + IMAGE_NAME: ${{ inputs.imagename }} + CHAINCODE_VERSION: ${{ github.ref_name }} + + - name: Release package + if: startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v1 + with: + files: ${{ inputs.chaincode-label }}-${{ github.ref_name }}.tgz \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/test-ansible.yaml b/full-stack-asset-transfer-guide/.github/workflows/test-ansible.yaml new file mode 100644 index 00000000..e82f8739 --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/test-ansible.yaml @@ -0,0 +1,49 @@ +name: test-ansible + +on: + pull_request: + branches: + - main + +jobs: + test-ansible: + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: k9s + env: + K9S_VERSION: v0.25.3 + run: | + curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz -o /tmp/k9s_Linux_x86_64.tar.gz + tar -zxf /tmp/k9s_Linux_x86_64.tar.gz -C /usr/local/bin k9s + sudo chown root /usr/local/bin/k9s + sudo chmod 755 /usr/local/bin/k9s + + - name: just + env: + JUST_VERSION: 1.2.0 + run: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin + + - name: weft + run: | + npm install -g @hyperledger-labs/weft + + - name: fabric + run: | + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary + + - name: check prereqs + run: | + export WORKSHOP_PATH="${PWD}" + export PATH="${WORKSHOP_PATH}/bin:${PATH}" + export FABRIC_CFG_PATH="${WORKSHOP_PATH}/config" + + ./check.sh + + - name: just test-ansible + run: | + just test-ansible \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/test-appdev.yaml b/full-stack-asset-transfer-guide/.github/workflows/test-appdev.yaml new file mode 100644 index 00000000..d0c08e7d --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/test-appdev.yaml @@ -0,0 +1,49 @@ +name: test-appdev + +on: + pull_request: + branches: + - main + +jobs: + test-appdev: + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: k9s + env: + K9S_VERSION: v0.25.3 + run: | + curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz -o /tmp/k9s_Linux_x86_64.tar.gz + tar -zxf /tmp/k9s_Linux_x86_64.tar.gz -C /usr/local/bin k9s + sudo chown root /usr/local/bin/k9s + sudo chmod 755 /usr/local/bin/k9s + + - name: just + env: + JUST_VERSION: 1.2.0 + run: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin + + - name: weft + run: | + npm install -g @hyperledger-labs/weft + + - name: fabric + run: | + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary + + - name: check prereqs + run: | + export WORKSHOP_PATH="${PWD}" + export PATH="${WORKSHOP_PATH}/bin:${PATH}" + export FABRIC_CFG_PATH="${WORKSHOP_PATH}/config" + + ./check.sh + + - name: just test-appdev + run: | + just test-appdev \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/test-chaincode.yaml b/full-stack-asset-transfer-guide/.github/workflows/test-chaincode.yaml new file mode 100644 index 00000000..459b0711 --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/test-chaincode.yaml @@ -0,0 +1,49 @@ +name: test-chaincode + +on: + pull_request: + branches: + - main + +jobs: + test-chaincode: + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: k9s + env: + K9S_VERSION: v0.25.3 + run: | + curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz -o /tmp/k9s_Linux_x86_64.tar.gz + tar -zxf /tmp/k9s_Linux_x86_64.tar.gz -C /usr/local/bin k9s + sudo chown root /usr/local/bin/k9s + sudo chmod 755 /usr/local/bin/k9s + + - name: just + env: + JUST_VERSION: 1.2.0 + run: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin + + - name: weft + run: | + npm install -g @hyperledger-labs/weft + + - name: fabric + run: | + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary + + - name: check prereqs + run: | + export WORKSHOP_PATH="${PWD}" + export PATH="${WORKSHOP_PATH}/bin:${PATH}" + export FABRIC_CFG_PATH="${WORKSHOP_PATH}/config" + + ./check.sh + + - name: just test-chaincode + run: | + just test-chaincode \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/test-cloud.yaml b/full-stack-asset-transfer-guide/.github/workflows/test-cloud.yaml new file mode 100644 index 00000000..ce9a2c9d --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/test-cloud.yaml @@ -0,0 +1,49 @@ +name: test-cloud + +on: + pull_request: + branches: + - main + +jobs: + test-cloud: + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: k9s + env: + K9S_VERSION: v0.25.3 + run: | + curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz -o /tmp/k9s_Linux_x86_64.tar.gz + tar -zxf /tmp/k9s_Linux_x86_64.tar.gz -C /usr/local/bin k9s + sudo chown root /usr/local/bin/k9s + sudo chmod 755 /usr/local/bin/k9s + + - name: just + env: + JUST_VERSION: 1.2.0 + run: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin + + - name: weft + run: | + npm install -g @hyperledger-labs/weft + + - name: fabric + run: | + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary + + - name: check prereqs + run: | + export WORKSHOP_PATH="${PWD}" + export PATH="${WORKSHOP_PATH}/bin:${PATH}" + export FABRIC_CFG_PATH="${WORKSHOP_PATH}/config" + + ./check.sh + + - name: just test-cloud + run: | + just test-cloud \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.github/workflows/test-console.yaml b/full-stack-asset-transfer-guide/.github/workflows/test-console.yaml new file mode 100644 index 00000000..c3969a99 --- /dev/null +++ b/full-stack-asset-transfer-guide/.github/workflows/test-console.yaml @@ -0,0 +1,49 @@ +name: test-console + +on: + pull_request: + branches: + - main + +jobs: + test-console: + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: k9s + env: + K9S_VERSION: v0.25.3 + run: | + curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_x86_64.tar.gz -o /tmp/k9s_Linux_x86_64.tar.gz + tar -zxf /tmp/k9s_Linux_x86_64.tar.gz -C /usr/local/bin k9s + sudo chown root /usr/local/bin/k9s + sudo chmod 755 /usr/local/bin/k9s + + - name: just + env: + JUST_VERSION: 1.2.0 + run: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin + + - name: weft + run: | + npm install -g @hyperledger-labs/weft + + - name: fabric + run: | + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary + + - name: check prereqs + run: | + export WORKSHOP_PATH="${PWD}" + export PATH="${WORKSHOP_PATH}/bin:${PATH}" + export FABRIC_CFG_PATH="${WORKSHOP_PATH}/config" + + ./check.sh + + - name: just test-console + run: | + just test-console \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/.gitignore b/full-stack-asset-transfer-guide/.gitignore new file mode 100644 index 00000000..a7148016 --- /dev/null +++ b/full-stack-asset-transfer-guide/.gitignore @@ -0,0 +1,17 @@ +fabric +_cfg +node_modules +*.bin +.idea/ +_* +*tgz +*.tar.gz +~*.pptx + +bin +config/ + +.DS_Store +.idea/ + +rook \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/LICENSE b/full-stack-asset-transfer-guide/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/full-stack-asset-transfer-guide/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/full-stack-asset-transfer-guide/README.md b/full-stack-asset-transfer-guide/README.md new file mode 100644 index 00000000..b9e4e04a --- /dev/null +++ b/full-stack-asset-transfer-guide/README.md @@ -0,0 +1,108 @@ +![Conga](https://avatars.githubusercontent.com/u/49026922?s=200&v=4) + +# Fabric Full Stack Development Workshop + +![Hyperledger](https://img.shields.io/badge/hyperledger-2F3134?style=for-the-badge&logo=hyperledger&logoColor=white) + +Hyperledger Fabric can be used to represent assets of any kind on a permissioned decentralized ledger, from fungible tokens to non-fungible tokens, including monetary products, marbles, pineapples, classic cars, fine art, and anything else you can imagine. +Fabric can be used to track and update anything about these assets, common examples include asset ownership, exchange, provenance, and lifecycle. + +This workshop will demonstrate how a generic asset transfer solution can be modeled and deployed to take advantage of a blockchains qualitites of service. + +The workshop will be split into three sections: +- Smart Contract Development +- Client Application Development +- Cloud Native Fabric Deployment + +![Intro diagram](./docs/images/readme_diagram.png) + +**OBJECTIVES:** + +- Show how an Asset Transfer smart contract can be written to encapsulate business logic + - Show how the smart contract can be developed iteratively to get correct function in a development context +- Show how client applications can be written using the Gateway functionality + - Show how the simplification of the Gateway programming model makes connecting applications more streamlined + - Show how this streamlined approach improves resilience and availability +- Show how the solution can then be deployed to a production-class environment + - Show how a Hyperledger Fabric network can be created and managed in Kubernetes (K8S) using automation + - Show how the Fabric Operator and Console can be installed via Ansible playbooks + - Show how a multi-organization configuration of Fabric can be created + +--- + +**Please ensure you've got the [required tools](./SETUP.md) on your local machine or in a virtual machine -- To check, run `./check.sh`** + +--- + + +## Before you begin.... + +Fabric is a multi-server decentralized system with orderer and peer nodes, so it can be quite complex to configure. Even the simplest smart contract needs a running Fabric Infrastructure and one size does not fit all. + +There are configurations that can run Fabric either as local binaries, in a single docker container, in multiple containers, or in K8S. +This workshop will show some of the approaches that can be used for developing applications and contracts with a minimal Fabric environment (Microfab), and how a production deployment can be achieved. +There are other ways of deploying Fabric produced by the community - these are equally valid and useful. Feel free to try the others, once you understand the basic concepts to find what works best for you. + +At a high-level remember that a solution using Fabric has (a) client application to send in transaction requests (b) Fabric infrastructure to service those requests (c) Smart Contract to action the transactions. +The nature of (b) the fabric infrastructure will change depending on your scenario; start simple and build up. The smart contracts and client application's code will remain the same no matter the way Fabric is provisioned. +There will be minor variations in deployment (eg local docker container vs remote K8S cluster) but fundamentally the process is the same. + +## Running the workshop + +![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white) If you're running on Windows, please check the [hints and tips](./docs/tips-for-windows-dev.md) + +- Ensure you've got the tools you may need, either installed locally or in a multipass virtual machine. See the [setup page](./SETUP.md) for details. +- Clone this repository to a convient location +- We suggest that you open 3 or 4 terminal windows + - One for running chaincode in dev mode + - One for running the fabric infrastructure and optionally one for monitoring it + - One for client applications + +- Work through the sections below in order, although you don't necessarily need to complete all the Exercises before moving to the next section. + +--- +## Scenario + +Lets assume the assets you are tracking on the blockchain ledger are trading cards. Each trading card represents a comic book character and has an id, size, favorite color, and owner. +These trading cards can be passed between people, with some cards having more 'value' due to rarity or having notable attributes. + +In token terms, think of these cards as non-fungible tokens. Each card has different attributes and individual cards can't be subdivided. + +We'll create a digital representation of these cards on the blockchain ledger. There are a few important aspects of this solution to consider: + +- Ledger - The blockchain ledger on each peer maintains the current state of each card (asset), as well as the history of transactions that led to the current state, so that there is no doubt about the assets issuance, provenance, attributes, and ownership. +- Asset transfer smart contract - manage changes to asset state such as the transfer of cards between people +- Organizations - Since this is a permissioned blockchain we'll model the participants as organizations that are authorized to run nodes or transact on the Fabric network. Our simple network will consist of an ordering service organization and two transacting organizations. + - Ordering service organization - runs the ordering service to ensure transactions get ordered into blocks fairly, this may be a consortium leader or regulator in the industry. Note that ordering service nodes could also be contributed from multiple organizations, this becomes especially important when running a Byzantine Fault Tolerant (BFT) ordering service. + - Owner Organizations - Each owner organization is authorized to run peers and submit transfer transactions for the cards (assets) that they own. + + +## Smart Contract Development + +- [Introduction](./docs/SmartContractDev/00-Introduction.md) +- **Exercise**: [Getting Started with a Smart Contract](./docs/SmartContractDev/01-Exercise-Getting-Started.md) +- **Exercise**: [Adding a new transaction function](./docs/SmartContractDev/02-Exercise-Adding-tx-function.md) +- Reference: + - [Detailed Test and Debug](./docs/SmartContractDev/03-Test-And-Debug-Reference.md) + +## Client Application Development + +- [Fabric Gateway](docs/ApplicationDev/01-FabricGateway.md) +- **Exercise:** [Run the client application](docs/ApplicationDev/02-Exercise-RunApplication.md) +- [Application overview](docs/ApplicationDev/03-ApplicationOverview.md) +- **Exercise:** [Implement asset transfer](docs/ApplicationDev/04-Exercise-AssetTransfer.md) +- [Chaincode events](docs/ApplicationDev/05-ChaincodeEvents.md) +- **Exercise:** [Use chaincode events](docs/ApplicationDev/06-Exercise-ChaincodeEvents.md) + +## Cloud Native Fabric + +- [Cloud Ready!](docs/CloudReady/00-setup.md) +- **Exercise:** [Deploy a Kubernetes Cluster](docs/CloudReady/10-kube.md) +- **Exercise:** [Deploy a Fabric Network](docs/CloudReady/20-fabric.md) +- **Exercise:** [Deploy a Smart Contract](docs/CloudReady/30-chaincode.md) +- **Exercise:** [Deploy a Client Application](docs/CloudReady/40-bananas.md) + +## Epilogue + +- [Go Bananas](docs/CloudReady/40-bananas.md) +- [Bring it Home](docs/CloudReady/90-teardown.md) diff --git a/full-stack-asset-transfer-guide/SETUP.md b/full-stack-asset-transfer-guide/SETUP.md new file mode 100644 index 00000000..40a84671 --- /dev/null +++ b/full-stack-asset-transfer-guide/SETUP.md @@ -0,0 +1,138 @@ +# Essential Setup + +Remember to clone this repository! + +```shell +git clone https://github.com/hyperledgendary/full-stack-asset-transfer-guide.git workshop +cd workshop +export WORKSHOP_PATH=$(pwd) +``` + +> to check the tools you already have `./check.sh` + +## Option 1: Use local environment + +Do you want to configure your local environment with the workshop dependencies? + +- To develop an application and/or contract (first two parts of workshop) follow the *DEV* setup below + +- To deploy a chaincode to kubernetes in a production manner (third part of workshop) follow the *PROD* setup below + +## Option 2: Use a Multipass Ubuntu image + +If you do not want to install dependencies on your local environment, you can use a Multipass Ubuntu image instead. + +Tip - You may need to stop any VPN client for the Multipass networking to work. + +- [Install multipass](https://multipass.run/install) + +- Launch the virtual machine and automatically install the workshop dependencies: + +```shell +multipass launch \ + --name fabric-dev \ + --disk 80G \ + --cpus 8 \ + --mem 8G \ + --cloud-init infrastructure/multipass-cloud-config.yaml +``` + +- Mount the local workshop to your multipass vm: + +```shell +multipass mount $PWD fabric-dev:/home/ubuntu/full-stack-asset-transfer-guide +``` + +- Open a shell on the virtual machine: + +```shell +multipass shell fabric-dev +``` + +Tip - The vm creation log can be seen at /var/log/cloud-init-output.log if you need to troubleshoot anything. + +- You are now inside the virtual machine. cd to the workshop directory: + +```shell +cd full-stack-asset-transfer-guide +``` + +- Install Fabric peer CLI and set environment variables +```shell +curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh && chmod +x install-fabric.sh +./install-fabric.sh binary +export WORKSHOP_PATH=$(pwd) +export PATH=${WORKSHOP_PATH}/bin:$PATH +export FABRIC_CFG_PATH=${WORKSHOP_PATH}/config +``` + +Note - You'll probably want three terminal windows for running the workshop, go ahead and open the shells now: + +```shell +multipass shell fabric-dev +``` + +- Eventual cleanup - To remove the multipass image when you are done with it after the workshop: +```shell +multipass delete fabric-dev +multipass purge +multipass list +``` + +## DEV - Required Tools + +You will need a set of tools to assist with chaincode and application development. +We'll assume you are developing in Node for this workshop, but you could also develop in Java or Go by installing the respective compilers. + +- [docker engine](https://docs.docker.com/engine/install/) + +- [just](https://github.com/casey/just#installation) to run all the commands here directly + +- [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) to install node and npm +```shell +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash +``` + +- [node v16 and npm](https://github.com/nvm-sh/nvm#usage) to run node chaincode and applications +```shell +nvm install 16 +``` + +- [typescript](https://www.typescriptlang.org/download) to compile typescript chaincode and applications to node +```shell +npm install -g typescript +``` + +- [weft ](https://www.npmjs.com/package/@hyperledger-labs/weft) Hyperledger-Labs cli to work with identities and chaincode packages +```shell +npm install -g @hyperledger-labs/weft +``` + +- [jq](https://stedolan.github.io/jq/) jq JSON command-line processor +```shell +sudo apt-get update && sudo apt-get install -y jq +``` + +- Fabric peer CLI +```shell +curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh | bash -s -- binary +export WORKSHOP_PATH=$(pwd) +export PATH=${WORKSHOP_PATH}/bin:$PATH +export FABRIC_CFG_PATH=${WORKSHOP_PATH}/config +``` + +## PROD - Required Tools for Kubernetes Deployment + +- [kubectl](https://kubernetes.io/docs/tasks/tools/) +- [jq](https://stedolan.github.io/jq/) +- [just](https://github.com/casey/just#installation) to run all the comamnds here directly +- [kind](https://kind.sigs.k8s.io/) if you want to create a cluster locally, see below for other options +- [k9s](https://k9scli.io) (recommended, but not essential) + +### Beta Ansible Playbooks + +The v2.0.0-beta Ansible Collection for Hyperledger Fabric is required for Kubernetes deployment. This isn't yet being published to DockerHub but is being published to Github Packages. + +For reference check the latest version of [ofs-ansible](https://github.com/IBM-Blockchain/ansible-collection/pkgs/container/ofs-ansibe) + +The Ansible scripts in the workshop are set to use the latest image here by default. diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/.eslintrc.js b/full-stack-asset-transfer-guide/applications/conga-cards/.eslintrc.js new file mode 100644 index 00000000..ad992fae --- /dev/null +++ b/full-stack-asset-transfer-guide/applications/conga-cards/.eslintrc.js @@ -0,0 +1,12 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + ], +}; \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/.gitignore b/full-stack-asset-transfer-guide/applications/conga-cards/.gitignore new file mode 100644 index 00000000..1276eb3b --- /dev/null +++ b/full-stack-asset-transfer-guide/applications/conga-cards/.gitignore @@ -0,0 +1,18 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + +# Coverage directory used by tools like istanbul +coverage + +# Dependencies +node_modules/ +jspm_packages/ +package-lock.json + +# Compiled TypeScript files +dist + +# Files generated by the application at runtime +checkpoint.json +store.log diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/.npmrc b/full-stack-asset-transfer-guide/applications/conga-cards/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/full-stack-asset-transfer-guide/applications/conga-cards/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/README.md b/full-stack-asset-transfer-guide/applications/conga-cards/README.md new file mode 100644 index 00000000..e99b1bcc --- /dev/null +++ b/full-stack-asset-transfer-guide/applications/conga-cards/README.md @@ -0,0 +1,73 @@ +# Conga Cards + +This Gateway Client application will listen for chaincode events, invoking a [#discord webhook](https://discord.com/developers/docs/resources/webhook) +to post a channel message when [Conga Cards](assets/) are created, deleted, and exchanged on a channel. + +> [Conga Comics](https://congacomic.github.io) | Life on the chain, one block at a time by Ed Moffatt & some friends + +This project is based on the [trader-typescript](../trader-typescript) sample Gateway Client application. + + +## Prerequisites + +The client application requires Node.js 16 or later. + +## Set up + +The following steps prepare the client application for execution: + +1. Ensure the [asset-transfer](../../contracts/asset-transfer-typescript/) smart contract is deployed to a running Fabric network. +1. Run `npm install` to download dependencies and compile the application code. + +> **Note:** After making any code changes to the application, be sure to recompile the application code. This can be done by explicitly running `npm install` again, or you can leave `npm run build:watch` running in a terminal window to automatically rebuild the application on any code change. + + +The client application uses environment variables to supply configuration options. You must set the following environment variables when running the application: + +- `ENDPOINT` - endpoint address for the Gateway service to which the client will connect in the form **hostname:port**. Depending on your environment, this can be the address of a specific peer within the user's organization, or an ingress endpoint that dispatches to any available peer in the user's organization. +- `MSP_ID` - member service provider ID for the user's organization. +- `CERTIFICATE` - PEM file containing the user's X.509 certificate. +- `PRIVATE_KEY` - PEM file containing the user's private key. + +The following environment variables are optional and can be set if required by your environment: + +- `CHANNEL_NAME` - Channel to which the chaincode is deployed. (Default: `mychannel`) +- `CHAINCODE_NAME` - Channel to which the chaincode is deployed. (Default: `asset-transfer`) +- `TLS_CERT` - PEM file containing the CA certificate used to authenticate the TLS connection to the Gateway peer. *Only required if using a TLS connection and a private CA.* +- `HOST_ALIAS` - the name of the Gateway peer as it appears in its TLS certificate. *Only required if the endpoint address used by the client does not match the address in the Gateway peer's TLS certificate.* + +- `WEBHOOK_URL` - the [#discord webhook](https://discord.com/developers/docs/resources/webhook) to which the channel + events will be relayed. + + +# Run + +The sample application is run as a command-line application, and is lauched using `npm start [ ...]`. The following commands are available: + +- `npm start create ` to create a new asset. +- `npm start delete ` to delete an existing asset. +- `npm start getAllAssets` to list all assets. +- `npm start read ` to view an existing asset. +- `npm start transfer ` to transfer an asset to a new owner within an organization MSP ID. +- `npm start discord` starts an event loop, relaying channel events to `${WEBHOOK_URL}` + + +## Sample Interaction: + +- Submit some transactions to a ledger: +```shell +npm start create blockbert SeanB orange + +npm start create count-blockula jkneubuhl Org1MSP purple + +npm start transfer count-blockula davidboswell Org1MSP +``` + +- Run the discord event listener: +```shell +export WEBHOOK_URL="https://discord.com/api/webhooks/123456789/xyzzy-abcdef-12345" + +npm start discord +``` + +![Sample Interaction](images/interaction.png) \ No newline at end of file diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/assets/appleplectic.png b/full-stack-asset-transfer-guide/applications/conga-cards/assets/appleplectic.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8da445a68fce3e4a0e26c912f3010a76d2ede7 GIT binary patch literal 64230 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 kZ@S?fi~^EV&<7wUK9!~g&Q literal 0 HcmV?d00001 diff --git a/full-stack-asset-transfer-guide/applications/conga-cards/assets/bananomatopoeia.png b/full-stack-asset-transfer-guide/applications/conga-cards/assets/bananomatopoeia.png new file mode 100644 index 0000000000000000000000000000000000000000..40fcba2587f2fd54c706ca8a8a391fcc99a30ea3 GIT binary patch literal 113103 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≠49QfulGh_r&zo(mAxxZ9LCD1Yi!FT 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