mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
Merge branch 'main' into main
Signed-off-by: Arnaud J Le Hors <lehors@us.ibm.com>
This commit is contained in:
commit
f1f2e42fe4
808 changed files with 39648 additions and 32534 deletions
53
.github/actions/fsat-setup/action.yaml
vendored
Normal file
53
.github/actions/fsat-setup/action.yaml
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
name: Set up the Full Stack Asset Transfer Guide Dependencies
|
||||||
|
description: Set up the Full Stack Asset Transfer Guide Dependencies
|
||||||
|
inputs:
|
||||||
|
node-version:
|
||||||
|
description: Version of node
|
||||||
|
default: 16.x
|
||||||
|
just-version:
|
||||||
|
description: Just Version
|
||||||
|
default: 1.2.0
|
||||||
|
k9s-version:
|
||||||
|
description: k9s Version
|
||||||
|
default: v0.25.3
|
||||||
|
fabric-version:
|
||||||
|
description: Version of Hyperledger Fabric
|
||||||
|
default: 2.5.0-alpha3
|
||||||
|
ca-version:
|
||||||
|
description: Version of Hyperledger Fabric CA
|
||||||
|
default: 1.5.6-beta3
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ inputs.node-version }}
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: '**/package-lock.json'
|
||||||
|
|
||||||
|
- name: Install k9s
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl --fail --silent --show-error -L https://github.com/derailed/k9s/releases/download/${{ inputs.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: Install just
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --tag ${{ inputs.just-version }} --to /usr/local/bin
|
||||||
|
|
||||||
|
- name: Install weft
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
npm install -g @hyperledger-labs/weft
|
||||||
|
|
||||||
|
- name: Install fabric CLI
|
||||||
|
shell: bash
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
|
run: |
|
||||||
|
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh \
|
||||||
|
| bash -s -- binary --fabric-version ${{ inputs.fabric-version }} --ca-version ${{ inputs.ca-version }}
|
||||||
|
echo ${PWD}/bin >> $GITHUB_PATH
|
||||||
56
.github/actions/test-network-setup/action.yaml
vendored
Normal file
56
.github/actions/test-network-setup/action.yaml
vendored
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
name: Set up Test Network Runner
|
||||||
|
description: Set up the Test Network Runtime
|
||||||
|
inputs:
|
||||||
|
go-version:
|
||||||
|
description: Version of go
|
||||||
|
default: 1.19.6
|
||||||
|
node-version:
|
||||||
|
description: Version of node
|
||||||
|
default: 16.x
|
||||||
|
java-version:
|
||||||
|
description: Version of JDK
|
||||||
|
default: 11.x
|
||||||
|
fabric-version:
|
||||||
|
description: Version of Hyperledger Fabric
|
||||||
|
default: 2.5.0-beta2
|
||||||
|
ca-version:
|
||||||
|
description: Version of Hyperledger Fabric CA
|
||||||
|
default: 1.5.6-beta3
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ inputs.go-version }}
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: '**/go.sum'
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ inputs.node-version }}
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: '**/package-lock.json'
|
||||||
|
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: temurin
|
||||||
|
java-version: ${{ inputs.java-version }}
|
||||||
|
cache: gradle
|
||||||
|
|
||||||
|
- name: Install fabric CLI
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh \
|
||||||
|
| bash -s -- binary --fabric-version ${{ inputs.fabric-version }} --ca-version ${{ inputs.ca-version }}
|
||||||
|
echo ${PWD}/bin >> $GITHUB_PATH
|
||||||
|
|
||||||
|
- name: Pull Fabric Docker Images
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh \
|
||||||
|
| bash -s -- docker --fabric-version ${{ inputs.fabric-version }} --ca-version ${{ inputs.ca-version }}
|
||||||
|
|
||||||
|
- name: Install retry CLI
|
||||||
|
shell: bash
|
||||||
|
run: curl -sSL https://raw.githubusercontent.com/kadwanev/retry/master/retry -o ./bin/retry && chmod +x ./bin/retry
|
||||||
6
.github/settings.yml
vendored
6
.github/settings.yml
vendored
|
|
@ -1,10 +1,10 @@
|
||||||
repository:
|
repository:
|
||||||
name: fabric-samples
|
name: fabric-samples
|
||||||
description: null
|
description: Samples for Hyperledger Fabric
|
||||||
homepage: https://wiki.hyperledger.org/display/fabric
|
homepage: https://wiki.hyperledger.org/display/fabric
|
||||||
default_branch: master
|
default_branch: main
|
||||||
has_downloads: true
|
has_downloads: true
|
||||||
has_issues: false
|
has_issues: true
|
||||||
has_projects: false
|
has_projects: false
|
||||||
has_wiki: false
|
has_wiki: false
|
||||||
archived: false
|
archived: false
|
||||||
|
|
|
||||||
66
.github/workflows/lint.yaml
vendored
Normal file
66
.github/workflows/lint.yaml
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Lint 🎉
|
||||||
|
run-name: ${{ github.actor }} is linting fabric-samples 🎉
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
GO_VER: 1.19.6
|
||||||
|
NODE_VER: 16.x
|
||||||
|
JAVA_VER: 11.x
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
go:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VER }}
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- run: go install golang.org/x/tools/cmd/goimports@latest
|
||||||
|
- run: ci/scripts/lint-go.sh
|
||||||
|
|
||||||
|
typescript:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.NODE_VER }}
|
||||||
|
- run: ci/scripts/lint-typescript.sh
|
||||||
|
|
||||||
|
javascript:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.NODE_VER }}
|
||||||
|
- run: ci/scripts/lint-javascript.sh
|
||||||
|
|
||||||
|
java:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: temurin
|
||||||
|
java-version: ${{ env.JAVA_VER }}
|
||||||
|
- run: ci/scripts/lint-java.sh
|
||||||
|
|
||||||
|
shell:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- run: ci/scripts/lint-shell.sh
|
||||||
47
.github/workflows/rest-sample.yaml
vendored
Normal file
47
.github/workflows/rest-sample.yaml
vendored
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: REST Sample 🐧
|
||||||
|
run-name: ${{ github.actor }} is testing the REST Sample 🐧
|
||||||
|
|
||||||
|
env:
|
||||||
|
NODE_VER: 16.x
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
paths: [ "asset-transfer-basic/rest-api-typescript/**" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
paths: [ "asset-transfer-basic/rest-api-typescript/**" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-sample:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.NODE_VER }}
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: '**/package-lock.json'
|
||||||
|
|
||||||
|
- name: Install REST Sample Dependencies
|
||||||
|
working-directory: asset-transfer-basic/rest-api-typescript
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Build REST Sample Application
|
||||||
|
run: npm run build
|
||||||
|
working-directory: asset-transfer-basic/rest-api-typescript
|
||||||
|
|
||||||
|
- name: Test REST Sample Application
|
||||||
|
run: npm test
|
||||||
|
working-directory: asset-transfer-basic/rest-api-typescript
|
||||||
59
.github/workflows/test-fsat.yaml
vendored
Normal file
59
.github/workflows/test-fsat.yaml
vendored
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
name: Full Stack Asset Transfer Guide 🚀
|
||||||
|
run-name: ${{ github.actor }} is testing the Full Stack Asset Transfer Guide 🚀
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "main"
|
||||||
|
- "release-2.5"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ansible:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Full Stack Runtime
|
||||||
|
uses: ./.github/actions/fsat-setup
|
||||||
|
- run: just test-ansible
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
|
|
||||||
|
appdev:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Full Stack Runtime
|
||||||
|
uses: ./.github/actions/fsat-setup
|
||||||
|
- run: just test-appdev
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
|
|
||||||
|
chaincode:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Full Stack Runtime
|
||||||
|
uses: ./.github/actions/fsat-setup
|
||||||
|
- run: just test-chaincode
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
|
|
||||||
|
cloud:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Full Stack Runtime
|
||||||
|
uses: ./.github/actions/fsat-setup
|
||||||
|
- run: just test-cloud
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
|
|
||||||
|
console:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Full Stack Runtime
|
||||||
|
uses: ./.github/actions/fsat-setup
|
||||||
|
- run: just test-console
|
||||||
|
working-directory: full-stack-asset-transfer-guide
|
||||||
39
.github/workflows/test-network-basic.yaml
vendored
Normal file
39
.github/workflows/test-network-basic.yaml
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Basic 🔎
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Basic tests 🔎
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
basic:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
- javascript
|
||||||
|
- typescript
|
||||||
|
- java
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test Network Basic
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-basic.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
40
.github/workflows/test-network-events.yaml
vendored
Normal file
40
.github/workflows/test-network-events.yaml
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Events 💡
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Events tests 💡
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
events:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- javascript
|
||||||
|
- java
|
||||||
|
chaincode-name:
|
||||||
|
- events
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-events.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: ${{ matrix.chaincode-name }}
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
39
.github/workflows/test-network-gateway.yaml
vendored
Normal file
39
.github/workflows/test-network-gateway.yaml
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Gateway 🖥️
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Gateway tests 🖥️
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
gateway:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
- javascript
|
||||||
|
- typescript
|
||||||
|
- java
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
env:
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
|
run: ../ci/scripts/run-test-network-gateway.sh
|
||||||
48
.github/workflows/test-network-hsm.yaml
vendored
Normal file
48
.github/workflows/test-network-hsm.yaml
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network HSM 🍏
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network HSM tests 🍏
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
hsm:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
- javascript
|
||||||
|
- typescript
|
||||||
|
- java
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Install SoftHSM
|
||||||
|
run: sudo apt install -y softhsm2
|
||||||
|
|
||||||
|
- name: Set up SoftHSM
|
||||||
|
run: |
|
||||||
|
echo directories.tokendir = /tmp > $HOME/softhsm2.conf
|
||||||
|
export SOFTHSM2_CONF=$HOME/softhsm2.conf
|
||||||
|
softhsm2-util --init-token --slot 0 --label "ForFabric" --pin 98765432 --so-pin 1234
|
||||||
|
|
||||||
|
- name: Run Test Network HSM
|
||||||
|
working-directory: test-network
|
||||||
|
env:
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
|
run: ../ci/scripts/run-test-network-hsm.sh
|
||||||
70
.github/workflows/test-network-k8s.yaml
vendored
Normal file
70
.github/workflows/test-network-k8s.yaml
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Kubernetes Test Network 🍒
|
||||||
|
run-name: ${{ github.actor }} is testing the Kubernetes Test Network 🍒
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ccaas-java:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Test the network
|
||||||
|
working-directory: test-network-k8s
|
||||||
|
run: ../ci/scripts/run-k8s-test-network-basic.sh
|
||||||
|
env:
|
||||||
|
CLIENT_LANGUAGE: typescript
|
||||||
|
CHAINCODE_LANGUAGE: java
|
||||||
|
|
||||||
|
ccaas-external:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Test the network
|
||||||
|
working-directory: test-network-k8s
|
||||||
|
run: ../ci/scripts/run-k8s-test-network-basic.sh
|
||||||
|
env:
|
||||||
|
CLIENT_LANGUAGE: typescript
|
||||||
|
CHAINCODE_LANGUAGE: external
|
||||||
|
|
||||||
|
k8s-builder:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Test the network
|
||||||
|
working-directory: test-network-k8s
|
||||||
|
run: ../ci/scripts/run-k8s-test-network-basic.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: basic
|
||||||
|
CHAINCODE_LANGUAGE: java
|
||||||
|
CHAINCODE_BUILDER: k8s
|
||||||
|
|
||||||
|
multi-namespace:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Test the network
|
||||||
|
working-directory: test-network-k8s
|
||||||
|
run: ../ci/scripts/run-k8s-test-network-basic.sh
|
||||||
|
env:
|
||||||
|
ORG0_NS: org0-namespace
|
||||||
|
ORG1_NS: org1-namespace
|
||||||
|
ORG2_NS: org2-namespace
|
||||||
|
CHAINCODE_NAME: basic
|
||||||
|
CHAINCODE_LANGUAGE: java
|
||||||
|
CHAINCODE_BUILDER: k8s
|
||||||
40
.github/workflows/test-network-ledger.yaml
vendored
Normal file
40
.github/workflows/test-network-ledger.yaml
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Ledger 🥑
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Ledger tests 🥑
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
basic:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
- javascript
|
||||||
|
chaincode-name:
|
||||||
|
- ledger
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-ledger.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: ${{ matrix.chaincode-name }}
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
39
.github/workflows/test-network-off-chain.yaml
vendored
Normal file
39
.github/workflows/test-network-off-chain.yaml
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Off Chain 🍔
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Off Chain tests 🍔
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
off-chain:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
- javascript
|
||||||
|
- typescript
|
||||||
|
- java
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test Network Off Chain
|
||||||
|
working-directory: test-network
|
||||||
|
env:
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
|
run: ../ci/scripts/run-test-network-off-chain.sh
|
||||||
39
.github/workflows/test-network-private.yaml
vendored
Normal file
39
.github/workflows/test-network-private.yaml
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Private 🔒
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Private tests 🔒
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
private:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
chaincode-name:
|
||||||
|
- private
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-private.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: ${{ matrix.chaincode-name }}
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
40
.github/workflows/test-network-sbe.yaml
vendored
Normal file
40
.github/workflows/test-network-sbe.yaml
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network SBE 🎵
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network SBE tests 🎵
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
SBE:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- typescript
|
||||||
|
- java
|
||||||
|
chaincode-name:
|
||||||
|
- sbe
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-sbe.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: ${{ matrix.chaincode-name }}
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
39
.github/workflows/test-network-secured.yaml
vendored
Normal file
39
.github/workflows/test-network-secured.yaml
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
name: Test Network Secured 🔔
|
||||||
|
run-name: ${{ github.actor }} is running the Test Network Secured tests 🔔
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main", "release-2.5" ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
secured:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
chaincode-language:
|
||||||
|
- go
|
||||||
|
chaincode-name:
|
||||||
|
- secured
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up the test network runtime
|
||||||
|
uses: ./.github/actions/test-network-setup
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
working-directory: test-network
|
||||||
|
run: ../ci/scripts/run-test-network-secured.sh
|
||||||
|
env:
|
||||||
|
CHAINCODE_NAME: ${{ matrix.chaincode-name }}
|
||||||
|
CHAINCODE_LANGUAGE: ${{ matrix.chaincode-language }}
|
||||||
14
.gitignore
vendored
14
.gitignore
vendored
|
|
@ -4,9 +4,6 @@
|
||||||
.#*
|
.#*
|
||||||
# Vim file artifacts
|
# Vim file artifacts
|
||||||
.*.sw*
|
.*.sw*
|
||||||
# installed platform-specific binaries
|
|
||||||
bin
|
|
||||||
/config
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.project
|
.project
|
||||||
# omit Go vendor directories
|
# omit Go vendor directories
|
||||||
|
|
@ -19,8 +16,17 @@ node_modules/
|
||||||
# Ignore Gradle build output directory
|
# Ignore Gradle build output directory
|
||||||
build
|
build
|
||||||
package-lock.json
|
package-lock.json
|
||||||
external-chaincode/
|
|
||||||
|
|
||||||
# Eclipse
|
# Eclipse
|
||||||
.classpath
|
.classpath
|
||||||
.settings
|
.settings
|
||||||
|
|
||||||
|
# installed Fabric binaries etc.
|
||||||
|
bin/
|
||||||
|
builders/
|
||||||
|
config/
|
||||||
|
external-chaincode/
|
||||||
|
install-fabric.sh
|
||||||
|
|
||||||
|
# override the ignore of all config/ folders
|
||||||
|
!full-stack-asset-transfer-guide/infrastructure/sample-network/config
|
||||||
|
|
@ -23,7 +23,6 @@ Kubernetes guide, the Kube test network can be used as a platform to author and
|
||||||
applications on a development or CI workstation.
|
applications on a development or CI workstation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Asset transfer samples and tutorials
|
## Asset transfer samples and tutorials
|
||||||
|
|
||||||
The asset transfer series provides a series of sample smart contracts and applications to demonstrate how to store and transfer assets using Hyperledger Fabric.
|
The asset transfer series provides a series of sample smart contracts and applications to demonstrate how to store and transfer assets using Hyperledger Fabric.
|
||||||
|
|
@ -43,7 +42,6 @@ transfer an asset in a more realistic transfer scenario.
|
||||||
| [Attribute-based access control](asset-transfer-abac) | Demonstrates the use of attribute and identity based access control using a simple asset transfer scenario | [README](asset-transfer-abac/README.md) | Go | None |
|
| [Attribute-based access control](asset-transfer-abac) | Demonstrates the use of attribute and identity based access control using a simple asset transfer scenario | [README](asset-transfer-abac/README.md) | Go | None |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Additional samples
|
## Additional samples
|
||||||
|
|
||||||
Additional samples demonstrate various Fabric use cases and application patterns.
|
Additional samples demonstrate various Fabric use cases and application patterns.
|
||||||
|
|
@ -58,9 +56,7 @@ Additional samples demonstrate various Fabric use cases and application patterns
|
||||||
| [High throughput](high-throughput) | Learn how you can design your smart contract to avoid transaction collisions in high volume environments. | [README](high-throughput/README.md) |
|
| [High throughput](high-throughput) | Learn how you can design your smart contract to avoid transaction collisions in high volume environments. | [README](high-throughput/README.md) |
|
||||||
| [Simple Auction](auction-simple) | Run an auction where bids are kept private until the auction is closed, after which users can reveal their bid. | [README](auction-simple/README.md) |
|
| [Simple Auction](auction-simple) | Run an auction where bids are kept private until the auction is closed, after which users can reveal their bid. | [README](auction-simple/README.md) |
|
||||||
| [Dutch Auction](auction-dutch) | Run an auction in which multiple items of the same type can be sold to more than one buyer. This example also includes the ability to add an auditor organization. | [README](auction-dutch/README.md) |
|
| [Dutch Auction](auction-dutch) | Run an auction in which multiple items of the same type can be sold to more than one buyer. This example also includes the ability to add an auditor organization. | [README](auction-dutch/README.md) |
|
||||||
| [Chaincode](chaincode) | A set of other sample smart contracts, many of which were used in tutorials prior to the asset transfer sample series. | |
|
|
||||||
| [Interest rate swaps](interest_rate_swaps) | **Deprecated in favor of state based endorsement asset transfer sample** | |
|
|
||||||
| [Fabcar](fabcar) | **Deprecated in favor of basic asset transfer sample** | |
|
|
||||||
|
|
||||||
## License <a name="license"></a>
|
## License <a name="license"></a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,32 @@
|
||||||
module github.com/hyperledger/fabric-samples/asset-transfer-abac/chaincode-go
|
module github.com/hyperledger/fabric-samples/asset-transfer-abac/chaincode-go
|
||||||
|
|
||||||
go 1.15
|
go 1.17
|
||||||
|
|
||||||
require github.com/hyperledger/fabric-contract-api-go v1.1.1
|
require github.com/hyperledger/fabric-contract-api-go v1.2.1
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||||
|
github.com/go-openapi/spec v0.20.8 // indirect
|
||||||
|
github.com/go-openapi/swag v0.21.1 // indirect
|
||||||
|
github.com/gobuffalo/envy v1.10.1 // indirect
|
||||||
|
github.com/gobuffalo/packd v1.0.1 // indirect
|
||||||
|
github.com/gobuffalo/packr v1.30.1 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20230228194215-b84622ba6a7a // indirect
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.3.0 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.8.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
|
||||||
|
google.golang.org/grpc v1.53.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -28,7 +28,7 @@ func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
// Demonstrate the use of Attribute-Based Access Control (ABAC) by checking
|
// Demonstrate the use of Attribute-Based Access Control (ABAC) by checking
|
||||||
// to see if the caller has the "abac.creator" attribute with a value of true;
|
// to see if the caller has the "abac.creator" attribute with a value of true;
|
||||||
// if not, return an error.
|
// if not, return an error.
|
||||||
//
|
|
||||||
err := ctx.GetClientIdentity().AssertAttributeValue("abac.creator", "true")
|
err := ctx.GetClientIdentity().AssertAttributeValue("abac.creator", "true")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("submitting client not authorized to create asset, does not have abac.creator role")
|
return fmt.Errorf("submitting client not authorized to create asset, does not have abac.creator role")
|
||||||
|
|
|
||||||
|
|
@ -13,36 +13,32 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/hyperledger/fabric-gateway/pkg/client"
|
"github.com/hyperledger/fabric-gateway/pkg/client"
|
||||||
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
||||||
gwproto "github.com/hyperledger/fabric-protos-go/gateway"
|
"github.com/hyperledger/fabric-protos-go-apiv2/gateway"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"path"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mspID = "Org1MSP"
|
mspID = "Org1MSP"
|
||||||
cryptoPath = "../../test-network/organizations/peerOrganizations/org1.example.com"
|
cryptoPath = "../../test-network/organizations/peerOrganizations/org1.example.com"
|
||||||
certPath = cryptoPath + "/users/User1@org1.example.com/msp/signcerts/cert.pem"
|
certPath = cryptoPath + "/users/User1@org1.example.com/msp/signcerts/cert.pem"
|
||||||
keyPath = cryptoPath + "/users/User1@org1.example.com/msp/keystore/"
|
keyPath = cryptoPath + "/users/User1@org1.example.com/msp/keystore/"
|
||||||
tlsCertPath = cryptoPath + "/peers/peer0.org1.example.com/tls/ca.crt"
|
tlsCertPath = cryptoPath + "/peers/peer0.org1.example.com/tls/ca.crt"
|
||||||
peerEndpoint = "localhost:7051"
|
peerEndpoint = "localhost:7051"
|
||||||
gatewayPeer = "peer0.org1.example.com"
|
gatewayPeer = "peer0.org1.example.com"
|
||||||
channelName = "mychannel"
|
|
||||||
chaincodeName = "basic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var now = time.Now()
|
var now = time.Now()
|
||||||
var assetId = fmt.Sprintf("asset%d", now.Unix()*1e3+int64(now.Nanosecond())/1e6)
|
var assetId = fmt.Sprintf("asset%d", now.Unix()*1e3+int64(now.Nanosecond())/1e6)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("============ application-golang starts ============")
|
|
||||||
|
|
||||||
// The gRPC client connection should be shared by all Gateway connections to this endpoint
|
// The gRPC client connection should be shared by all Gateway connections to this endpoint
|
||||||
clientConnection := newGrpcConnection()
|
clientConnection := newGrpcConnection()
|
||||||
defer clientConnection.Close()
|
defer clientConnection.Close()
|
||||||
|
|
@ -51,7 +47,7 @@ func main() {
|
||||||
sign := newSign()
|
sign := newSign()
|
||||||
|
|
||||||
// Create a Gateway connection for a specific client identity
|
// Create a Gateway connection for a specific client identity
|
||||||
gateway, err := client.Connect(
|
gw, err := client.Connect(
|
||||||
id,
|
id,
|
||||||
client.WithSign(sign),
|
client.WithSign(sign),
|
||||||
client.WithClientConnection(clientConnection),
|
client.WithClientConnection(clientConnection),
|
||||||
|
|
@ -64,30 +60,28 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer gateway.Close()
|
defer gw.Close()
|
||||||
|
|
||||||
network := gateway.GetNetwork(channelName)
|
// Override default values for chaincode and channel name as they may differ in testing contexts.
|
||||||
|
chaincodeName := "basic"
|
||||||
|
if ccname := os.Getenv("CHAINCODE_NAME"); ccname != "" {
|
||||||
|
chaincodeName = ccname
|
||||||
|
}
|
||||||
|
|
||||||
|
channelName := "mychannel"
|
||||||
|
if cname := os.Getenv("CHANNEL_NAME"); cname != "" {
|
||||||
|
channelName = cname
|
||||||
|
}
|
||||||
|
|
||||||
|
network := gw.GetNetwork(channelName)
|
||||||
contract := network.GetContract(chaincodeName)
|
contract := network.GetContract(chaincodeName)
|
||||||
|
|
||||||
fmt.Println("initLedger:")
|
|
||||||
initLedger(contract)
|
initLedger(contract)
|
||||||
|
|
||||||
fmt.Println("getAllAssets:")
|
|
||||||
getAllAssets(contract)
|
getAllAssets(contract)
|
||||||
|
|
||||||
fmt.Println("createAsset:")
|
|
||||||
createAsset(contract)
|
createAsset(contract)
|
||||||
|
|
||||||
fmt.Println("readAssetByID:")
|
|
||||||
readAssetByID(contract)
|
readAssetByID(contract)
|
||||||
|
|
||||||
fmt.Println("transferAssetAsync:")
|
|
||||||
transferAssetAsync(contract)
|
transferAssetAsync(contract)
|
||||||
|
|
||||||
fmt.Println("exampleErrorHandling:")
|
|
||||||
exampleErrorHandling(contract)
|
exampleErrorHandling(contract)
|
||||||
|
|
||||||
log.Println("============ application-golang ends ============")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// newGrpcConnection creates a gRPC connection to the Gateway server.
|
// newGrpcConnection creates a gRPC connection to the Gateway server.
|
||||||
|
|
@ -125,7 +119,7 @@ func newIdentity() *identity.X509Identity {
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadCertificate(filename string) (*x509.Certificate, error) {
|
func loadCertificate(filename string) (*x509.Certificate, error) {
|
||||||
certificatePEM, err := ioutil.ReadFile(filename)
|
certificatePEM, err := os.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read certificate file: %w", err)
|
return nil, fmt.Errorf("failed to read certificate file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
@ -134,11 +128,11 @@ func loadCertificate(filename string) (*x509.Certificate, error) {
|
||||||
|
|
||||||
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
||||||
func newSign() identity.Sign {
|
func newSign() identity.Sign {
|
||||||
files, err := ioutil.ReadDir(keyPath)
|
files, err := os.ReadDir(keyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to read private key directory: %w", err))
|
panic(fmt.Errorf("failed to read private key directory: %w", err))
|
||||||
}
|
}
|
||||||
privateKeyPEM, err := ioutil.ReadFile(path.Join(keyPath, files[0].Name()))
|
privateKeyPEM, err := os.ReadFile(path.Join(keyPath, files[0].Name()))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to read private key file: %w", err))
|
panic(fmt.Errorf("failed to read private key file: %w", err))
|
||||||
|
|
@ -157,12 +151,10 @@ func newSign() identity.Sign {
|
||||||
return sign
|
return sign
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// This type of transaction would typically only be run once by an application the first time it was started after its
|
||||||
This type of transaction would typically only be run once by an application the first time it was started after its
|
// initial deployment. A new version of the chaincode deployed later would likely not need to run an "init" function.
|
||||||
initial deployment. A new version of the chaincode deployed later would likely not need to run an "init" function.
|
|
||||||
*/
|
|
||||||
func initLedger(contract *client.Contract) {
|
func initLedger(contract *client.Contract) {
|
||||||
fmt.Printf("Submit Transaction: InitLedger, function creates the initial set of assets on the ledger \n")
|
fmt.Printf("\n--> Submit Transaction: InitLedger, function creates the initial set of assets on the ledger \n")
|
||||||
|
|
||||||
_, err := contract.SubmitTransaction("InitLedger")
|
_, err := contract.SubmitTransaction("InitLedger")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -174,7 +166,7 @@ func initLedger(contract *client.Contract) {
|
||||||
|
|
||||||
// Evaluate a transaction to query ledger state.
|
// Evaluate a transaction to query ledger state.
|
||||||
func getAllAssets(contract *client.Contract) {
|
func getAllAssets(contract *client.Contract) {
|
||||||
fmt.Println("Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger")
|
fmt.Println("\n--> Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger")
|
||||||
|
|
||||||
evaluateResult, err := contract.EvaluateTransaction("GetAllAssets")
|
evaluateResult, err := contract.EvaluateTransaction("GetAllAssets")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -187,7 +179,7 @@ func getAllAssets(contract *client.Contract) {
|
||||||
|
|
||||||
// Submit a transaction synchronously, blocking until it has been committed to the ledger.
|
// Submit a transaction synchronously, blocking until it has been committed to the ledger.
|
||||||
func createAsset(contract *client.Contract) {
|
func createAsset(contract *client.Contract) {
|
||||||
fmt.Printf("Submit Transaction: CreateAsset, creates new asset with ID, Color, Size, Owner and AppraisedValue arguments \n")
|
fmt.Printf("\n--> Submit Transaction: CreateAsset, creates new asset with ID, Color, Size, Owner and AppraisedValue arguments \n")
|
||||||
|
|
||||||
_, err := contract.SubmitTransaction("CreateAsset", assetId, "yellow", "5", "Tom", "1300")
|
_, err := contract.SubmitTransaction("CreateAsset", assetId, "yellow", "5", "Tom", "1300")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -199,7 +191,7 @@ func createAsset(contract *client.Contract) {
|
||||||
|
|
||||||
// Evaluate a transaction by assetID to query ledger state.
|
// Evaluate a transaction by assetID to query ledger state.
|
||||||
func readAssetByID(contract *client.Contract) {
|
func readAssetByID(contract *client.Contract) {
|
||||||
fmt.Printf("Evaluate Transaction: ReadAsset, function returns asset attributes\n")
|
fmt.Printf("\n--> Evaluate Transaction: ReadAsset, function returns asset attributes\n")
|
||||||
|
|
||||||
evaluateResult, err := contract.EvaluateTransaction("ReadAsset", assetId)
|
evaluateResult, err := contract.EvaluateTransaction("ReadAsset", assetId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -210,25 +202,23 @@ func readAssetByID(contract *client.Contract) {
|
||||||
fmt.Printf("*** Result:%s\n", result)
|
fmt.Printf("*** Result:%s\n", result)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Submit transaction asynchronously, blocking until the transaction has been sent to the orderer, and allowing
|
||||||
Submit transaction asynchronously, blocking until the transaction has been sent to the orderer, and allowing
|
// this thread to process the chaincode response (e.g. update a UI) without waiting for the commit notification
|
||||||
this thread to process the chaincode response (e.g. update a UI) without waiting for the commit notification
|
|
||||||
*/
|
|
||||||
func transferAssetAsync(contract *client.Contract) {
|
func transferAssetAsync(contract *client.Contract) {
|
||||||
fmt.Printf("Async Submit Transaction: TransferAsset, updates existing asset owner'\n")
|
fmt.Printf("\n--> Async Submit Transaction: TransferAsset, updates existing asset owner")
|
||||||
|
|
||||||
submitResult, commit, err := contract.SubmitAsync("TransferAsset", client.WithArguments(assetId, "Mark"))
|
submitResult, commit, err := contract.SubmitAsync("TransferAsset", client.WithArguments(assetId, "Mark"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to submit transaction asynchronously: %w", err))
|
panic(fmt.Errorf("failed to submit transaction asynchronously: %w", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Successfully submitted transaction to transfer ownership from %s to Mark. \n", string(submitResult))
|
fmt.Printf("\n*** Successfully submitted transaction to transfer ownership from %s to Mark. \n", string(submitResult))
|
||||||
fmt.Println("Waiting for transaction commit.")
|
fmt.Println("*** Waiting for transaction commit.")
|
||||||
|
|
||||||
if status, err := commit.Status(); err != nil {
|
if commitStatus, err := commit.Status(); err != nil {
|
||||||
panic(fmt.Errorf("failed to get commit status: %w", err))
|
panic(fmt.Errorf("failed to get commit status: %w", err))
|
||||||
} else if !status.Successful {
|
} else if !commitStatus.Successful {
|
||||||
panic(fmt.Errorf("transaction %s failed to commit with status: %d", status.TransactionID, int32(status.Code)))
|
panic(fmt.Errorf("transaction %s failed to commit with status: %d", commitStatus.TransactionID, int32(commitStatus.Code)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("*** Transaction committed successfully\n")
|
fmt.Printf("*** Transaction committed successfully\n")
|
||||||
|
|
@ -236,40 +226,53 @@ func transferAssetAsync(contract *client.Contract) {
|
||||||
|
|
||||||
// Submit transaction, passing in the wrong number of arguments ,expected to throw an error containing details of any error responses from the smart contract.
|
// Submit transaction, passing in the wrong number of arguments ,expected to throw an error containing details of any error responses from the smart contract.
|
||||||
func exampleErrorHandling(contract *client.Contract) {
|
func exampleErrorHandling(contract *client.Contract) {
|
||||||
fmt.Println("Submit Transaction: UpdateAsset asset70, asset70 does not exist and should return an error")
|
fmt.Println("\n--> Submit Transaction: UpdateAsset asset70, asset70 does not exist and should return an error")
|
||||||
|
|
||||||
_, err := contract.SubmitTransaction("UpdateAsset")
|
_, err := contract.SubmitTransaction("UpdateAsset", "asset70", "blue", "5", "Tomoko", "300")
|
||||||
if err != nil {
|
if err == nil {
|
||||||
switch err := err.(type) {
|
panic("******** FAILED to return an error")
|
||||||
case *client.EndorseError:
|
}
|
||||||
fmt.Printf("Endorse error with gRPC status %v: %s\n", status.Code(err), err)
|
|
||||||
case *client.SubmitError:
|
fmt.Println("*** Successfully caught the error:")
|
||||||
fmt.Printf("Submit error with gRPC status %v: %s\n", status.Code(err), err)
|
|
||||||
case *client.CommitStatusError:
|
switch err := err.(type) {
|
||||||
if errors.Is(err, context.DeadlineExceeded) {
|
case *client.EndorseError:
|
||||||
fmt.Printf("Timeout waiting for transaction %s commit status: %s", err.TransactionID, err)
|
fmt.Printf("Endorse error for transaction %s with gRPC status %v: %s\n", err.TransactionID, status.Code(err), err)
|
||||||
} else {
|
case *client.SubmitError:
|
||||||
fmt.Printf("Error obtaining commit status with gRPC status %v: %s\n", status.Code(err), err)
|
fmt.Printf("Submit error for transaction %s with gRPC status %v: %s\n", err.TransactionID, status.Code(err), err)
|
||||||
}
|
case *client.CommitStatusError:
|
||||||
case *client.CommitError:
|
if errors.Is(err, context.DeadlineExceeded) {
|
||||||
fmt.Printf("Transaction %s failed to commit with status %d: %s\n", err.TransactionID, int32(err.Code), err)
|
fmt.Printf("Timeout waiting for transaction %s commit status: %s", err.TransactionID, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Error obtaining commit status for transaction %s with gRPC status %v: %s\n", err.TransactionID, status.Code(err), err)
|
||||||
}
|
}
|
||||||
/*
|
case *client.CommitError:
|
||||||
Any error that originates from a peer or orderer node external to the gateway will have its details
|
fmt.Printf("Transaction %s failed to commit with status %d: %s\n", err.TransactionID, int32(err.Code), err)
|
||||||
embedded within the gRPC status error. The following code shows how to extract that.
|
default:
|
||||||
*/
|
panic(fmt.Errorf("unexpected error type %T: %w", err, err))
|
||||||
statusErr := status.Convert(err)
|
}
|
||||||
for _, detail := range statusErr.Details() {
|
|
||||||
errDetail := detail.(*gwproto.ErrorDetail)
|
// Any error that originates from a peer or orderer node external to the gateway will have its details
|
||||||
fmt.Printf("Error from endpoint: %s, mspId: %s, message: %s\n", errDetail.Address, errDetail.MspId, errDetail.Message)
|
// embedded within the gRPC status error. The following code shows how to extract that.
|
||||||
|
statusErr := status.Convert(err)
|
||||||
|
|
||||||
|
details := statusErr.Details()
|
||||||
|
if len(details) > 0 {
|
||||||
|
fmt.Println("Error Details:")
|
||||||
|
|
||||||
|
for _, detail := range details {
|
||||||
|
switch detail := detail.(type) {
|
||||||
|
case *gateway.ErrorDetail:
|
||||||
|
fmt.Printf("- address: %s, mspId: %s, message: %s\n", detail.Address, detail.MspId, detail.Message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Format JSON data
|
// Format JSON data
|
||||||
func formatJSON(data []byte) string {
|
func formatJSON(data []byte) string {
|
||||||
var prettyJSON bytes.Buffer
|
var prettyJSON bytes.Buffer
|
||||||
if err := json.Indent(&prettyJSON, data, " ", ""); err != nil {
|
if err := json.Indent(&prettyJSON, data, "", " "); err != nil {
|
||||||
panic(fmt.Errorf("failed to parse JSON: %w", err))
|
panic(fmt.Errorf("failed to parse JSON: %w", err))
|
||||||
}
|
}
|
||||||
return prettyJSON.String()
|
return prettyJSON.String()
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,19 @@
|
||||||
module assetTransfer
|
module assetTransfer
|
||||||
|
|
||||||
go 1.16
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0
|
github.com/hyperledger/fabric-gateway v1.2.2
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20211118165945-23d738fc3553
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
|
google.golang.org/grpc v1.53.0
|
||||||
golang.org/x/text v0.3.7 // indirect
|
)
|
||||||
google.golang.org/grpc v1.42.0
|
|
||||||
|
require (
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,488 +1,31 @@
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
|
||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
|
||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
|
||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
|
||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
|
||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
|
||||||
github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg=
|
|
||||||
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
|
||||||
github.com/Shopify/sarama v1.27.2 h1:1EyY1dsxNDUQEv0O/4TsjosHI2CgB1uo9H/v56xzTxc=
|
|
||||||
github.com/Shopify/sarama v1.27.2/go.mod h1:g5s5osgELxgM+Md9Qni9rzo7Rbt+vvFQI4bt/Mc93II=
|
|
||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
|
||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
|
||||||
github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw=
|
|
||||||
github.com/cucumber/godog v0.12.1/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6Tm9t5pIc=
|
|
||||||
github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
|
|
||||||
github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
|
||||||
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
|
|
||||||
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
|
||||||
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
|
|
||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
|
||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
|
||||||
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
|
||||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/hyperledger/fabric-gateway v1.2.2 h1:8Al1U2ciEtkiZ21701qbf9oOfd+4Y0inQUhTx1bDRMM=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/hyperledger/fabric-gateway v1.2.2/go.mod h1:Ziu7mVxlE2MCwmH0S8zK3WylwEMq1fVBgf+M8OJglQc=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0 h1:+J5f5uPzlgyfyeQ0nnqmuFYQvARGYG8SnZ8xODXlAsI=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0/go.mod h1:smwq1q6eKByqQAp0SYdVvE1MvDoneF373j11XwWajgA=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8=
|
|
||||||
github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
|
||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
|
||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
|
||||||
github.com/hyperledger/fabric v2.1.1+incompatible h1:cYYRv3vVg4kA6DmrixLxwn1nwBEUuYda8DsMwlaMKbY=
|
|
||||||
github.com/hyperledger/fabric v2.1.1+incompatible/go.mod h1:tGFAOCT696D3rG0Vofd2dyWYLySHlh0aQjf7Q1HAju0=
|
|
||||||
github.com/hyperledger/fabric-amcl v0.0.0-20200424173818-327c9e2cf77a h1:JAKZdGuUIjVmES0X31YUD7UqMR2rz/kxLluJuGvsXPk=
|
|
||||||
github.com/hyperledger/fabric-amcl v0.0.0-20200424173818-327c9e2cf77a/go.mod h1:X+DIyUsaTmalOpmpQfIvFZjKHQedrURQ5t4YqquX7lE=
|
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0 h1:bki1JYYdQzRGHFArxtgG4wyH6sbFNbYn3PzpdeDfjdk=
|
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0/go.mod h1:uaRZyC+xzfucPqZIJpesdEsugVvChPhDxZiZmDRSFd4=
|
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20211118165945-23d738fc3553 h1:E9f0v1q4EDfrE+0LdkxVtdYKAZ7PGCaj1bBx45R9yEQ=
|
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20211118165945-23d738fc3553/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
|
||||||
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
|
|
||||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/klauspost/compress v1.11.0 h1:wJbzvpYMVGG9iTI9VxpnNZfd4DzMPoCWze3GgSqz8yg=
|
|
||||||
github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
|
||||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
|
||||||
github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw=
|
|
||||||
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
|
||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks=
|
|
||||||
github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
|
||||||
github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
|
|
||||||
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
|
||||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
||||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
|
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
|
||||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
|
||||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
|
|
||||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
|
||||||
github.com/sykesm/zap-logfmt v0.0.4 h1:U2WzRvmIWG1wDLCFY3sz8UeEmsdHQjHFNlIdmroVFaI=
|
|
||||||
github.com/sykesm/zap-logfmt v0.0.4/go.mod h1:AuBd9xQjAe3URrWT1BBDk2v2onAZHkZkWRMiYZXiZWA=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
|
|
||||||
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
|
||||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
|
||||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
|
||||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
|
||||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
|
||||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
|
||||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
|
||||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
|
||||||
go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
|
||||||
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
|
|
||||||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
|
||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
|
||||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
|
||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
|
||||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
|
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08 h1:WecRHqgE09JBkh/584XIE6PMz5KKE/vER4izNUi30AQ=
|
|
||||||
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 h1:EfLuoKW5WfkgVdDy7dTK8qSbH37AX5mj/MFh+bGPz14=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
|
||||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
|
|
||||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
|
|
||||||
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
|
|
||||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
|
|
||||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
|
|
||||||
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
|
|
||||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg=
|
|
||||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
|
|
||||||
gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
|
|
||||||
gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
|
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,15 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// This dependency is used by the application.
|
implementation 'org.hyperledger.fabric:fabric-gateway:1.1.1'
|
||||||
implementation 'org.hyperledger.fabric:fabric-gateway:1.0.0'
|
implementation 'io.grpc:grpc-netty-shaded:1.50.1'
|
||||||
implementation 'io.grpc:grpc-netty-shaded:1.42.0'
|
implementation 'com.google.code.gson:gson:2.9.1'
|
||||||
implementation 'com.google.code.gson:gson:2.8.9'
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(11)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@
|
||||||
* in the user manual at https://docs.gradle.org/6.5/userguide/multi_project_builds.html
|
* in the user manual at https://docs.gradle.org/6.5/userguide/multi_project_builds.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rootProject.name = 'application-java'
|
rootProject.name = 'asset-transfer-basic'
|
||||||
|
|
|
||||||
|
|
@ -4,62 +4,52 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.security.InvalidKeyException;
|
|
||||||
import java.security.PrivateKey;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import io.grpc.ManagedChannel;
|
import io.grpc.ManagedChannel;
|
||||||
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
|
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
|
||||||
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
|
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
|
||||||
import org.hyperledger.fabric.client.CallOption;
|
|
||||||
import org.hyperledger.fabric.client.CommitException;
|
import org.hyperledger.fabric.client.CommitException;
|
||||||
import org.hyperledger.fabric.client.CommitStatusException;
|
import org.hyperledger.fabric.client.CommitStatusException;
|
||||||
import org.hyperledger.fabric.client.Contract;
|
import org.hyperledger.fabric.client.Contract;
|
||||||
import org.hyperledger.fabric.client.EndorseException;
|
import org.hyperledger.fabric.client.EndorseException;
|
||||||
import org.hyperledger.fabric.client.Gateway;
|
import org.hyperledger.fabric.client.Gateway;
|
||||||
import org.hyperledger.fabric.client.GatewayException;
|
import org.hyperledger.fabric.client.GatewayException;
|
||||||
import org.hyperledger.fabric.client.Network;
|
|
||||||
import org.hyperledger.fabric.client.Status;
|
|
||||||
import org.hyperledger.fabric.client.SubmitException;
|
import org.hyperledger.fabric.client.SubmitException;
|
||||||
import org.hyperledger.fabric.client.SubmittedTransaction;
|
|
||||||
import org.hyperledger.fabric.client.identity.Identities;
|
import org.hyperledger.fabric.client.identity.Identities;
|
||||||
import org.hyperledger.fabric.client.identity.Identity;
|
import org.hyperledger.fabric.client.identity.Identity;
|
||||||
import org.hyperledger.fabric.client.identity.Signer;
|
import org.hyperledger.fabric.client.identity.Signer;
|
||||||
import org.hyperledger.fabric.client.identity.Signers;
|
import org.hyperledger.fabric.client.identity.Signers;
|
||||||
import org.hyperledger.fabric.client.identity.X509Identity;
|
import org.hyperledger.fabric.client.identity.X509Identity;
|
||||||
import org.hyperledger.fabric.protos.gateway.ErrorDetail;
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public final class App {
|
public final class App {
|
||||||
private static final String mspID = "Org1MSP";
|
private static final String MSP_ID = System.getenv().getOrDefault("MSP_ID", "Org1MSP");
|
||||||
private static final String channelName = "mychannel";
|
private static final String CHANNEL_NAME = System.getenv().getOrDefault("CHANNEL_NAME", "mychannel");
|
||||||
private static final String chaincodeName = "basic";
|
private static final String CHAINCODE_NAME = System.getenv().getOrDefault("CHAINCODE_NAME", "basic");
|
||||||
|
|
||||||
// Path to crypto materials.
|
// Path to crypto materials.
|
||||||
private static final Path cryptoPath = Paths.get("..", "..", "test-network", "organizations", "peerOrganizations", "org1.example.com");
|
private static final Path CRYPTO_PATH = Paths.get("../../test-network/organizations/peerOrganizations/org1.example.com");
|
||||||
// Path to user certificate.
|
// Path to user certificate.
|
||||||
private static final Path certPath = cryptoPath.resolve(Paths.get("users", "User1@org1.example.com", "msp", "signcerts", "cert.pem"));
|
private static final Path CERT_PATH = CRYPTO_PATH.resolve(Paths.get("users/User1@org1.example.com/msp/signcerts/cert.pem"));
|
||||||
// Path to user private key directory.
|
// Path to user private key directory.
|
||||||
private static final Path keyDirPath = cryptoPath.resolve(Paths.get("users", "User1@org1.example.com", "msp", "keystore"));
|
private static final Path KEY_DIR_PATH = CRYPTO_PATH.resolve(Paths.get("users/User1@org1.example.com/msp/keystore"));
|
||||||
// Path to peer tls certificate.
|
// Path to peer tls certificate.
|
||||||
private static final Path tlsCertPath = cryptoPath.resolve(Paths.get("peers", "peer0.org1.example.com", "tls", "ca.crt"));
|
private static final Path TLS_CERT_PATH = CRYPTO_PATH.resolve(Paths.get("peers/peer0.org1.example.com/tls/ca.crt"));
|
||||||
|
|
||||||
// Gateway peer end point.
|
// Gateway peer end point.
|
||||||
private static final String peerEndpoint = "localhost:7051";
|
private static final String PEER_ENDPOINT = "localhost:7051";
|
||||||
private static final String overrideAuth = "peer0.org1.example.com";
|
private static final String OVERRIDE_AUTH = "peer0.org1.example.com";
|
||||||
|
|
||||||
private final Contract contract;
|
private final Contract contract;
|
||||||
private final String assetId = "asset" + Instant.now().toEpochMilli();
|
private final String assetId = "asset" + Instant.now().toEpochMilli();
|
||||||
|
|
@ -68,16 +58,16 @@ public final class App {
|
||||||
public static void main(final String[] args) throws Exception {
|
public static void main(final String[] args) throws Exception {
|
||||||
// The gRPC client connection should be shared by all Gateway connections to
|
// The gRPC client connection should be shared by all Gateway connections to
|
||||||
// this endpoint.
|
// this endpoint.
|
||||||
ManagedChannel channel = newGrpcConnection();
|
var channel = newGrpcConnection();
|
||||||
|
|
||||||
Gateway.Builder builder = Gateway.newInstance().identity(newIdentity()).signer(newSigner()).connection(channel)
|
var builder = Gateway.newInstance().identity(newIdentity()).signer(newSigner()).connection(channel)
|
||||||
// Default timeouts for different gRPC calls
|
// Default timeouts for different gRPC calls
|
||||||
.evaluateOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
|
.evaluateOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS))
|
||||||
.endorseOptions(CallOption.deadlineAfter(15, TimeUnit.SECONDS))
|
.endorseOptions(options -> options.withDeadlineAfter(15, TimeUnit.SECONDS))
|
||||||
.submitOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
|
.submitOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS))
|
||||||
.commitStatusOptions(CallOption.deadlineAfter(1, TimeUnit.MINUTES));
|
.commitStatusOptions(options -> options.withDeadlineAfter(1, TimeUnit.MINUTES));
|
||||||
|
|
||||||
try (Gateway gateway = builder.connect()) {
|
try (var gateway = builder.connect()) {
|
||||||
new App(gateway).run();
|
new App(gateway).run();
|
||||||
} finally {
|
} finally {
|
||||||
channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
|
channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
|
||||||
|
|
@ -85,38 +75,41 @@ public final class App {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ManagedChannel newGrpcConnection() throws IOException, CertificateException {
|
private static ManagedChannel newGrpcConnection() throws IOException, CertificateException {
|
||||||
Reader tlsCertReader = Files.newBufferedReader(tlsCertPath);
|
var tlsCertReader = Files.newBufferedReader(TLS_CERT_PATH);
|
||||||
X509Certificate tlsCert = Identities.readX509Certificate(tlsCertReader);
|
var tlsCert = Identities.readX509Certificate(tlsCertReader);
|
||||||
|
|
||||||
return NettyChannelBuilder.forTarget(peerEndpoint)
|
return NettyChannelBuilder.forTarget(PEER_ENDPOINT)
|
||||||
.sslContext(GrpcSslContexts.forClient().trustManager(tlsCert).build()).overrideAuthority(overrideAuth)
|
.sslContext(GrpcSslContexts.forClient().trustManager(tlsCert).build()).overrideAuthority(OVERRIDE_AUTH)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Identity newIdentity() throws IOException, CertificateException {
|
private static Identity newIdentity() throws IOException, CertificateException {
|
||||||
Reader certReader = Files.newBufferedReader(certPath);
|
var certReader = Files.newBufferedReader(CERT_PATH);
|
||||||
X509Certificate certificate = Identities.readX509Certificate(certReader);
|
var certificate = Identities.readX509Certificate(certReader);
|
||||||
|
|
||||||
return new X509Identity(mspID, certificate);
|
return new X509Identity(MSP_ID, certificate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Signer newSigner() throws IOException, InvalidKeyException {
|
private static Signer newSigner() throws IOException, InvalidKeyException {
|
||||||
Path keyPath = Files.list(keyDirPath)
|
var keyReader = Files.newBufferedReader(getPrivateKeyPath());
|
||||||
.findFirst()
|
var privateKey = Identities.readPrivateKey(keyReader);
|
||||||
.orElseThrow();
|
|
||||||
Reader keyReader = Files.newBufferedReader(keyPath);
|
|
||||||
PrivateKey privateKey = Identities.readPrivateKey(keyReader);
|
|
||||||
|
|
||||||
return Signers.newPrivateKeySigner(privateKey);
|
return Signers.newPrivateKeySigner(privateKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Path getPrivateKeyPath() throws IOException {
|
||||||
|
try (var keyFiles = Files.list(KEY_DIR_PATH)) {
|
||||||
|
return keyFiles.findFirst().orElseThrow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public App(final Gateway gateway) {
|
public App(final Gateway gateway) {
|
||||||
// Get a network instance representing the channel where the smart contract is
|
// Get a network instance representing the channel where the smart contract is
|
||||||
// deployed.
|
// deployed.
|
||||||
Network network = gateway.getNetwork(channelName);
|
var network = gateway.getNetwork(CHANNEL_NAME);
|
||||||
|
|
||||||
// Get the smart contract from the network.
|
// Get the smart contract from the network.
|
||||||
contract = network.getContract(chaincodeName);
|
contract = network.getContract(CHAINCODE_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() throws GatewayException, CommitException {
|
public void run() throws GatewayException, CommitException {
|
||||||
|
|
@ -158,7 +151,7 @@ public final class App {
|
||||||
private void getAllAssets() throws GatewayException {
|
private void getAllAssets() throws GatewayException {
|
||||||
System.out.println("\n--> Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger");
|
System.out.println("\n--> Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger");
|
||||||
|
|
||||||
byte[] result = contract.evaluateTransaction("GetAllAssets");
|
var result = contract.evaluateTransaction("GetAllAssets");
|
||||||
|
|
||||||
System.out.println("*** Result: " + prettyJson(result));
|
System.out.println("*** Result: " + prettyJson(result));
|
||||||
}
|
}
|
||||||
|
|
@ -168,7 +161,7 @@ public final class App {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String prettyJson(final String json) {
|
private String prettyJson(final String json) {
|
||||||
JsonElement parsedJson = JsonParser.parseString(json);
|
var parsedJson = JsonParser.parseString(json);
|
||||||
return gson.toJson(parsedJson);
|
return gson.toJson(parsedJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,19 +185,19 @@ public final class App {
|
||||||
private void transferAssetAsync() throws EndorseException, SubmitException, CommitStatusException {
|
private void transferAssetAsync() throws EndorseException, SubmitException, CommitStatusException {
|
||||||
System.out.println("\n--> Async Submit Transaction: TransferAsset, updates existing asset owner");
|
System.out.println("\n--> Async Submit Transaction: TransferAsset, updates existing asset owner");
|
||||||
|
|
||||||
SubmittedTransaction commit = contract.newProposal("TransferAsset")
|
var commit = contract.newProposal("TransferAsset")
|
||||||
.addArguments(assetId, "Saptha")
|
.addArguments(assetId, "Saptha")
|
||||||
.build()
|
.build()
|
||||||
.endorse()
|
.endorse()
|
||||||
.submitAsync();
|
.submitAsync();
|
||||||
|
|
||||||
byte[] result = commit.getResult();
|
var result = commit.getResult();
|
||||||
String oldOwner = new String(result, StandardCharsets.UTF_8);
|
var oldOwner = new String(result, StandardCharsets.UTF_8);
|
||||||
|
|
||||||
System.out.println("*** Successfully submitted transaction to transfer ownership from " + oldOwner + " to Saptha");
|
System.out.println("*** Successfully submitted transaction to transfer ownership from " + oldOwner + " to Saptha");
|
||||||
System.out.println("*** Waiting for transaction commit");
|
System.out.println("*** Waiting for transaction commit");
|
||||||
|
|
||||||
Status status = commit.getStatus();
|
var status = commit.getStatus();
|
||||||
if (!status.isSuccessful()) {
|
if (!status.isSuccessful()) {
|
||||||
throw new RuntimeException("Transaction " + status.getTransactionId() +
|
throw new RuntimeException("Transaction " + status.getTransactionId() +
|
||||||
" failed to commit with status code " + status.getCode());
|
" failed to commit with status code " + status.getCode());
|
||||||
|
|
@ -216,7 +209,7 @@ public final class App {
|
||||||
private void readAssetById() throws GatewayException {
|
private void readAssetById() throws GatewayException {
|
||||||
System.out.println("\n--> Evaluate Transaction: ReadAsset, function returns asset attributes");
|
System.out.println("\n--> Evaluate Transaction: ReadAsset, function returns asset attributes");
|
||||||
|
|
||||||
byte[] evaluateResult = contract.evaluateTransaction("ReadAsset", assetId);
|
var evaluateResult = contract.evaluateTransaction("ReadAsset", assetId);
|
||||||
|
|
||||||
System.out.println("*** Result:" + prettyJson(evaluateResult));
|
System.out.println("*** Result:" + prettyJson(evaluateResult));
|
||||||
}
|
}
|
||||||
|
|
@ -237,10 +230,10 @@ public final class App {
|
||||||
e.printStackTrace(System.out);
|
e.printStackTrace(System.out);
|
||||||
System.out.println("Transaction ID: " + e.getTransactionId());
|
System.out.println("Transaction ID: " + e.getTransactionId());
|
||||||
|
|
||||||
List<ErrorDetail> details = e.getDetails();
|
var details = e.getDetails();
|
||||||
if (!details.isEmpty()) {
|
if (!details.isEmpty()) {
|
||||||
System.out.println("Error Details:");
|
System.out.println("Error Details:");
|
||||||
for (ErrorDetail detail : details) {
|
for (var detail : details) {
|
||||||
System.out.println("- address: " + detail.getAddress() + ", mspId: " + detail.getMspId()
|
System.out.println("- address: " + detail.getAddress() + ", mspId: " + detail.getMspId()
|
||||||
+ ", message: " + detail.getMessage());
|
+ ", message: " + detail.getMessage());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,14 @@
|
||||||
"author": "Hyperledger",
|
"author": "Hyperledger",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hyperledger/fabric-gateway": "^1.0.0",
|
"@hyperledger/fabric-gateway": "^1.1.1"
|
||||||
"@grpc/grpc-js": "^1.5.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tsconfig/node14": "^1.0.1",
|
"@tsconfig/node14": "^1.0.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.6.0",
|
"@types/node": "^14.18.16",
|
||||||
"@typescript-eslint/parser": "^5.6.0",
|
"@typescript-eslint/eslint-plugin": "^5.22.0",
|
||||||
"eslint": "^8.4.1",
|
"@typescript-eslint/parser": "^5.22.0",
|
||||||
"typescript": "~4.5.2"
|
"eslint": "^8.14.0",
|
||||||
|
"typescript": "~4.6.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
@ -25,7 +24,10 @@ func main() {
|
||||||
log.Fatalf("Error setting DISCOVERY_AS_LOCALHOST environment variable: %v", err)
|
log.Fatalf("Error setting DISCOVERY_AS_LOCALHOST environment variable: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
wallet, err := gateway.NewFileSystemWallet("wallet")
|
walletPath := "wallet"
|
||||||
|
// remove any existing wallet from prior runs
|
||||||
|
os.RemoveAll(walletPath)
|
||||||
|
wallet, err := gateway.NewFileSystemWallet(walletPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to create wallet: %v", err)
|
log.Fatalf("Failed to create wallet: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -56,12 +58,24 @@ func main() {
|
||||||
}
|
}
|
||||||
defer gw.Close()
|
defer gw.Close()
|
||||||
|
|
||||||
network, err := gw.GetNetwork("mychannel")
|
channelName := "mychannel"
|
||||||
|
if cname := os.Getenv("CHANNEL_NAME"); cname != "" {
|
||||||
|
channelName = cname
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("--> Connecting to channel", channelName)
|
||||||
|
network, err := gw.GetNetwork(channelName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to get network: %v", err)
|
log.Fatalf("Failed to get network: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
contract := network.GetContract("basic")
|
chaincodeName := "basic"
|
||||||
|
if ccname := os.Getenv("CHAINCODE_NAME"); ccname != "" {
|
||||||
|
chaincodeName = ccname
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("--> Using chaincode", chaincodeName)
|
||||||
|
contract := network.GetContract(chaincodeName)
|
||||||
|
|
||||||
log.Println("--> Submit Transaction: InitLedger, function creates the initial set of assets on the ledger")
|
log.Println("--> Submit Transaction: InitLedger, function creates the initial set of assets on the ledger")
|
||||||
result, err := contract.SubmitTransaction("InitLedger")
|
result, err := contract.SubmitTransaction("InitLedger")
|
||||||
|
|
@ -78,14 +92,14 @@ func main() {
|
||||||
log.Println(string(result))
|
log.Println(string(result))
|
||||||
|
|
||||||
log.Println("--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments")
|
log.Println("--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments")
|
||||||
result, err = contract.SubmitTransaction("CreateAsset", "asset13", "yellow", "5", "Tom", "1300")
|
result, err = contract.SubmitTransaction("CreateAsset", "asset113", "yellow", "5", "Tom", "1300")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to Submit transaction: %v", err)
|
log.Fatalf("Failed to Submit transaction: %v", err)
|
||||||
}
|
}
|
||||||
log.Println(string(result))
|
log.Println(string(result))
|
||||||
|
|
||||||
log.Println("--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID")
|
log.Println("--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID")
|
||||||
result, err = contract.EvaluateTransaction("ReadAsset", "asset13")
|
result, err = contract.EvaluateTransaction("ReadAsset", "asset113")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to evaluate transaction: %v\n", err)
|
log.Fatalf("Failed to evaluate transaction: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
@ -129,14 +143,14 @@ func populateWallet(wallet *gateway.Wallet) error {
|
||||||
|
|
||||||
certPath := filepath.Join(credPath, "signcerts", "cert.pem")
|
certPath := filepath.Join(credPath, "signcerts", "cert.pem")
|
||||||
// read the certificate pem
|
// read the certificate pem
|
||||||
cert, err := ioutil.ReadFile(filepath.Clean(certPath))
|
cert, err := os.ReadFile(filepath.Clean(certPath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
keyDir := filepath.Join(credPath, "keystore")
|
keyDir := filepath.Join(credPath, "keystore")
|
||||||
// there's a single file in this dir containing the private key
|
// there's a single file in this dir containing the private key
|
||||||
files, err := ioutil.ReadDir(keyDir)
|
files, err := os.ReadDir(keyDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -144,7 +158,7 @@ func populateWallet(wallet *gateway.Wallet) error {
|
||||||
return fmt.Errorf("keystore folder should have contain one file")
|
return fmt.Errorf("keystore folder should have contain one file")
|
||||||
}
|
}
|
||||||
keyPath := filepath.Join(keyDir, files[0].Name())
|
keyPath := filepath.Join(keyDir, files[0].Name())
|
||||||
key, err := ioutil.ReadFile(filepath.Clean(keyPath))
|
key, err := os.ReadFile(filepath.Clean(keyPath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,49 @@
|
||||||
module asset-transfer-basic
|
module asset-transfer-basic
|
||||||
|
|
||||||
go 1.14
|
go 1.18
|
||||||
|
|
||||||
require github.com/hyperledger/fabric-sdk-go v1.0.0-rc1
|
require github.com/hyperledger/fabric-sdk-go v1.0.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Knetic/govaluate v3.0.0+incompatible // indirect
|
||||||
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
|
github.com/cloudflare/cfssl v1.4.1 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7 // indirect
|
||||||
|
github.com/go-kit/kit v0.8.0 // indirect
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0 // indirect
|
||||||
|
github.com/golang/mock v1.4.3 // indirect
|
||||||
|
github.com/golang/protobuf v1.3.3 // indirect
|
||||||
|
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/hyperledger/fabric-config v0.0.5 // indirect
|
||||||
|
github.com/hyperledger/fabric-lib-go v1.0.0 // indirect
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23 // indirect
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 // indirect
|
||||||
|
github.com/magiconair/properties v1.8.1 // indirect
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.3.2 // indirect
|
||||||
|
github.com/pelletier/go-toml v1.8.0 // indirect
|
||||||
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/prometheus/client_golang v1.1.0 // indirect
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 // indirect
|
||||||
|
github.com/prometheus/common v0.6.0 // indirect
|
||||||
|
github.com/prometheus/procfs v0.0.3 // indirect
|
||||||
|
github.com/spf13/afero v1.3.1 // indirect
|
||||||
|
github.com/spf13/cast v1.3.1 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
|
github.com/spf13/viper v1.1.1 // indirect
|
||||||
|
github.com/stretchr/testify v1.5.1 // indirect
|
||||||
|
github.com/weppos/publicsuffix-go v0.5.0 // indirect
|
||||||
|
github.com/zmap/zcrypto v0.0.0-20190729165852-9051775e6a2e // indirect
|
||||||
|
github.com/zmap/zlint v0.0.0-20190806154020-fd021b4cfbeb // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d // indirect
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 // indirect
|
||||||
|
golang.org/x/text v0.3.2 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 // indirect
|
||||||
|
google.golang.org/grpc v1.29.1 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/hyperledger/fabric-config v0.0.5 h1:khRkm8U9Ghdg8VmZfptgzCFlCzrka8bPfUkM+/j6Zlg=
|
github.com/hyperledger/fabric-config v0.0.5 h1:khRkm8U9Ghdg8VmZfptgzCFlCzrka8bPfUkM+/j6Zlg=
|
||||||
github.com/hyperledger/fabric-config v0.0.5/go.mod h1:YpITBI/+ZayA3XWY5lF302K7PAsFYjEEPM/zr3hegA8=
|
github.com/hyperledger/fabric-config v0.0.5/go.mod h1:YpITBI/+ZayA3XWY5lF302K7PAsFYjEEPM/zr3hegA8=
|
||||||
|
|
@ -69,8 +68,8 @@ github.com/hyperledger/fabric-lib-go v1.0.0/go.mod h1:H362nMlunurmHwkYqR5uHL2UDW
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23 h1:SEbB3yH4ISTGRifDamYXAst36gO2kM855ndMJlsv+pc=
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23 h1:SEbB3yH4ISTGRifDamYXAst36gO2kM855ndMJlsv+pc=
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
||||||
github.com/hyperledger/fabric-sdk-go v1.0.0-rc1 h1:cfDo/5ovUZf2dCz08fznUxxVYEWAT4yKJcAh9b+K9Mk=
|
github.com/hyperledger/fabric-sdk-go v1.0.0 h1:NRu0iNbHV6u4nd9jgYghAdA1Ll4g0Sri4hwMEGiTbyg=
|
||||||
github.com/hyperledger/fabric-sdk-go v1.0.0-rc1/go.mod h1:qWE9Syfg1KbwNjtILk70bJLilnmCvllIYFCSY/pa1RU=
|
github.com/hyperledger/fabric-sdk-go v1.0.0/go.mod h1:qWE9Syfg1KbwNjtILk70bJLilnmCvllIYFCSY/pa1RU=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo=
|
github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo=
|
||||||
github.com/jmoiron/sqlx v0.0.0-20180124204410-05cef0741ade/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU=
|
github.com/jmoiron/sqlx v0.0.0-20180124204410-05cef0741ade/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU=
|
||||||
|
|
@ -105,7 +104,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
|
||||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
|
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E=
|
github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E=
|
||||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
|
github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
|
||||||
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
||||||
|
|
@ -223,9 +221,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ import org.hyperledger.fabric.gateway.Wallets;
|
||||||
|
|
||||||
public class App {
|
public class App {
|
||||||
|
|
||||||
|
private static final String CHANNEL_NAME = System.getenv().getOrDefault("CHANNEL_NAME", "mychannel");
|
||||||
|
private static final String CHAINCODE_NAME = System.getenv().getOrDefault("CHAINCODE_NAME", "basic");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
System.setProperty("org.hyperledger.fabric.sdk.service_discovery.as_localhost", "true");
|
System.setProperty("org.hyperledger.fabric.sdk.service_discovery.as_localhost", "true");
|
||||||
}
|
}
|
||||||
|
|
@ -33,7 +36,7 @@ public class App {
|
||||||
Path networkConfigPath = Paths.get("..", "..", "test-network", "organizations", "peerOrganizations", "org1.example.com", "connection-org1.yaml");
|
Path networkConfigPath = Paths.get("..", "..", "test-network", "organizations", "peerOrganizations", "org1.example.com", "connection-org1.yaml");
|
||||||
|
|
||||||
Gateway.Builder builder = Gateway.createBuilder();
|
Gateway.Builder builder = Gateway.createBuilder();
|
||||||
builder.identity(wallet, "appUser").networkConfig(networkConfigPath).discovery(true);
|
builder.identity(wallet, "javaAppUser").networkConfig(networkConfigPath).discovery(true);
|
||||||
return builder.connect();
|
return builder.connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,8 +53,8 @@ public class App {
|
||||||
try (Gateway gateway = connect()) {
|
try (Gateway gateway = connect()) {
|
||||||
|
|
||||||
// get the network and contract
|
// get the network and contract
|
||||||
Network network = gateway.getNetwork("mychannel");
|
Network network = gateway.getNetwork(CHANNEL_NAME);
|
||||||
Contract contract = network.getContract("basic");
|
Contract contract = network.getContract(CHAINCODE_NAME);
|
||||||
|
|
||||||
byte[] result;
|
byte[] result;
|
||||||
|
|
||||||
|
|
@ -63,14 +66,14 @@ public class App {
|
||||||
System.out.println("Evaluate Transaction: GetAllAssets, result: " + new String(result));
|
System.out.println("Evaluate Transaction: GetAllAssets, result: " + new String(result));
|
||||||
|
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
System.out.println("Submit Transaction: CreateAsset asset13");
|
System.out.println("Submit Transaction: CreateAsset asset213");
|
||||||
//CreateAsset creates an asset with ID asset13, color yellow, owner Tom, size 5 and appraisedValue of 1300
|
// CreateAsset creates an asset with ID asset213, color yellow, owner Tom, size 5 and appraisedValue of 1300
|
||||||
contract.submitTransaction("CreateAsset", "asset13", "yellow", "5", "Tom", "1300");
|
contract.submitTransaction("CreateAsset", "asset213", "yellow", "5", "Tom", "1300");
|
||||||
|
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
System.out.println("Evaluate Transaction: ReadAsset asset13");
|
System.out.println("Evaluate Transaction: ReadAsset asset213");
|
||||||
// ReadAsset returns an asset with given assetID
|
// ReadAsset returns an asset with given assetID
|
||||||
result = contract.evaluateTransaction("ReadAsset", "asset13");
|
result = contract.evaluateTransaction("ReadAsset", "asset213");
|
||||||
System.out.println("result: " + new String(result));
|
System.out.println("result: " + new String(result));
|
||||||
|
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
|
|
@ -92,7 +95,7 @@ public class App {
|
||||||
try {
|
try {
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
System.out.println("Submit Transaction: UpdateAsset asset70");
|
System.out.println("Submit Transaction: UpdateAsset asset70");
|
||||||
//Non existing asset asset70 should throw Error
|
// Non existing asset asset70 should throw Error
|
||||||
contract.submitTransaction("UpdateAsset", "asset70", "blue", "5", "Tomoko", "300");
|
contract.submitTransaction("UpdateAsset", "asset70", "blue", "5", "Tomoko", "300");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Expected an error on UpdateAsset of non-existing Asset: " + e);
|
System.err.println("Expected an error on UpdateAsset of non-existing Asset: " + e);
|
||||||
|
|
@ -110,6 +113,7 @@ public class App {
|
||||||
}
|
}
|
||||||
catch(Exception e){
|
catch(Exception e){
|
||||||
System.err.println(e);
|
System.err.println(e);
|
||||||
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,9 @@ package application.java;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
import org.hyperledger.fabric.gateway.Wallet;
|
import org.hyperledger.fabric.gateway.Wallet;
|
||||||
import org.hyperledger.fabric.gateway.Wallets;
|
import org.hyperledger.fabric.gateway.Wallets;
|
||||||
import org.hyperledger.fabric.gateway.Identities;
|
import org.hyperledger.fabric.gateway.Identities;
|
||||||
|
|
@ -32,6 +35,9 @@ public class EnrollAdmin {
|
||||||
CryptoSuite cryptoSuite = CryptoSuiteFactory.getDefault().getCryptoSuite();
|
CryptoSuite cryptoSuite = CryptoSuiteFactory.getDefault().getCryptoSuite();
|
||||||
caClient.setCryptoSuite(cryptoSuite);
|
caClient.setCryptoSuite(cryptoSuite);
|
||||||
|
|
||||||
|
// Delete wallet if it exists from prior runs
|
||||||
|
FileUtils.deleteDirectory(new File("wallet"));
|
||||||
|
|
||||||
// Create a wallet for managing identities
|
// Create a wallet for managing identities
|
||||||
Wallet wallet = Wallets.newFileSystemWallet(Paths.get("wallet"));
|
Wallet wallet = Wallets.newFileSystemWallet(Paths.get("wallet"));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,8 @@ public class RegisterUser {
|
||||||
Wallet wallet = Wallets.newFileSystemWallet(Paths.get("wallet"));
|
Wallet wallet = Wallets.newFileSystemWallet(Paths.get("wallet"));
|
||||||
|
|
||||||
// Check to see if we've already enrolled the user.
|
// Check to see if we've already enrolled the user.
|
||||||
if (wallet.get("appUser") != null) {
|
if (wallet.get("javaAppUser") != null) {
|
||||||
System.out.println("An identity for the user \"appUser\" already exists in the wallet");
|
System.out.println("An identity for the user \"javaAppUser\" already exists in the wallet");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,14 +94,14 @@ public class RegisterUser {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Register the user, enroll the user, and import the new identity into the wallet.
|
// Register the user, enroll the user, and import the new identity into the wallet.
|
||||||
RegistrationRequest registrationRequest = new RegistrationRequest("appUser");
|
RegistrationRequest registrationRequest = new RegistrationRequest("javaAppUser");
|
||||||
registrationRequest.setAffiliation("org1.department1");
|
registrationRequest.setAffiliation("org1.department1");
|
||||||
registrationRequest.setEnrollmentID("appUser");
|
registrationRequest.setEnrollmentID("javaAppUser");
|
||||||
String enrollmentSecret = caClient.register(registrationRequest, admin);
|
String enrollmentSecret = caClient.register(registrationRequest, admin);
|
||||||
Enrollment enrollment = caClient.enroll("appUser", enrollmentSecret);
|
Enrollment enrollment = caClient.enroll("javaAppUser", enrollmentSecret);
|
||||||
Identity user = Identities.newX509Identity("Org1MSP", enrollment);
|
Identity user = Identities.newX509Identity("Org1MSP", enrollment);
|
||||||
wallet.put("appUser", user);
|
wallet.put("javaAppUser", user);
|
||||||
System.out.println("Successfully enrolled user \"appUser\" and imported it into the wallet");
|
System.out.println("Successfully enrolled user \"javaAppUser\" and imported it into the wallet");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,12 @@ const path = require('path');
|
||||||
const { buildCAClient, registerAndEnrollUser, enrollAdmin } = require('../../test-application/javascript/CAUtil.js');
|
const { buildCAClient, registerAndEnrollUser, enrollAdmin } = require('../../test-application/javascript/CAUtil.js');
|
||||||
const { buildCCPOrg1, buildWallet } = require('../../test-application/javascript/AppUtil.js');
|
const { buildCCPOrg1, buildWallet } = require('../../test-application/javascript/AppUtil.js');
|
||||||
|
|
||||||
const channelName = 'mychannel';
|
const channelName = process.env.CHANNEL_NAME || 'mychannel';
|
||||||
const chaincodeName = 'basic';
|
const chaincodeName = process.env.CHAINCODE_NAME || 'basic';
|
||||||
|
|
||||||
const mspOrg1 = 'Org1MSP';
|
const mspOrg1 = 'Org1MSP';
|
||||||
const walletPath = path.join(__dirname, 'wallet');
|
const walletPath = path.join(__dirname, 'wallet');
|
||||||
const org1UserId = 'appUser';
|
const org1UserId = 'javascriptAppUser';
|
||||||
|
|
||||||
function prettyJSONString(inputString) {
|
function prettyJSONString(inputString) {
|
||||||
return JSON.stringify(JSON.parse(inputString), null, 2);
|
return JSON.stringify(JSON.parse(inputString), null, 2);
|
||||||
|
|
@ -128,14 +129,14 @@ async function main() {
|
||||||
// This will be sent to both peers and if both peers endorse the transaction, the endorsed proposal will be sent
|
// This will be sent to both peers and if both peers endorse the transaction, the endorsed proposal will be sent
|
||||||
// to the orderer to be committed by each of the peer's to the channel ledger.
|
// to the orderer to be committed by each of the peer's to the channel ledger.
|
||||||
console.log('\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments');
|
console.log('\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments');
|
||||||
result = await contract.submitTransaction('CreateAsset', 'asset13', 'yellow', '5', 'Tom', '1300');
|
result = await contract.submitTransaction('CreateAsset', 'asset313', 'yellow', '5', 'Tom', '1300');
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
if (`${result}` !== '') {
|
if (`${result}` !== '') {
|
||||||
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID');
|
console.log('\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID');
|
||||||
result = await contract.evaluateTransaction('ReadAsset', 'asset13');
|
result = await contract.evaluateTransaction('ReadAsset', 'asset313');
|
||||||
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
||||||
|
|
||||||
console.log('\n--> Evaluate Transaction: AssetExists, function returns "true" if an asset with given assetID exist');
|
console.log('\n--> Evaluate Transaction: AssetExists, function returns "true" if an asset with given assetID exist');
|
||||||
|
|
@ -174,7 +175,9 @@ async function main() {
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`******** FAILED to run the application: ${error}`);
|
console.error(`******** FAILED to run the application: ${error}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Asset-transfer-basic application implemented in JavaScript",
|
"description": "Asset-transfer-basic application implemented in JavaScript",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12",
|
"node": ">=14.14",
|
||||||
"npm": ">=5"
|
"npm": ">=6"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint *.js",
|
"lint": "eslint *.js",
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
"fabric-network": "^2.2.8"
|
"fabric-network": "^2.2.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/node": "^12.20.55",
|
||||||
"tslint": "^5.11.0",
|
"tslint": "^5.11.0",
|
||||||
"typescript": "^3.1.6"
|
"typescript": "^3.1.6"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,10 @@ import { enrollUserToWallet, registerUser, UserToEnroll, UserToRegister } from '
|
||||||
|
|
||||||
const walletPath = path.join(__dirname, 'wallet');
|
const walletPath = path.join(__dirname, 'wallet');
|
||||||
|
|
||||||
// define information about the channel and chaincode id that will be driven by this application
|
// define information about the channel and chaincode that will be driven by this application
|
||||||
const channelName = 'mychannel';
|
const channelName = envOrDefault('CHANNEL_NAME', 'mychannel');
|
||||||
const chaincodeId = 'basic';
|
const chaincodeName = envOrDefault('CHAINCODE_NAME', 'default-basic');
|
||||||
|
|
||||||
|
|
||||||
// define the CA Registrar
|
// define the CA Registrar
|
||||||
const mspOrg1 = 'Org1MSP';
|
const mspOrg1 = 'Org1MSP';
|
||||||
|
|
@ -52,13 +53,13 @@ const transactionsToSend: TransactionToSendFormat[] = [
|
||||||
{
|
{
|
||||||
request: 'submit',
|
request: 'submit',
|
||||||
txName: 'CreateAsset',
|
txName: 'CreateAsset',
|
||||||
txArgs: ['asset13', 'yellow', '5', 'Tom', '1300'],
|
txArgs: ['asset513', 'yellow', '5', 'Tom', '1300'],
|
||||||
description: '\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments',
|
description: '\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
request: 'evaluate',
|
request: 'evaluate',
|
||||||
txName: 'ReadAsset',
|
txName: 'ReadAsset',
|
||||||
txArgs: ['asset13'],
|
txArgs: ['asset513'],
|
||||||
description: '\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID',
|
description: '\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -192,7 +193,7 @@ async function main() {
|
||||||
const network = await gateway.getNetwork(channelName);
|
const network = await gateway.getNetwork(channelName);
|
||||||
|
|
||||||
// Get the contract from the network.
|
// Get the contract from the network.
|
||||||
const contract = network.getContract(chaincodeId);
|
const contract = network.getContract(chaincodeName);
|
||||||
|
|
||||||
// loop around all transactions to send, each one will be sent sequentially
|
// loop around all transactions to send, each one will be sent sequentially
|
||||||
// through the same gateway/network/contract as subsequent transations expect the
|
// through the same gateway/network/contract as subsequent transations expect the
|
||||||
|
|
@ -231,9 +232,9 @@ async function findSoftHSMPKCS11Lib() {
|
||||||
if (typeof process.env.PKCS11_LIB === 'string' && process.env.PKCS11_LIB !== '') {
|
if (typeof process.env.PKCS11_LIB === 'string' && process.env.PKCS11_LIB !== '') {
|
||||||
pkcsLibPath = process.env.PKCS11_LIB;
|
pkcsLibPath = process.env.PKCS11_LIB;
|
||||||
} else {
|
} else {
|
||||||
//
|
|
||||||
// Check common locations for PKCS library
|
// Check common locations for PKCS library
|
||||||
//
|
|
||||||
for (const pathnameToTry of commonSoftHSMPathNames) {
|
for (const pathnameToTry of commonSoftHSMPathNames) {
|
||||||
if (fs.existsSync(pathnameToTry)) {
|
if (fs.existsSync(pathnameToTry)) {
|
||||||
pkcsLibPath = pathnameToTry;
|
pkcsLibPath = pathnameToTry;
|
||||||
|
|
@ -274,5 +275,12 @@ async function interactWithFabric(contract: Contract, transactionToPerform: Tran
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined.
|
||||||
|
*/
|
||||||
|
function envOrDefault(key: string, defaultValue: string): string {
|
||||||
|
return process.env[key] || defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
// execute the main function
|
// execute the main function
|
||||||
main();
|
main();
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12",
|
"node": ">=14.14",
|
||||||
"npm": ">=5"
|
"npm": ">=6"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "tslint -c tslint.json 'src/**/*.ts'",
|
"lint": "tslint -c tslint.json 'src/**/*.ts'",
|
||||||
|
|
@ -24,8 +24,9 @@
|
||||||
"fabric-network": "^2.2.4"
|
"fabric-network": "^2.2.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/node": "^14.17.32",
|
||||||
"tslint": "^5.11.0",
|
"tslint": "^5.11.0",
|
||||||
"typescript": "^3.1.6"
|
"typescript": "~4.9.4"
|
||||||
},
|
},
|
||||||
"nyc": {
|
"nyc": {
|
||||||
"extension": [
|
"extension": [
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,12 @@ import * as path from 'path';
|
||||||
import { buildCCPOrg1, buildWallet, prettyJSONString } from './utils//AppUtil';
|
import { buildCCPOrg1, buildWallet, prettyJSONString } from './utils//AppUtil';
|
||||||
import { buildCAClient, enrollAdmin, registerAndEnrollUser } from './utils/CAUtil';
|
import { buildCAClient, enrollAdmin, registerAndEnrollUser } from './utils/CAUtil';
|
||||||
|
|
||||||
const channelName = 'mychannel';
|
const channelName = process.env.CHANNEL_NAME || 'mychannel';
|
||||||
const chaincodeName = 'basic';
|
const chaincodeName = process.env.CHAINCODE_NAME || 'basic';
|
||||||
|
|
||||||
const mspOrg1 = 'Org1MSP';
|
const mspOrg1 = 'Org1MSP';
|
||||||
const walletPath = path.join(__dirname, 'wallet');
|
const walletPath = path.join(__dirname, 'wallet');
|
||||||
const org1UserId = 'appUser';
|
const org1UserId = 'typescriptAppUser';
|
||||||
|
|
||||||
// pre-requisites:
|
// pre-requisites:
|
||||||
// - fabric-sample two organization test-network setup with two peers, ordering service,
|
// - fabric-sample two organization test-network setup with two peers, ordering service,
|
||||||
|
|
@ -47,11 +48,10 @@ const org1UserId = 'appUser';
|
||||||
*/
|
*/
|
||||||
// Delete the /fabric-samples/asset-transfer-basic/application-typescript/wallet directory
|
// Delete the /fabric-samples/asset-transfer-basic/application-typescript/wallet directory
|
||||||
// and retry this application.
|
// and retry this application.
|
||||||
//
|
|
||||||
// The certificate authority must have been restarted and the saved certificates for the
|
// The certificate authority must have been restarted and the saved certificates for the
|
||||||
// admin and application user are not valid. Deleting the wallet store will force these to be reset
|
// admin and application user are not valid. Deleting the wallet store will force these to be reset
|
||||||
// with the new certificate authority.
|
// with the new certificate authority.
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A test application to show basic queries operations with any of the asset-transfer-basic chaincodes
|
* A test application to show basic queries operations with any of the asset-transfer-basic chaincodes
|
||||||
|
|
@ -122,11 +122,11 @@ async function main() {
|
||||||
// This will be sent to both peers and if both peers endorse the transaction, the endorsed proposal will be sent
|
// This will be sent to both peers and if both peers endorse the transaction, the endorsed proposal will be sent
|
||||||
// to the orderer to be committed by each of the peer's to the channel ledger.
|
// to the orderer to be committed by each of the peer's to the channel ledger.
|
||||||
console.log('\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments');
|
console.log('\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments');
|
||||||
await contract.submitTransaction('CreateAsset', 'asset13', 'yellow', '5', 'Tom', '1300');
|
await contract.submitTransaction('CreateAsset', 'asset413', 'yellow', '5', 'Tom', '1300');
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
|
|
||||||
console.log('\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID');
|
console.log('\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID');
|
||||||
result = await contract.evaluateTransaction('ReadAsset', 'asset13');
|
result = await contract.evaluateTransaction('ReadAsset', 'asset413');
|
||||||
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
console.log(`*** Result: ${prettyJSONString(result.toString())}`);
|
||||||
|
|
||||||
console.log('\n--> Evaluate Transaction: AssetExists, function returns "true" if an asset with given assetID exist');
|
console.log('\n--> Evaluate Transaction: AssetExists, function returns "true" if an asset with given assetID exist');
|
||||||
|
|
@ -165,6 +165,7 @@ async function main() {
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`******** FAILED to run the application: ${error}`);
|
console.error(`******** FAILED to run the application: ${error}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,10 @@ const buildWallet = async (walletPath: string): Promise<Wallet> => {
|
||||||
// Create a new wallet : Note that wallet is for managing identities.
|
// Create a new wallet : Note that wallet is for managing identities.
|
||||||
let wallet: Wallet;
|
let wallet: Wallet;
|
||||||
if (walletPath) {
|
if (walletPath) {
|
||||||
|
|
||||||
|
// remove any pre-existing wallet from prior runs
|
||||||
|
fs.rmSync(walletPath, { recursive: true, force: true });
|
||||||
|
|
||||||
wallet = await Wallets.newFileSystemWallet(walletPath);
|
wallet = await Wallets.newFileSystemWallet(walletPath);
|
||||||
console.log(`Built a file system wallet at ${walletPath}`);
|
console.log(`Built a file system wallet at ${walletPath}`);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
ARG GO_VER=1.14.4
|
ARG GO_VER=1.17
|
||||||
ARG ALPINE_VER=3.12
|
ARG ALPINE_VER=3.16
|
||||||
|
|
||||||
FROM golang:${GO_VER}-alpine${ALPINE_VER}
|
FROM golang:${GO_VER}-alpine${ALPINE_VER}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ package main
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
@ -121,7 +120,7 @@ func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
return fmt.Errorf("the asset %s does not exist", id)
|
return fmt.Errorf("the asset %s does not exist", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// overwritting original asset with new asset
|
// overwriting original asset with new asset
|
||||||
asset := Asset{
|
asset := Asset{
|
||||||
ID: id,
|
ID: id,
|
||||||
Color: color,
|
Color: color,
|
||||||
|
|
@ -138,7 +137,7 @@ func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface,
|
||||||
return ctx.GetStub().PutState(id, assetJSON)
|
return ctx.GetStub().PutState(id, assetJSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteAsset deletes an given asset from the world state.
|
// DeleteAsset deletes a given asset from the world state.
|
||||||
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error {
|
func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error {
|
||||||
exists, err := s.AssetExists(ctx, id)
|
exists, err := s.AssetExists(ctx, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -254,18 +253,18 @@ func getTLSProperties() shim.TLSProperties {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if !tlsDisabled {
|
if !tlsDisabled {
|
||||||
keyBytes, err = ioutil.ReadFile(key)
|
keyBytes, err = os.ReadFile(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("error while reading the crypto file: %s", err)
|
log.Panicf("error while reading the crypto file: %s", err)
|
||||||
}
|
}
|
||||||
certBytes, err = ioutil.ReadFile(cert)
|
certBytes, err = os.ReadFile(cert)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("error while reading the crypto file: %s", err)
|
log.Panicf("error while reading the crypto file: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Did not request for the peer cert verification
|
// Did not request for the peer cert verification
|
||||||
if clientCACert != "" {
|
if clientCACert != "" {
|
||||||
clientCACertBytes, err = ioutil.ReadFile(clientCACert)
|
clientCACertBytes, err = os.ReadFile(clientCACert)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("error while reading the crypto file: %s", err)
|
log.Panicf("error while reading the crypto file: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,34 @@
|
||||||
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-external
|
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-external
|
||||||
|
|
||||||
go 1.14
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20230228194215-b84622ba6a7a
|
||||||
github.com/hyperledger/fabric-contract-api-go v1.1.0
|
github.com/hyperledger/fabric-contract-api-go v1.2.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||||
|
github.com/go-openapi/spec v0.20.8 // indirect
|
||||||
|
github.com/go-openapi/swag v0.21.1 // indirect
|
||||||
|
github.com/gobuffalo/envy v1.10.1 // indirect
|
||||||
|
github.com/gobuffalo/packd v1.0.1 // indirect
|
||||||
|
github.com/gobuffalo/packr v1.30.1 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.3.0 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.8.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
|
||||||
|
google.golang.org/grpc v1.53.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -4,9 +4,9 @@ package mocks
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes/timestamp"
|
|
||||||
"github.com/hyperledger/fabric-chaincode-go/shim"
|
"github.com/hyperledger/fabric-chaincode-go/shim"
|
||||||
"github.com/hyperledger/fabric-protos-go/peer"
|
"github.com/hyperledger/fabric-protos-go/peer"
|
||||||
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ChaincodeStub struct {
|
type ChaincodeStub struct {
|
||||||
|
|
@ -388,16 +388,16 @@ type ChaincodeStub struct {
|
||||||
getTxIDReturnsOnCall map[int]struct {
|
getTxIDReturnsOnCall map[int]struct {
|
||||||
result1 string
|
result1 string
|
||||||
}
|
}
|
||||||
GetTxTimestampStub func() (*timestamp.Timestamp, error)
|
GetTxTimestampStub func() (*timestamppb.Timestamp, error)
|
||||||
getTxTimestampMutex sync.RWMutex
|
getTxTimestampMutex sync.RWMutex
|
||||||
getTxTimestampArgsForCall []struct {
|
getTxTimestampArgsForCall []struct {
|
||||||
}
|
}
|
||||||
getTxTimestampReturns struct {
|
getTxTimestampReturns struct {
|
||||||
result1 *timestamp.Timestamp
|
result1 *timestamppb.Timestamp
|
||||||
result2 error
|
result2 error
|
||||||
}
|
}
|
||||||
getTxTimestampReturnsOnCall map[int]struct {
|
getTxTimestampReturnsOnCall map[int]struct {
|
||||||
result1 *timestamp.Timestamp
|
result1 *timestamppb.Timestamp
|
||||||
result2 error
|
result2 error
|
||||||
}
|
}
|
||||||
InvokeChaincodeStub func(string, [][]byte, string) peer.Response
|
InvokeChaincodeStub func(string, [][]byte, string) peer.Response
|
||||||
|
|
@ -413,6 +413,18 @@ type ChaincodeStub struct {
|
||||||
invokeChaincodeReturnsOnCall map[int]struct {
|
invokeChaincodeReturnsOnCall map[int]struct {
|
||||||
result1 peer.Response
|
result1 peer.Response
|
||||||
}
|
}
|
||||||
|
PurgePrivateDataStub func(string, string) error
|
||||||
|
purgePrivateDataMutex sync.RWMutex
|
||||||
|
purgePrivateDataArgsForCall []struct {
|
||||||
|
arg1 string
|
||||||
|
arg2 string
|
||||||
|
}
|
||||||
|
purgePrivateDataReturns struct {
|
||||||
|
result1 error
|
||||||
|
}
|
||||||
|
purgePrivateDataReturnsOnCall map[int]struct {
|
||||||
|
result1 error
|
||||||
|
}
|
||||||
PutPrivateDataStub func(string, string, []byte) error
|
PutPrivateDataStub func(string, string, []byte) error
|
||||||
putPrivateDataMutex sync.RWMutex
|
putPrivateDataMutex sync.RWMutex
|
||||||
putPrivateDataArgsForCall []struct {
|
putPrivateDataArgsForCall []struct {
|
||||||
|
|
@ -2261,7 +2273,7 @@ func (fake *ChaincodeStub) GetTxIDReturnsOnCall(i int, result1 string) {
|
||||||
}{result1}
|
}{result1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) GetTxTimestamp() (*timestamp.Timestamp, error) {
|
func (fake *ChaincodeStub) GetTxTimestamp() (*timestamppb.Timestamp, error) {
|
||||||
fake.getTxTimestampMutex.Lock()
|
fake.getTxTimestampMutex.Lock()
|
||||||
ret, specificReturn := fake.getTxTimestampReturnsOnCall[len(fake.getTxTimestampArgsForCall)]
|
ret, specificReturn := fake.getTxTimestampReturnsOnCall[len(fake.getTxTimestampArgsForCall)]
|
||||||
fake.getTxTimestampArgsForCall = append(fake.getTxTimestampArgsForCall, struct {
|
fake.getTxTimestampArgsForCall = append(fake.getTxTimestampArgsForCall, struct {
|
||||||
|
|
@ -2284,34 +2296,34 @@ func (fake *ChaincodeStub) GetTxTimestampCallCount() int {
|
||||||
return len(fake.getTxTimestampArgsForCall)
|
return len(fake.getTxTimestampArgsForCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) GetTxTimestampCalls(stub func() (*timestamp.Timestamp, error)) {
|
func (fake *ChaincodeStub) GetTxTimestampCalls(stub func() (*timestamppb.Timestamp, error)) {
|
||||||
fake.getTxTimestampMutex.Lock()
|
fake.getTxTimestampMutex.Lock()
|
||||||
defer fake.getTxTimestampMutex.Unlock()
|
defer fake.getTxTimestampMutex.Unlock()
|
||||||
fake.GetTxTimestampStub = stub
|
fake.GetTxTimestampStub = stub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) GetTxTimestampReturns(result1 *timestamp.Timestamp, result2 error) {
|
func (fake *ChaincodeStub) GetTxTimestampReturns(result1 *timestamppb.Timestamp, result2 error) {
|
||||||
fake.getTxTimestampMutex.Lock()
|
fake.getTxTimestampMutex.Lock()
|
||||||
defer fake.getTxTimestampMutex.Unlock()
|
defer fake.getTxTimestampMutex.Unlock()
|
||||||
fake.GetTxTimestampStub = nil
|
fake.GetTxTimestampStub = nil
|
||||||
fake.getTxTimestampReturns = struct {
|
fake.getTxTimestampReturns = struct {
|
||||||
result1 *timestamp.Timestamp
|
result1 *timestamppb.Timestamp
|
||||||
result2 error
|
result2 error
|
||||||
}{result1, result2}
|
}{result1, result2}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) GetTxTimestampReturnsOnCall(i int, result1 *timestamp.Timestamp, result2 error) {
|
func (fake *ChaincodeStub) GetTxTimestampReturnsOnCall(i int, result1 *timestamppb.Timestamp, result2 error) {
|
||||||
fake.getTxTimestampMutex.Lock()
|
fake.getTxTimestampMutex.Lock()
|
||||||
defer fake.getTxTimestampMutex.Unlock()
|
defer fake.getTxTimestampMutex.Unlock()
|
||||||
fake.GetTxTimestampStub = nil
|
fake.GetTxTimestampStub = nil
|
||||||
if fake.getTxTimestampReturnsOnCall == nil {
|
if fake.getTxTimestampReturnsOnCall == nil {
|
||||||
fake.getTxTimestampReturnsOnCall = make(map[int]struct {
|
fake.getTxTimestampReturnsOnCall = make(map[int]struct {
|
||||||
result1 *timestamp.Timestamp
|
result1 *timestamppb.Timestamp
|
||||||
result2 error
|
result2 error
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
fake.getTxTimestampReturnsOnCall[i] = struct {
|
fake.getTxTimestampReturnsOnCall[i] = struct {
|
||||||
result1 *timestamp.Timestamp
|
result1 *timestamppb.Timestamp
|
||||||
result2 error
|
result2 error
|
||||||
}{result1, result2}
|
}{result1, result2}
|
||||||
}
|
}
|
||||||
|
|
@ -2383,6 +2395,67 @@ func (fake *ChaincodeStub) InvokeChaincodeReturnsOnCall(i int, result1 peer.Resp
|
||||||
}{result1}
|
}{result1}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateData(arg1 string, arg2 string) error {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
ret, specificReturn := fake.purgePrivateDataReturnsOnCall[len(fake.purgePrivateDataArgsForCall)]
|
||||||
|
fake.purgePrivateDataArgsForCall = append(fake.purgePrivateDataArgsForCall, struct {
|
||||||
|
arg1 string
|
||||||
|
arg2 string
|
||||||
|
}{arg1, arg2})
|
||||||
|
fake.recordInvocation("PurgePrivateData", []interface{}{arg1, arg2})
|
||||||
|
fake.purgePrivateDataMutex.Unlock()
|
||||||
|
if fake.PurgePrivateDataStub != nil {
|
||||||
|
return fake.PurgePrivateDataStub(arg1, arg2)
|
||||||
|
}
|
||||||
|
if specificReturn {
|
||||||
|
return ret.result1
|
||||||
|
}
|
||||||
|
fakeReturns := fake.purgePrivateDataReturns
|
||||||
|
return fakeReturns.result1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataCallCount() int {
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
|
return len(fake.purgePrivateDataArgsForCall)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataCalls(stub func(string, string) error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = stub
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataArgsForCall(i int) (string, string) {
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
|
argsForCall := fake.purgePrivateDataArgsForCall[i]
|
||||||
|
return argsForCall.arg1, argsForCall.arg2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataReturns(result1 error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = nil
|
||||||
|
fake.purgePrivateDataReturns = struct {
|
||||||
|
result1 error
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataReturnsOnCall(i int, result1 error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = nil
|
||||||
|
if fake.purgePrivateDataReturnsOnCall == nil {
|
||||||
|
fake.purgePrivateDataReturnsOnCall = make(map[int]struct {
|
||||||
|
result1 error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fake.purgePrivateDataReturnsOnCall[i] = struct {
|
||||||
|
result1 error
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) PutPrivateData(arg1 string, arg2 string, arg3 []byte) error {
|
func (fake *ChaincodeStub) PutPrivateData(arg1 string, arg2 string, arg3 []byte) error {
|
||||||
var arg3Copy []byte
|
var arg3Copy []byte
|
||||||
if arg3 != nil {
|
if arg3 != nil {
|
||||||
|
|
@ -2846,6 +2919,8 @@ func (fake *ChaincodeStub) Invocations() map[string][][]interface{} {
|
||||||
defer fake.getTxTimestampMutex.RUnlock()
|
defer fake.getTxTimestampMutex.RUnlock()
|
||||||
fake.invokeChaincodeMutex.RLock()
|
fake.invokeChaincodeMutex.RLock()
|
||||||
defer fake.invokeChaincodeMutex.RUnlock()
|
defer fake.invokeChaincodeMutex.RUnlock()
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
fake.putPrivateDataMutex.RLock()
|
fake.putPrivateDataMutex.RLock()
|
||||||
defer fake.putPrivateDataMutex.RUnlock()
|
defer fake.putPrivateDataMutex.RUnlock()
|
||||||
fake.putStateMutex.RLock()
|
fake.putStateMutex.RLock()
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ type SmartContract struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Asset describes basic details of what makes up a simple asset
|
// Asset describes basic details of what makes up a simple asset
|
||||||
//Insert struct field in alphabetic order => to achieve determinism across languages
|
// Insert struct field in alphabetic order => to achieve determinism across languages
|
||||||
// golang keeps the order when marshal to json but doesn't order automatically
|
// golang keeps the order when marshal to json but doesn't order automatically
|
||||||
type Asset struct {
|
type Asset struct {
|
||||||
AppraisedValue int `json:"AppraisedValue"`
|
AppraisedValue int `json:"AppraisedValue"`
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,38 @@
|
||||||
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
|
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
|
||||||
|
|
||||||
go 1.14
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/golang/protobuf v1.3.2
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20230228194215-b84622ba6a7a
|
||||||
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
|
github.com/hyperledger/fabric-contract-api-go v1.2.1
|
||||||
github.com/hyperledger/fabric-contract-api-go v1.1.0
|
github.com/hyperledger/fabric-protos-go v0.3.0
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e
|
github.com/stretchr/testify v1.8.2
|
||||||
github.com/stretchr/testify v1.5.1
|
google.golang.org/protobuf v1.28.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||||
|
github.com/go-openapi/spec v0.20.8 // indirect
|
||||||
|
github.com/go-openapi/swag v0.21.1 // indirect
|
||||||
|
github.com/gobuffalo/envy v1.10.1 // indirect
|
||||||
|
github.com/gobuffalo/packd v1.0.1 // indirect
|
||||||
|
github.com/gobuffalo/packr v1.30.1 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.8.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
|
||||||
|
google.golang.org/grpc v1.53.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,5 +1,5 @@
|
||||||
# the first stage
|
# the first stage
|
||||||
FROM gradle:jdk11 AS GRADLE_BUILD
|
FROM gradle:7-jdk11-alpine AS GRADLE_BUILD
|
||||||
|
|
||||||
# copy the build.gradle and src code to the container
|
# copy the build.gradle and src code to the container
|
||||||
COPY src/ src/
|
COPY src/ src/
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
rootProject.name = System.getenv('CHAINCODE_NAME') ?: 'basic'
|
||||||
rootProject.name = 'basic'
|
|
||||||
|
|
@ -87,7 +87,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
Asset asset = new Asset(assetID, color, size, owner, appraisedValue);
|
Asset asset = new Asset(assetID, color, size, owner, appraisedValue);
|
||||||
//Use Genson to convert the Asset into string, sort it alphabetically and serialize it into a json string
|
// Use Genson to convert the Asset into string, sort it alphabetically and serialize it into a json string
|
||||||
String sortedJson = genson.serialize(asset);
|
String sortedJson = genson.serialize(asset);
|
||||||
stub.putStringState(assetID, sortedJson);
|
stub.putStringState(assetID, sortedJson);
|
||||||
|
|
||||||
|
|
@ -139,7 +139,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
Asset newAsset = new Asset(assetID, color, size, owner, appraisedValue);
|
Asset newAsset = new Asset(assetID, color, size, owner, appraisedValue);
|
||||||
//Use Genson to convert the Asset into string, sort it alphabetically and serialize it into a json string
|
// Use Genson to convert the Asset into string, sort it alphabetically and serialize it into a json string
|
||||||
String sortedJson = genson.serialize(newAsset);
|
String sortedJson = genson.serialize(newAsset);
|
||||||
stub.putStringState(assetID, sortedJson);
|
stub.putStringState(assetID, sortedJson);
|
||||||
return newAsset;
|
return newAsset;
|
||||||
|
|
@ -201,7 +201,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
Asset asset = genson.deserialize(assetJSON, Asset.class);
|
Asset asset = genson.deserialize(assetJSON, Asset.class);
|
||||||
|
|
||||||
Asset newAsset = new Asset(asset.getAssetID(), asset.getColor(), asset.getSize(), newOwner, asset.getAppraisedValue());
|
Asset newAsset = new Asset(asset.getAssetID(), asset.getColor(), asset.getSize(), newOwner, asset.getAppraisedValue());
|
||||||
//Use a Genson to conver the Asset into string, sort it alphabetically and serialize it into a json string
|
// Use a Genson to conver the Asset into string, sort it alphabetically and serialize it into a json string
|
||||||
String sortedJson = genson.serialize(newAsset);
|
String sortedJson = genson.serialize(newAsset);
|
||||||
stub.putStringState(assetID, sortedJson);
|
stub.putStringState(assetID, sortedJson);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ class AssetTransfer extends Contract {
|
||||||
Owner: owner,
|
Owner: owner,
|
||||||
AppraisedValue: appraisedValue,
|
AppraisedValue: appraisedValue,
|
||||||
};
|
};
|
||||||
//we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive'
|
// we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive'
|
||||||
await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset))));
|
await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset))));
|
||||||
return JSON.stringify(asset);
|
return JSON.stringify(asset);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ WORKDIR /usr/src/app
|
||||||
|
|
||||||
# Copy node.js source and build, changing owner as well
|
# Copy node.js source and build, changing owner as well
|
||||||
COPY --chown=node:node . /usr/src/app
|
COPY --chown=node:node . /usr/src/app
|
||||||
|
ENV npm_config_cache=/usr/src/app
|
||||||
RUN npm ci && npm run package
|
RUN npm ci && npm run package
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -15,16 +16,17 @@ ARG CC_SERVER_PORT
|
||||||
|
|
||||||
# Setup tini to work better handle signals
|
# Setup tini to work better handle signals
|
||||||
ENV TINI_VERSION v0.19.0
|
ENV TINI_VERSION v0.19.0
|
||||||
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
|
ENV PLATFORM=amd64
|
||||||
|
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${PLATFORM} /tini
|
||||||
RUN chmod +x /tini
|
RUN chmod +x /tini
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
COPY --chown=node:node --from=builder /usr/src/app/dist ./dist
|
COPY --chown=node:node --from=builder /usr/src/app/dist ./dist
|
||||||
COPY --chown=node:node --from=builder /usr/src/app/package.json ./
|
COPY --chown=node:node --from=builder /usr/src/app/package.json ./
|
||||||
COPY --chown=node:node --from=builder /usr/src/app/npm-shrinkwrap.json ./
|
COPY --chown=node:node --from=builder /usr/src/app/npm-shrinkwrap.json ./
|
||||||
COPY --chown=node:node docker/docker-entrypoint.sh /usr/src/app/docker-entrypoint.sh
|
COPY --chown=node:node docker/docker-entrypoint.sh /usr/src/app/docker-entrypoint.sh
|
||||||
RUN npm ci --only=production
|
|
||||||
|
RUN npm ci --omit=dev && npm cache clean --force
|
||||||
|
|
||||||
ENV PORT $CC_SERVER_PORT
|
ENV PORT $CC_SERVER_PORT
|
||||||
EXPOSE $CC_SERVER_PORT
|
EXPOSE $CC_SERVER_PORT
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -34,11 +34,11 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.1.7",
|
"@types/chai": "^4.1.7",
|
||||||
"@types/mocha": "^5.2.5",
|
"@types/mocha": "^5.2.5",
|
||||||
"@types/node": "^10.12.10",
|
"@types/node": "^12.20.55",
|
||||||
"@types/sinon": "^5.0.7",
|
"@types/sinon": "^5.0.7",
|
||||||
"@types/sinon-chai": "^3.2.1",
|
"@types/sinon-chai": "^3.2.1",
|
||||||
"chai": "^4.2.0",
|
"chai": "^4.2.0",
|
||||||
"mocha": "^5.2.0",
|
"mocha": "^10.0.0",
|
||||||
"nyc": "^14.1.1",
|
"nyc": "^14.1.1",
|
||||||
"sinon": "^7.1.1",
|
"sinon": "^7.1.1",
|
||||||
"sinon-chai": "^3.3.0",
|
"sinon-chai": "^3.3.0",
|
||||||
|
|
|
||||||
2
asset-transfer-basic/rest-api-go/.gitignore
vendored
Normal file
2
asset-transfer-basic/rest-api-go/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
Requests.http
|
||||||
|
rest-api-go
|
||||||
39
asset-transfer-basic/rest-api-go/README.md
Normal file
39
asset-transfer-basic/rest-api-go/README.md
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
# Asset Transfer REST API Sample
|
||||||
|
|
||||||
|
This is a simple REST server written in golang with endpoints for chaincode invoke and query.
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
- Setup fabric test network and deploy the asset transfer chaincode by [following this instructions](https://hyperledger-fabric.readthedocs.io/en/release-2.4/test_network.html).
|
||||||
|
|
||||||
|
- cd into rest-api-go directory
|
||||||
|
- Download required dependencies using `go mod download`
|
||||||
|
- Run `go run main.go` to run the REST server
|
||||||
|
|
||||||
|
## Sending Requests
|
||||||
|
|
||||||
|
Invoke endpoint accepts POST requests with chaincode function and arguments. Query endpoint accepts get requests with chaincode function and arguments.
|
||||||
|
|
||||||
|
Sample chaincode invoke for the "createAsset" function. Response will contain transaction ID for a successful invoke.
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
curl --request POST \
|
||||||
|
--url http://localhost:3000/invoke \
|
||||||
|
--header 'content-type: application/x-www-form-urlencoded' \
|
||||||
|
--data = \
|
||||||
|
--data channelid=mychannel \
|
||||||
|
--data chaincodeid=basic \
|
||||||
|
--data function=createAsset \
|
||||||
|
--data args=Asset123 \
|
||||||
|
--data args=yellow \
|
||||||
|
--data args=54 \
|
||||||
|
--data args=Tom \
|
||||||
|
--data args=13005
|
||||||
|
```
|
||||||
|
Sample chaincode query for getting asset details.
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
curl --request GET \
|
||||||
|
--url 'http://localhost:3000/query?channelid=mychannel&chaincodeid=basic&function=ReadAsset&args=Asset123'
|
||||||
|
```
|
||||||
19
asset-transfer-basic/rest-api-go/go.mod
Normal file
19
asset-transfer-basic/rest-api-go/go.mod
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
module rest-api-go
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/hyperledger/fabric-gateway v1.2.2
|
||||||
|
google.golang.org/grpc v1.53.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0 // indirect
|
||||||
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
|
)
|
||||||
31
asset-transfer-basic/rest-api-go/go.sum
Normal file
31
asset-transfer-basic/rest-api-go/go.sum
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
|
github.com/hyperledger/fabric-gateway v1.2.2 h1:8Al1U2ciEtkiZ21701qbf9oOfd+4Y0inQUhTx1bDRMM=
|
||||||
|
github.com/hyperledger/fabric-gateway v1.2.2/go.mod h1:Ziu7mVxlE2MCwmH0S8zK3WylwEMq1fVBgf+M8OJglQc=
|
||||||
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0 h1:+J5f5uPzlgyfyeQ0nnqmuFYQvARGYG8SnZ8xODXlAsI=
|
||||||
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0/go.mod h1:smwq1q6eKByqQAp0SYdVvE1MvDoneF373j11XwWajgA=
|
||||||
|
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
||||||
|
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
|
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||||
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||||
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 h1:EfLuoKW5WfkgVdDy7dTK8qSbH37AX5mj/MFh+bGPz14=
|
||||||
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
|
||||||
|
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
|
||||||
|
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||||
|
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
26
asset-transfer-basic/rest-api-go/main.go
Normal file
26
asset-transfer-basic/rest-api-go/main.go
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"rest-api-go/web"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//Initialize setup for Org1
|
||||||
|
cryptoPath := "../../test-network/organizations/peerOrganizations/org1.example.com"
|
||||||
|
orgConfig := web.OrgSetup{
|
||||||
|
OrgName: "Org1",
|
||||||
|
MSPID: "Org1MSP",
|
||||||
|
CertPath: cryptoPath + "/users/User1@org1.example.com/msp/signcerts/cert.pem",
|
||||||
|
KeyPath: cryptoPath + "/users/User1@org1.example.com/msp/keystore/",
|
||||||
|
TLSCertPath: cryptoPath + "/peers/peer0.org1.example.com/tls/ca.crt",
|
||||||
|
PeerEndpoint: "localhost:7051",
|
||||||
|
GatewayPeer: "peer0.org1.example.com",
|
||||||
|
}
|
||||||
|
|
||||||
|
orgSetup, err := web.Initialize(orgConfig)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error initializing setup for Org1: ", err)
|
||||||
|
}
|
||||||
|
web.Serve(web.OrgSetup(*orgSetup))
|
||||||
|
}
|
||||||
31
asset-transfer-basic/rest-api-go/web/app.go
Normal file
31
asset-transfer-basic/rest-api-go/web/app.go
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/hyperledger/fabric-gateway/pkg/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OrgSetup contains organization's config to interact with the network.
|
||||||
|
type OrgSetup struct {
|
||||||
|
OrgName string
|
||||||
|
MSPID string
|
||||||
|
CryptoPath string
|
||||||
|
CertPath string
|
||||||
|
KeyPath string
|
||||||
|
TLSCertPath string
|
||||||
|
PeerEndpoint string
|
||||||
|
GatewayPeer string
|
||||||
|
Gateway client.Gateway
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serve starts http web server.
|
||||||
|
func Serve(setups OrgSetup) {
|
||||||
|
http.HandleFunc("/query", setups.Query)
|
||||||
|
http.HandleFunc("/invoke", setups.Invoke)
|
||||||
|
fmt.Println("Listening (http://localhost:3000/)...")
|
||||||
|
if err := http.ListenAndServe(":3000", nil); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
106
asset-transfer-basic/rest-api-go/web/initialize.go
Normal file
106
asset-transfer-basic/rest-api-go/web/initialize.go
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/x509"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/hyperledger/fabric-gateway/pkg/client"
|
||||||
|
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Initialize the setup for the organization.
|
||||||
|
func Initialize(setup OrgSetup) (*OrgSetup, error) {
|
||||||
|
log.Printf("Initializing connection for %s...\n", setup.OrgName)
|
||||||
|
clientConnection := setup.newGrpcConnection()
|
||||||
|
id := setup.newIdentity()
|
||||||
|
sign := setup.newSign()
|
||||||
|
|
||||||
|
gateway, err := client.Connect(
|
||||||
|
id,
|
||||||
|
client.WithSign(sign),
|
||||||
|
client.WithClientConnection(clientConnection),
|
||||||
|
client.WithEvaluateTimeout(5*time.Second),
|
||||||
|
client.WithEndorseTimeout(15*time.Second),
|
||||||
|
client.WithSubmitTimeout(5*time.Second),
|
||||||
|
client.WithCommitStatusTimeout(1*time.Minute),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
setup.Gateway = *gateway
|
||||||
|
log.Println("Initialization complete")
|
||||||
|
return &setup, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// newGrpcConnection creates a gRPC connection to the Gateway server.
|
||||||
|
func (setup OrgSetup) newGrpcConnection() *grpc.ClientConn {
|
||||||
|
certificate, err := loadCertificate(setup.TLSCertPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
certPool := x509.NewCertPool()
|
||||||
|
certPool.AddCert(certificate)
|
||||||
|
transportCredentials := credentials.NewClientTLSFromCert(certPool, setup.GatewayPeer)
|
||||||
|
|
||||||
|
connection, err := grpc.Dial(setup.PeerEndpoint, grpc.WithTransportCredentials(transportCredentials))
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to create gRPC connection: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
return connection
|
||||||
|
}
|
||||||
|
|
||||||
|
// newIdentity creates a client identity for this Gateway connection using an X.509 certificate.
|
||||||
|
func (setup OrgSetup) newIdentity() *identity.X509Identity {
|
||||||
|
certificate, err := loadCertificate(setup.CertPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
id, err := identity.NewX509Identity(setup.MSPID, certificate)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
||||||
|
func (setup OrgSetup) newSign() identity.Sign {
|
||||||
|
files, err := ioutil.ReadDir(setup.KeyPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to read private key directory: %w", err))
|
||||||
|
}
|
||||||
|
privateKeyPEM, err := ioutil.ReadFile(path.Join(setup.KeyPath, files[0].Name()))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to read private key file: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
privateKey, err := identity.PrivateKeyFromPEM(privateKeyPEM)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sign, err := identity.NewPrivateKeySign(privateKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sign
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadCertificate(filename string) (*x509.Certificate, error) {
|
||||||
|
certificatePEM, err := ioutil.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read certificate file: %w", err)
|
||||||
|
}
|
||||||
|
return identity.CertificateFromPEM(certificatePEM)
|
||||||
|
}
|
||||||
40
asset-transfer-basic/rest-api-go/web/invoke.go
Normal file
40
asset-transfer-basic/rest-api-go/web/invoke.go
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/hyperledger/fabric-gateway/pkg/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Invoke handles chaincode invoke requests.
|
||||||
|
func (setup *OrgSetup) Invoke(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Println("Received Invoke request")
|
||||||
|
if err := r.ParseForm(); err != nil {
|
||||||
|
fmt.Fprintf(w, "ParseForm() err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
chainCodeName := r.FormValue("chaincodeid")
|
||||||
|
channelID := r.FormValue("channelid")
|
||||||
|
function := r.FormValue("function")
|
||||||
|
args := r.Form["args"]
|
||||||
|
fmt.Printf("channel: %s, chaincode: %s, function: %s, args: %s\n", channelID, chainCodeName, function, args)
|
||||||
|
network := setup.Gateway.GetNetwork(channelID)
|
||||||
|
contract := network.GetContract(chainCodeName)
|
||||||
|
txn_proposal, err := contract.NewProposal(function, client.WithArguments(args...))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(w, "Error creating txn proposal: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
txn_endorsed, err := txn_proposal.Endorse()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(w, "Error endorsing txn: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
txn_committed, err := txn_endorsed.Submit()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(w, "Error submitting transaction: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "Transaction ID : %s Response: %s", txn_committed.TransactionID(), txn_endorsed.Result())
|
||||||
|
}
|
||||||
25
asset-transfer-basic/rest-api-go/web/query.go
Normal file
25
asset-transfer-basic/rest-api-go/web/query.go
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Query handles chaincode query requests.
|
||||||
|
func (setup OrgSetup) Query(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Println("Received Query request")
|
||||||
|
queryParams := r.URL.Query()
|
||||||
|
chainCodeName := queryParams.Get("chaincodeid")
|
||||||
|
channelID := queryParams.Get("channelid")
|
||||||
|
function := queryParams.Get("function")
|
||||||
|
args := r.URL.Query()["args"]
|
||||||
|
fmt.Printf("channel: %s, chaincode: %s, function: %s, args: %s\n", channelID, chainCodeName, function, args)
|
||||||
|
network := setup.Gateway.GetNetwork(channelID)
|
||||||
|
contract := network.GetContract(chainCodeName)
|
||||||
|
evaluateResponse, err := contract.EvaluateTransaction(function, args...)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(w, "Error: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "Response: %s", evaluateResponse)
|
||||||
|
}
|
||||||
8175
asset-transfer-basic/rest-api-typescript/package-lock.json
generated
8175
asset-transfer-basic/rest-api-typescript/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -12,13 +12,13 @@
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"env-var": "^7.0.1",
|
"env-var": "^7.0.1",
|
||||||
"express": "^4.17.1",
|
"express": "^4.18.2",
|
||||||
"express-validator": "^6.12.0",
|
"express-validator": "^6.12.0",
|
||||||
"fabric-network": "^2.2.10",
|
"fabric-network": "^2.2.10",
|
||||||
"helmet": "^4.6.0",
|
"helmet": "^4.6.0",
|
||||||
"http-status-codes": "^2.1.4",
|
"http-status-codes": "^2.1.4",
|
||||||
"ioredis": "^4.27.8",
|
"ioredis": "^4.27.8",
|
||||||
"passport": "^0.4.1",
|
"passport": "^0.6.0",
|
||||||
"passport-headerapikey": "^1.2.2",
|
"passport-headerapikey": "^1.2.2",
|
||||||
"pino": "^6.11.3",
|
"pino": "^6.11.3",
|
||||||
"pino-http": "^5.5.0",
|
"pino-http": "^5.5.0",
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
"@types/express": "^4.17.12",
|
"@types/express": "^4.17.12",
|
||||||
"@types/ioredis": "^4.26.4",
|
"@types/ioredis": "^4.26.4",
|
||||||
"@types/jest": "^27.4.1",
|
"@types/jest": "^27.4.1",
|
||||||
"@types/node": "^15.14.7",
|
"@types/node": "^12.20.55",
|
||||||
"@types/passport": "^1.0.7",
|
"@types/passport": "^1.0.7",
|
||||||
"@types/pino": "^6.3.8",
|
"@types/pino": "^6.3.8",
|
||||||
"@types/pino-http": "^5.4.1",
|
"@types/pino-http": "^5.4.1",
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,10 @@ export const createServer = async (): Promise<Application> => {
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
app.use(express.urlencoded({ extended: true }));
|
app.use(express.urlencoded({ extended: true }));
|
||||||
|
|
||||||
//define passport startegy
|
// define passport startegy
|
||||||
passport.use(fabricAPIKeyStrategy);
|
passport.use(fabricAPIKeyStrategy);
|
||||||
|
|
||||||
//initialize passport js
|
// initialize passport js
|
||||||
app.use(passport.initialize());
|
app.use(passport.initialize());
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'development') {
|
if (process.env.NODE_ENV === 'development') {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
||||||
|
|
@ -62,7 +62,7 @@ func newIdentity() *identity.X509Identity {
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadCertificate(filename string) (*x509.Certificate, error) {
|
func loadCertificate(filename string) (*x509.Certificate, error) {
|
||||||
certificatePEM, err := ioutil.ReadFile(filename)
|
certificatePEM, err := os.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to read certificate file: %w", err)
|
return nil, fmt.Errorf("failed to read certificate file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
@ -71,11 +71,11 @@ func loadCertificate(filename string) (*x509.Certificate, error) {
|
||||||
|
|
||||||
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
||||||
func newSign() identity.Sign {
|
func newSign() identity.Sign {
|
||||||
files, err := ioutil.ReadDir(keyPath)
|
files, err := os.ReadDir(keyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to read private key directory: %w", err))
|
panic(fmt.Errorf("failed to read private key directory: %w", err))
|
||||||
}
|
}
|
||||||
privateKeyPEM, err := ioutil.ReadFile(path.Join(keyPath, files[0].Name()))
|
privateKeyPEM, err := os.ReadFile(path.Join(keyPath, files[0].Name()))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to read private key file: %w", err))
|
panic(fmt.Errorf("failed to read private key file: %w", err))
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,19 @@
|
||||||
module assetTransfer
|
module assetTransfer
|
||||||
|
|
||||||
go 1.16
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0
|
github.com/hyperledger/fabric-gateway v1.2.2
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20220125190318-19041b215616 // indirect
|
google.golang.org/grpc v1.53.0
|
||||||
github.com/miekg/pkcs11 v1.1.1 // indirect
|
)
|
||||||
golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba // indirect
|
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
|
require (
|
||||||
google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
google.golang.org/grpc v1.44.0
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0 // indirect
|
||||||
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,500 +1,31 @@
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
|
||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
|
||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
|
||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
|
||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
|
||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
|
||||||
github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg=
|
|
||||||
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
|
||||||
github.com/Shopify/sarama v1.27.2 h1:1EyY1dsxNDUQEv0O/4TsjosHI2CgB1uo9H/v56xzTxc=
|
|
||||||
github.com/Shopify/sarama v1.27.2/go.mod h1:g5s5osgELxgM+Md9Qni9rzo7Rbt+vvFQI4bt/Mc93II=
|
|
||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
|
||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
|
||||||
github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw=
|
|
||||||
github.com/cucumber/godog v0.12.1/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6Tm9t5pIc=
|
|
||||||
github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
|
|
||||||
github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
|
||||||
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
|
|
||||||
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
|
||||||
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
|
|
||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
|
||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
|
||||||
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
|
||||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/hyperledger/fabric-gateway v1.2.2 h1:8Al1U2ciEtkiZ21701qbf9oOfd+4Y0inQUhTx1bDRMM=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/hyperledger/fabric-gateway v1.2.2/go.mod h1:Ziu7mVxlE2MCwmH0S8zK3WylwEMq1fVBgf+M8OJglQc=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0 h1:+J5f5uPzlgyfyeQ0nnqmuFYQvARGYG8SnZ8xODXlAsI=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/hyperledger/fabric-protos-go-apiv2 v0.2.0/go.mod h1:smwq1q6eKByqQAp0SYdVvE1MvDoneF373j11XwWajgA=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8=
|
|
||||||
github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
|
||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
|
||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
|
||||||
github.com/hyperledger/fabric v2.1.1+incompatible h1:cYYRv3vVg4kA6DmrixLxwn1nwBEUuYda8DsMwlaMKbY=
|
|
||||||
github.com/hyperledger/fabric v2.1.1+incompatible/go.mod h1:tGFAOCT696D3rG0Vofd2dyWYLySHlh0aQjf7Q1HAju0=
|
|
||||||
github.com/hyperledger/fabric-amcl v0.0.0-20200424173818-327c9e2cf77a h1:JAKZdGuUIjVmES0X31YUD7UqMR2rz/kxLluJuGvsXPk=
|
|
||||||
github.com/hyperledger/fabric-amcl v0.0.0-20200424173818-327c9e2cf77a/go.mod h1:X+DIyUsaTmalOpmpQfIvFZjKHQedrURQ5t4YqquX7lE=
|
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0 h1:bki1JYYdQzRGHFArxtgG4wyH6sbFNbYn3PzpdeDfjdk=
|
|
||||||
github.com/hyperledger/fabric-gateway v1.0.0/go.mod h1:uaRZyC+xzfucPqZIJpesdEsugVvChPhDxZiZmDRSFd4=
|
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20211118165945-23d738fc3553/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20220125190318-19041b215616 h1:CZrcDuLxBorn/xvbQl/r9kC0pniDEm0GuiBn9GgfY3c=
|
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20220125190318-19041b215616/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=
|
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
|
||||||
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
|
|
||||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/klauspost/compress v1.11.0 h1:wJbzvpYMVGG9iTI9VxpnNZfd4DzMPoCWze3GgSqz8yg=
|
|
||||||
github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
|
||||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
|
||||||
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
|
||||||
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
|
||||||
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
|
||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks=
|
|
||||||
github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
|
||||||
github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
|
|
||||||
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
|
||||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
||||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
|
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
|
||||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
|
||||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
|
|
||||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
|
||||||
github.com/sykesm/zap-logfmt v0.0.4 h1:U2WzRvmIWG1wDLCFY3sz8UeEmsdHQjHFNlIdmroVFaI=
|
|
||||||
github.com/sykesm/zap-logfmt v0.0.4/go.mod h1:AuBd9xQjAe3URrWT1BBDk2v2onAZHkZkWRMiYZXiZWA=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
|
|
||||||
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
|
||||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
|
||||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
|
||||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
|
||||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
|
||||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
|
||||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
|
||||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
|
||||||
go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
|
||||||
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
|
|
||||||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
|
||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
|
||||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
|
||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
|
||||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8=
|
|
||||||
golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 h1:EfLuoKW5WfkgVdDy7dTK8qSbH37AX5mj/MFh+bGPz14=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
|
||||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 h1:zzNejm+EgrbLfDZ6lu9Uud2IVvHySPl8vQzf04laR5Q=
|
|
||||||
google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
|
||||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
|
||||||
google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=
|
|
||||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
|
|
||||||
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
|
|
||||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
|
|
||||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
|
|
||||||
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
|
|
||||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg=
|
|
||||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
|
|
||||||
gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
|
|
||||||
gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
|
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,15 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// This dependency is used by the application.
|
implementation 'org.hyperledger.fabric:fabric-gateway:1.1.1'
|
||||||
implementation 'org.hyperledger.fabric:fabric-gateway:1.0.0'
|
implementation 'io.grpc:grpc-netty-shaded:1.50.1'
|
||||||
implementation 'io.grpc:grpc-netty-shaded:1.42.0'
|
implementation 'com.google.code.gson:gson:2.9.1'
|
||||||
implementation 'com.google.code.gson:gson:2.8.9'
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(11)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@
|
||||||
* in the user manual at https://docs.gradle.org/6.5/userguide/multi_project_builds.html
|
* in the user manual at https://docs.gradle.org/6.5/userguide/multi_project_builds.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rootProject.name = 'application-gateway-java'
|
rootProject.name = 'asset-transfer-events'
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,10 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import io.grpc.ManagedChannel;
|
|
||||||
import org.hyperledger.fabric.client.CallOption;
|
|
||||||
import org.hyperledger.fabric.client.ChaincodeEvent;
|
import org.hyperledger.fabric.client.ChaincodeEvent;
|
||||||
import org.hyperledger.fabric.client.ChaincodeEventsRequest;
|
|
||||||
import org.hyperledger.fabric.client.CloseableIterator;
|
import org.hyperledger.fabric.client.CloseableIterator;
|
||||||
import org.hyperledger.fabric.client.CommitException;
|
import org.hyperledger.fabric.client.CommitException;
|
||||||
import org.hyperledger.fabric.client.CommitStatusException;
|
import org.hyperledger.fabric.client.CommitStatusException;
|
||||||
|
|
@ -24,9 +15,12 @@ import org.hyperledger.fabric.client.Contract;
|
||||||
import org.hyperledger.fabric.client.EndorseException;
|
import org.hyperledger.fabric.client.EndorseException;
|
||||||
import org.hyperledger.fabric.client.Gateway;
|
import org.hyperledger.fabric.client.Gateway;
|
||||||
import org.hyperledger.fabric.client.Network;
|
import org.hyperledger.fabric.client.Network;
|
||||||
import org.hyperledger.fabric.client.Status;
|
|
||||||
import org.hyperledger.fabric.client.SubmitException;
|
import org.hyperledger.fabric.client.SubmitException;
|
||||||
import org.hyperledger.fabric.client.SubmittedTransaction;
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public final class App {
|
public final class App {
|
||||||
private static final String channelName = "mychannel";
|
private static final String channelName = "mychannel";
|
||||||
|
|
@ -38,17 +32,17 @@ public final class App {
|
||||||
private final Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
private final Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
|
||||||
public static void main(final String[] args) throws Exception {
|
public static void main(final String[] args) throws Exception {
|
||||||
ManagedChannel grpcChannel = Connections.newGrpcConnection();
|
var grpcChannel = Connections.newGrpcConnection();
|
||||||
Gateway.Builder builder = Gateway.newInstance()
|
var builder = Gateway.newInstance()
|
||||||
.identity(Connections.newIdentity())
|
.identity(Connections.newIdentity())
|
||||||
.signer(Connections.newSigner())
|
.signer(Connections.newSigner())
|
||||||
.connection(grpcChannel)
|
.connection(grpcChannel)
|
||||||
.evaluateOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
|
.evaluateOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS))
|
||||||
.endorseOptions(CallOption.deadlineAfter(15, TimeUnit.SECONDS))
|
.endorseOptions(options -> options.withDeadlineAfter(15, TimeUnit.SECONDS))
|
||||||
.submitOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
|
.submitOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS))
|
||||||
.commitStatusOptions(CallOption.deadlineAfter(1, TimeUnit.MINUTES));
|
.commitStatusOptions(options -> options.withDeadlineAfter(1, TimeUnit.MINUTES));
|
||||||
|
|
||||||
try (Gateway gateway = builder.connect()) {
|
try (var gateway = builder.connect()) {
|
||||||
new App(gateway).run();
|
new App(gateway).run();
|
||||||
} finally {
|
} finally {
|
||||||
grpcChannel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
|
grpcChannel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
|
||||||
|
|
@ -62,8 +56,8 @@ public final class App {
|
||||||
|
|
||||||
public void run() throws EndorseException, SubmitException, CommitStatusException, CommitException {
|
public void run() throws EndorseException, SubmitException, CommitStatusException, CommitException {
|
||||||
// Listen for events emitted by subsequent transactions, stopping when the try-with-resources block exits
|
// Listen for events emitted by subsequent transactions, stopping when the try-with-resources block exits
|
||||||
try (CloseableIterator<ChaincodeEvent> eventSession = startChaincodeEventListening()) {
|
try (var eventSession = startChaincodeEventListening()) {
|
||||||
long firstBlockNumber = createAsset();
|
var firstBlockNumber = createAsset();
|
||||||
updateAsset();
|
updateAsset();
|
||||||
transferAsset();
|
transferAsset();
|
||||||
deleteAsset();
|
deleteAsset();
|
||||||
|
|
@ -76,11 +70,11 @@ public final class App {
|
||||||
private CloseableIterator<ChaincodeEvent> startChaincodeEventListening() {
|
private CloseableIterator<ChaincodeEvent> startChaincodeEventListening() {
|
||||||
System.out.println("\n*** Start chaincode event listening");
|
System.out.println("\n*** Start chaincode event listening");
|
||||||
|
|
||||||
CloseableIterator<ChaincodeEvent> eventIter = network.getChaincodeEvents(chaincodeName);
|
var eventIter = network.getChaincodeEvents(chaincodeName);
|
||||||
|
|
||||||
CompletableFuture.runAsync(() -> {
|
CompletableFuture.runAsync(() -> {
|
||||||
eventIter.forEachRemaining(event -> {
|
eventIter.forEachRemaining(event -> {
|
||||||
String payload = prettyJson(event.getPayload());
|
var payload = prettyJson(event.getPayload());
|
||||||
System.out.println("\n<-- Chaincode event received: " + event.getEventName() + " - " + payload);
|
System.out.println("\n<-- Chaincode event received: " + event.getEventName() + " - " + payload);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -93,20 +87,20 @@ public final class App {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String prettyJson(final String json) {
|
private String prettyJson(final String json) {
|
||||||
JsonElement parsedJson = JsonParser.parseString(json);
|
var parsedJson = JsonParser.parseString(json);
|
||||||
return gson.toJson(parsedJson);
|
return gson.toJson(parsedJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
private long createAsset() throws EndorseException, SubmitException, CommitStatusException {
|
private long createAsset() throws EndorseException, SubmitException, CommitStatusException {
|
||||||
System.out.println("\n--> Submit transaction: CreateAsset, " + assetId + " owned by Sam with appraised value 100");
|
System.out.println("\n--> Submit transaction: CreateAsset, " + assetId + " owned by Sam with appraised value 100");
|
||||||
|
|
||||||
SubmittedTransaction commit = contract.newProposal("CreateAsset")
|
var commit = contract.newProposal("CreateAsset")
|
||||||
.addArguments(assetId, "blue", "10", "Sam", "100")
|
.addArguments(assetId, "blue", "10", "Sam", "100")
|
||||||
.build()
|
.build()
|
||||||
.endorse()
|
.endorse()
|
||||||
.submitAsync();
|
.submitAsync();
|
||||||
|
|
||||||
Status status = commit.getStatus();
|
var status = commit.getStatus();
|
||||||
if (!status.isSuccessful()) {
|
if (!status.isSuccessful()) {
|
||||||
throw new RuntimeException("failed to commit transaction with status code " + status.getCode());
|
throw new RuntimeException("failed to commit transaction with status code " + status.getCode());
|
||||||
}
|
}
|
||||||
|
|
@ -143,14 +137,14 @@ public final class App {
|
||||||
private void replayChaincodeEvents(final long startBlock) {
|
private void replayChaincodeEvents(final long startBlock) {
|
||||||
System.out.println("\n*** Start chaincode event replay");
|
System.out.println("\n*** Start chaincode event replay");
|
||||||
|
|
||||||
ChaincodeEventsRequest request = network.newChaincodeEventsRequest(chaincodeName)
|
var request = network.newChaincodeEventsRequest(chaincodeName)
|
||||||
.startBlock(startBlock)
|
.startBlock(startBlock)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
try (CloseableIterator<ChaincodeEvent> eventIter = request.getEvents()) {
|
try (var eventIter = request.getEvents()) {
|
||||||
while (eventIter.hasNext()) {
|
while (eventIter.hasNext()) {
|
||||||
ChaincodeEvent event = eventIter.next();
|
var event = eventIter.next();
|
||||||
String payload = prettyJson(event.getPayload());
|
var payload = prettyJson(event.getPayload());
|
||||||
System.out.println("\n<-- Chaincode event replayed: " + event.getEventName() + " - " + payload);
|
System.out.println("\n<-- Chaincode event replayed: " + event.getEventName() + " - " + payload);
|
||||||
|
|
||||||
if (event.getEventName().equals("DeleteAsset")) {
|
if (event.getEventName().equals("DeleteAsset")) {
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,6 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.security.InvalidKeyException;
|
|
||||||
import java.security.PrivateKey;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
|
|
||||||
import io.grpc.ManagedChannel;
|
import io.grpc.ManagedChannel;
|
||||||
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
|
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
|
||||||
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
|
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
|
||||||
|
|
@ -23,6 +13,13 @@ import org.hyperledger.fabric.client.identity.Signer;
|
||||||
import org.hyperledger.fabric.client.identity.Signers;
|
import org.hyperledger.fabric.client.identity.Signers;
|
||||||
import org.hyperledger.fabric.client.identity.X509Identity;
|
import org.hyperledger.fabric.client.identity.X509Identity;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
|
||||||
public final class Connections {
|
public final class Connections {
|
||||||
// Path to crypto materials.
|
// Path to crypto materials.
|
||||||
private static final Path cryptoPath = Paths.get("..", "..", "test-network", "organizations", "peerOrganizations", "org1.example.com");
|
private static final Path cryptoPath = Paths.get("..", "..", "test-network", "organizations", "peerOrganizations", "org1.example.com");
|
||||||
|
|
@ -44,8 +41,8 @@ public final class Connections {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ManagedChannel newGrpcConnection() throws IOException, CertificateException {
|
public static ManagedChannel newGrpcConnection() throws IOException, CertificateException {
|
||||||
Reader tlsCertReader = Files.newBufferedReader(tlsCertPath);
|
var tlsCertReader = Files.newBufferedReader(tlsCertPath);
|
||||||
X509Certificate tlsCert = Identities.readX509Certificate(tlsCertReader);
|
var tlsCert = Identities.readX509Certificate(tlsCertReader);
|
||||||
|
|
||||||
return NettyChannelBuilder.forTarget(peerEndpoint)
|
return NettyChannelBuilder.forTarget(peerEndpoint)
|
||||||
.sslContext(GrpcSslContexts.forClient().trustManager(tlsCert).build()).overrideAuthority(overrideAuth)
|
.sslContext(GrpcSslContexts.forClient().trustManager(tlsCert).build()).overrideAuthority(overrideAuth)
|
||||||
|
|
@ -53,19 +50,22 @@ public final class Connections {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Identity newIdentity() throws IOException, CertificateException {
|
public static Identity newIdentity() throws IOException, CertificateException {
|
||||||
Reader certReader = Files.newBufferedReader(certPath);
|
var certReader = Files.newBufferedReader(certPath);
|
||||||
X509Certificate certificate = Identities.readX509Certificate(certReader);
|
var certificate = Identities.readX509Certificate(certReader);
|
||||||
|
|
||||||
return new X509Identity(mspID, certificate);
|
return new X509Identity(mspID, certificate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Signer newSigner() throws IOException, InvalidKeyException {
|
public static Signer newSigner() throws IOException, InvalidKeyException {
|
||||||
Path keyPath = Files.list(keyDirPath)
|
var keyReader = Files.newBufferedReader(getPrivateKeyPath());
|
||||||
.findFirst()
|
var privateKey = Identities.readPrivateKey(keyReader);
|
||||||
.orElseThrow();
|
|
||||||
Reader keyReader = Files.newBufferedReader(keyPath);
|
|
||||||
PrivateKey privateKey = Identities.readPrivateKey(keyReader);
|
|
||||||
|
|
||||||
return Signers.newPrivateKeySigner(privateKey);
|
return Signers.newPrivateKeySigner(privateKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Path getPrivateKeyPath() throws IOException {
|
||||||
|
try (var keyFiles = Files.list(keyDirPath)) {
|
||||||
|
return keyFiles.findFirst().orElseThrow();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,14 @@
|
||||||
"author": "Hyperledger",
|
"author": "Hyperledger",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/grpc-js": "^1.5.0",
|
"@hyperledger/fabric-gateway": "^1.1.1"
|
||||||
"@hyperledger/fabric-gateway": "^1.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tsconfig/node14": "^1.0.1",
|
"@tsconfig/node14": "^1.0.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.6.0",
|
"@types/node": "^14.18.16",
|
||||||
"@typescript-eslint/parser": "^5.6.0",
|
"@typescript-eslint/eslint-plugin": "^5.22.0",
|
||||||
"eslint": "^8.4.1",
|
"@typescript-eslint/parser": "^5.22.0",
|
||||||
"typescript": "~4.5.2"
|
"eslint": "^8.14.0",
|
||||||
|
"typescript": "~4.6.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rootProject.name = 'asset-transfer-events-java'
|
rootProject.name = 'events'
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
||||||
public Asset CreateAsset(final Context ctx, final String assetID, final String color, final int size, final String owner, final int appraisedValue) {
|
public Asset CreateAsset(final Context ctx, final String assetID, final String color, final int size, final String owner, final int appraisedValue) {
|
||||||
ChaincodeStub stub = ctx.getStub();
|
ChaincodeStub stub = ctx.getStub();
|
||||||
//input validations
|
// input validations
|
||||||
String errorMessage = null;
|
String errorMessage = null;
|
||||||
if (assetID == null || assetID.equals("")) {
|
if (assetID == null || assetID.equals("")) {
|
||||||
errorMessage = String.format("Empty input: assetID");
|
errorMessage = String.format("Empty input: assetID");
|
||||||
|
|
@ -167,7 +167,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
||||||
public Asset UpdateAsset(final Context ctx, final String assetID, final String color, final int size, final String owner, final int appraisedValue) {
|
public Asset UpdateAsset(final Context ctx, final String assetID, final String color, final int size, final String owner, final int appraisedValue) {
|
||||||
ChaincodeStub stub = ctx.getStub();
|
ChaincodeStub stub = ctx.getStub();
|
||||||
//input validations
|
// input validations
|
||||||
String errorMessage = null;
|
String errorMessage = null;
|
||||||
if (assetID == null || assetID.equals("")) {
|
if (assetID == null || assetID.equals("")) {
|
||||||
errorMessage = String.format("Empty input: assetID");
|
errorMessage = String.format("Empty input: assetID");
|
||||||
|
|
@ -217,7 +217,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
// delete private details of asset
|
// delete private details of asset
|
||||||
removePrivateData(ctx, assetID);
|
removePrivateData(ctx, assetID);
|
||||||
stub.delState(assetID); // delete the key from Statedb
|
stub.delState(assetID); // delete the key from Statedb
|
||||||
stub.setEvent("DeleteAsset", asset.serialize()); //publish Event
|
stub.setEvent("DeleteAsset", asset.serialize()); // publish Event
|
||||||
}
|
}
|
||||||
|
|
||||||
private Asset getState(final Context ctx, final String assetID) {
|
private Asset getState(final Context ctx, final String assetID) {
|
||||||
|
|
@ -241,7 +241,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
String clientMSPID = ctx.getClientIdentity().getMSPID();
|
String clientMSPID = ctx.getClientIdentity().getMSPID();
|
||||||
String implicitCollectionName = getCollectionName(ctx);
|
String implicitCollectionName = getCollectionName(ctx);
|
||||||
String privData = null;
|
String privData = null;
|
||||||
//only if ClientOrgMatchesPeerOrg
|
// only if ClientOrgMatchesPeerOrg
|
||||||
if (peerMSPID.equals(clientMSPID)) {
|
if (peerMSPID.equals(clientMSPID)) {
|
||||||
System.out.printf(" ReadPrivateData from collection %s, ID %s\n", implicitCollectionName, assetKey);
|
System.out.printf(" ReadPrivateData from collection %s, ID %s\n", implicitCollectionName, assetKey);
|
||||||
byte[] propJSON = ctx.getStub().getPrivateData(implicitCollectionName, assetKey);
|
byte[] propJSON = ctx.getStub().getPrivateData(implicitCollectionName, assetKey);
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ public class App {
|
||||||
|
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
System.out.println("Submit Transaction: CreateAsset asset13");
|
System.out.println("Submit Transaction: CreateAsset asset13");
|
||||||
//CreateAsset creates an asset with ID asset13, color yellow, owner Tom, size 5 and appraisedValue of 1300
|
// CreateAsset creates an asset with ID asset13, color yellow, owner Tom, size 5 and appraisedValue of 1300
|
||||||
contract.submitTransaction("CreateAsset", "asset13", "yellow", "5", "Tom", "1300");
|
contract.submitTransaction("CreateAsset", "asset13", "yellow", "5", "Tom", "1300");
|
||||||
|
|
||||||
System.out.println("\n");
|
System.out.println("\n");
|
||||||
|
|
@ -136,6 +136,7 @@ public class App {
|
||||||
}
|
}
|
||||||
catch(Exception e){
|
catch(Exception e){
|
||||||
System.err.println(e);
|
System.err.println(e);
|
||||||
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,7 @@ async function main() {
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`******** FAILED to run the application: ${error}`);
|
console.error(`******** FAILED to run the application: ${error}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('*** application ending');
|
console.log('*** application ending');
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,34 @@
|
||||||
module github.com/hyperledger/fabric-samples/asset-transfer-ledger-queries/chaincode-go
|
module github.com/hyperledger/fabric-samples/asset-transfer-ledger-queries/chaincode-go
|
||||||
|
|
||||||
go 1.14
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/golang/protobuf v1.3.2
|
github.com/golang/protobuf v1.5.2
|
||||||
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200511190512-bcfeb58dd83a
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20230228194215-b84622ba6a7a
|
||||||
github.com/hyperledger/fabric-contract-api-go v1.1.0
|
github.com/hyperledger/fabric-contract-api-go v1.2.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||||
|
github.com/go-openapi/spec v0.20.8 // indirect
|
||||||
|
github.com/go-openapi/swag v0.21.1 // indirect
|
||||||
|
github.com/gobuffalo/envy v1.10.1 // indirect
|
||||||
|
github.com/gobuffalo/packd v1.0.1 // indirect
|
||||||
|
github.com/gobuffalo/packr v1.30.1 // indirect
|
||||||
|
github.com/hyperledger/fabric-protos-go v0.3.0 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.8.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
|
||||||
|
google.golang.org/grpc v1.53.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -19,8 +19,7 @@
|
||||||
"author": "Hyperledger",
|
"author": "Hyperledger",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/grpc-js": "^1.5.0",
|
"@hyperledger/fabric-gateway": "^1.1.1"
|
||||||
"@hyperledger/fabric-gateway": "^1.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tsconfig/node14": "^1.0.1",
|
"@tsconfig/node14": "^1.0.1",
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ async function main(): Promise<void> {
|
||||||
await getAssetsByRange(contractOrg1);
|
await getAssetsByRange(contractOrg1);
|
||||||
|
|
||||||
try{
|
try{
|
||||||
//Attempt to transfer asset without prior aprroval from Org2, transaction expected to fail.
|
// Attempt to transfer asset without prior aprroval from Org2, transaction expected to fail.
|
||||||
console.log('\nAttempt TransferAsset without prior AgreeToTransfer');
|
console.log('\nAttempt TransferAsset without prior AgreeToTransfer');
|
||||||
await transferAsset(contractOrg1, assetID1);
|
await transferAsset(contractOrg1, assetID1);
|
||||||
doFail('TransferAsset transaction succeeded when it was expected to fail');
|
doFail('TransferAsset transaction succeeded when it was expected to fail');
|
||||||
|
|
@ -129,6 +129,10 @@ async function main(): Promise<void> {
|
||||||
|
|
||||||
// Delete AssetID2 as Org1.
|
// Delete AssetID2 as Org1.
|
||||||
await deleteAsset(contractOrg1, assetID2);
|
await deleteAsset(contractOrg1, assetID2);
|
||||||
|
|
||||||
|
// Trigger a purge of the private data for the asset
|
||||||
|
// The previous delete is optinal if purge is used
|
||||||
|
await purgeAsset(contractOrg1, assetID2);
|
||||||
} finally {
|
} finally {
|
||||||
gatewayOrg1.close();
|
gatewayOrg1.close();
|
||||||
clientOrg1.close();
|
clientOrg1.close();
|
||||||
|
|
@ -261,6 +265,17 @@ async function deleteAsset(contract: Contract, assetID: string): Promise<void> {
|
||||||
|
|
||||||
console.log('*** Transaction committed successfully');
|
console.log('*** Transaction committed successfully');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function purgeAsset(contract: Contract, assetID: string): Promise<void> {
|
||||||
|
console.log('\n--> Submit Transaction: PurgeAsset, ID:', assetID);
|
||||||
|
const dataForPurge = { assetID };
|
||||||
|
await contract.submit('PurgeAsset', {
|
||||||
|
transientData: { asset_purge: JSON.stringify(dataForPurge) },
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('*** Transaction committed successfully');
|
||||||
|
}
|
||||||
|
|
||||||
async function readAssetPrivateDetails(contract: Contract, assetID: string, collectionName: string): Promise<boolean> {
|
async function readAssetPrivateDetails(contract: Contract, assetID: string, collectionName: string): Promise<boolean> {
|
||||||
console.log(`\n--> Evaluate Transaction: ReadAssetPrivateDetails from ${collectionName}, ID: ${assetID}`);
|
console.log(`\n--> Evaluate Transaction: ReadAssetPrivateDetails from ${collectionName}, ID: ${assetID}`);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,7 @@ async function initContractFromOrg1Identity() {
|
||||||
try {
|
try {
|
||||||
// Create a new gateway for connecting to Org's peer node.
|
// Create a new gateway for connecting to Org's peer node.
|
||||||
const gatewayOrg1 = new Gateway();
|
const gatewayOrg1 = new Gateway();
|
||||||
//connect using Discovery enabled
|
// Connect using Discovery enabled
|
||||||
await gatewayOrg1.connect(ccpOrg1,
|
await gatewayOrg1.connect(ccpOrg1,
|
||||||
{ wallet: walletOrg1, identity: Org1UserId, discovery: { enabled: true, asLocalhost: true } });
|
{ wallet: walletOrg1, identity: Org1UserId, discovery: { enabled: true, asLocalhost: true } });
|
||||||
|
|
||||||
|
|
@ -191,15 +191,15 @@ async function main() {
|
||||||
console.log('\n**************** As Org1 Client ****************');
|
console.log('\n**************** As Org1 Client ****************');
|
||||||
console.log('Adding Assets to work with:\n--> Submit Transaction: CreateAsset ' + assetID1);
|
console.log('Adding Assets to work with:\n--> Submit Transaction: CreateAsset ' + assetID1);
|
||||||
let statefulTxn = contractOrg1.createTransaction('CreateAsset');
|
let statefulTxn = contractOrg1.createTransaction('CreateAsset');
|
||||||
//if you need to customize endorsement to specific set of Orgs, use setEndorsingOrganizations
|
// if you need to customize endorsement to specific set of Orgs, use setEndorsingOrganizations
|
||||||
//statefulTxn.setEndorsingOrganizations(mspOrg1);
|
// statefulTxn.setEndorsingOrganizations(mspOrg1);
|
||||||
let tmapData = Buffer.from(JSON.stringify(asset1Data));
|
let tmapData = Buffer.from(JSON.stringify(asset1Data));
|
||||||
statefulTxn.setTransient({
|
statefulTxn.setTransient({
|
||||||
asset_properties: tmapData
|
asset_properties: tmapData
|
||||||
});
|
});
|
||||||
result = await statefulTxn.submit();
|
result = await statefulTxn.submit();
|
||||||
|
|
||||||
//Add asset2
|
// Add asset2
|
||||||
console.log('\n--> Submit Transaction: CreateAsset ' + assetID2);
|
console.log('\n--> Submit Transaction: CreateAsset ' + assetID2);
|
||||||
statefulTxn = contractOrg1.createTransaction('CreateAsset');
|
statefulTxn = contractOrg1.createTransaction('CreateAsset');
|
||||||
tmapData = Buffer.from(JSON.stringify(asset2Data));
|
tmapData = Buffer.from(JSON.stringify(asset2Data));
|
||||||
|
|
@ -285,13 +285,13 @@ async function main() {
|
||||||
});
|
});
|
||||||
result = await statefulTxn.submit();
|
result = await statefulTxn.submit();
|
||||||
|
|
||||||
//Again ReadAsset : results will show that the buyer identity now owns the asset:
|
// Again ReadAsset : results will show that the buyer identity now owns the asset:
|
||||||
console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID1);
|
console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID1);
|
||||||
result = await contractOrg1.evaluateTransaction('ReadAsset', assetID1);
|
result = await contractOrg1.evaluateTransaction('ReadAsset', assetID1);
|
||||||
console.log(`<-- result: ${prettyJSONString(result.toString())}`);
|
console.log(`<-- result: ${prettyJSONString(result.toString())}`);
|
||||||
verifyAssetData(mspOrg1, result, assetID1, 'green', 20, Org2UserId);
|
verifyAssetData(mspOrg1, result, assetID1, 'green', 20, Org2UserId);
|
||||||
|
|
||||||
//Confirm that transfer removed the private details from the Org1 collection:
|
// Confirm that transfer removed the private details from the Org1 collection:
|
||||||
console.log('\n--> Evaluate Transaction: ReadAssetPrivateDetails');
|
console.log('\n--> Evaluate Transaction: ReadAssetPrivateDetails');
|
||||||
// ReadAssetPrivateDetails reads data from Org's private collection: Should return empty
|
// ReadAssetPrivateDetails reads data from Org's private collection: Should return empty
|
||||||
result = await contractOrg1.evaluateTransaction('ReadAssetPrivateDetails', org1PrivateCollectionName, assetID1);
|
result = await contractOrg1.evaluateTransaction('ReadAssetPrivateDetails', org1PrivateCollectionName, assetID1);
|
||||||
|
|
@ -307,7 +307,7 @@ async function main() {
|
||||||
console.log('\n********* Demo deleting asset **************');
|
console.log('\n********* Demo deleting asset **************');
|
||||||
let dataForDelete = { assetID: assetID2 };
|
let dataForDelete = { assetID: assetID2 };
|
||||||
try {
|
try {
|
||||||
//Non-owner Org2 should not be able to DeleteAsset. Expect an error from DeleteAsset
|
// Non-owner Org2 should not be able to DeleteAsset. Expect an error from DeleteAsset
|
||||||
console.log('--> Attempt Transaction: as Org2 DeleteAsset ' + assetID2);
|
console.log('--> Attempt Transaction: as Org2 DeleteAsset ' + assetID2);
|
||||||
statefulTxn = contractOrg2.createTransaction('DeleteAsset');
|
statefulTxn = contractOrg2.createTransaction('DeleteAsset');
|
||||||
tmapData = Buffer.from(JSON.stringify(dataForDelete));
|
tmapData = Buffer.from(JSON.stringify(dataForDelete));
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, a
|
||||||
return nil, fmt.Errorf("failed to read asset: %v", err)
|
return nil, fmt.Errorf("failed to read asset: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//No Asset found, return empty response
|
// No Asset found, return empty response
|
||||||
if assetJSON == nil {
|
if assetJSON == nil {
|
||||||
log.Printf("%v does not exist in collection %v", assetID, assetCollection)
|
log.Printf("%v does not exist in collection %v", assetID, assetCollection)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ func TestReadAssetPrivateDetails(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Nil(t, assetBytes)
|
require.Nil(t, assetBytes)
|
||||||
|
|
||||||
//read from the collection with no access
|
// read from the collection with no access
|
||||||
chaincodeStub.GetPrivateDataReturns(nil, fmt.Errorf("collection not found"))
|
chaincodeStub.GetPrivateDataReturns(nil, fmt.Errorf("collection not found"))
|
||||||
assetBytes, err = assetTransferCC.ReadAssetPrivateDetails(transactionContext, myOrg2PrivCollection, "id1")
|
assetBytes, err = assetTransferCC.ReadAssetPrivateDetails(transactionContext, myOrg2PrivCollection, "id1")
|
||||||
require.EqualError(t, err, "failed to read asset details: collection not found")
|
require.EqualError(t, err, "failed to read asset details: collection not found")
|
||||||
|
|
@ -72,7 +72,7 @@ func TestReadTransferAgreement(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
assetTransferCC := chaincode.SmartContract{}
|
||||||
|
|
||||||
//TransferAgreement does not exist
|
// TransferAgreement does not exist
|
||||||
assetBytes, err := assetTransferCC.ReadTransferAgreement(transactionContext, "id1")
|
assetBytes, err := assetTransferCC.ReadTransferAgreement(transactionContext, "id1")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Nil(t, assetBytes)
|
require.Nil(t, assetBytes)
|
||||||
|
|
@ -115,7 +115,7 @@ func TestQueryAssetByOwner(t *testing.T) {
|
||||||
|
|
||||||
func TestQueryAssets(t *testing.T) {
|
func TestQueryAssets(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
//Iterator with no records
|
// Iterator with no records
|
||||||
iterator := &mocks.StateQueryIterator{}
|
iterator := &mocks.StateQueryIterator{}
|
||||||
iterator.HasNextReturns(false)
|
iterator.HasNextReturns(false)
|
||||||
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
|
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
|
||||||
|
|
@ -150,7 +150,7 @@ func TestQueryAssets(t *testing.T) {
|
||||||
|
|
||||||
func TestGetAssetByRange(t *testing.T) {
|
func TestGetAssetByRange(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
//Iterator with no records
|
// Iterator with no records
|
||||||
iterator := &mocks.StateQueryIterator{}
|
iterator := &mocks.StateQueryIterator{}
|
||||||
iterator.HasNextReturns(false)
|
iterator.HasNextReturns(false)
|
||||||
chaincodeStub.GetPrivateDataByRangeReturns(iterator, nil)
|
chaincodeStub.GetPrivateDataByRangeReturns(iterator, nil)
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface)
|
||||||
// Asset properties are private, therefore they get passed in transient field, instead of func args
|
// Asset properties are private, therefore they get passed in transient field, instead of func args
|
||||||
transientAssetJSON, ok := transientMap["asset_properties"]
|
transientAssetJSON, ok := transientMap["asset_properties"]
|
||||||
if !ok {
|
if !ok {
|
||||||
//log error to stdout
|
// log error to stdout
|
||||||
return fmt.Errorf("asset not found in the transient map input")
|
return fmt.Errorf("asset not found in the transient map input")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -450,7 +450,7 @@ func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface)
|
||||||
return fmt.Errorf("failed to infer private collection name for the org: %v", err)
|
return fmt.Errorf("failed to infer private collection name for the org: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//check the asset is in the caller org's private collection
|
// Check the asset is in the caller org's private collection
|
||||||
valAsbytes, err = ctx.GetStub().GetPrivateData(ownerCollection, assetDeleteInput.ID)
|
valAsbytes, err = ctx.GetStub().GetPrivateData(ownerCollection, assetDeleteInput.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read asset from owner's Collection: %v", err)
|
return fmt.Errorf("failed to read asset from owner's Collection: %v", err)
|
||||||
|
|
@ -475,6 +475,68 @@ func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PurgeAsset can be used by the owner of the asset to delete the asset
|
||||||
|
// Trigger removal of the asset
|
||||||
|
func (s *SmartContract) PurgeAsset(ctx contractapi.TransactionContextInterface) error {
|
||||||
|
|
||||||
|
transientMap, err := ctx.GetStub().GetTransient()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Error getting transient: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asset properties are private, therefore they get passed in transient field
|
||||||
|
transientDeleteJSON, ok := transientMap["asset_purge"]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("asset to purge not found in the transient map")
|
||||||
|
}
|
||||||
|
|
||||||
|
type assetPurge struct {
|
||||||
|
ID string `json:"assetID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetPurgeInput assetPurge
|
||||||
|
err = json.Unmarshal(transientDeleteJSON, &assetPurgeInput)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to unmarshal JSON: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(assetPurgeInput.ID) == 0 {
|
||||||
|
return fmt.Errorf("assetID field must be a non-empty string")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that the client is submitting request to peer in their organization
|
||||||
|
err = verifyClientOrgMatchesPeerOrg(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("PurgeAsset cannot be performed: Error %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Purging Asset: %v", assetPurgeInput.ID)
|
||||||
|
|
||||||
|
// Note that there is no check here to see if the id exist; it might have been 'deleted' already
|
||||||
|
// so a check here is pointless. We would need to call purge irrespective of the result
|
||||||
|
// A delete can be called before purge, but is not essential
|
||||||
|
|
||||||
|
ownerCollection, err := getCollectionName(ctx) // Get owners collection
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to infer private collection name for the org: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete the asset from state
|
||||||
|
err = ctx.GetStub().PurgePrivateData(assetCollection, assetPurgeInput.ID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to purge state from asset collection: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, delete private details of asset
|
||||||
|
err = ctx.GetStub().PurgePrivateData(ownerCollection, assetPurgeInput.ID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to purge state from owner collection: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// DeleteTranferAgreement can be used by the buyer to withdraw a proposal from
|
// DeleteTranferAgreement can be used by the buyer to withdraw a proposal from
|
||||||
// the asset collection and from his own collection.
|
// the asset collection and from his own collection.
|
||||||
func (s *SmartContract) DeleteTranferAgreement(ctx contractapi.TransactionContextInterface) error {
|
func (s *SmartContract) DeleteTranferAgreement(ctx contractapi.TransactionContextInterface) error {
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ func TestCreateAssetSuccessful(t *testing.T) {
|
||||||
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
||||||
err := assetTransferCC.CreateAsset(transactionContext)
|
err := assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
//Validate PutPrivateData calls
|
// Validate PutPrivateData calls
|
||||||
calledCollection, calledId, _ := chaincodeStub.PutPrivateDataArgsForCall(0)
|
calledCollection, calledId, _ := chaincodeStub.PutPrivateDataArgsForCall(0)
|
||||||
require.Equal(t, assetCollectionName, calledCollection)
|
require.Equal(t, assetCollectionName, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
require.Equal(t, "id1", calledId)
|
||||||
|
|
@ -150,7 +150,7 @@ func TestAgreeToTransferBadInput(t *testing.T) {
|
||||||
|
|
||||||
assetPrivDetail := &chaincode.AssetPrivateDetails{
|
assetPrivDetail := &chaincode.AssetPrivateDetails{
|
||||||
ID: "id1",
|
ID: "id1",
|
||||||
//no AppraisedValue
|
// no AppraisedValue
|
||||||
}
|
}
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
origAsset := chaincode.Asset{
|
origAsset := chaincode.Asset{
|
||||||
|
|
@ -166,7 +166,7 @@ func TestAgreeToTransferBadInput(t *testing.T) {
|
||||||
require.EqualError(t, err, "appraisedValue field must be a positive integer")
|
require.EqualError(t, err, "appraisedValue field must be a positive integer")
|
||||||
|
|
||||||
assetPrivDetail = &chaincode.AssetPrivateDetails{
|
assetPrivDetail = &chaincode.AssetPrivateDetails{
|
||||||
//no ID
|
// no ID
|
||||||
AppraisedValue: 500,
|
AppraisedValue: 500,
|
||||||
}
|
}
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
|
|
@ -178,7 +178,7 @@ func TestAgreeToTransferBadInput(t *testing.T) {
|
||||||
AppraisedValue: 500,
|
AppraisedValue: 500,
|
||||||
}
|
}
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
//asset does not exist
|
// asset does not exist
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
||||||
err = assetTransferCC.AgreeToTransfer(transactionContext)
|
err = assetTransferCC.AgreeToTransfer(transactionContext)
|
||||||
require.EqualError(t, err, "id1 does not exist")
|
require.EqualError(t, err, "id1 does not exist")
|
||||||
|
|
@ -233,7 +233,7 @@ func TestTransferAssetBadInput(t *testing.T) {
|
||||||
BuyerMSP: myOrg2Msp,
|
BuyerMSP: myOrg2Msp,
|
||||||
}
|
}
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
//asset does not exist
|
// asset does not exist
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
||||||
err = assetTransferCC.TransferAsset(transactionContext)
|
err = assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.EqualError(t, err, "id1 does not exist")
|
require.EqualError(t, err, "id1 does not exist")
|
||||||
|
|
@ -255,15 +255,15 @@ func TestTransferAssetSuccessful(t *testing.T) {
|
||||||
Owner: myOrg1Clientid,
|
Owner: myOrg1Clientid,
|
||||||
}
|
}
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
||||||
//to ensure we pass data hash verification
|
// to ensure we pass data hash verification
|
||||||
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
||||||
//to ensure that ReadTransferAgreement call returns org2 client ID
|
// to ensure that ReadTransferAgreement call returns org2 client ID
|
||||||
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte(myOrg2Clientid), nil)
|
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte(myOrg2Clientid), nil)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
|
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
//Validate PutPrivateData calls
|
// Validate PutPrivateData calls
|
||||||
expectedNewAsset := origAsset
|
expectedNewAsset := origAsset
|
||||||
expectedNewAsset.Owner = myOrg2Clientid
|
expectedNewAsset.Owner = myOrg2Clientid
|
||||||
expectedNewAssetBytes, err := json.Marshal(expectedNewAsset)
|
expectedNewAssetBytes, err := json.Marshal(expectedNewAsset)
|
||||||
|
|
@ -290,7 +290,7 @@ func TestTransferAssetByNonOwner(t *testing.T) {
|
||||||
BuyerMSP: myOrg1Msp,
|
BuyerMSP: myOrg1Msp,
|
||||||
}
|
}
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
//Try to transfer asset owned by Org2
|
// Try to transfer asset owned by Org2
|
||||||
org2Asset := chaincode.Asset{
|
org2Asset := chaincode.Asset{
|
||||||
ID: "id1",
|
ID: "id1",
|
||||||
Type: "testfulasset",
|
Type: "testfulasset",
|
||||||
|
|
@ -319,10 +319,10 @@ func TestTransferAssetWithoutAnAgreement(t *testing.T) {
|
||||||
Owner: myOrg1Clientid,
|
Owner: myOrg1Clientid,
|
||||||
}
|
}
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
||||||
//to ensure we pass data hash verification
|
// to ensure we pass data hash verification
|
||||||
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
//ReadTransferAgreement call returns no buyer client ID
|
// ReadTransferAgreement call returns no buyer client ID
|
||||||
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte{}, nil)
|
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte{}, nil)
|
||||||
|
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
|
|
@ -347,7 +347,7 @@ func TestTransferAssetNonMatchingAppraisalValue(t *testing.T) {
|
||||||
}
|
}
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
//data hash different in each collection
|
// data hash different in each collection
|
||||||
chaincodeStub.GetPrivateDataHashReturnsOnCall(0, []byte("datahash1"), nil)
|
chaincodeStub.GetPrivateDataHashReturnsOnCall(0, []byte("datahash1"), nil)
|
||||||
chaincodeStub.GetPrivateDataHashReturnsOnCall(1, []byte("datahash2"), nil)
|
chaincodeStub.GetPrivateDataHashReturnsOnCall(1, []byte("datahash2"), nil)
|
||||||
|
|
||||||
|
|
@ -370,7 +370,7 @@ func prepMocks(orgMSP, clientId string) (*mocks.TransactionContext, *mocks.Chain
|
||||||
clientIdentity := &mocks.ClientIdentity{}
|
clientIdentity := &mocks.ClientIdentity{}
|
||||||
clientIdentity.GetMSPIDReturns(orgMSP, nil)
|
clientIdentity.GetMSPIDReturns(orgMSP, nil)
|
||||||
clientIdentity.GetIDReturns(base64.StdEncoding.EncodeToString([]byte(clientId)), nil)
|
clientIdentity.GetIDReturns(base64.StdEncoding.EncodeToString([]byte(clientId)), nil)
|
||||||
//set matching msp ID using peer shim env variable
|
// set matching msp ID using peer shim env variable
|
||||||
os.Setenv("CORE_PEER_LOCALMSPID", orgMSP)
|
os.Setenv("CORE_PEER_LOCALMSPID", orgMSP)
|
||||||
transactionContext.GetClientIdentityReturns(clientIdentity)
|
transactionContext.GetClientIdentityReturns(clientIdentity)
|
||||||
return transactionContext, chaincodeStub
|
return transactionContext, chaincodeStub
|
||||||
|
|
|
||||||
|
|
@ -413,6 +413,18 @@ type ChaincodeStub struct {
|
||||||
invokeChaincodeReturnsOnCall map[int]struct {
|
invokeChaincodeReturnsOnCall map[int]struct {
|
||||||
result1 peer.Response
|
result1 peer.Response
|
||||||
}
|
}
|
||||||
|
PurgePrivateDataStub func(string, string) error
|
||||||
|
purgePrivateDataMutex sync.RWMutex
|
||||||
|
purgePrivateDataArgsForCall []struct {
|
||||||
|
arg1 string
|
||||||
|
arg2 string
|
||||||
|
}
|
||||||
|
purgePrivateDataReturns struct {
|
||||||
|
result1 error
|
||||||
|
}
|
||||||
|
purgePrivateDataReturnsOnCall map[int]struct {
|
||||||
|
result1 error
|
||||||
|
}
|
||||||
PutPrivateDataStub func(string, string, []byte) error
|
PutPrivateDataStub func(string, string, []byte) error
|
||||||
putPrivateDataMutex sync.RWMutex
|
putPrivateDataMutex sync.RWMutex
|
||||||
putPrivateDataArgsForCall []struct {
|
putPrivateDataArgsForCall []struct {
|
||||||
|
|
@ -2383,6 +2395,67 @@ func (fake *ChaincodeStub) InvokeChaincodeReturnsOnCall(i int, result1 peer.Resp
|
||||||
}{result1}
|
}{result1}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateData(arg1 string, arg2 string) error {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
ret, specificReturn := fake.purgePrivateDataReturnsOnCall[len(fake.purgePrivateDataArgsForCall)]
|
||||||
|
fake.purgePrivateDataArgsForCall = append(fake.purgePrivateDataArgsForCall, struct {
|
||||||
|
arg1 string
|
||||||
|
arg2 string
|
||||||
|
}{arg1, arg2})
|
||||||
|
fake.recordInvocation("PurgePrivateData", []interface{}{arg1, arg2})
|
||||||
|
fake.purgePrivateDataMutex.Unlock()
|
||||||
|
if fake.PurgePrivateDataStub != nil {
|
||||||
|
return fake.PurgePrivateDataStub(arg1, arg2)
|
||||||
|
}
|
||||||
|
if specificReturn {
|
||||||
|
return ret.result1
|
||||||
|
}
|
||||||
|
fakeReturns := fake.purgePrivateDataReturns
|
||||||
|
return fakeReturns.result1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataCallCount() int {
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
|
return len(fake.purgePrivateDataArgsForCall)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataCalls(stub func(string, string) error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = stub
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataArgsForCall(i int) (string, string) {
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
|
argsForCall := fake.purgePrivateDataArgsForCall[i]
|
||||||
|
return argsForCall.arg1, argsForCall.arg2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataReturns(result1 error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = nil
|
||||||
|
fake.purgePrivateDataReturns = struct {
|
||||||
|
result1 error
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *ChaincodeStub) PurgePrivateDataReturnsOnCall(i int, result1 error) {
|
||||||
|
fake.purgePrivateDataMutex.Lock()
|
||||||
|
defer fake.purgePrivateDataMutex.Unlock()
|
||||||
|
fake.PurgePrivateDataStub = nil
|
||||||
|
if fake.purgePrivateDataReturnsOnCall == nil {
|
||||||
|
fake.purgePrivateDataReturnsOnCall = make(map[int]struct {
|
||||||
|
result1 error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fake.purgePrivateDataReturnsOnCall[i] = struct {
|
||||||
|
result1 error
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
func (fake *ChaincodeStub) PutPrivateData(arg1 string, arg2 string, arg3 []byte) error {
|
func (fake *ChaincodeStub) PutPrivateData(arg1 string, arg2 string, arg3 []byte) error {
|
||||||
var arg3Copy []byte
|
var arg3Copy []byte
|
||||||
if arg3 != nil {
|
if arg3 != nil {
|
||||||
|
|
@ -2846,6 +2919,8 @@ func (fake *ChaincodeStub) Invocations() map[string][][]interface{} {
|
||||||
defer fake.getTxTimestampMutex.RUnlock()
|
defer fake.getTxTimestampMutex.RUnlock()
|
||||||
fake.invokeChaincodeMutex.RLock()
|
fake.invokeChaincodeMutex.RLock()
|
||||||
defer fake.invokeChaincodeMutex.RUnlock()
|
defer fake.invokeChaincodeMutex.RUnlock()
|
||||||
|
fake.purgePrivateDataMutex.RLock()
|
||||||
|
defer fake.purgePrivateDataMutex.RUnlock()
|
||||||
fake.putPrivateDataMutex.RLock()
|
fake.putPrivateDataMutex.RLock()
|
||||||
defer fake.putPrivateDataMutex.RUnlock()
|
defer fake.putPrivateDataMutex.RUnlock()
|
||||||
fake.putStateMutex.RLock()
|
fake.putStateMutex.RLock()
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@
|
||||||
"maxPeerCount": 1,
|
"maxPeerCount": 1,
|
||||||
"blockToLive":1000000,
|
"blockToLive":1000000,
|
||||||
"memberOnlyRead": true,
|
"memberOnlyRead": true,
|
||||||
"memberOnlyWrite": true
|
"memberOnlyWrite": true,
|
||||||
|
"endorsementPolicy": {
|
||||||
|
"signaturePolicy":"OR('Org1MSP.member','Org2MSP.member')"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Org1MSPPrivateCollection",
|
"name": "Org1MSPPrivateCollection",
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,38 @@
|
||||||
module github.com/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go
|
module github.com/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go
|
||||||
|
|
||||||
go 1.14
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/hyperledger/fabric-chaincode-go v0.0.0-20200511190512-bcfeb58dd83a
|
github.com/hyperledger/fabric-chaincode-go v0.0.0-20230228194215-b84622ba6a7a
|
||||||
github.com/hyperledger/fabric-contract-api-go v1.1.0
|
github.com/hyperledger/fabric-contract-api-go v1.2.1
|
||||||
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23
|
github.com/hyperledger/fabric-protos-go v0.3.0
|
||||||
github.com/stretchr/testify v1.5.1
|
github.com/stretchr/testify v1.8.2
|
||||||
google.golang.org/protobuf v1.25.0
|
google.golang.org/protobuf v1.28.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0 // indirect
|
||||||
|
github.com/go-openapi/spec v0.20.8 // indirect
|
||||||
|
github.com/go-openapi/swag v0.21.1 // indirect
|
||||||
|
github.com/gobuffalo/envy v1.10.1 // indirect
|
||||||
|
github.com/gobuffalo/packd v1.0.1 // indirect
|
||||||
|
github.com/gobuffalo/packr v1.30.1 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.8.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
|
golang.org/x/net v0.7.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/text v0.7.0 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
|
||||||
|
google.golang.org/grpc v1.53.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -14,7 +14,7 @@ version '1.0-SNAPSHOT'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.+'
|
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.+'
|
||||||
implementation 'org.json:json:+'
|
implementation 'org.json:json:+'
|
||||||
|
|
||||||
testImplementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.+'
|
testImplementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.+'
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@
|
||||||
"maxPeerCount": 1,
|
"maxPeerCount": 1,
|
||||||
"blockToLive":1000000,
|
"blockToLive":1000000,
|
||||||
"memberOnlyRead": true,
|
"memberOnlyRead": true,
|
||||||
"memberOnlyWrite": true
|
"memberOnlyWrite": true,
|
||||||
|
"endorsementPolicy": {
|
||||||
|
"signaturePolicy":"OR('Org1MSP.member','Org2MSP.member')"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Org1MSPPrivateCollection",
|
"name": "Org1MSPPrivateCollection",
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
// write private data from this peer.
|
// write private data from this peer.
|
||||||
verifyClientOrgMatchesPeerOrg(ctx);
|
verifyClientOrgMatchesPeerOrg(ctx);
|
||||||
|
|
||||||
//Make submitting client the owner
|
// Make submitting client the owner
|
||||||
asset.setOwner(clientID);
|
asset.setOwner(clientID);
|
||||||
System.out.printf("CreateAsset Put: collection %s, ID %s\n", ASSET_COLLECTION_NAME, assetID);
|
System.out.printf("CreateAsset Put: collection %s, ID %s\n", ASSET_COLLECTION_NAME, assetID);
|
||||||
System.out.printf("Put: collection %s, ID %s\n", ASSET_COLLECTION_NAME, new String(asset.serialize()));
|
System.out.printf("Put: collection %s, ID %s\n", ASSET_COLLECTION_NAME, new String(asset.serialize()));
|
||||||
|
|
@ -328,7 +328,7 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
// Get collection name for this organization.
|
// Get collection name for this organization.
|
||||||
String orgCollectionName = getCollectionName(ctx);
|
String orgCollectionName = getCollectionName(ctx);
|
||||||
|
|
||||||
//Save AssetPrivateDetails to org collection
|
// Save AssetPrivateDetails to org collection
|
||||||
AssetPrivateDetails assetPriv = new AssetPrivateDetails(assetID, appraisedValue);
|
AssetPrivateDetails assetPriv = new AssetPrivateDetails(assetID, appraisedValue);
|
||||||
System.out.printf("Put AssetPrivateDetails: collection %s, ID %s\n", orgCollectionName, assetID);
|
System.out.printf("Put AssetPrivateDetails: collection %s, ID %s\n", orgCollectionName, assetID);
|
||||||
stub.putPrivateData(orgCollectionName, assetID, assetPriv.serialize());
|
stub.putPrivateData(orgCollectionName, assetID, assetPriv.serialize());
|
||||||
|
|
@ -392,12 +392,12 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
|
|
||||||
verifyClientOrgMatchesPeerOrg(ctx);
|
verifyClientOrgMatchesPeerOrg(ctx);
|
||||||
|
|
||||||
//Save AssetPrivateDetails to org collection
|
// Save AssetPrivateDetails to org collection
|
||||||
System.out.printf("Put AssetPrivateDetails: collection %s, ID %s\n", orgCollectionName, assetID);
|
System.out.printf("Put AssetPrivateDetails: collection %s, ID %s\n", orgCollectionName, assetID);
|
||||||
stub.putPrivateData(orgCollectionName, assetID, assetPriv.serialize());
|
stub.putPrivateData(orgCollectionName, assetID, assetPriv.serialize());
|
||||||
|
|
||||||
String clientID = ctx.getClientIdentity().getId();
|
String clientID = ctx.getClientIdentity().getId();
|
||||||
//Write the AgreeToTransfer key in assetCollection
|
// Write the AgreeToTransfer key in assetCollection
|
||||||
CompositeKey aggKey = stub.createCompositeKey(AGREEMENT_KEYPREFIX, assetID);
|
CompositeKey aggKey = stub.createCompositeKey(AGREEMENT_KEYPREFIX, assetID);
|
||||||
System.out.printf("AgreeToTransfer Put: collection %s, ID %s, Key %s\n", ASSET_COLLECTION_NAME, assetID, aggKey);
|
System.out.printf("AgreeToTransfer Put: collection %s, ID %s, Key %s\n", ASSET_COLLECTION_NAME, assetID, aggKey);
|
||||||
stub.putPrivateData(ASSET_COLLECTION_NAME, aggKey.toString(), clientID);
|
stub.putPrivateData(ASSET_COLLECTION_NAME, aggKey.toString(), clientID);
|
||||||
|
|
@ -470,15 +470,15 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
String newOwner = transferAgreement.getBuyerID();
|
String newOwner = transferAgreement.getBuyerID();
|
||||||
thisAsset.setOwner(newOwner);
|
thisAsset.setOwner(newOwner);
|
||||||
|
|
||||||
//Save updated Asset to collection
|
// Save updated Asset to collection
|
||||||
System.out.printf("Transfer Asset: collection %s, ID %s to owner %s\n", ASSET_COLLECTION_NAME, assetID, newOwner);
|
System.out.printf("Transfer Asset: collection %s, ID %s to owner %s\n", ASSET_COLLECTION_NAME, assetID, newOwner);
|
||||||
stub.putPrivateData(ASSET_COLLECTION_NAME, assetID, thisAsset.serialize());
|
stub.putPrivateData(ASSET_COLLECTION_NAME, assetID, thisAsset.serialize());
|
||||||
|
|
||||||
// delete the key from owners collection
|
// Delete the key from owners collection
|
||||||
String ownersCollectionName = getCollectionName(ctx);
|
String ownersCollectionName = getCollectionName(ctx);
|
||||||
stub.delPrivateData(ownersCollectionName, assetID);
|
stub.delPrivateData(ownersCollectionName, assetID);
|
||||||
|
|
||||||
//Delete the transfer agreement from the asset collection
|
// Delete the transfer agreement from the asset collection
|
||||||
CompositeKey aggKey = stub.createCompositeKey(AGREEMENT_KEYPREFIX, assetID);
|
CompositeKey aggKey = stub.createCompositeKey(AGREEMENT_KEYPREFIX, assetID);
|
||||||
System.out.printf("AgreeToTransfer deleteKey: collection %s, ID %s, Key %s\n", ASSET_COLLECTION_NAME, assetID, aggKey);
|
System.out.printf("AgreeToTransfer deleteKey: collection %s, ID %s, Key %s\n", ASSET_COLLECTION_NAME, assetID, aggKey);
|
||||||
stub.delPrivateData(ASSET_COLLECTION_NAME, aggKey.toString());
|
stub.delPrivateData(ASSET_COLLECTION_NAME, aggKey.toString());
|
||||||
|
|
@ -488,6 +488,9 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
* Deletes a asset & related details from the ledger.
|
* Deletes a asset & related details from the ledger.
|
||||||
* Input in transient map: asset_delete
|
* Input in transient map: asset_delete
|
||||||
*
|
*
|
||||||
|
* This deletes the private data, but does not trigger an immediate cleanup
|
||||||
|
* of the history. To specifically force removal right now use purge
|
||||||
|
*
|
||||||
* @param ctx the transaction context
|
* @param ctx the transaction context
|
||||||
*/
|
*/
|
||||||
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
||||||
|
|
@ -539,6 +542,53 @@ public final class AssetTransfer implements ContractInterface {
|
||||||
stub.delPrivateData(ownersCollectionName, assetID);
|
stub.delPrivateData(ownersCollectionName, assetID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purges the history of the asset from Private Data
|
||||||
|
* (delete does not need to be called as well)
|
||||||
|
* Input in transient map: asset_delete
|
||||||
|
*
|
||||||
|
* @param ctx the transaction context
|
||||||
|
*/
|
||||||
|
@Transaction(intent = Transaction.TYPE.SUBMIT)
|
||||||
|
public void PurgeAsset(final Context ctx) {
|
||||||
|
ChaincodeStub stub = ctx.getStub();
|
||||||
|
Map<String, byte[]> transientMap = ctx.getStub().getTransient();
|
||||||
|
if (!transientMap.containsKey("asset_purge")) {
|
||||||
|
String errorMessage = String.format("PurgeAsset call must specify 'asset_purge' in Transient map input");
|
||||||
|
System.err.println(errorMessage);
|
||||||
|
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] transientAssetJSON = transientMap.get("asset_purge");
|
||||||
|
final String assetID;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject json = new JSONObject(new String(transientAssetJSON, UTF_8));
|
||||||
|
assetID = json.getString("assetID");
|
||||||
|
|
||||||
|
} catch (Exception err) {
|
||||||
|
String errorMessage = String.format("TransientMap deserialized error: %s ", err);
|
||||||
|
System.err.println(errorMessage);
|
||||||
|
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that there is no check here to see if the id exist; it might have been 'deleted' already
|
||||||
|
// so a check here is pointless. We would need to call purge irrespective of the result
|
||||||
|
// A delete can be called before purge, but is not essential
|
||||||
|
|
||||||
|
String ownersCollectionName = getCollectionName(ctx);
|
||||||
|
verifyClientOrgMatchesPeerOrg(ctx);
|
||||||
|
|
||||||
|
// delete the key from asset collection
|
||||||
|
System.out.printf("PurgeAsset: collection %s, ID %s\n", ASSET_COLLECTION_NAME, assetID);
|
||||||
|
stub.purgePrivateData(ASSET_COLLECTION_NAME, assetID);
|
||||||
|
|
||||||
|
// Finally, delete private details of asset
|
||||||
|
System.out.printf("PurgeAsset: collection %s, ID %s\n", ownersCollectionName, assetID);
|
||||||
|
stub.purgePrivateData(ownersCollectionName, assetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Used by TransferAsset to verify that the transfer is being initiated by the owner and that
|
// Used by TransferAsset to verify that the transfer is being initiated by the owner and that
|
||||||
// the buyer has agreed to the same appraisal value as the owner
|
// the buyer has agreed to the same appraisal value as the owner
|
||||||
private void verifyAgreement(final Context ctx, final String assetID, final String owner, final String buyerMSP) {
|
private void verifyAgreement(final Context ctx, final String assetID, final String owner, final String buyerMSP) {
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,7 @@ async function main() {
|
||||||
console.log('*** Result: committed, now asset will only require Org1 to endorse');
|
console.log('*** Result: committed, now asset will only require Org1 to endorse');
|
||||||
} catch (createError) {
|
} catch (createError) {
|
||||||
console.log(`*** Failed: create - ${createError}`);
|
console.log(`*** Failed: create - ${createError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 100, org1, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 100, org1, contractOrg1, contractOrg2);
|
||||||
|
|
@ -207,6 +208,7 @@ async function main() {
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
} catch (updateError) {
|
} catch (updateError) {
|
||||||
console.log(`*** Failed: update - ${updateError}`);
|
console.log(`*** Failed: update - ${updateError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 200, org1, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 200, org1, contractOrg1, contractOrg2);
|
||||||
|
|
@ -223,6 +225,7 @@ async function main() {
|
||||||
console.log('*** Result: committed - because Org1 and Org2 both endorsed, while only the Org1 endorsement was required and checked');
|
console.log('*** Result: committed - because Org1 and Org2 both endorsed, while only the Org1 endorsement was required and checked');
|
||||||
} catch (updateError) {
|
} catch (updateError) {
|
||||||
console.log(`*** Failed: update - ${updateError}`);
|
console.log(`*** Failed: update - ${updateError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 300, org1, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 300, org1, contractOrg1, contractOrg2);
|
||||||
|
|
@ -236,6 +239,7 @@ async function main() {
|
||||||
console.log('*** Result: committed - because Org1 was on the discovery list, Org2 did not endorse');
|
console.log('*** Result: committed - because Org1 was on the discovery list, Org2 did not endorse');
|
||||||
} catch (updateError) {
|
} catch (updateError) {
|
||||||
console.log(`*** Failed: update - ${updateError}`);
|
console.log(`*** Failed: update - ${updateError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 400, org1, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 400, org1, contractOrg1, contractOrg2);
|
||||||
|
|
@ -263,6 +267,7 @@ async function main() {
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
} catch (transferError) {
|
} catch (transferError) {
|
||||||
console.log(`*** Failed: transfer - ${transferError}`);
|
console.log(`*** Failed: transfer - ${transferError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 400, org2, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 400, org2, contractOrg1, contractOrg2);
|
||||||
|
|
@ -277,6 +282,7 @@ async function main() {
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
} catch (updateError) {
|
} catch (updateError) {
|
||||||
console.log(`*** Failed: update - ${updateError}`);
|
console.log(`*** Failed: update - ${updateError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await readAssetByBothOrgs(assetKey, 600, org2, contractOrg1, contractOrg2);
|
await readAssetByBothOrgs(assetKey, 600, org2, contractOrg1, contractOrg2);
|
||||||
|
|
@ -317,6 +323,7 @@ async function main() {
|
||||||
console.log('*** Result: committed');
|
console.log('*** Result: committed');
|
||||||
} catch (deleteError) {
|
} catch (deleteError) {
|
||||||
console.log(`*** Failed: delete - ${deleteError}`);
|
console.log(`*** Failed: delete - ${deleteError}`);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The asset should now be deleted, both orgs should not be able to read it
|
// The asset should now be deleted, both orgs should not be able to read it
|
||||||
|
|
|
||||||
|
|
@ -14,13 +14,13 @@ version '1.0-SNAPSHOT'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.+'
|
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.4.1'
|
||||||
implementation 'org.json:json:+'
|
implementation 'org.json:json:+'
|
||||||
implementation 'com.google.protobuf:protobuf-java:3.+'
|
implementation 'com.google.protobuf:protobuf-java:3.+'
|
||||||
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-protos:2.+'
|
implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-protos:2.4.1'
|
||||||
implementation 'com.owlike:genson:1.5'
|
implementation 'com.owlike:genson:1.5'
|
||||||
|
|
||||||
testImplementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.+'
|
testImplementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.4.1'
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2'
|
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2'
|
||||||
testImplementation 'org.assertj:assertj-core:3.11.1'
|
testImplementation 'org.assertj:assertj-core:3.11.1'
|
||||||
testImplementation 'org.mockito:mockito-core:2.+'
|
testImplementation 'org.mockito:mockito-core:2.+'
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8",
|
"node": ">=12"
|
||||||
"npm": ">=5"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "tslint -c tslint.json 'src/**/*.ts'",
|
"lint": "tslint -c tslint.json 'src/**/*.ts'",
|
||||||
|
|
@ -21,14 +20,15 @@
|
||||||
"author": "Hyperledger",
|
"author": "Hyperledger",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fabric-contract-api": "^2.0.0",
|
"@grpc/grpc-js": "1.8.1",
|
||||||
"fabric-shim": "^2.0.0"
|
"fabric-contract-api": "~2.5.2",
|
||||||
|
"fabric-shim": "~2.5.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.2.11",
|
"@types/chai": "^4.2.11",
|
||||||
"@types/chai-as-promised": "^7.1.2",
|
"@types/chai-as-promised": "^7.1.2",
|
||||||
"@types/mocha": "^7.0.2",
|
"@types/mocha": "^7.0.2",
|
||||||
"@types/node": "^13.9.3",
|
"@types/node": "^12.20.55",
|
||||||
"@types/sinon": "^7.5.2",
|
"@types/sinon": "^7.5.2",
|
||||||
"@types/sinon-chai": "^3.2.3",
|
"@types/sinon-chai": "^3.2.3",
|
||||||
"chai": "^4.2.0",
|
"chai": "^4.2.0",
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue