diff --git a/.github/workflows/deploy_corda-pkgs.yml b/.github/workflows/deploy_corda-pkgs.yml index d88c91452..d860ef45d 100644 --- a/.github/workflows/deploy_corda-pkgs.yml +++ b/.github/workflows/deploy_corda-pkgs.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Deploy Corda Packages on: @@ -8,7 +12,7 @@ on: - 'common/protos-java-kt/gradle.properties' - 'core/network/corda-interop-app/gradle.properties' - 'sdks/corda/gradle.properties' - - 'core/drivers/corda-driver/makefile.variables.docker' + - 'core/drivers/corda-driver/VERSION' # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -41,6 +45,7 @@ jobs: publish-interop-app: + if: always() needs: publish-protos runs-on: ubuntu-latest steps: @@ -71,6 +76,7 @@ jobs: working-directory: core/network/corda-interop-app publish-sdk: + if: always() needs: [publish-protos, publish-interop-app] runs-on: ubuntu-latest steps: @@ -101,7 +107,7 @@ jobs: working-directory: sdks/corda publish-driver: - if: github.repository_owner == 'hyperledger-labs' + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} needs: [publish-protos, publish-interop-app, publish-sdk] runs-on: ubuntu-latest steps: @@ -127,5 +133,7 @@ jobs: - name: Build and Push run: make push-image working-directory: core/drivers/corda-driver - - \ No newline at end of file + + - name: Push latest tag + run: make push-image-latest + working-directory: core/drivers/corda-driver diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml index 561a3b2ee..676c087aa 100644 --- a/.github/workflows/deploy_docs.yml +++ b/.github/workflows/deploy_docs.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Deploy Docs (Github Pages) on: diff --git a/.github/workflows/deploy_fabric-pkgs.yml b/.github/workflows/deploy_fabric-pkgs.yml index ac2d7b204..efdd81c6c 100644 --- a/.github/workflows/deploy_fabric-pkgs.yml +++ b/.github/workflows/deploy_fabric-pkgs.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Deploy Fabric Packages on: @@ -7,7 +11,7 @@ on: paths: - 'common/protos-js/package.json' - 'sdks/fabric/interoperation-node-sdk/package.json' - - 'core/drivers/fabric-driver/makefile.variables.docker' + - 'core/drivers/fabric-driver/VERSION' # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -48,7 +52,7 @@ jobs: working-directory: common/protos-js publish-sdk: - if: github.repository_owner == 'hyperledger-labs' + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} needs: [publish-protos] runs-on: ubuntu-latest steps: @@ -76,7 +80,7 @@ jobs: working-directory: sdks/fabric/interoperation-node-sdk publish-driver: - if: github.repository_owner == 'hyperledger-labs' + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} needs: [publish-protos] runs-on: ubuntu-latest steps: @@ -100,5 +104,7 @@ jobs: - name: Build and Push run: make push-image working-directory: core/drivers/fabric-driver - - \ No newline at end of file + + - name: Push latest tag + run: make push-image-latest + working-directory: core/drivers/fabric-driver diff --git a/.github/workflows/deploy_go-pkgs.yml b/.github/workflows/deploy_go-pkgs.yml index 31b29e299..dba2edb54 100644 --- a/.github/workflows/deploy_go-pkgs.yml +++ b/.github/workflows/deploy_go-pkgs.yml @@ -1,65 +1,299 @@ -name: Deploy General Go Module +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + +name: Deploy Go Modules on: + push: + branches: + - main + paths: + - 'common/protos-go/VERSION' + - 'core/network/fabric-interop-cc/libs/utils/VERSION' + - 'core/network/fabric-interop-cc/libs/assetexchange/VERSION' + - 'core/network/fabric-interop-cc/interfaces/asset-mgmt/VERSION' + - 'core/network/fabric-interop-cc/contracts/interop/VERSION' + - 'sdks/fabric/go-sdk/VERSION' + # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - inputs: - module: - description: 'Go Module name' - default: 'protos-go' - required: true - version: - description: 'Version for Go Release' - default: 'v0.0.0' - required: true jobs: - release: + publish-protos: + if: github.repository_owner == 'hyperledger-labs' + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description + run: | + echo "MODULE_TAG=common/protos-go" >> $GITHUB_ENV + echo "MODULE_DESC=GO Weaver Protos" >> $GITHUB_ENV + + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: common/protos-go + + - name: Create Release + id: protos-go-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 + + publish-lib-utils: + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} + needs: publish-protos + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description + run: | + echo "MODULE_TAG=core/network/fabric-interop-cc/libs/utils" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Utils Library for Interoperation" >> $GITHUB_ENV + + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: core/network/fabric-interop-cc/libs/utils + + - name: Build test + run: go build -v ./... + working-directory: core/network/fabric-interop-cc/libs/utils + + - name: Create Release + id: lib-utils-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 + + publish-lib-asset-exchange: + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} + needs: publish-protos + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description + run: | + echo "MODULE_TAG=core/network/fabric-interop-cc/libs/assetexchange" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Library for Asset Exchange" >> $GITHUB_ENV + + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: core/network/fabric-interop-cc/libs/assetexchange + + - name: Build test + run: go build -v ./... + working-directory: core/network/fabric-interop-cc/libs/assetexchange + + - name: Create Release + id: lib-asset-exchange-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 + + publish-interface-asset-mgmt: + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} + needs: [publish-protos] runs-on: ubuntu-latest steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 - name: Set current date as env run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description + run: | + echo "MODULE_TAG=core/network/fabric-interop-cc/interfaces/asset-mgmt" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Asset Management Interface" >> $GITHUB_ENV - - name: Get Full path + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: core/network/fabric-interop-cc/interfaces/asset-mgmt + + - name: Build test + run: go build -v ./... + working-directory: core/network/fabric-interop-cc/interfaces/asset-mgmt + + - name: Create Release + id: asset-mgmt-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 + + publish-interop-cc: + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} + needs: [publish-protos, publish-lib-utils, publish-lib-asset-exchange] + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description + run: | + echo "MODULE_TAG=core/network/fabric-interop-cc/contracts/interop" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Interop Chaincode" >> $GITHUB_ENV + + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: core/network/fabric-interop-cc/contracts/interop + + - name: Build test + run: make build + working-directory: core/network/fabric-interop-cc/contracts/interop + + - name: Create Release + id: interop-cc-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 + + publish-go-sdk: + if: ${{ always() && github.repository_owner == 'hyperledger-labs' }} + needs: [publish-protos] + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Set module tag and description run: | - if [ "${{ github.event.inputs.module }}" = "protos-go" ]; then - echo "MODULE_TAG=common/protos-go" >> $GITHUB_ENV - echo "MODULE_DESC=GO Weaver Protos" >> $GITHUB_ENV - elif [ "${{ github.event.inputs.module }}" = "interop" ]; then - echo "MODULE_TAG=core/network/fabric-interop-cc/contracts/interop" >> $GITHUB_ENV - echo "MODULE_DESC=GO Fabric Interop Chaincode" >> $GITHUB_ENV - elif [ "${{ github.event.inputs.module }}" = "utils" ]; then - echo "MODULE_TAG=core/network/fabric-interop-cc/libs/utils" >> $GITHUB_ENV - echo "MODULE_DESC=GO Fabric Utils Library for Interoperation" >> $GITHUB_ENV - elif [ "${{ github.event.inputs.module }}" = "assetexchange" ]; then - echo "MODULE_TAG=core/network/fabric-interop-cc/libs/assetexchange" >> $GITHUB_ENV - echo "MODULE_DESC=GO Fabric Library for Asset Exchange" >> $GITHUB_ENV - elif [ "${{ github.event.inputs.module }}" = "asset-mgmt" ]; then - echo "MODULE_TAG=core/network/fabric-interop-cc/interfaces/asset-mgmt" >> $GITHUB_ENV - echo "MODULE_DESC=GO Fabric Asset Management Interface" >> $GITHUB_ENV - elif [ "${{ github.event.inputs.module }}" = "go-sdk" ]; then echo "MODULE_TAG=sdks/fabric/go-sdk" >> $GITHUB_ENV echo "MODULE_DESC=GO Fabric Weaver SDK" >> $GITHUB_ENV - else - echo "Module not known to the workflow. Exiting." - exit 1 - fi - - name: Create GO Release - id: go-release + - name: Set module version + run: echo "VERSION=v$(cat VERSION)" >> $GITHUB_ENV + working-directory: sdks/fabric/go-sdk + + - name: Build test + run: go build -v ./... + working-directory: sdks/fabric/go-sdk + + - name: Create Release + id: go-sdk-release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: ${{ env.MODULE_TAG }}/${{ github.event.inputs.version }} - release_name: ${{ github.event.inputs.version }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + tag_name: ${{ env.MODULE_TAG }}/${{ env.VERSION }} + release_name: ${{ env.VERSION }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} body: | - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` - - Release: ${{ github.event.inputs.version }} - - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ github.event.inputs.version }}/${{ env.MODULE_TAG }}/README.md). - - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ github.event.inputs.version }}/${{ env.MODULE_TAG }}) + - Release: ${{ env.VERSION }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ env.VERSION }}/${{ env.MODULE_TAG }}) draft: false - prerelease: false \ No newline at end of file + prerelease: false + + - name: Wait for release to be reflected + run: sleep 300 diff --git a/.github/workflows/deploy_relay-server.yml b/.github/workflows/deploy_relay-server.yml index 18bfe0504..54fee7c05 100644 --- a/.github/workflows/deploy_relay-server.yml +++ b/.github/workflows/deploy_relay-server.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Deploy Relay Docker Image on: @@ -5,7 +9,7 @@ on: branches: - main paths: - - 'core/relay/Makefile.variables.docker' + - 'core/relay/VERSION' # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -27,4 +31,8 @@ jobs: - name: Build and Push run: make push-server + working-directory: core/relay + + - name: Push latest tag + run: make push-server-latest working-directory: core/relay \ No newline at end of file diff --git a/.github/workflows/deploy_weaver-fabric-cc.yml b/.github/workflows/deploy_weaver-fabric-cc.yml new file mode 100644 index 000000000..4c01f53ca --- /dev/null +++ b/.github/workflows/deploy_weaver-fabric-cc.yml @@ -0,0 +1,38 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + +name: Deploy Weaver Fabric CC Docker Image + +on: + push: + branches: + - main + paths: + - 'core/network/fabric-interop-cc/contracts/interop/VERSION' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + weaver-fabric-cc-image: + if: github.repository_owner == 'hyperledger-labs' + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and Push + run: make push-image + working-directory: core/network/fabric-interop-cc + + - name: Push latest tag + run: make push-image-latest + working-directory: core/network/fabric-interop-cc \ No newline at end of file diff --git a/.github/workflows/manual_deploy_go-pkgs.yml b/.github/workflows/manual_deploy_go-pkgs.yml new file mode 100644 index 000000000..551ef8fcb --- /dev/null +++ b/.github/workflows/manual_deploy_go-pkgs.yml @@ -0,0 +1,80 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + +name: Deploy General Go Module + +on: + # Allows this to be a reusable workflow + workflow_call: + inputs: + module: + description: 'Go Module name' + required: true + type: string + version: + description: 'Version for Go Release' + required: true + type: string + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + module: + description: 'Go Module name' + default: 'protos-go' + required: true + version: + description: 'Version for Go Release' + default: 'v0.0.0' + required: true + +jobs: + release: + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Set current date as env + run: echo "RELEASE_DATE=$(date +%b\ %d,\ %Y)" >> $GITHUB_ENV + + - name: Get Full path + run: | + if [ "${{ inputs.module }}" = "protos-go" ]; then + echo "MODULE_TAG=common/protos-go" >> $GITHUB_ENV + echo "MODULE_DESC=GO Weaver Protos" >> $GITHUB_ENV + elif [ "${{ inputs.module }}" = "interop" ]; then + echo "MODULE_TAG=core/network/fabric-interop-cc/contracts/interop" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Interop Chaincode" >> $GITHUB_ENV + elif [ "${{ inputs.module }}" = "utils" ]; then + echo "MODULE_TAG=core/network/fabric-interop-cc/libs/utils" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Utils Library for Interoperation" >> $GITHUB_ENV + elif [ "${{ inputs.module }}" = "assetexchange" ]; then + echo "MODULE_TAG=core/network/fabric-interop-cc/libs/assetexchange" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Library for Asset Exchange" >> $GITHUB_ENV + elif [ "${{ inputs.module }}" = "asset-mgmt" ]; then + echo "MODULE_TAG=core/network/fabric-interop-cc/interfaces/asset-mgmt" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Asset Management Interface" >> $GITHUB_ENV + elif [ "${{ inputs.module }}" = "go-sdk" ]; then + echo "MODULE_TAG=sdks/fabric/go-sdk" >> $GITHUB_ENV + echo "MODULE_DESC=GO Fabric Weaver SDK" >> $GITHUB_ENV + else + echo "Module not known to the workflow. Exiting." + exit 1 + fi + + - name: Create GO Release + id: go-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.MODULE_TAG }}/${{ inputs.version }} + release_name: ${{ inputs.version }} - ${{ env.MODULE_DESC }} - ${{ env.RELEASE_DATE }} + body: | + - Go Module: `github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/${{ env.MODULE_TAG }}` + - Release: ${{ inputs.version }} + - Readme: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ inputs.version }}/${{ env.MODULE_TAG }}/README.md). + - Source: [Here](https://github.com/${{ github.repository_owner }}/weaver-dlt-interoperability/blob/${{ env.MODULE_TAG }}/${{ inputs.version }}/${{ env.MODULE_TAG }}) + draft: false + prerelease: false \ No newline at end of file diff --git a/.github/workflows/test_asset-exchange-besu.yml b/.github/workflows/test_asset-exchange-besu.yml new file mode 100644 index 000000000..80f41d2b0 --- /dev/null +++ b/.github/workflows/test_asset-exchange-besu.yml @@ -0,0 +1,150 @@ +# This is a basic workflow to help you get started with Actions + +name: Test Asset Exchange Besu + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + + asset-exchange-besu: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'adopt' + + # BESU NETWORK + - name: Start Besu Network + run: | + sudo apt install -y tmux jq + wget https://hyperledger.jfrog.io/artifactory/besu-binaries/besu/22.7.0/besu-22.7.0.zip + unzip besu-22.7.0.zip + export PATH="${PWD}/besu-22.7.0/bin:$PATH" + wget https://artifacts.consensys.net/public/ethsigner/raw/names/ethsigner.zip/versions/22.1.3/ethsigner-22.1.3.zip + unzip ethsigner-22.1.3.zip + export PATH="${PWD}/ethsigner-22.1.3/bin:$PATH" + make start + sleep 100 + working-directory: tests/network-setups/besu + + # Deploy contracts + - name: Deploy contracts + run: | + make deploy-contracts + working-directory: samples/besu/simpleasset + + # BESU CLI + - name: Setup BESU CLI init + run: | + npm install . + cp config.template.json tmp.json + cp config.template.json tmp.json + jq -r '.network1.tokenContract |= "../simpleasset/build/contracts/AliceERC20.json"' tmp.json > config.json + cp config.json tmp.json + jq -r '.network2.tokenContract |= "../simpleasset/build/contracts/BobERC20.json"' tmp.json > config.json + rm tmp.json + working-directory: samples/besu/besu-cli + + - name: Asset Exchange Besu CLI Tests + run: | + export PATH="${PWD}/bin:$PATH" + COUNT=0 + TOTAL=15 + tokencontract=( "AliceERC1155" "AliceERC20" "AliceERC721") + for (( count=0; count<3; count++ )) + do + cp config.template.json tmp.json + cp config.template.json tmp.json + jq -r ".network1.tokenContract |= \"../simpleasset/build/contracts/${tokencontract[$count]}.json\"" tmp.json > config.json + cp config.json tmp.json + jq -r '.network2.tokenContract |= "../simpleasset/build/contracts/BobERC20.json"' tmp.json > config.json + rm tmp.json + + # issue 1 tokens to account 1 + # & lock 1 token for account 2 in network 2 + if [ ${tokencontract[$count]} == "AliceERC20" ]; then + besu-cli asset issue --network=network1 --account=1 --amount=1 --asset_type=ERC20 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --timeout=1000 1> tmp.out + elif [ ${tokencontract[$count]} == "AliceERC1155" ]; then + besu-cli asset issue --network=network1 --account=1 --amount=1 --token_id=0 --token_data="" --asset_type=ERC1155 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --token_id=0 --timeout=1000 --asset_type=ERC1155 1> tmp.out + else + besu-cli asset issue --network=network1 --account=1 --amount=1 --token_id=0 --asset_type=ERC721 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --token_id=0 --asset_type=ERC721 --timeout=1000 1> tmp.out + fi + + cat tmp.out | grep "Account balance of the sender in Network network1: 1" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out + + tmp_string=$(cat tmp.out | grep "Lock contract ID:") + arrIN=(${tmp_string//:/ }) + LOCK_ID=${arrIN[3]} + tmp_string=$(cat tmp.out | grep "Preimage:") + arrIN=(${tmp_string//:/ }) + PREIMAGE=${arrIN[1]} + + # Is Asset locked + besu-cli asset is-locked --network=network1 --lock_contract_id=$LOCK_ID 1> tmp.out + cat tmp.out | grep "in Network network1: true" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out + + sleep 30 + + # Claim asset + besu-cli asset claim --network=network1 --lock_contract_id=$LOCK_ID --recipient_account=2 --preimage=$PREIMAGE 1> tmp.out + cat tmp.out | grep "Account balance of the recipient in Network network1 after claiming: 1" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out + + # test unlock + if [ ${tokencontract[$count]} == "AliceERC20" ]; then + besu-cli asset issue --network=network1 --account=1 --amount=1 --asset_type=ERC20 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --timeout=5 1> tmp.out + elif [ ${tokencontract[$count]} == "AliceERC1155" ]; then + besu-cli asset issue --network=network1 --account=1 --amount=1 --token_id=1 --token_data="" --asset_type=ERC1155 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --token_id=1 --timeout=5 --asset_type=ERC1155 1> tmp.out + else + besu-cli asset issue --network=network1 --account=1 --amount=1 --token_id=1 --asset_type=ERC721 + besu-cli asset lock --network=network1 --sender_account=1 --recipient_account=2 --amount=1 --token_id=1 --asset_type=ERC721 --timeout=5 1> tmp.out + fi + cat tmp.out | grep "Account balance of the sender in Network network1: 0" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out + + tmp_string=$(cat tmp.out | grep "Lock contract ID:") + arrIN=(${tmp_string//:/ }) + LOCK_ID=${arrIN[3]} + tmp_string=$(cat tmp.out | grep "Preimage:") + arrIN=(${tmp_string//:/ }) + PREIMAGE=${arrIN[1]} + + besu-cli asset unlock --network=network1 --lock_contract_id=$LOCK_ID --sender_account=1 --token_id=1 1> tmp.out + cat tmp.out | grep "after unlocking: 1" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out + done + # RESULT + echo "Passed $COUNT/$TOTAL Tests." + + if [ $COUNT == $TOTAL ]; then + exit 0 + else + exit 1 + fi + working-directory: samples/besu/besu-cli + diff --git a/.github/workflows/test_asset-exchange-corda.yml b/.github/workflows/test_asset-exchange-corda.yml index 3345c06c8..d3a270611 100644 --- a/.github/workflows/test_asset-exchange-corda.yml +++ b/.github/workflows/test_asset-exchange-corda.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This is a basic workflow to help you get started with Actions name: Test Asset Exchange Corda diff --git a/.github/workflows/test_asset-exchange-fabric.yml b/.github/workflows/test_asset-exchange-fabric.yml index 845ce2273..c9fd6b631 100644 --- a/.github/workflows/test_asset-exchange-fabric.yml +++ b/.github/workflows/test_asset-exchange-fabric.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This is a basic workflow to help you get started with Actions name: Test Asset Exchange Fabric @@ -17,7 +21,6 @@ on: jobs: asset-exchange-fabric: - # if: ${{ false }} # disable # The type of runner that the job will run on runs-on: ubuntu-latest diff --git a/.github/workflows/test_asset-transfer.yml b/.github/workflows/test_asset-transfer.yml index f84ea0d3f..2dbbbfaf4 100644 --- a/.github/workflows/test_asset-transfer.yml +++ b/.github/workflows/test_asset-transfer.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This is a basic workflow to help you get started with Actions name: Test Asset Transfer @@ -16,7 +20,6 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: fabric-asset-transfer: - # if: ${{ false }} # disable # The type of runner that the job will run on runs-on: ubuntu-latest @@ -265,7 +268,8 @@ jobs: cat tmp.out ./bin/fabric-cli chaincode query --user=bob mychannel simpleassettransfer ReadAsset '["bond01","a03"]' --local-network=network2 &> tmp.out - tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + #tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out | tr '\n' ' ' | grep "Result from network query: { \"type\": \"bond01\", \"id\": \"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" cat tmp.out ./bin/fabric-cli asset transfer pledge --source-network=network1 --dest-network=network2 --recipient=bob --expiry-secs=20 --type=bond --ref=a04 --data-file=src/data/assetsForTransfer.json &> tmp.out @@ -283,7 +287,8 @@ jobs: cat tmp.out ./bin/fabric-cli chaincode query --user=alice mychannel simpleassettransfer ReadAsset '["bond01","a04"]' --local-network=network1 &> tmp.out - tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + #tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out | tr '\n' ' ' | grep "Result from network query: { \"type\": \"bond01\", \"id\": \"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" cat tmp.out ./bin/fabric-cli chaincode query --user=bob mychannel simpleassettransfer ReadAsset '["bond01","a04"]' --local-network=network2 &> tmp.out @@ -632,7 +637,8 @@ jobs: cat tmp.out ./bin/fabric-cli chaincode query --user=bob mychannel simpleassettransfer ReadAsset '["bond01","a03"]' --local-network=network2 &> tmp.out - tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + #tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out | tr '\n' ' ' | grep "Result from network query: { \"type\": \"bond01\", \"id\": \"a03\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" cat tmp.out ./bin/fabric-cli asset transfer pledge --source-network=network1 --dest-network=network2 --recipient=bob --expiry-secs=20 --type=bond --ref=a04 --data-file=src/data/assetsForTransfer.json &> tmp.out @@ -650,7 +656,8 @@ jobs: cat tmp.out ./bin/fabric-cli chaincode query --user=alice mychannel simpleassettransfer ReadAsset '["bond01","a04"]' --local-network=network1 &> tmp.out - tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + #tail -n 1 tmp.out | grep "Result from network query: {\"type\":\"bond01\",\"id\":\"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" + cat tmp.out | tr '\n' ' ' | grep "Result from network query: { \"type\": \"bond01\", \"id\": \"a04\"" && COUNT=$(( COUNT + 1 )) && echo "PASS" cat tmp.out ./bin/fabric-cli chaincode query --user=bob mychannel simpleassettransfer ReadAsset '["bond01","a04"]' --local-network=network2 &> tmp.out diff --git a/.github/workflows/test_corda-interop-app.yml b/.github/workflows/test_corda-interop-app.yml index 1f7751829..6ada7ed84 100644 --- a/.github/workflows/test_corda-interop-app.yml +++ b/.github/workflows/test_corda-interop-app.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This workflow will build a Java project with Gradle # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle diff --git a/.github/workflows/test_data-sharing.yml b/.github/workflows/test_data-sharing.yml index d44eef541..2d8859f8a 100644 --- a/.github/workflows/test_data-sharing.yml +++ b/.github/workflows/test_data-sharing.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This is a basic workflow to help you get started with Actions name: Test Data Sharing @@ -16,7 +20,6 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: data-sharing: - # if: ${{ false }} # disable # The type of runner that the job will run on runs-on: ubuntu-latest diff --git a/.github/workflows/test_docker-build.yml b/.github/workflows/test_docker-build.yml index ef90df673..114af1493 100644 --- a/.github/workflows/test_docker-build.yml +++ b/.github/workflows/test_docker-build.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Test All Docker Images Build on: @@ -39,6 +43,10 @@ jobs: make build working-directory: common/protos-js + - name: Build Fabric Interop Node SDK (Local) + run: make build-local + working-directory: sdks/fabric/interoperation-node-sdk + - name: Build Image (Local) run: make build-image-local working-directory: core/drivers/fabric-driver @@ -114,4 +122,4 @@ jobs: - name: Build Image run: make image - working-directory: core/drivers/corda-driver \ No newline at end of file + working-directory: core/drivers/corda-driver diff --git a/.github/workflows/test_go.yml b/.github/workflows/test_go.yml index ae953134e..a0f401963 100644 --- a/.github/workflows/test_go.yml +++ b/.github/workflows/test_go.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + name: Unit Test Fabric Interop CC and Sample Chaincode on: diff --git a/.github/workflows/test_node-sdk.yml b/.github/workflows/test_node-sdk.yml index f211848c0..298d52051 100644 --- a/.github/workflows/test_node-sdk.yml +++ b/.github/workflows/test_node-sdk.yml @@ -1,3 +1,7 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions diff --git a/.github/workflows/test_relay.yml b/.github/workflows/test_relay.yml new file mode 100644 index 000000000..923755172 --- /dev/null +++ b/.github/workflows/test_relay.yml @@ -0,0 +1,56 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: CC-BY-4.0 + +name: Unit Test Relay + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + relay: + # if: ${{ false }} + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Install RUST Toolchain minimal stable with clippy and rustfmt + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + components: rustfmt, clippy + + - name: Get Latest Relay Dependencies + run: | + cargo update -p nom + cargo update -p lexical-core + working-directory: core/relay + + - name: Use Protoc 3.15 + run: | + curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v3.15.6/protoc-3.15.6-linux-x86_64.zip + unzip protoc-3.15.6-linux-x86_64.zip -d protoc + + - name: Build Image + run: make + working-directory: core/relay + + - name: Run Dummy Relay + run: RELAY_CONFIG=config/Dummy_Relay.toml cargo run --bin server &> relay-dummy.out & + working-directory: core/relay + + - name: Run Dummy Driver + run: RELAY_CONFIG=config/Dummy_Relay.toml cargo run --bin dummy-driver &> driver-dummy.out & + working-directory: core/relay + + - name: Mock Client Test + run: | + echo "Waiting for Dummy Relay and Driver to come up" + sleep 30 + cargo run --bin client 9085 localhost:9085/Dummy_Network/abc:abc:abc:abc + working-directory: core/relay \ No newline at end of file diff --git a/common/policy-dsl/package-lock.json b/common/policy-dsl/package-lock.json index bb28dc4fc..2f2d102de 100644 --- a/common/policy-dsl/package-lock.json +++ b/common/policy-dsl/package-lock.json @@ -430,23 +430,6 @@ "minimist": "^1.2.0" } }, - "@concordance/react": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", - "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", - "dev": true, - "requires": { - "arrify": "^1.0.1" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -714,12 +697,6 @@ "fastq": "^1.6.0" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -738,15 +715,6 @@ "@sinonjs/commons": "^1.7.0" } }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -925,15 +893,14 @@ "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } } }, "ansi-escapes": { @@ -960,9 +927,9 @@ "dev": true }, "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", + "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", "dev": true }, "antlr4": { @@ -1010,7 +977,7 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true }, "array-union": { @@ -1032,9 +999,9 @@ "dev": true }, "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true }, "assign-symbols": { @@ -1043,12 +1010,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1062,67 +1023,107 @@ "dev": true }, "ava": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-3.15.0.tgz", - "integrity": "sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz", + "integrity": "sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w==", "dev": true, "requires": { - "@concordance/react": "^2.0.0", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "ansi-styles": "^5.0.0", + "acorn": "^8.7.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.1.0", "arrgv": "^1.0.2", - "arrify": "^2.0.1", - "callsites": "^3.1.0", - "chalk": "^4.1.0", - "chokidar": "^3.4.3", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", "chunkd": "^2.0.1", - "ci-info": "^2.0.0", + "ci-info": "^3.3.1", "ci-parallel-vars": "^1.0.1", "clean-yaml-object": "^0.1.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", "common-path-prefix": "^3.0.0", - "concordance": "^5.0.1", - "convert-source-map": "^1.7.0", + "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.3.1", - "del": "^6.0.0", - "emittery": "^0.8.0", - "equal-length": "^1.0.0", - "figures": "^3.2.0", - "globby": "^11.0.1", - "ignore-by-default": "^2.0.0", - "import-local": "^3.0.2", - "indent-string": "^4.0.0", + "debug": "^4.3.4", + "del": "^6.1.1", + "emittery": "^0.11.0", + "figures": "^4.0.1", + "globby": "^13.1.1", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", "is-error": "^2.2.2", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", - "lodash": "^4.17.20", - "matcher": "^3.0.0", - "md5-hex": "^3.0.1", - "mem": "^8.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", "ms": "^2.1.3", - "ora": "^5.2.0", - "p-event": "^4.2.0", - "p-map": "^4.0.0", - "picomatch": "^2.2.2", - "pkg-conf": "^3.1.0", - "plur": "^4.0.0", + "p-event": "^5.0.1", + "p-map": "^5.4.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", "pretty-ms": "^7.0.1", - "read-pkg": "^5.2.0", "resolve-cwd": "^3.0.0", "slash": "^3.0.0", - "source-map-support": "^0.5.19", - "stack-utils": "^2.0.3", - "strip-ansi": "^6.0.0", - "supertap": "^2.0.0", + "stack-utils": "^2.0.5", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", "temp-dir": "^2.0.0", - "trim-off-newlines": "^1.0.1", - "update-notifier": "^5.0.1", - "write-file-atomic": "^3.0.3", - "yargs": "^16.2.0" + "write-file-atomic": "^4.0.1", + "yargs": "^17.5.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "callsites": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", + "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==", + "dev": true + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + }, + "ci-info": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", + "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", + "dev": true + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } } }, "babel-jest": { @@ -1278,59 +1279,18 @@ } } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "blueimp-md5": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1378,16 +1338,6 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1411,38 +1361,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1470,6 +1388,15 @@ "rsvp": "^4.8.4" } }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "requires": { + "nofilter": "^3.1.0" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1569,38 +1496,51 @@ "clean-yaml-object": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", "dev": true }, "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "cliui": { @@ -1614,21 +1554,6 @@ "wrap-ansi": "^7.0.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1636,12 +1561,12 @@ "dev": true }, "code-excerpt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", - "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, "requires": { - "convert-to-spaces": "^1.0.1" + "convert-to-spaces": "^2.0.1" } }, "collect-v8-coverage": { @@ -1718,20 +1643,6 @@ "well-known-symbols": "^2.0.0" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1742,9 +1653,9 @@ } }, "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true }, "copy-descriptor": { @@ -1774,12 +1685,6 @@ } } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -1806,7 +1711,7 @@ "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, "requires": { "array-find-index": "^1.0.1" @@ -1867,21 +1772,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1894,21 +1784,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -1951,9 +1826,9 @@ } }, "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "requires": { "globby": "^11.0.1", @@ -1964,6 +1839,31 @@ "p-map": "^4.0.0", "rimraf": "^3.0.2", "slash": "^3.0.0" + }, + "dependencies": { + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } } }, "delayed-stream": { @@ -2010,19 +1910,10 @@ } } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "electron-to-chromium": { @@ -2032,9 +1923,9 @@ "dev": true }, "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz", + "integrity": "sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==", "dev": true }, "emoji-regex": { @@ -2052,12 +1943,6 @@ "once": "^1.4.0" } }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", - "dev": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2073,12 +1958,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2320,9 +2199,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -2363,12 +2242,21 @@ } }, "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } } }, "fill-range": { @@ -2491,15 +2379,6 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2507,36 +2386,24 @@ "dev": true }, "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, "requires": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", + "fast-glob": "^3.2.11", "ignore": "^5.2.0", "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } } }, "graceful-fs": { @@ -2619,12 +2486,6 @@ } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -2646,12 +2507,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -2688,12 +2543,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2701,15 +2550,9 @@ "dev": true }, "ignore-by-default": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz", - "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA==", - "dev": true - }, - "import-lazy": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true }, "import-local": { @@ -2729,9 +2572,9 @@ "dev": true }, "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true }, "inflight": { @@ -2750,12 +2593,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, "irregular-plurals": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", @@ -2882,7 +2719,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -2906,40 +2743,12 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -2983,9 +2792,9 @@ "dev": true }, "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true }, "is-windows": { @@ -3004,12 +2813,6 @@ "is-docker": "^2.0.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3760,7 +3563,7 @@ "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", "dev": true }, "js-tokens": { @@ -3820,18 +3623,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3844,15 +3635,6 @@ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3865,15 +3647,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -3897,17 +3670,10 @@ "dev": true }, "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true }, "locate-path": { "version": "5.0.0", @@ -3924,22 +3690,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4000,18 +3750,18 @@ } }, "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, "requires": { - "escape-string-regexp": "^4.0.0" + "escape-string-regexp": "^5.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true } } @@ -4026,19 +3776,19 @@ } }, "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" + "mimic-fn": "^4.0.0" }, "dependencies": { "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true } } @@ -4086,12 +3836,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4213,6 +3957,12 @@ "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4239,12 +3989,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -4341,33 +4085,10 @@ "word-wrap": "~1.2.3" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true }, "p-each-series": { @@ -4377,12 +4098,12 @@ "dev": true }, "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, "requires": { - "p-timeout": "^3.1.0" + "p-timeout": "^5.0.2" } }, "p-finally": { @@ -4410,22 +4131,46 @@ } }, "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "aggregate-error": "^4.0.0" + }, + "dependencies": { + "aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "requires": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + } + }, + "clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } } }, "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true }, "p-try": { "version": "2.2.0", @@ -4433,36 +4178,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -4523,12 +4238,6 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -4536,47 +4245,56 @@ "dev": true }, "pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", "dev": true, "requires": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "yocto-queue": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^4.0.0" } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true } } @@ -4591,12 +4309,12 @@ } }, "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, "requires": { - "irregular-plurals": "^3.2.0" + "irregular-plurals": "^3.3.0" } }, "posix-character-classes": { @@ -4611,12 +4329,6 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -4681,41 +4393,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -4773,17 +4456,6 @@ } } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4803,24 +4475,6 @@ "safe-regex": "^1.1.0" } }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4883,25 +4537,6 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -5118,23 +4753,6 @@ "lru-cache": "^6.0.0" } }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -5142,14 +4760,6 @@ "dev": true, "requires": { "type-fest": "^0.13.1" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - } } }, "set-blocking": { @@ -5231,24 +4841,20 @@ "dev": true }, "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true } } }, @@ -5521,23 +5127,6 @@ "strip-ansi": "^6.0.1" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5547,12 +5136,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -5565,23 +5148,33 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "supertap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-2.0.0.tgz", - "integrity": "sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, "requires": { - "arrify": "^2.0.1", - "indent-string": "^4.0.0", - "js-yaml": "^3.14.0", + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", "serialize-error": "^7.0.1", - "strip-ansi": "^6.0.0" + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "supports-color": { @@ -5651,7 +5244,7 @@ "time-zone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", "dev": true }, "tmpl": { @@ -5686,12 +5279,6 @@ } } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -5733,12 +5320,6 @@ "punycode": "^2.1.1" } }, - "trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", - "dev": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -5755,9 +5336,9 @@ "dev": true }, "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true }, "typedarray-to-buffer": { @@ -5781,15 +5362,6 @@ "set-value": "^2.0.1" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -5836,55 +5408,18 @@ } } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -5948,15 +5483,6 @@ "makeerror": "1.0.12" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -6010,15 +5536,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6071,12 +5588,6 @@ "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -6102,24 +5613,30 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.0.0" } }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true } } diff --git a/common/policy-dsl/package.json b/common/policy-dsl/package.json index f8826f03c..96c19187c 100644 --- a/common/policy-dsl/package.json +++ b/common/policy-dsl/package.json @@ -25,7 +25,7 @@ "author": "", "license": "ISC", "devDependencies": { - "ava": "^3.13.0", + "ava": "^4.3.3", "jest": "^26.6.3" }, "dependencies": { diff --git a/common/protos-go/VERSION b/common/protos-go/VERSION new file mode 100644 index 000000000..26ca59460 --- /dev/null +++ b/common/protos-go/VERSION @@ -0,0 +1 @@ +1.5.1 diff --git a/common/protos-go/common/access_control.pb.go b/common/protos-go/common/access_control.pb.go index 828b91645..ac5fd10cf 100644 --- a/common/protos-go/common/access_control.pb.go +++ b/common/protos-go/common/access_control.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/access_control.proto package common diff --git a/common/protos-go/common/ack.pb.go b/common/protos-go/common/ack.pb.go index 2b9639c20..5fbca51f0 100644 --- a/common/protos-go/common/ack.pb.go +++ b/common/protos-go/common/ack.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/ack.proto package common diff --git a/common/protos-go/common/asset_locks.pb.go b/common/protos-go/common/asset_locks.pb.go index 9b9bc8838..49b35bc96 100644 --- a/common/protos-go/common/asset_locks.pb.go +++ b/common/protos-go/common/asset_locks.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/asset_locks.proto package common diff --git a/common/protos-go/common/asset_transfer.pb.go b/common/protos-go/common/asset_transfer.pb.go index b2fc4628f..790802e65 100644 --- a/common/protos-go/common/asset_transfer.pb.go +++ b/common/protos-go/common/asset_transfer.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/asset_transfer.proto package common diff --git a/common/protos-go/common/events.pb.go b/common/protos-go/common/events.pb.go new file mode 100644 index 000000000..4ece08844 --- /dev/null +++ b/common/protos-go/common/events.pb.go @@ -0,0 +1,973 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.17.3 +// source: common/events.proto + +package common + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type EventType int32 + +const ( + EventType_LEDGER_STATE EventType = 0 + EventType_ASSET_LOCK EventType = 1 + EventType_ASSET_CLAIM EventType = 2 +) + +// Enum value maps for EventType. +var ( + EventType_name = map[int32]string{ + 0: "LEDGER_STATE", + 1: "ASSET_LOCK", + 2: "ASSET_CLAIM", + } + EventType_value = map[string]int32{ + "LEDGER_STATE": 0, + "ASSET_LOCK": 1, + "ASSET_CLAIM": 2, + } +) + +func (x EventType) Enum() *EventType { + p := new(EventType) + *p = x + return p +} + +func (x EventType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EventType) Descriptor() protoreflect.EnumDescriptor { + return file_common_events_proto_enumTypes[0].Descriptor() +} + +func (EventType) Type() protoreflect.EnumType { + return &file_common_events_proto_enumTypes[0] +} + +func (x EventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EventType.Descriptor instead. +func (EventType) EnumDescriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{0} +} + +type EventSubOperation int32 + +const ( + EventSubOperation_SUBSCRIBE EventSubOperation = 0 + EventSubOperation_UNSUBSCRIBE EventSubOperation = 1 + EventSubOperation_UPDATE EventSubOperation = 2 +) + +// Enum value maps for EventSubOperation. +var ( + EventSubOperation_name = map[int32]string{ + 0: "SUBSCRIBE", + 1: "UNSUBSCRIBE", + 2: "UPDATE", + } + EventSubOperation_value = map[string]int32{ + "SUBSCRIBE": 0, + "UNSUBSCRIBE": 1, + "UPDATE": 2, + } +) + +func (x EventSubOperation) Enum() *EventSubOperation { + p := new(EventSubOperation) + *p = x + return p +} + +func (x EventSubOperation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EventSubOperation) Descriptor() protoreflect.EnumDescriptor { + return file_common_events_proto_enumTypes[1].Descriptor() +} + +func (EventSubOperation) Type() protoreflect.EnumType { + return &file_common_events_proto_enumTypes[1] +} + +func (x EventSubOperation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EventSubOperation.Descriptor instead. +func (EventSubOperation) EnumDescriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{1} +} + +type EventSubscriptionState_STATUS int32 + +const ( + // pending ACK from remote relay + EventSubscriptionState_SUBSCRIBE_PENDING_ACK EventSubscriptionState_STATUS = 0 + // Received ACK, waiting for event subscription confirmation from remote relay + EventSubscriptionState_SUBSCRIBE_PENDING EventSubscriptionState_STATUS = 1 + EventSubscriptionState_SUBSCRIBED EventSubscriptionState_STATUS = 2 + EventSubscriptionState_UNSUBSCRIBE_PENDING_ACK EventSubscriptionState_STATUS = 3 + EventSubscriptionState_UNSUBSCRIBE_PENDING EventSubscriptionState_STATUS = 4 + EventSubscriptionState_UNSUBSCRIBED EventSubscriptionState_STATUS = 5 + EventSubscriptionState_ERROR EventSubscriptionState_STATUS = 6 +) + +// Enum value maps for EventSubscriptionState_STATUS. +var ( + EventSubscriptionState_STATUS_name = map[int32]string{ + 0: "SUBSCRIBE_PENDING_ACK", + 1: "SUBSCRIBE_PENDING", + 2: "SUBSCRIBED", + 3: "UNSUBSCRIBE_PENDING_ACK", + 4: "UNSUBSCRIBE_PENDING", + 5: "UNSUBSCRIBED", + 6: "ERROR", + } + EventSubscriptionState_STATUS_value = map[string]int32{ + "SUBSCRIBE_PENDING_ACK": 0, + "SUBSCRIBE_PENDING": 1, + "SUBSCRIBED": 2, + "UNSUBSCRIBE_PENDING_ACK": 3, + "UNSUBSCRIBE_PENDING": 4, + "UNSUBSCRIBED": 5, + "ERROR": 6, + } +) + +func (x EventSubscriptionState_STATUS) Enum() *EventSubscriptionState_STATUS { + p := new(EventSubscriptionState_STATUS) + *p = x + return p +} + +func (x EventSubscriptionState_STATUS) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EventSubscriptionState_STATUS) Descriptor() protoreflect.EnumDescriptor { + return file_common_events_proto_enumTypes[2].Descriptor() +} + +func (EventSubscriptionState_STATUS) Type() protoreflect.EnumType { + return &file_common_events_proto_enumTypes[2] +} + +func (x EventSubscriptionState_STATUS) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EventSubscriptionState_STATUS.Descriptor instead. +func (EventSubscriptionState_STATUS) EnumDescriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{2, 0} +} + +type EventMatcher struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventType EventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=common.events.EventType" json:"event_type,omitempty"` + EventClassId string `protobuf:"bytes,2,opt,name=event_class_id,json=eventClassId,proto3" json:"event_class_id,omitempty"` + TransactionLedgerId string `protobuf:"bytes,3,opt,name=transaction_ledger_id,json=transactionLedgerId,proto3" json:"transaction_ledger_id,omitempty"` + TransactionContractId string `protobuf:"bytes,4,opt,name=transaction_contract_id,json=transactionContractId,proto3" json:"transaction_contract_id,omitempty"` + TransactionFunc string `protobuf:"bytes,5,opt,name=transaction_func,json=transactionFunc,proto3" json:"transaction_func,omitempty"` +} + +func (x *EventMatcher) Reset() { + *x = EventMatcher{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventMatcher) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventMatcher) ProtoMessage() {} + +func (x *EventMatcher) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventMatcher.ProtoReflect.Descriptor instead. +func (*EventMatcher) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{0} +} + +func (x *EventMatcher) GetEventType() EventType { + if x != nil { + return x.EventType + } + return EventType_LEDGER_STATE +} + +func (x *EventMatcher) GetEventClassId() string { + if x != nil { + return x.EventClassId + } + return "" +} + +func (x *EventMatcher) GetTransactionLedgerId() string { + if x != nil { + return x.TransactionLedgerId + } + return "" +} + +func (x *EventMatcher) GetTransactionContractId() string { + if x != nil { + return x.TransactionContractId + } + return "" +} + +func (x *EventMatcher) GetTransactionFunc() string { + if x != nil { + return x.TransactionFunc + } + return "" +} + +// Below message is used to communicate between dest-relay and src-relay; +// and src-relay and src-driver. +type EventSubscription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventMatcher *EventMatcher `protobuf:"bytes,1,opt,name=event_matcher,json=eventMatcher,proto3" json:"event_matcher,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Operation EventSubOperation `protobuf:"varint,3,opt,name=operation,proto3,enum=common.events.EventSubOperation" json:"operation,omitempty"` +} + +func (x *EventSubscription) Reset() { + *x = EventSubscription{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventSubscription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventSubscription) ProtoMessage() {} + +func (x *EventSubscription) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventSubscription.ProtoReflect.Descriptor instead. +func (*EventSubscription) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{1} +} + +func (x *EventSubscription) GetEventMatcher() *EventMatcher { + if x != nil { + return x.EventMatcher + } + return nil +} + +func (x *EventSubscription) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +func (x *EventSubscription) GetOperation() EventSubOperation { + if x != nil { + return x.Operation + } + return EventSubOperation_SUBSCRIBE +} + +type EventSubscriptionState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + Status EventSubscriptionState_STATUS `protobuf:"varint,2,opt,name=status,proto3,enum=common.events.EventSubscriptionState_STATUS" json:"status,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + EventMatcher *EventMatcher `protobuf:"bytes,4,opt,name=event_matcher,json=eventMatcher,proto3" json:"event_matcher,omitempty"` + EventPublicationSpec *EventPublication `protobuf:"bytes,5,opt,name=event_publication_spec,json=eventPublicationSpec,proto3" json:"event_publication_spec,omitempty"` +} + +func (x *EventSubscriptionState) Reset() { + *x = EventSubscriptionState{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventSubscriptionState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventSubscriptionState) ProtoMessage() {} + +func (x *EventSubscriptionState) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventSubscriptionState.ProtoReflect.Descriptor instead. +func (*EventSubscriptionState) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{2} +} + +func (x *EventSubscriptionState) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *EventSubscriptionState) GetStatus() EventSubscriptionState_STATUS { + if x != nil { + return x.Status + } + return EventSubscriptionState_SUBSCRIBE_PENDING_ACK +} + +func (x *EventSubscriptionState) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *EventSubscriptionState) GetEventMatcher() *EventMatcher { + if x != nil { + return x.EventMatcher + } + return nil +} + +func (x *EventSubscriptionState) GetEventPublicationSpec() *EventPublication { + if x != nil { + return x.EventPublicationSpec + } + return nil +} + +type ContractTransaction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DriverId string `protobuf:"bytes,1,opt,name=driver_id,json=driverId,proto3" json:"driver_id,omitempty"` + LedgerId string `protobuf:"bytes,2,opt,name=ledger_id,json=ledgerId,proto3" json:"ledger_id,omitempty"` + ContractId string `protobuf:"bytes,3,opt,name=contract_id,json=contractId,proto3" json:"contract_id,omitempty"` + Func string `protobuf:"bytes,4,opt,name=func,proto3" json:"func,omitempty"` + Args [][]byte `protobuf:"bytes,5,rep,name=args,proto3" json:"args,omitempty"` + ReplaceArgIndex uint64 `protobuf:"varint,6,opt,name=replace_arg_index,json=replaceArgIndex,proto3" json:"replace_arg_index,omitempty"` + Members []string `protobuf:"bytes,7,rep,name=members,proto3" json:"members,omitempty"` +} + +func (x *ContractTransaction) Reset() { + *x = ContractTransaction{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContractTransaction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContractTransaction) ProtoMessage() {} + +func (x *ContractTransaction) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContractTransaction.ProtoReflect.Descriptor instead. +func (*ContractTransaction) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{3} +} + +func (x *ContractTransaction) GetDriverId() string { + if x != nil { + return x.DriverId + } + return "" +} + +func (x *ContractTransaction) GetLedgerId() string { + if x != nil { + return x.LedgerId + } + return "" +} + +func (x *ContractTransaction) GetContractId() string { + if x != nil { + return x.ContractId + } + return "" +} + +func (x *ContractTransaction) GetFunc() string { + if x != nil { + return x.Func + } + return "" +} + +func (x *ContractTransaction) GetArgs() [][]byte { + if x != nil { + return x.Args + } + return nil +} + +func (x *ContractTransaction) GetReplaceArgIndex() uint64 { + if x != nil { + return x.ReplaceArgIndex + } + return 0 +} + +func (x *ContractTransaction) GetMembers() []string { + if x != nil { + return x.Members + } + return nil +} + +type EventPublication struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to PublicationTarget: + // *EventPublication_Ctx + // *EventPublication_AppUrl + PublicationTarget isEventPublication_PublicationTarget `protobuf_oneof:"publication_target"` +} + +func (x *EventPublication) Reset() { + *x = EventPublication{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventPublication) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventPublication) ProtoMessage() {} + +func (x *EventPublication) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventPublication.ProtoReflect.Descriptor instead. +func (*EventPublication) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{4} +} + +func (m *EventPublication) GetPublicationTarget() isEventPublication_PublicationTarget { + if m != nil { + return m.PublicationTarget + } + return nil +} + +func (x *EventPublication) GetCtx() *ContractTransaction { + if x, ok := x.GetPublicationTarget().(*EventPublication_Ctx); ok { + return x.Ctx + } + return nil +} + +func (x *EventPublication) GetAppUrl() string { + if x, ok := x.GetPublicationTarget().(*EventPublication_AppUrl); ok { + return x.AppUrl + } + return "" +} + +type isEventPublication_PublicationTarget interface { + isEventPublication_PublicationTarget() +} + +type EventPublication_Ctx struct { + Ctx *ContractTransaction `protobuf:"bytes,1,opt,name=ctx,proto3,oneof"` +} + +type EventPublication_AppUrl struct { + AppUrl string `protobuf:"bytes,2,opt,name=app_url,json=appUrl,proto3,oneof"` +} + +func (*EventPublication_Ctx) isEventPublication_PublicationTarget() {} + +func (*EventPublication_AppUrl) isEventPublication_PublicationTarget() {} + +type EventStates struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + States []*EventState `protobuf:"bytes,1,rep,name=states,proto3" json:"states,omitempty"` +} + +func (x *EventStates) Reset() { + *x = EventStates{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventStates) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventStates) ProtoMessage() {} + +func (x *EventStates) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventStates.ProtoReflect.Descriptor instead. +func (*EventStates) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{5} +} + +func (x *EventStates) GetStates() []*EventState { + if x != nil { + return x.States + } + return nil +} + +// the payload that is used for the communication between the requesting relay +// and its network +type EventState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State *RequestState `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + EventId string `protobuf:"bytes,2,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *EventState) Reset() { + *x = EventState{} + if protoimpl.UnsafeEnabled { + mi := &file_common_events_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventState) ProtoMessage() {} + +func (x *EventState) ProtoReflect() protoreflect.Message { + mi := &file_common_events_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventState.ProtoReflect.Descriptor instead. +func (*EventState) Descriptor() ([]byte, []int) { + return file_common_events_proto_rawDescGZIP(), []int{6} +} + +func (x *EventState) GetState() *RequestState { + if x != nil { + return x.State + } + return nil +} + +func (x *EventState) GetEventId() string { + if x != nil { + return x.EventId + } + return "" +} + +func (x *EventState) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +var File_common_events_proto protoreflect.FileDescriptor + +var file_common_events_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x84, 0x02, 0x0a, + 0x0c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x37, 0x0a, + 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x64, 0x67, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x36, 0x0a, 0x17, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, + 0x75, 0x6e, 0x63, 0x22, 0xc0, 0x01, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0d, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, + 0x75, 0x62, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd0, 0x03, 0x0a, 0x16, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x40, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x72, 0x52, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x12, 0x55, 0x0a, 0x16, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x22, 0x9d, 0x01, 0x0a, 0x06, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, + 0x15, 0x0a, 0x11, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, + 0x49, 0x42, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x4e, 0x53, 0x55, 0x42, 0x53, + 0x43, 0x52, 0x49, 0x42, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x43, + 0x4b, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x4e, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, + 0x42, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, + 0x55, 0x4e, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x44, 0x10, 0x05, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x06, 0x22, 0xde, 0x01, 0x0a, 0x13, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x66, 0x75, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, + 0x61, 0x72, 0x67, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x72, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x7b, 0x0a, 0x10, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x03, 0x63, 0x74, 0x78, 0x12, 0x19, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x61, 0x70, 0x70, 0x55, 0x72, + 0x6c, 0x42, 0x14, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x40, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x0a, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x3e, + 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4c, + 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0e, 0x0a, + 0x0a, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x0f, 0x0a, + 0x0b, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x02, 0x2a, 0x3f, + 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, + 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x42, + 0x72, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_common_events_proto_rawDescOnce sync.Once + file_common_events_proto_rawDescData = file_common_events_proto_rawDesc +) + +func file_common_events_proto_rawDescGZIP() []byte { + file_common_events_proto_rawDescOnce.Do(func() { + file_common_events_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_events_proto_rawDescData) + }) + return file_common_events_proto_rawDescData +} + +var file_common_events_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_common_events_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_common_events_proto_goTypes = []interface{}{ + (EventType)(0), // 0: common.events.EventType + (EventSubOperation)(0), // 1: common.events.EventSubOperation + (EventSubscriptionState_STATUS)(0), // 2: common.events.EventSubscriptionState.STATUS + (*EventMatcher)(nil), // 3: common.events.EventMatcher + (*EventSubscription)(nil), // 4: common.events.EventSubscription + (*EventSubscriptionState)(nil), // 5: common.events.EventSubscriptionState + (*ContractTransaction)(nil), // 6: common.events.ContractTransaction + (*EventPublication)(nil), // 7: common.events.EventPublication + (*EventStates)(nil), // 8: common.events.EventStates + (*EventState)(nil), // 9: common.events.EventState + (*Query)(nil), // 10: common.query.Query + (*RequestState)(nil), // 11: common.state.RequestState +} +var file_common_events_proto_depIdxs = []int32{ + 0, // 0: common.events.EventMatcher.event_type:type_name -> common.events.EventType + 3, // 1: common.events.EventSubscription.event_matcher:type_name -> common.events.EventMatcher + 10, // 2: common.events.EventSubscription.query:type_name -> common.query.Query + 1, // 3: common.events.EventSubscription.operation:type_name -> common.events.EventSubOperation + 2, // 4: common.events.EventSubscriptionState.status:type_name -> common.events.EventSubscriptionState.STATUS + 3, // 5: common.events.EventSubscriptionState.event_matcher:type_name -> common.events.EventMatcher + 7, // 6: common.events.EventSubscriptionState.event_publication_spec:type_name -> common.events.EventPublication + 6, // 7: common.events.EventPublication.ctx:type_name -> common.events.ContractTransaction + 9, // 8: common.events.EventStates.states:type_name -> common.events.EventState + 11, // 9: common.events.EventState.state:type_name -> common.state.RequestState + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_common_events_proto_init() } +func file_common_events_proto_init() { + if File_common_events_proto != nil { + return + } + file_common_query_proto_init() + file_common_state_proto_init() + if !protoimpl.UnsafeEnabled { + file_common_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventMatcher); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventSubscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventSubscriptionState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContractTransaction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventPublication); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventStates); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_common_events_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*EventPublication_Ctx)(nil), + (*EventPublication_AppUrl)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_common_events_proto_rawDesc, + NumEnums: 3, + NumMessages: 7, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_common_events_proto_goTypes, + DependencyIndexes: file_common_events_proto_depIdxs, + EnumInfos: file_common_events_proto_enumTypes, + MessageInfos: file_common_events_proto_msgTypes, + }.Build() + File_common_events_proto = out.File + file_common_events_proto_rawDesc = nil + file_common_events_proto_goTypes = nil + file_common_events_proto_depIdxs = nil +} diff --git a/common/protos-go/common/interop_payload.pb.go b/common/protos-go/common/interop_payload.pb.go index e35281390..bfbb902a6 100644 --- a/common/protos-go/common/interop_payload.pb.go +++ b/common/protos-go/common/interop_payload.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/interop_payload.proto package common diff --git a/common/protos-go/common/membership.pb.go b/common/protos-go/common/membership.pb.go index 72d84d73d..98180bb7a 100644 --- a/common/protos-go/common/membership.pb.go +++ b/common/protos-go/common/membership.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/membership.proto package common diff --git a/common/protos-go/common/proofs.pb.go b/common/protos-go/common/proofs.pb.go index 88f8792bb..8ef9cb5ce 100644 --- a/common/protos-go/common/proofs.pb.go +++ b/common/protos-go/common/proofs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/proofs.proto package common diff --git a/common/protos-go/common/query.pb.go b/common/protos-go/common/query.pb.go index 2697aa449..2a3567ef2 100644 --- a/common/protos-go/common/query.pb.go +++ b/common/protos-go/common/query.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/query.proto package common diff --git a/common/protos-go/common/state.pb.go b/common/protos-go/common/state.pb.go index 97149ac7f..ca236f331 100644 --- a/common/protos-go/common/state.pb.go +++ b/common/protos-go/common/state.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/state.proto package common @@ -78,9 +78,13 @@ const ( // pending ACK from remote relay RequestState_PENDING_ACK RequestState_STATUS = 0 // Received ACK, waiting for data to be sent from remote relay - RequestState_PENDING RequestState_STATUS = 1 - RequestState_ERROR RequestState_STATUS = 2 - RequestState_COMPLETED RequestState_STATUS = 3 + RequestState_PENDING RequestState_STATUS = 1 + RequestState_ERROR RequestState_STATUS = 2 // View is not there, received error from remote relay + RequestState_COMPLETED RequestState_STATUS = 3 // Data Sharing completed Successfully + RequestState_EVENT_RECEIVED RequestState_STATUS = 4 // View is there and event is received from remote relay + RequestState_EVENT_WRITTEN RequestState_STATUS = 5 // Driver Successfully wrote the view to ledger + RequestState_EVENT_WRITE_ERROR RequestState_STATUS = 6 // View is there but driver failed to write + RequestState_DELETED RequestState_STATUS = 7 // Once network fetches this request state, mark it delete for cleanup later on ) // Enum value maps for RequestState_STATUS. @@ -90,12 +94,20 @@ var ( 1: "PENDING", 2: "ERROR", 3: "COMPLETED", + 4: "EVENT_RECEIVED", + 5: "EVENT_WRITTEN", + 6: "EVENT_WRITE_ERROR", + 7: "DELETED", } RequestState_STATUS_value = map[string]int32{ - "PENDING_ACK": 0, - "PENDING": 1, - "ERROR": 2, - "COMPLETED": 3, + "PENDING_ACK": 0, + "PENDING": 1, + "ERROR": 2, + "COMPLETED": 3, + "EVENT_RECEIVED": 4, + "EVENT_WRITTEN": 5, + "EVENT_WRITE_ERROR": 6, + "DELETED": 7, } ) @@ -481,7 +493,7 @@ var file_common_state_proto_rawDesc = []byte{ 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x12, 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0xf5, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0xc1, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, @@ -491,20 +503,24 @@ var file_common_state_proto_rawDesc = []byte{ 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x12, 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x06, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x42, 0x07, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x71, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x77, - 0x65, 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, - 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x2d, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8b, 0x01, 0x0a, + 0x06, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x5f, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x12, 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, + 0x44, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x57, 0x52, 0x49, + 0x54, 0x54, 0x45, 0x4e, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x06, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x07, 0x42, 0x07, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x42, 0x71, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2d, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, 0x2d, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, 0x67, 0x6f, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/protos-go/common/verification_policy.pb.go b/common/protos-go/common/verification_policy.pb.go index d0d2b48a7..2a26bc03f 100644 --- a/common/protos-go/common/verification_policy.pb.go +++ b/common/protos-go/common/verification_policy.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: common/verification_policy.proto package common diff --git a/common/protos-go/corda/view_data.pb.go b/common/protos-go/corda/view_data.pb.go index 99236aa7f..949d44160 100644 --- a/common/protos-go/corda/view_data.pb.go +++ b/common/protos-go/corda/view_data.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: corda/view_data.proto package corda diff --git a/common/protos-go/driver/driver.pb.go b/common/protos-go/driver/driver.pb.go index 45ae3ba62..a0d669699 100644 --- a/common/protos-go/driver/driver.pb.go +++ b/common/protos-go/driver/driver.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: driver/driver.proto package driver @@ -11,6 +11,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" + sync "sync" ) const ( @@ -20,6 +21,62 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Data for a View processing by dest-driver +type WriteExternalStateMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ViewPayload *common.ViewPayload `protobuf:"bytes,1,opt,name=view_payload,json=viewPayload,proto3" json:"view_payload,omitempty"` + Ctx *common.ContractTransaction `protobuf:"bytes,2,opt,name=ctx,proto3" json:"ctx,omitempty"` +} + +func (x *WriteExternalStateMessage) Reset() { + *x = WriteExternalStateMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_driver_driver_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteExternalStateMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteExternalStateMessage) ProtoMessage() {} + +func (x *WriteExternalStateMessage) ProtoReflect() protoreflect.Message { + mi := &file_driver_driver_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WriteExternalStateMessage.ProtoReflect.Descriptor instead. +func (*WriteExternalStateMessage) Descriptor() ([]byte, []int) { + return file_driver_driver_proto_rawDescGZIP(), []int{0} +} + +func (x *WriteExternalStateMessage) GetViewPayload() *common.ViewPayload { + if x != nil { + return x.ViewPayload + } + return nil +} + +func (x *WriteExternalStateMessage) GetCtx() *common.ContractTransaction { + if x != nil { + return x.Ctx + } + return nil +} + var File_driver_driver_proto protoreflect.FileDescriptor var file_driver_driver_proto_rawDesc = []byte{ @@ -27,34 +84,87 @@ var file_driver_driver_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x53, 0x0a, 0x13, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3c, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x42, - 0x72, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x64, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, - 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x0b, 0x76, 0x69, 0x65, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x34, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x03, 0x63, 0x74, 0x78, 0x32, 0xcd, 0x02, 0x0a, 0x13, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, + 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, + 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x23, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x13, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x00, 0x12, 0x51, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, + 0x41, 0x63, 0x6b, 0x22, 0x00, 0x42, 0x72, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, + 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, + 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, + 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, + 0x67, 0x6f, 0x2f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_driver_driver_proto_rawDescOnce sync.Once + file_driver_driver_proto_rawDescData = file_driver_driver_proto_rawDesc +) + +func file_driver_driver_proto_rawDescGZIP() []byte { + file_driver_driver_proto_rawDescOnce.Do(func() { + file_driver_driver_proto_rawDescData = protoimpl.X.CompressGZIP(file_driver_driver_proto_rawDescData) + }) + return file_driver_driver_proto_rawDescData } +var file_driver_driver_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_driver_driver_proto_goTypes = []interface{}{ - (*common.Query)(nil), // 0: common.query.Query - (*common.Ack)(nil), // 1: common.ack.Ack + (*WriteExternalStateMessage)(nil), // 0: driver.driver.WriteExternalStateMessage + (*common.ViewPayload)(nil), // 1: common.state.ViewPayload + (*common.ContractTransaction)(nil), // 2: common.events.ContractTransaction + (*common.Query)(nil), // 3: common.query.Query + (*common.EventSubscription)(nil), // 4: common.events.EventSubscription + (*common.Ack)(nil), // 5: common.ack.Ack } var file_driver_driver_proto_depIdxs = []int32{ - 0, // 0: driver.driver.DriverCommunication.RequestDriverState:input_type -> common.query.Query - 1, // 1: driver.driver.DriverCommunication.RequestDriverState:output_type -> common.ack.Ack - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 1, // 0: driver.driver.WriteExternalStateMessage.view_payload:type_name -> common.state.ViewPayload + 2, // 1: driver.driver.WriteExternalStateMessage.ctx:type_name -> common.events.ContractTransaction + 3, // 2: driver.driver.DriverCommunication.RequestDriverState:input_type -> common.query.Query + 4, // 3: driver.driver.DriverCommunication.SubscribeEvent:input_type -> common.events.EventSubscription + 4, // 4: driver.driver.DriverCommunication.RequestSignedEventSubscriptionQuery:input_type -> common.events.EventSubscription + 0, // 5: driver.driver.DriverCommunication.WriteExternalState:input_type -> driver.driver.WriteExternalStateMessage + 5, // 6: driver.driver.DriverCommunication.RequestDriverState:output_type -> common.ack.Ack + 5, // 7: driver.driver.DriverCommunication.SubscribeEvent:output_type -> common.ack.Ack + 3, // 8: driver.driver.DriverCommunication.RequestSignedEventSubscriptionQuery:output_type -> common.query.Query + 5, // 9: driver.driver.DriverCommunication.WriteExternalState:output_type -> common.ack.Ack + 6, // [6:10] is the sub-list for method output_type + 2, // [2:6] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_driver_driver_proto_init() } @@ -62,18 +172,33 @@ func file_driver_driver_proto_init() { if File_driver_driver_proto != nil { return } + if !protoimpl.UnsafeEnabled { + file_driver_driver_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteExternalStateMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_driver_driver_proto_rawDesc, NumEnums: 0, - NumMessages: 0, + NumMessages: 1, NumExtensions: 0, NumServices: 1, }, GoTypes: file_driver_driver_proto_goTypes, DependencyIndexes: file_driver_driver_proto_depIdxs, + MessageInfos: file_driver_driver_proto_msgTypes, }.Build() File_driver_driver_proto = out.File file_driver_driver_proto_rawDesc = nil diff --git a/common/protos-go/driver/driver_grpc.pb.go b/common/protos-go/driver/driver_grpc.pb.go index 508e0d6ec..b129a6e94 100644 --- a/common/protos-go/driver/driver_grpc.pb.go +++ b/common/protos-go/driver/driver_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.15.6 -// source: driver/driver.proto package driver @@ -23,9 +19,20 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type DriverCommunicationClient interface { + // Data Sharing // the remote relay sends a RequestDriverState request to its driver with a // query defining the data it wants to receive RequestDriverState(ctx context.Context, in *common.Query, opts ...grpc.CallOption) (*common.Ack, error) + // Events Subscription + // the src-relay uses this endpoint to forward the event subscription request from dest-relay to driver + SubscribeEvent(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Ack, error) + // Recommended to have TLS mode on for this unsafe endpoint + // Relay uses this to get Query.requestor_signature and + // Query.certificate required for event subscription + RequestSignedEventSubscriptionQuery(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Query, error) + // Events Publication + // the dest-relay calls the dest-driver on this end point to write the remote network state to the local ledger + WriteExternalState(ctx context.Context, in *WriteExternalStateMessage, opts ...grpc.CallOption) (*common.Ack, error) } type driverCommunicationClient struct { @@ -45,13 +52,51 @@ func (c *driverCommunicationClient) RequestDriverState(ctx context.Context, in * return out, nil } +func (c *driverCommunicationClient) SubscribeEvent(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/driver.driver.DriverCommunication/SubscribeEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *driverCommunicationClient) RequestSignedEventSubscriptionQuery(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Query, error) { + out := new(common.Query) + err := c.cc.Invoke(ctx, "/driver.driver.DriverCommunication/RequestSignedEventSubscriptionQuery", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *driverCommunicationClient) WriteExternalState(ctx context.Context, in *WriteExternalStateMessage, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/driver.driver.DriverCommunication/WriteExternalState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DriverCommunicationServer is the server API for DriverCommunication service. // All implementations must embed UnimplementedDriverCommunicationServer // for forward compatibility type DriverCommunicationServer interface { + // Data Sharing // the remote relay sends a RequestDriverState request to its driver with a // query defining the data it wants to receive RequestDriverState(context.Context, *common.Query) (*common.Ack, error) + // Events Subscription + // the src-relay uses this endpoint to forward the event subscription request from dest-relay to driver + SubscribeEvent(context.Context, *common.EventSubscription) (*common.Ack, error) + // Recommended to have TLS mode on for this unsafe endpoint + // Relay uses this to get Query.requestor_signature and + // Query.certificate required for event subscription + RequestSignedEventSubscriptionQuery(context.Context, *common.EventSubscription) (*common.Query, error) + // Events Publication + // the dest-relay calls the dest-driver on this end point to write the remote network state to the local ledger + WriteExternalState(context.Context, *WriteExternalStateMessage) (*common.Ack, error) mustEmbedUnimplementedDriverCommunicationServer() } @@ -62,6 +107,15 @@ type UnimplementedDriverCommunicationServer struct { func (UnimplementedDriverCommunicationServer) RequestDriverState(context.Context, *common.Query) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestDriverState not implemented") } +func (UnimplementedDriverCommunicationServer) SubscribeEvent(context.Context, *common.EventSubscription) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubscribeEvent not implemented") +} +func (UnimplementedDriverCommunicationServer) RequestSignedEventSubscriptionQuery(context.Context, *common.EventSubscription) (*common.Query, error) { + return nil, status.Errorf(codes.Unimplemented, "method RequestSignedEventSubscriptionQuery not implemented") +} +func (UnimplementedDriverCommunicationServer) WriteExternalState(context.Context, *WriteExternalStateMessage) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method WriteExternalState not implemented") +} func (UnimplementedDriverCommunicationServer) mustEmbedUnimplementedDriverCommunicationServer() {} // UnsafeDriverCommunicationServer may be embedded to opt out of forward compatibility for this service. @@ -93,6 +147,60 @@ func _DriverCommunication_RequestDriverState_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } +func _DriverCommunication_SubscribeEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.EventSubscription) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DriverCommunicationServer).SubscribeEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/driver.driver.DriverCommunication/SubscribeEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DriverCommunicationServer).SubscribeEvent(ctx, req.(*common.EventSubscription)) + } + return interceptor(ctx, in, info, handler) +} + +func _DriverCommunication_RequestSignedEventSubscriptionQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.EventSubscription) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DriverCommunicationServer).RequestSignedEventSubscriptionQuery(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/driver.driver.DriverCommunication/RequestSignedEventSubscriptionQuery", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DriverCommunicationServer).RequestSignedEventSubscriptionQuery(ctx, req.(*common.EventSubscription)) + } + return interceptor(ctx, in, info, handler) +} + +func _DriverCommunication_WriteExternalState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteExternalStateMessage) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DriverCommunicationServer).WriteExternalState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/driver.driver.DriverCommunication/WriteExternalState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DriverCommunicationServer).WriteExternalState(ctx, req.(*WriteExternalStateMessage)) + } + return interceptor(ctx, in, info, handler) +} + // DriverCommunication_ServiceDesc is the grpc.ServiceDesc for DriverCommunication service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -104,6 +212,18 @@ var DriverCommunication_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestDriverState", Handler: _DriverCommunication_RequestDriverState_Handler, }, + { + MethodName: "SubscribeEvent", + Handler: _DriverCommunication_SubscribeEvent_Handler, + }, + { + MethodName: "RequestSignedEventSubscriptionQuery", + Handler: _DriverCommunication_RequestSignedEventSubscriptionQuery_Handler, + }, + { + MethodName: "WriteExternalState", + Handler: _DriverCommunication_WriteExternalState_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "driver/driver.proto", diff --git a/common/protos-go/fabric/view_data.pb.go b/common/protos-go/fabric/view_data.pb.go index ec2693250..838ad7129 100644 --- a/common/protos-go/fabric/view_data.pb.go +++ b/common/protos-go/fabric/view_data.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: fabric/view_data.proto package fabric diff --git a/common/protos-go/identity/agent.pb.go b/common/protos-go/identity/agent.pb.go index d8ff0a15a..15212105f 100644 --- a/common/protos-go/identity/agent.pb.go +++ b/common/protos-go/identity/agent.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: identity/agent.proto package identity @@ -21,17 +21,18 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type NetworkUnitIdentity struct { +// Unique identifier for a unit of a network that runs an IIN agent +type SecurityDomainMemberIdentity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NetworkId string `protobuf:"bytes,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - ParticipantId string `protobuf:"bytes,2,opt,name=participant_id,json=participantId,proto3" json:"participant_id,omitempty"` + SecurityDomain string `protobuf:"bytes,1,opt,name=security_domain,json=securityDomain,proto3" json:"security_domain,omitempty"` + MemberId string `protobuf:"bytes,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` } -func (x *NetworkUnitIdentity) Reset() { - *x = NetworkUnitIdentity{} +func (x *SecurityDomainMemberIdentity) Reset() { + *x = SecurityDomainMemberIdentity{} if protoimpl.UnsafeEnabled { mi := &file_identity_agent_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -39,13 +40,13 @@ func (x *NetworkUnitIdentity) Reset() { } } -func (x *NetworkUnitIdentity) String() string { +func (x *SecurityDomainMemberIdentity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NetworkUnitIdentity) ProtoMessage() {} +func (*SecurityDomainMemberIdentity) ProtoMessage() {} -func (x *NetworkUnitIdentity) ProtoReflect() protoreflect.Message { +func (x *SecurityDomainMemberIdentity) ProtoReflect() protoreflect.Message { mi := &file_identity_agent_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -57,68 +58,420 @@ func (x *NetworkUnitIdentity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NetworkUnitIdentity.ProtoReflect.Descriptor instead. -func (*NetworkUnitIdentity) Descriptor() ([]byte, []int) { +// Deprecated: Use SecurityDomainMemberIdentity.ProtoReflect.Descriptor instead. +func (*SecurityDomainMemberIdentity) Descriptor() ([]byte, []int) { return file_identity_agent_proto_rawDescGZIP(), []int{0} } -func (x *NetworkUnitIdentity) GetNetworkId() string { +func (x *SecurityDomainMemberIdentity) GetSecurityDomain() string { if x != nil { - return x.NetworkId + return x.SecurityDomain } return "" } -func (x *NetworkUnitIdentity) GetParticipantId() string { +func (x *SecurityDomainMemberIdentity) GetMemberId() string { if x != nil { - return x.ParticipantId + return x.MemberId } return "" } +type SecurityDomainMemberIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SourceNetwork *SecurityDomainMemberIdentity `protobuf:"bytes,1,opt,name=source_network,json=sourceNetwork,proto3" json:"source_network,omitempty"` + RequestingNetwork *SecurityDomainMemberIdentity `protobuf:"bytes,2,opt,name=requesting_network,json=requestingNetwork,proto3" json:"requesting_network,omitempty"` + Nonce string `protobuf:"bytes,3,opt,name=nonce,proto3" json:"nonce,omitempty"` +} + +func (x *SecurityDomainMemberIdentityRequest) Reset() { + *x = SecurityDomainMemberIdentityRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_agent_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityDomainMemberIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDomainMemberIdentityRequest) ProtoMessage() {} + +func (x *SecurityDomainMemberIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_identity_agent_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityDomainMemberIdentityRequest.ProtoReflect.Descriptor instead. +func (*SecurityDomainMemberIdentityRequest) Descriptor() ([]byte, []int) { + return file_identity_agent_proto_rawDescGZIP(), []int{1} +} + +func (x *SecurityDomainMemberIdentityRequest) GetSourceNetwork() *SecurityDomainMemberIdentity { + if x != nil { + return x.SourceNetwork + } + return nil +} + +func (x *SecurityDomainMemberIdentityRequest) GetRequestingNetwork() *SecurityDomainMemberIdentity { + if x != nil { + return x.RequestingNetwork + } + return nil +} + +func (x *SecurityDomainMemberIdentityRequest) GetNonce() string { + if x != nil { + return x.Nonce + } + return "" +} + +// Association of signature (over arbitrary data) and signer identity +type Attestation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UnitIdentity *SecurityDomainMemberIdentity `protobuf:"bytes,1,opt,name=unit_identity,json=unitIdentity,proto3" json:"unit_identity,omitempty"` + Certificate string `protobuf:"bytes,2,opt,name=certificate,proto3" json:"certificate,omitempty"` + Signature string `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` + Nonce string `protobuf:"bytes,4,opt,name=nonce,proto3" json:"nonce,omitempty"` +} + +func (x *Attestation) Reset() { + *x = Attestation{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_agent_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Attestation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Attestation) ProtoMessage() {} + +func (x *Attestation) ProtoReflect() protoreflect.Message { + mi := &file_identity_agent_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Attestation.ProtoReflect.Descriptor instead. +func (*Attestation) Descriptor() ([]byte, []int) { + return file_identity_agent_proto_rawDescGZIP(), []int{2} +} + +func (x *Attestation) GetUnitIdentity() *SecurityDomainMemberIdentity { + if x != nil { + return x.UnitIdentity + } + return nil +} + +func (x *Attestation) GetCertificate() string { + if x != nil { + return x.Certificate + } + return "" +} + +func (x *Attestation) GetSignature() string { + if x != nil { + return x.Signature + } + return "" +} + +func (x *Attestation) GetNonce() string { + if x != nil { + return x.Nonce + } + return "" +} + +// Attested security domain membership by a single member +type AttestedMembership struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Membership string `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` // 'common.membership.Membership': Serialized and Base64-encoded + Attestation *Attestation `protobuf:"bytes,2,opt,name=attestation,proto3" json:"attestation,omitempty"` +} + +func (x *AttestedMembership) Reset() { + *x = AttestedMembership{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_agent_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AttestedMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AttestedMembership) ProtoMessage() {} + +func (x *AttestedMembership) ProtoReflect() protoreflect.Message { + mi := &file_identity_agent_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AttestedMembership.ProtoReflect.Descriptor instead. +func (*AttestedMembership) Descriptor() ([]byte, []int) { + return file_identity_agent_proto_rawDescGZIP(), []int{3} +} + +func (x *AttestedMembership) GetMembership() string { + if x != nil { + return x.Membership + } + return "" +} + +func (x *AttestedMembership) GetAttestation() *Attestation { + if x != nil { + return x.Attestation + } + return nil +} + +// Counter attestation over security domain membership attested by its participants +type CounterAttestedMembership struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AttestedMembershipSet string `protobuf:"bytes,1,opt,name=attested_membership_set,json=attestedMembershipSet,proto3" json:"attested_membership_set,omitempty"` // 'AttestedMembershipSet': Serialized and Base64-encoded + Attestations []*Attestation `protobuf:"bytes,2,rep,name=attestations,proto3" json:"attestations,omitempty"` +} + +func (x *CounterAttestedMembership) Reset() { + *x = CounterAttestedMembership{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_agent_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CounterAttestedMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CounterAttestedMembership) ProtoMessage() {} + +func (x *CounterAttestedMembership) ProtoReflect() protoreflect.Message { + mi := &file_identity_agent_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CounterAttestedMembership.ProtoReflect.Descriptor instead. +func (*CounterAttestedMembership) Descriptor() ([]byte, []int) { + return file_identity_agent_proto_rawDescGZIP(), []int{4} +} + +func (x *CounterAttestedMembership) GetAttestedMembershipSet() string { + if x != nil { + return x.AttestedMembershipSet + } + return "" +} + +func (x *CounterAttestedMembership) GetAttestations() []*Attestation { + if x != nil { + return x.Attestations + } + return nil +} + +type CounterAttestedMembership_AttestedMembershipSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Membership string `protobuf:"bytes,1,opt,name=membership,proto3" json:"membership,omitempty"` // 'common.membership.Membership': Serialized and Base64-encoded + Attestations []*Attestation `protobuf:"bytes,2,rep,name=attestations,proto3" json:"attestations,omitempty"` +} + +func (x *CounterAttestedMembership_AttestedMembershipSet) Reset() { + *x = CounterAttestedMembership_AttestedMembershipSet{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_agent_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CounterAttestedMembership_AttestedMembershipSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CounterAttestedMembership_AttestedMembershipSet) ProtoMessage() {} + +func (x *CounterAttestedMembership_AttestedMembershipSet) ProtoReflect() protoreflect.Message { + mi := &file_identity_agent_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CounterAttestedMembership_AttestedMembershipSet.ProtoReflect.Descriptor instead. +func (*CounterAttestedMembership_AttestedMembershipSet) Descriptor() ([]byte, []int) { + return file_identity_agent_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *CounterAttestedMembership_AttestedMembershipSet) GetMembership() string { + if x != nil { + return x.Membership + } + return "" +} + +func (x *CounterAttestedMembership_AttestedMembershipSet) GetAttestations() []*Attestation { + if x != nil { + return x.Attestations + } + return nil +} + var File_identity_agent_proto protoreflect.FileDescriptor var file_identity_agent_proto_rawDesc = []byte{ 0x0a, 0x14, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, - 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5b, 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x25, - 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x49, 0x64, 0x32, 0xf2, 0x03, 0x0a, 0x08, 0x49, 0x49, 0x4e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, - 0x56, 0x0a, 0x1c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, - 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x6e, 0x69, - 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x19, - 0x46, 0x6c, 0x6f, 0x77, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x41, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, + 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x64, 0x0a, 0x1c, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0xed, 0x01, 0x0a, 0x23, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x53, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x11, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x0b, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x74, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x75, 0x6e, + 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x22, 0x73, 0x0a, 0x12, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x61, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x78, 0x0a, 0x15, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x53, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x3f, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0xc1, 0x03, 0x0a, 0x08, 0x49, 0x49, 0x4e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x11, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x1c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x74, 0x65, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, - 0x49, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x55, 0x6e, 0x69, 0x74, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x00, 0x12, 0x52, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, + 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0f, 0x53, 0x65, 0x6e, + 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x42, 0x75, 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5a, 0x51, @@ -142,29 +495,38 @@ func file_identity_agent_proto_rawDescGZIP() []byte { return file_identity_agent_proto_rawDescData } -var file_identity_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_identity_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_identity_agent_proto_goTypes = []interface{}{ - (*NetworkUnitIdentity)(nil), // 0: identity.agent.NetworkUnitIdentity - (*common.Ack)(nil), // 1: common.ack.Ack + (*SecurityDomainMemberIdentity)(nil), // 0: identity.agent.SecurityDomainMemberIdentity + (*SecurityDomainMemberIdentityRequest)(nil), // 1: identity.agent.SecurityDomainMemberIdentityRequest + (*Attestation)(nil), // 2: identity.agent.Attestation + (*AttestedMembership)(nil), // 3: identity.agent.AttestedMembership + (*CounterAttestedMembership)(nil), // 4: identity.agent.CounterAttestedMembership + (*CounterAttestedMembership_AttestedMembershipSet)(nil), // 5: identity.agent.CounterAttestedMembership.AttestedMembershipSet + (*common.Ack)(nil), // 6: common.ack.Ack } var file_identity_agent_proto_depIdxs = []int32{ - 0, // 0: identity.agent.IINAgent.SyncExternalState:input_type -> identity.agent.NetworkUnitIdentity - 0, // 1: identity.agent.IINAgent.RequestIdentityConfiguration:input_type -> identity.agent.NetworkUnitIdentity - 0, // 2: identity.agent.IINAgent.SendIdentityConfiguration:input_type -> identity.agent.NetworkUnitIdentity - 0, // 3: identity.agent.IINAgent.FlowAndRecordAttestations:input_type -> identity.agent.NetworkUnitIdentity - 0, // 4: identity.agent.IINAgent.RequestAttestation:input_type -> identity.agent.NetworkUnitIdentity - 0, // 5: identity.agent.IINAgent.SendAttestation:input_type -> identity.agent.NetworkUnitIdentity - 1, // 6: identity.agent.IINAgent.SyncExternalState:output_type -> common.ack.Ack - 1, // 7: identity.agent.IINAgent.RequestIdentityConfiguration:output_type -> common.ack.Ack - 1, // 8: identity.agent.IINAgent.SendIdentityConfiguration:output_type -> common.ack.Ack - 1, // 9: identity.agent.IINAgent.FlowAndRecordAttestations:output_type -> common.ack.Ack - 1, // 10: identity.agent.IINAgent.RequestAttestation:output_type -> common.ack.Ack - 1, // 11: identity.agent.IINAgent.SendAttestation:output_type -> common.ack.Ack - 6, // [6:12] is the sub-list for method output_type - 0, // [0:6] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 0, // 0: identity.agent.SecurityDomainMemberIdentityRequest.source_network:type_name -> identity.agent.SecurityDomainMemberIdentity + 0, // 1: identity.agent.SecurityDomainMemberIdentityRequest.requesting_network:type_name -> identity.agent.SecurityDomainMemberIdentity + 0, // 2: identity.agent.Attestation.unit_identity:type_name -> identity.agent.SecurityDomainMemberIdentity + 2, // 3: identity.agent.AttestedMembership.attestation:type_name -> identity.agent.Attestation + 2, // 4: identity.agent.CounterAttestedMembership.attestations:type_name -> identity.agent.Attestation + 2, // 5: identity.agent.CounterAttestedMembership.AttestedMembershipSet.attestations:type_name -> identity.agent.Attestation + 0, // 6: identity.agent.IINAgent.SyncExternalState:input_type -> identity.agent.SecurityDomainMemberIdentity + 1, // 7: identity.agent.IINAgent.RequestIdentityConfiguration:input_type -> identity.agent.SecurityDomainMemberIdentityRequest + 3, // 8: identity.agent.IINAgent.SendIdentityConfiguration:input_type -> identity.agent.AttestedMembership + 4, // 9: identity.agent.IINAgent.RequestAttestation:input_type -> identity.agent.CounterAttestedMembership + 4, // 10: identity.agent.IINAgent.SendAttestation:input_type -> identity.agent.CounterAttestedMembership + 6, // 11: identity.agent.IINAgent.SyncExternalState:output_type -> common.ack.Ack + 6, // 12: identity.agent.IINAgent.RequestIdentityConfiguration:output_type -> common.ack.Ack + 6, // 13: identity.agent.IINAgent.SendIdentityConfiguration:output_type -> common.ack.Ack + 6, // 14: identity.agent.IINAgent.RequestAttestation:output_type -> common.ack.Ack + 6, // 15: identity.agent.IINAgent.SendAttestation:output_type -> common.ack.Ack + 11, // [11:16] is the sub-list for method output_type + 6, // [6:11] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_identity_agent_proto_init() } @@ -174,7 +536,67 @@ func file_identity_agent_proto_init() { } if !protoimpl.UnsafeEnabled { file_identity_agent_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetworkUnitIdentity); i { + switch v := v.(*SecurityDomainMemberIdentity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_identity_agent_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityDomainMemberIdentityRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_identity_agent_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Attestation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_identity_agent_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttestedMembership); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_identity_agent_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CounterAttestedMembership); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_identity_agent_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CounterAttestedMembership_AttestedMembershipSet); i { case 0: return &v.state case 1: @@ -192,7 +614,7 @@ func file_identity_agent_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_identity_agent_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/common/protos-go/identity/agent_grpc.pb.go b/common/protos-go/identity/agent_grpc.pb.go index 1d84d6a9e..2f49c04b2 100644 --- a/common/protos-go/identity/agent_grpc.pb.go +++ b/common/protos-go/identity/agent_grpc.pb.go @@ -20,18 +20,15 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type IINAgentClient interface { // user or agent triggers a sync of external/foreign network unit's state - SyncExternalState(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) + SyncExternalState(ctx context.Context, in *SecurityDomainMemberIdentity, opts ...grpc.CallOption) (*common.Ack, error) // Requesting network unit's state from a foreign IIN agent. - RequestIdentityConfiguration(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) + RequestIdentityConfiguration(ctx context.Context, in *SecurityDomainMemberIdentityRequest, opts ...grpc.CallOption) (*common.Ack, error) // Handling network unit's state sent by a foreign IIN agent. - SendIdentityConfiguration(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) - // user or agent triggers a flow to collect signatures attesting an - // external/foreign network unit's state and recording to ledger - FlowAndRecordAttestations(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) + SendIdentityConfiguration(ctx context.Context, in *AttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) // Requesting attestation from a local IIN agent. - RequestAttestation(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) + RequestAttestation(ctx context.Context, in *CounterAttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) // Handling attestation sent by a local IIN agent. - SendAttestation(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) + SendAttestation(ctx context.Context, in *CounterAttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) } type iINAgentClient struct { @@ -42,7 +39,7 @@ func NewIINAgentClient(cc grpc.ClientConnInterface) IINAgentClient { return &iINAgentClient{cc} } -func (c *iINAgentClient) SyncExternalState(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { +func (c *iINAgentClient) SyncExternalState(ctx context.Context, in *SecurityDomainMemberIdentity, opts ...grpc.CallOption) (*common.Ack, error) { out := new(common.Ack) err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/SyncExternalState", in, out, opts...) if err != nil { @@ -51,7 +48,7 @@ func (c *iINAgentClient) SyncExternalState(ctx context.Context, in *NetworkUnitI return out, nil } -func (c *iINAgentClient) RequestIdentityConfiguration(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { +func (c *iINAgentClient) RequestIdentityConfiguration(ctx context.Context, in *SecurityDomainMemberIdentityRequest, opts ...grpc.CallOption) (*common.Ack, error) { out := new(common.Ack) err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/RequestIdentityConfiguration", in, out, opts...) if err != nil { @@ -60,7 +57,7 @@ func (c *iINAgentClient) RequestIdentityConfiguration(ctx context.Context, in *N return out, nil } -func (c *iINAgentClient) SendIdentityConfiguration(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { +func (c *iINAgentClient) SendIdentityConfiguration(ctx context.Context, in *AttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) { out := new(common.Ack) err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/SendIdentityConfiguration", in, out, opts...) if err != nil { @@ -69,16 +66,7 @@ func (c *iINAgentClient) SendIdentityConfiguration(ctx context.Context, in *Netw return out, nil } -func (c *iINAgentClient) FlowAndRecordAttestations(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { - out := new(common.Ack) - err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/FlowAndRecordAttestations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *iINAgentClient) RequestAttestation(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { +func (c *iINAgentClient) RequestAttestation(ctx context.Context, in *CounterAttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) { out := new(common.Ack) err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/RequestAttestation", in, out, opts...) if err != nil { @@ -87,7 +75,7 @@ func (c *iINAgentClient) RequestAttestation(ctx context.Context, in *NetworkUnit return out, nil } -func (c *iINAgentClient) SendAttestation(ctx context.Context, in *NetworkUnitIdentity, opts ...grpc.CallOption) (*common.Ack, error) { +func (c *iINAgentClient) SendAttestation(ctx context.Context, in *CounterAttestedMembership, opts ...grpc.CallOption) (*common.Ack, error) { out := new(common.Ack) err := c.cc.Invoke(ctx, "/identity.agent.IINAgent/SendAttestation", in, out, opts...) if err != nil { @@ -101,18 +89,15 @@ func (c *iINAgentClient) SendAttestation(ctx context.Context, in *NetworkUnitIde // for forward compatibility type IINAgentServer interface { // user or agent triggers a sync of external/foreign network unit's state - SyncExternalState(context.Context, *NetworkUnitIdentity) (*common.Ack, error) + SyncExternalState(context.Context, *SecurityDomainMemberIdentity) (*common.Ack, error) // Requesting network unit's state from a foreign IIN agent. - RequestIdentityConfiguration(context.Context, *NetworkUnitIdentity) (*common.Ack, error) + RequestIdentityConfiguration(context.Context, *SecurityDomainMemberIdentityRequest) (*common.Ack, error) // Handling network unit's state sent by a foreign IIN agent. - SendIdentityConfiguration(context.Context, *NetworkUnitIdentity) (*common.Ack, error) - // user or agent triggers a flow to collect signatures attesting an - // external/foreign network unit's state and recording to ledger - FlowAndRecordAttestations(context.Context, *NetworkUnitIdentity) (*common.Ack, error) + SendIdentityConfiguration(context.Context, *AttestedMembership) (*common.Ack, error) // Requesting attestation from a local IIN agent. - RequestAttestation(context.Context, *NetworkUnitIdentity) (*common.Ack, error) + RequestAttestation(context.Context, *CounterAttestedMembership) (*common.Ack, error) // Handling attestation sent by a local IIN agent. - SendAttestation(context.Context, *NetworkUnitIdentity) (*common.Ack, error) + SendAttestation(context.Context, *CounterAttestedMembership) (*common.Ack, error) mustEmbedUnimplementedIINAgentServer() } @@ -120,22 +105,19 @@ type IINAgentServer interface { type UnimplementedIINAgentServer struct { } -func (UnimplementedIINAgentServer) SyncExternalState(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { +func (UnimplementedIINAgentServer) SyncExternalState(context.Context, *SecurityDomainMemberIdentity) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method SyncExternalState not implemented") } -func (UnimplementedIINAgentServer) RequestIdentityConfiguration(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { +func (UnimplementedIINAgentServer) RequestIdentityConfiguration(context.Context, *SecurityDomainMemberIdentityRequest) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestIdentityConfiguration not implemented") } -func (UnimplementedIINAgentServer) SendIdentityConfiguration(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { +func (UnimplementedIINAgentServer) SendIdentityConfiguration(context.Context, *AttestedMembership) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method SendIdentityConfiguration not implemented") } -func (UnimplementedIINAgentServer) FlowAndRecordAttestations(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { - return nil, status.Errorf(codes.Unimplemented, "method FlowAndRecordAttestations not implemented") -} -func (UnimplementedIINAgentServer) RequestAttestation(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { +func (UnimplementedIINAgentServer) RequestAttestation(context.Context, *CounterAttestedMembership) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestAttestation not implemented") } -func (UnimplementedIINAgentServer) SendAttestation(context.Context, *NetworkUnitIdentity) (*common.Ack, error) { +func (UnimplementedIINAgentServer) SendAttestation(context.Context, *CounterAttestedMembership) (*common.Ack, error) { return nil, status.Errorf(codes.Unimplemented, "method SendAttestation not implemented") } func (UnimplementedIINAgentServer) mustEmbedUnimplementedIINAgentServer() {} @@ -152,7 +134,7 @@ func RegisterIINAgentServer(s grpc.ServiceRegistrar, srv IINAgentServer) { } func _IINAgent_SyncExternalState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) + in := new(SecurityDomainMemberIdentity) if err := dec(in); err != nil { return nil, err } @@ -164,13 +146,13 @@ func _IINAgent_SyncExternalState_Handler(srv interface{}, ctx context.Context, d FullMethod: "/identity.agent.IINAgent/SyncExternalState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).SyncExternalState(ctx, req.(*NetworkUnitIdentity)) + return srv.(IINAgentServer).SyncExternalState(ctx, req.(*SecurityDomainMemberIdentity)) } return interceptor(ctx, in, info, handler) } func _IINAgent_RequestIdentityConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) + in := new(SecurityDomainMemberIdentityRequest) if err := dec(in); err != nil { return nil, err } @@ -182,13 +164,13 @@ func _IINAgent_RequestIdentityConfiguration_Handler(srv interface{}, ctx context FullMethod: "/identity.agent.IINAgent/RequestIdentityConfiguration", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).RequestIdentityConfiguration(ctx, req.(*NetworkUnitIdentity)) + return srv.(IINAgentServer).RequestIdentityConfiguration(ctx, req.(*SecurityDomainMemberIdentityRequest)) } return interceptor(ctx, in, info, handler) } func _IINAgent_SendIdentityConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) + in := new(AttestedMembership) if err := dec(in); err != nil { return nil, err } @@ -200,31 +182,13 @@ func _IINAgent_SendIdentityConfiguration_Handler(srv interface{}, ctx context.Co FullMethod: "/identity.agent.IINAgent/SendIdentityConfiguration", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).SendIdentityConfiguration(ctx, req.(*NetworkUnitIdentity)) - } - return interceptor(ctx, in, info, handler) -} - -func _IINAgent_FlowAndRecordAttestations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(IINAgentServer).FlowAndRecordAttestations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/identity.agent.IINAgent/FlowAndRecordAttestations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).FlowAndRecordAttestations(ctx, req.(*NetworkUnitIdentity)) + return srv.(IINAgentServer).SendIdentityConfiguration(ctx, req.(*AttestedMembership)) } return interceptor(ctx, in, info, handler) } func _IINAgent_RequestAttestation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) + in := new(CounterAttestedMembership) if err := dec(in); err != nil { return nil, err } @@ -236,13 +200,13 @@ func _IINAgent_RequestAttestation_Handler(srv interface{}, ctx context.Context, FullMethod: "/identity.agent.IINAgent/RequestAttestation", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).RequestAttestation(ctx, req.(*NetworkUnitIdentity)) + return srv.(IINAgentServer).RequestAttestation(ctx, req.(*CounterAttestedMembership)) } return interceptor(ctx, in, info, handler) } func _IINAgent_SendAttestation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NetworkUnitIdentity) + in := new(CounterAttestedMembership) if err := dec(in); err != nil { return nil, err } @@ -254,7 +218,7 @@ func _IINAgent_SendAttestation_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/identity.agent.IINAgent/SendAttestation", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IINAgentServer).SendAttestation(ctx, req.(*NetworkUnitIdentity)) + return srv.(IINAgentServer).SendAttestation(ctx, req.(*CounterAttestedMembership)) } return interceptor(ctx, in, info, handler) } @@ -278,10 +242,6 @@ var IINAgent_ServiceDesc = grpc.ServiceDesc{ MethodName: "SendIdentityConfiguration", Handler: _IINAgent_SendIdentityConfiguration_Handler, }, - { - MethodName: "FlowAndRecordAttestations", - Handler: _IINAgent_FlowAndRecordAttestations_Handler, - }, { MethodName: "RequestAttestation", Handler: _IINAgent_RequestAttestation_Handler, diff --git a/common/protos-go/networks/networks.pb.go b/common/protos-go/networks/networks.pb.go index fe425d87d..23519b4a1 100644 --- a/common/protos-go/networks/networks.pb.go +++ b/common/protos-go/networks/networks.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: networks/networks.proto package networks @@ -273,6 +273,125 @@ func (x *NetworkQuery) GetConfidential() bool { return false } +// Below message is used for network/client to dest-relay communication +type NetworkEventSubscription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventMatcher *common.EventMatcher `protobuf:"bytes,1,opt,name=event_matcher,json=eventMatcher,proto3" json:"event_matcher,omitempty"` + Query *NetworkQuery `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + EventPublicationSpec *common.EventPublication `protobuf:"bytes,3,opt,name=event_publication_spec,json=eventPublicationSpec,proto3" json:"event_publication_spec,omitempty"` +} + +func (x *NetworkEventSubscription) Reset() { + *x = NetworkEventSubscription{} + if protoimpl.UnsafeEnabled { + mi := &file_networks_networks_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NetworkEventSubscription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NetworkEventSubscription) ProtoMessage() {} + +func (x *NetworkEventSubscription) ProtoReflect() protoreflect.Message { + mi := &file_networks_networks_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NetworkEventSubscription.ProtoReflect.Descriptor instead. +func (*NetworkEventSubscription) Descriptor() ([]byte, []int) { + return file_networks_networks_proto_rawDescGZIP(), []int{4} +} + +func (x *NetworkEventSubscription) GetEventMatcher() *common.EventMatcher { + if x != nil { + return x.EventMatcher + } + return nil +} + +func (x *NetworkEventSubscription) GetQuery() *NetworkQuery { + if x != nil { + return x.Query + } + return nil +} + +func (x *NetworkEventSubscription) GetEventPublicationSpec() *common.EventPublication { + if x != nil { + return x.EventPublicationSpec + } + return nil +} + +type NetworkEventUnsubscription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *NetworkEventSubscription `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` +} + +func (x *NetworkEventUnsubscription) Reset() { + *x = NetworkEventUnsubscription{} + if protoimpl.UnsafeEnabled { + mi := &file_networks_networks_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NetworkEventUnsubscription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NetworkEventUnsubscription) ProtoMessage() {} + +func (x *NetworkEventUnsubscription) ProtoReflect() protoreflect.Message { + mi := &file_networks_networks_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NetworkEventUnsubscription.ProtoReflect.Descriptor instead. +func (*NetworkEventUnsubscription) Descriptor() ([]byte, []int) { + return file_networks_networks_proto_rawDescGZIP(), []int{5} +} + +func (x *NetworkEventUnsubscription) GetRequest() *NetworkEventSubscription { + if x != nil { + return x.Request + } + return nil +} + +func (x *NetworkEventUnsubscription) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + var File_networks_networks_proto protoreflect.FileDescriptor var file_networks_networks_proto_rawDesc = []byte{ @@ -281,65 +400,112 @@ var file_networks_networks_proto_rawDesc = []byte{ 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x1c, 0x0a, 0x06, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x8c, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x50, 0x61, 0x69, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x30, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x64, 0x22, 0xce, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x12, - 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x67, 0x12, 0x22, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x32, 0xed, 0x01, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x42, - 0x0a, 0x0c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, - 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x00, - 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x20, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x78, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, - 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x2d, 0x67, 0x6f, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x6f, 0x1a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1c, 0x0a, 0x06, 0x44, 0x62, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x50, 0x61, + 0x69, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xce, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x4f, 0x72, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x55, 0x0a, + 0x16, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x22, 0x82, 0x01, 0x0a, 0x1a, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x32, 0xd3, 0x04, 0x0a, 0x07, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x44, + 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x20, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x25, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x10, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x22, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x00, 0x42, + 0x78, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2d, 0x6c, + 0x61, 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, 0x2d, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, 0x67, 0x6f, + 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -354,29 +520,47 @@ func file_networks_networks_proto_rawDescGZIP() []byte { return file_networks_networks_proto_rawDescData } -var file_networks_networks_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_networks_networks_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_networks_networks_proto_goTypes = []interface{}{ - (*DbName)(nil), // 0: networks.networks.DbName - (*RelayDatabase)(nil), // 1: networks.networks.RelayDatabase - (*GetStateMessage)(nil), // 2: networks.networks.GetStateMessage - (*NetworkQuery)(nil), // 3: networks.networks.NetworkQuery - nil, // 4: networks.networks.RelayDatabase.PairsEntry - (*common.Ack)(nil), // 5: common.ack.Ack - (*common.RequestState)(nil), // 6: common.state.RequestState + (*DbName)(nil), // 0: networks.networks.DbName + (*RelayDatabase)(nil), // 1: networks.networks.RelayDatabase + (*GetStateMessage)(nil), // 2: networks.networks.GetStateMessage + (*NetworkQuery)(nil), // 3: networks.networks.NetworkQuery + (*NetworkEventSubscription)(nil), // 4: networks.networks.NetworkEventSubscription + (*NetworkEventUnsubscription)(nil), // 5: networks.networks.NetworkEventUnsubscription + nil, // 6: networks.networks.RelayDatabase.PairsEntry + (*common.EventMatcher)(nil), // 7: common.events.EventMatcher + (*common.EventPublication)(nil), // 8: common.events.EventPublication + (*common.Ack)(nil), // 9: common.ack.Ack + (*common.RequestState)(nil), // 10: common.state.RequestState + (*common.EventSubscriptionState)(nil), // 11: common.events.EventSubscriptionState + (*common.EventStates)(nil), // 12: common.events.EventStates } var file_networks_networks_proto_depIdxs = []int32{ - 4, // 0: networks.networks.RelayDatabase.pairs:type_name -> networks.networks.RelayDatabase.PairsEntry - 3, // 1: networks.networks.Network.RequestState:input_type -> networks.networks.NetworkQuery - 2, // 2: networks.networks.Network.GetState:input_type -> networks.networks.GetStateMessage - 0, // 3: networks.networks.Network.RequestDatabase:input_type -> networks.networks.DbName - 5, // 4: networks.networks.Network.RequestState:output_type -> common.ack.Ack - 6, // 5: networks.networks.Network.GetState:output_type -> common.state.RequestState - 1, // 6: networks.networks.Network.RequestDatabase:output_type -> networks.networks.RelayDatabase - 4, // [4:7] is the sub-list for method output_type - 1, // [1:4] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 6, // 0: networks.networks.RelayDatabase.pairs:type_name -> networks.networks.RelayDatabase.PairsEntry + 7, // 1: networks.networks.NetworkEventSubscription.event_matcher:type_name -> common.events.EventMatcher + 3, // 2: networks.networks.NetworkEventSubscription.query:type_name -> networks.networks.NetworkQuery + 8, // 3: networks.networks.NetworkEventSubscription.event_publication_spec:type_name -> common.events.EventPublication + 4, // 4: networks.networks.NetworkEventUnsubscription.request:type_name -> networks.networks.NetworkEventSubscription + 3, // 5: networks.networks.Network.RequestState:input_type -> networks.networks.NetworkQuery + 2, // 6: networks.networks.Network.GetState:input_type -> networks.networks.GetStateMessage + 0, // 7: networks.networks.Network.RequestDatabase:input_type -> networks.networks.DbName + 4, // 8: networks.networks.Network.SubscribeEvent:input_type -> networks.networks.NetworkEventSubscription + 2, // 9: networks.networks.Network.GetEventSubscriptionState:input_type -> networks.networks.GetStateMessage + 5, // 10: networks.networks.Network.UnsubscribeEvent:input_type -> networks.networks.NetworkEventUnsubscription + 2, // 11: networks.networks.Network.GetEventStates:input_type -> networks.networks.GetStateMessage + 9, // 12: networks.networks.Network.RequestState:output_type -> common.ack.Ack + 10, // 13: networks.networks.Network.GetState:output_type -> common.state.RequestState + 1, // 14: networks.networks.Network.RequestDatabase:output_type -> networks.networks.RelayDatabase + 9, // 15: networks.networks.Network.SubscribeEvent:output_type -> common.ack.Ack + 11, // 16: networks.networks.Network.GetEventSubscriptionState:output_type -> common.events.EventSubscriptionState + 9, // 17: networks.networks.Network.UnsubscribeEvent:output_type -> common.ack.Ack + 12, // 18: networks.networks.Network.GetEventStates:output_type -> common.events.EventStates + 12, // [12:19] is the sub-list for method output_type + 5, // [5:12] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_networks_networks_proto_init() } @@ -433,6 +617,30 @@ func file_networks_networks_proto_init() { return nil } } + file_networks_networks_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NetworkEventSubscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_networks_networks_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NetworkEventUnsubscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -440,7 +648,7 @@ func file_networks_networks_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_networks_networks_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/common/protos-go/networks/networks_grpc.pb.go b/common/protos-go/networks/networks_grpc.pb.go index 6e963dc9e..73e621b9c 100644 --- a/common/protos-go/networks/networks_grpc.pb.go +++ b/common/protos-go/networks/networks_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.15.6 -// source: networks/networks.proto package networks @@ -23,12 +19,23 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type NetworkClient interface { + // Data Sharing endpoints // endpoint for a network to request remote relay state via local relay RequestState(ctx context.Context, in *NetworkQuery, opts ...grpc.CallOption) (*common.Ack, error) - // This rpc endpooint is for polling the local relay for request state. + // This rpc endpoint is for polling the local relay for request state. GetState(ctx context.Context, in *GetStateMessage, opts ...grpc.CallOption) (*common.RequestState, error) // NOTE: This rpc is just for debugging. RequestDatabase(ctx context.Context, in *DbName, opts ...grpc.CallOption) (*RelayDatabase, error) + // Event endpoints + // endpoint for a client to subscribe to event via local relay initiating subscription flow. + SubscribeEvent(ctx context.Context, in *NetworkEventSubscription, opts ...grpc.CallOption) (*common.Ack, error) + // This rpc endpoint is for polling the local relay for subscription state. + GetEventSubscriptionState(ctx context.Context, in *GetStateMessage, opts ...grpc.CallOption) (*common.EventSubscriptionState, error) + // endpoint for a client to subscribe to event via local relay initiating subscription flow. + UnsubscribeEvent(ctx context.Context, in *NetworkEventUnsubscription, opts ...grpc.CallOption) (*common.Ack, error) + // endpoint for a client to fetch received events. + // Note: events are marked as deleted from relay database as soon as client fetches them. + GetEventStates(ctx context.Context, in *GetStateMessage, opts ...grpc.CallOption) (*common.EventStates, error) } type networkClient struct { @@ -66,16 +73,63 @@ func (c *networkClient) RequestDatabase(ctx context.Context, in *DbName, opts .. return out, nil } +func (c *networkClient) SubscribeEvent(ctx context.Context, in *NetworkEventSubscription, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/networks.networks.Network/SubscribeEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkClient) GetEventSubscriptionState(ctx context.Context, in *GetStateMessage, opts ...grpc.CallOption) (*common.EventSubscriptionState, error) { + out := new(common.EventSubscriptionState) + err := c.cc.Invoke(ctx, "/networks.networks.Network/GetEventSubscriptionState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkClient) UnsubscribeEvent(ctx context.Context, in *NetworkEventUnsubscription, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/networks.networks.Network/UnsubscribeEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkClient) GetEventStates(ctx context.Context, in *GetStateMessage, opts ...grpc.CallOption) (*common.EventStates, error) { + out := new(common.EventStates) + err := c.cc.Invoke(ctx, "/networks.networks.Network/GetEventStates", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // NetworkServer is the server API for Network service. // All implementations must embed UnimplementedNetworkServer // for forward compatibility type NetworkServer interface { + // Data Sharing endpoints // endpoint for a network to request remote relay state via local relay RequestState(context.Context, *NetworkQuery) (*common.Ack, error) - // This rpc endpooint is for polling the local relay for request state. + // This rpc endpoint is for polling the local relay for request state. GetState(context.Context, *GetStateMessage) (*common.RequestState, error) // NOTE: This rpc is just for debugging. RequestDatabase(context.Context, *DbName) (*RelayDatabase, error) + // Event endpoints + // endpoint for a client to subscribe to event via local relay initiating subscription flow. + SubscribeEvent(context.Context, *NetworkEventSubscription) (*common.Ack, error) + // This rpc endpoint is for polling the local relay for subscription state. + GetEventSubscriptionState(context.Context, *GetStateMessage) (*common.EventSubscriptionState, error) + // endpoint for a client to subscribe to event via local relay initiating subscription flow. + UnsubscribeEvent(context.Context, *NetworkEventUnsubscription) (*common.Ack, error) + // endpoint for a client to fetch received events. + // Note: events are marked as deleted from relay database as soon as client fetches them. + GetEventStates(context.Context, *GetStateMessage) (*common.EventStates, error) mustEmbedUnimplementedNetworkServer() } @@ -92,6 +146,18 @@ func (UnimplementedNetworkServer) GetState(context.Context, *GetStateMessage) (* func (UnimplementedNetworkServer) RequestDatabase(context.Context, *DbName) (*RelayDatabase, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestDatabase not implemented") } +func (UnimplementedNetworkServer) SubscribeEvent(context.Context, *NetworkEventSubscription) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubscribeEvent not implemented") +} +func (UnimplementedNetworkServer) GetEventSubscriptionState(context.Context, *GetStateMessage) (*common.EventSubscriptionState, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEventSubscriptionState not implemented") +} +func (UnimplementedNetworkServer) UnsubscribeEvent(context.Context, *NetworkEventUnsubscription) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnsubscribeEvent not implemented") +} +func (UnimplementedNetworkServer) GetEventStates(context.Context, *GetStateMessage) (*common.EventStates, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEventStates not implemented") +} func (UnimplementedNetworkServer) mustEmbedUnimplementedNetworkServer() {} // UnsafeNetworkServer may be embedded to opt out of forward compatibility for this service. @@ -159,6 +225,78 @@ func _Network_RequestDatabase_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Network_SubscribeEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NetworkEventSubscription) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkServer).SubscribeEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/networks.networks.Network/SubscribeEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkServer).SubscribeEvent(ctx, req.(*NetworkEventSubscription)) + } + return interceptor(ctx, in, info, handler) +} + +func _Network_GetEventSubscriptionState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateMessage) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkServer).GetEventSubscriptionState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/networks.networks.Network/GetEventSubscriptionState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkServer).GetEventSubscriptionState(ctx, req.(*GetStateMessage)) + } + return interceptor(ctx, in, info, handler) +} + +func _Network_UnsubscribeEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NetworkEventUnsubscription) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkServer).UnsubscribeEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/networks.networks.Network/UnsubscribeEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkServer).UnsubscribeEvent(ctx, req.(*NetworkEventUnsubscription)) + } + return interceptor(ctx, in, info, handler) +} + +func _Network_GetEventStates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateMessage) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkServer).GetEventStates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/networks.networks.Network/GetEventStates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkServer).GetEventStates(ctx, req.(*GetStateMessage)) + } + return interceptor(ctx, in, info, handler) +} + // Network_ServiceDesc is the grpc.ServiceDesc for Network service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -178,6 +316,22 @@ var Network_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestDatabase", Handler: _Network_RequestDatabase_Handler, }, + { + MethodName: "SubscribeEvent", + Handler: _Network_SubscribeEvent_Handler, + }, + { + MethodName: "GetEventSubscriptionState", + Handler: _Network_GetEventSubscriptionState_Handler, + }, + { + MethodName: "UnsubscribeEvent", + Handler: _Network_UnsubscribeEvent_Handler, + }, + { + MethodName: "GetEventStates", + Handler: _Network_GetEventStates_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "networks/networks.proto", diff --git a/common/protos-go/relay/datatransfer.pb.go b/common/protos-go/relay/datatransfer.pb.go index 4f4ef98e4..67f9bcf72 100644 --- a/common/protos-go/relay/datatransfer.pb.go +++ b/common/protos-go/relay/datatransfer.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.15.6 +// protoc v3.17.3 // source: relay/datatransfer.proto package relay diff --git a/common/protos-go/relay/datatransfer_grpc.pb.go b/common/protos-go/relay/datatransfer_grpc.pb.go index 9a9d74e1f..55dbe950e 100644 --- a/common/protos-go/relay/datatransfer_grpc.pb.go +++ b/common/protos-go/relay/datatransfer_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.15.6 -// source: relay/datatransfer.proto package relay diff --git a/common/protos-go/relay/events.pb.go b/common/protos-go/relay/events.pb.go new file mode 100644 index 000000000..8a99a3502 --- /dev/null +++ b/common/protos-go/relay/events.pb.go @@ -0,0 +1,109 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.17.3 +// source: relay/events.proto + +package relay + +import ( + common "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var File_relay_events_proto protoreflect.FileDescriptor + +var file_relay_events_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x63, 0x6b, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xd9, 0x01, + 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x12, 0x45, 0x0a, 0x0e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, + 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x16, 0x53, 0x65, 0x6e, 0x64, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, + 0x63, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, + 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x1c, 0x53, 0x65, 0x6e, 0x64, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, + 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x32, 0x8a, 0x01, 0x0a, 0x0c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x3f, 0x0a, 0x0f, 0x53, 0x65, + 0x6e, 0x64, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x65, + 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x09, 0x53, + 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x61, 0x63, 0x6b, + 0x2e, 0x41, 0x63, 0x6b, 0x22, 0x00, 0x42, 0x70, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x65, + 0x61, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x4e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, + 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x2d, 0x64, 0x6c, 0x74, + 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2d, + 0x67, 0x6f, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_relay_events_proto_goTypes = []interface{}{ + (*common.EventSubscription)(nil), // 0: common.events.EventSubscription + (*common.Ack)(nil), // 1: common.ack.Ack + (*common.ViewPayload)(nil), // 2: common.state.ViewPayload +} +var file_relay_events_proto_depIdxs = []int32{ + 0, // 0: relay.events.EventSubscribe.SubscribeEvent:input_type -> common.events.EventSubscription + 1, // 1: relay.events.EventSubscribe.SendSubscriptionStatus:input_type -> common.ack.Ack + 1, // 2: relay.events.EventSubscribe.SendDriverSubscriptionStatus:input_type -> common.ack.Ack + 2, // 3: relay.events.EventPublish.SendDriverState:input_type -> common.state.ViewPayload + 2, // 4: relay.events.EventPublish.SendState:input_type -> common.state.ViewPayload + 1, // 5: relay.events.EventSubscribe.SubscribeEvent:output_type -> common.ack.Ack + 1, // 6: relay.events.EventSubscribe.SendSubscriptionStatus:output_type -> common.ack.Ack + 1, // 7: relay.events.EventSubscribe.SendDriverSubscriptionStatus:output_type -> common.ack.Ack + 1, // 8: relay.events.EventPublish.SendDriverState:output_type -> common.ack.Ack + 1, // 9: relay.events.EventPublish.SendState:output_type -> common.ack.Ack + 5, // [5:10] is the sub-list for method output_type + 0, // [0:5] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_relay_events_proto_init() } +func file_relay_events_proto_init() { + if File_relay_events_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_relay_events_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 2, + }, + GoTypes: file_relay_events_proto_goTypes, + DependencyIndexes: file_relay_events_proto_depIdxs, + }.Build() + File_relay_events_proto = out.File + file_relay_events_proto_rawDesc = nil + file_relay_events_proto_goTypes = nil + file_relay_events_proto_depIdxs = nil +} diff --git a/common/protos-go/relay/events_grpc.pb.go b/common/protos-go/relay/events_grpc.pb.go new file mode 100644 index 000000000..fc5931666 --- /dev/null +++ b/common/protos-go/relay/events_grpc.pb.go @@ -0,0 +1,310 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package relay + +import ( + context "context" + common "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// EventSubscribeClient is the client API for EventSubscribe service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type EventSubscribeClient interface { + // the dest-relay forwards the request from client as EventSubscription to the src-relay + SubscribeEvent(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Ack, error) + // Src-relay based upon query (EventSubscription) forwards the same response (Ack) + // from driver to the dest-relay by calling a new endpoint in dest-relay + SendSubscriptionStatus(ctx context.Context, in *common.Ack, opts ...grpc.CallOption) (*common.Ack, error) + // Src-driver status of event subscription (Ack) + // to the src-relay by calling a new endpoint in src-relay + SendDriverSubscriptionStatus(ctx context.Context, in *common.Ack, opts ...grpc.CallOption) (*common.Ack, error) +} + +type eventSubscribeClient struct { + cc grpc.ClientConnInterface +} + +func NewEventSubscribeClient(cc grpc.ClientConnInterface) EventSubscribeClient { + return &eventSubscribeClient{cc} +} + +func (c *eventSubscribeClient) SubscribeEvent(ctx context.Context, in *common.EventSubscription, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/relay.events.EventSubscribe/SubscribeEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eventSubscribeClient) SendSubscriptionStatus(ctx context.Context, in *common.Ack, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/relay.events.EventSubscribe/SendSubscriptionStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eventSubscribeClient) SendDriverSubscriptionStatus(ctx context.Context, in *common.Ack, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/relay.events.EventSubscribe/SendDriverSubscriptionStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// EventSubscribeServer is the server API for EventSubscribe service. +// All implementations must embed UnimplementedEventSubscribeServer +// for forward compatibility +type EventSubscribeServer interface { + // the dest-relay forwards the request from client as EventSubscription to the src-relay + SubscribeEvent(context.Context, *common.EventSubscription) (*common.Ack, error) + // Src-relay based upon query (EventSubscription) forwards the same response (Ack) + // from driver to the dest-relay by calling a new endpoint in dest-relay + SendSubscriptionStatus(context.Context, *common.Ack) (*common.Ack, error) + // Src-driver status of event subscription (Ack) + // to the src-relay by calling a new endpoint in src-relay + SendDriverSubscriptionStatus(context.Context, *common.Ack) (*common.Ack, error) + mustEmbedUnimplementedEventSubscribeServer() +} + +// UnimplementedEventSubscribeServer must be embedded to have forward compatible implementations. +type UnimplementedEventSubscribeServer struct { +} + +func (UnimplementedEventSubscribeServer) SubscribeEvent(context.Context, *common.EventSubscription) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubscribeEvent not implemented") +} +func (UnimplementedEventSubscribeServer) SendSubscriptionStatus(context.Context, *common.Ack) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendSubscriptionStatus not implemented") +} +func (UnimplementedEventSubscribeServer) SendDriverSubscriptionStatus(context.Context, *common.Ack) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendDriverSubscriptionStatus not implemented") +} +func (UnimplementedEventSubscribeServer) mustEmbedUnimplementedEventSubscribeServer() {} + +// UnsafeEventSubscribeServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to EventSubscribeServer will +// result in compilation errors. +type UnsafeEventSubscribeServer interface { + mustEmbedUnimplementedEventSubscribeServer() +} + +func RegisterEventSubscribeServer(s grpc.ServiceRegistrar, srv EventSubscribeServer) { + s.RegisterService(&EventSubscribe_ServiceDesc, srv) +} + +func _EventSubscribe_SubscribeEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.EventSubscription) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventSubscribeServer).SubscribeEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/relay.events.EventSubscribe/SubscribeEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventSubscribeServer).SubscribeEvent(ctx, req.(*common.EventSubscription)) + } + return interceptor(ctx, in, info, handler) +} + +func _EventSubscribe_SendSubscriptionStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.Ack) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventSubscribeServer).SendSubscriptionStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/relay.events.EventSubscribe/SendSubscriptionStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventSubscribeServer).SendSubscriptionStatus(ctx, req.(*common.Ack)) + } + return interceptor(ctx, in, info, handler) +} + +func _EventSubscribe_SendDriverSubscriptionStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.Ack) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventSubscribeServer).SendDriverSubscriptionStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/relay.events.EventSubscribe/SendDriverSubscriptionStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventSubscribeServer).SendDriverSubscriptionStatus(ctx, req.(*common.Ack)) + } + return interceptor(ctx, in, info, handler) +} + +// EventSubscribe_ServiceDesc is the grpc.ServiceDesc for EventSubscribe service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var EventSubscribe_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "relay.events.EventSubscribe", + HandlerType: (*EventSubscribeServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SubscribeEvent", + Handler: _EventSubscribe_SubscribeEvent_Handler, + }, + { + MethodName: "SendSubscriptionStatus", + Handler: _EventSubscribe_SendSubscriptionStatus_Handler, + }, + { + MethodName: "SendDriverSubscriptionStatus", + Handler: _EventSubscribe_SendDriverSubscriptionStatus_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "relay/events.proto", +} + +// EventPublishClient is the client API for EventPublish service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type EventPublishClient interface { + // src-driver forwards the state as part of event subscription to src-relay + SendDriverState(ctx context.Context, in *common.ViewPayload, opts ...grpc.CallOption) (*common.Ack, error) + // src-relay will forward the state as part of event subscription to dest-relay + SendState(ctx context.Context, in *common.ViewPayload, opts ...grpc.CallOption) (*common.Ack, error) +} + +type eventPublishClient struct { + cc grpc.ClientConnInterface +} + +func NewEventPublishClient(cc grpc.ClientConnInterface) EventPublishClient { + return &eventPublishClient{cc} +} + +func (c *eventPublishClient) SendDriverState(ctx context.Context, in *common.ViewPayload, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/relay.events.EventPublish/SendDriverState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *eventPublishClient) SendState(ctx context.Context, in *common.ViewPayload, opts ...grpc.CallOption) (*common.Ack, error) { + out := new(common.Ack) + err := c.cc.Invoke(ctx, "/relay.events.EventPublish/SendState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// EventPublishServer is the server API for EventPublish service. +// All implementations must embed UnimplementedEventPublishServer +// for forward compatibility +type EventPublishServer interface { + // src-driver forwards the state as part of event subscription to src-relay + SendDriverState(context.Context, *common.ViewPayload) (*common.Ack, error) + // src-relay will forward the state as part of event subscription to dest-relay + SendState(context.Context, *common.ViewPayload) (*common.Ack, error) + mustEmbedUnimplementedEventPublishServer() +} + +// UnimplementedEventPublishServer must be embedded to have forward compatible implementations. +type UnimplementedEventPublishServer struct { +} + +func (UnimplementedEventPublishServer) SendDriverState(context.Context, *common.ViewPayload) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendDriverState not implemented") +} +func (UnimplementedEventPublishServer) SendState(context.Context, *common.ViewPayload) (*common.Ack, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendState not implemented") +} +func (UnimplementedEventPublishServer) mustEmbedUnimplementedEventPublishServer() {} + +// UnsafeEventPublishServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to EventPublishServer will +// result in compilation errors. +type UnsafeEventPublishServer interface { + mustEmbedUnimplementedEventPublishServer() +} + +func RegisterEventPublishServer(s grpc.ServiceRegistrar, srv EventPublishServer) { + s.RegisterService(&EventPublish_ServiceDesc, srv) +} + +func _EventPublish_SendDriverState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.ViewPayload) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventPublishServer).SendDriverState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/relay.events.EventPublish/SendDriverState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventPublishServer).SendDriverState(ctx, req.(*common.ViewPayload)) + } + return interceptor(ctx, in, info, handler) +} + +func _EventPublish_SendState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.ViewPayload) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EventPublishServer).SendState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/relay.events.EventPublish/SendState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EventPublishServer).SendState(ctx, req.(*common.ViewPayload)) + } + return interceptor(ctx, in, info, handler) +} + +// EventPublish_ServiceDesc is the grpc.ServiceDesc for EventPublish service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var EventPublish_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "relay.events.EventPublish", + HandlerType: (*EventPublishServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SendDriverState", + Handler: _EventPublish_SendDriverState_Handler, + }, + { + MethodName: "SendState", + Handler: _EventPublish_SendState_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "relay/events.proto", +} diff --git a/common/protos-java-kt/gradle.properties b/common/protos-java-kt/gradle.properties index f220c3bbc..2b6638d90 100644 --- a/common/protos-java-kt/gradle.properties +++ b/common/protos-java-kt/gradle.properties @@ -1,4 +1,4 @@ name=Interop Protos group=com.weaver -version=1.3.1 +version=1.4.2 kotlin.incremental=false diff --git a/common/protos-js/.npmignore b/common/protos-js/.npmignore index c7725bfb1..257a76b70 100644 --- a/common/protos-js/.npmignore +++ b/common/protos-js/.npmignore @@ -4,4 +4,5 @@ node_modules/ package-lock.json Makefile .gitignore -.npmignore \ No newline at end of file +.npmignore +build-protos.sh \ No newline at end of file diff --git a/common/protos-js/build-protos.sh b/common/protos-js/build-protos.sh new file mode 100755 index 000000000..dd0e6acaa --- /dev/null +++ b/common/protos-js/build-protos.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +BUILDDIR=./ +PROTOSDIR=../protos +FABRIC_PROTOSDIR=../fabric-protos + +# NodeJS Build +# Following build is without GRPC out, use this when no rpc services defined in proto. +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/common/interop_payload.proto $PROTOSDIR/common/asset_locks.proto $PROTOSDIR/common/asset_transfer.proto $PROTOSDIR/common/ack.proto $PROTOSDIR/common/query.proto $PROTOSDIR/common/state.proto $PROTOSDIR/common/proofs.proto $PROTOSDIR/common/verification_policy.proto $PROTOSDIR/common/membership.proto $PROTOSDIR/common/access_control.proto $PROTOSDIR/common/events.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/corda/view_data.proto +# Following build is with GRPC out, use this to build rpc proto services. +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --grpc_out=grpc_js:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/driver/driver.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/fabric/view_data.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --grpc_out=grpc_js:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/identity/agent.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --grpc_out=grpc_js:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/networks/networks.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --grpc_out=grpc_js:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $PROTOSDIR/relay/datatransfer.proto $PROTOSDIR/relay/events.proto +grpc_tools_node_protoc --proto_path=$PROTOSDIR --proto_path=$FABRIC_PROTOSDIR --js_out=import_style=commonjs,binary:$BUILDDIR --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` $FABRIC_PROTOSDIR/msp/identities.proto $FABRIC_PROTOSDIR/peer/proposal_response.proto $FABRIC_PROTOSDIR/peer/proposal.proto $FABRIC_PROTOSDIR/peer/chaincode.proto $FABRIC_PROTOSDIR/common/policies.proto $FABRIC_PROTOSDIR/msp/msp_principal.proto + +# Typescript Build +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/common/interop_payload.proto $PROTOSDIR/common/asset_locks.proto $PROTOSDIR/common/asset_transfer.proto $PROTOSDIR/common/ack.proto $PROTOSDIR/common/query.proto $PROTOSDIR/common/state.proto $PROTOSDIR/common/proofs.proto $PROTOSDIR/common/verification_policy.proto $PROTOSDIR/common/membership.proto $PROTOSDIR/common/access_control.proto $PROTOSDIR/common/events.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/corda/view_data.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/driver/driver.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/fabric/view_data.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/identity/agent.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/networks/networks.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $PROTOSDIR/relay/datatransfer.proto $PROTOSDIR/relay/events.proto +protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=$BUILDDIR -I $PROTOSDIR -I $FABRIC_PROTOSDIR $FABRIC_PROTOSDIR/msp/identities.proto $FABRIC_PROTOSDIR/peer/proposal_response.proto $FABRIC_PROTOSDIR/peer/proposal.proto $FABRIC_PROTOSDIR/peer/chaincode.proto $FABRIC_PROTOSDIR/common/policies.proto $FABRIC_PROTOSDIR/msp/msp_principal.proto diff --git a/common/protos-js/package.json b/common/protos-js/package.json index 03267f895..3603879f9 100644 --- a/common/protos-js/package.json +++ b/common/protos-js/package.json @@ -1,6 +1,6 @@ { "name": "@hyperledger-labs/weaver-protos-js", - "version": "1.3.1", + "version": "1.5.1", "description": "Interop protos for Node JS (Weaver)", "main": "index.js", "exports": { @@ -16,7 +16,7 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "grpc_tools_node_protoc --proto_path=../protos --proto_path=../fabric-protos --js_out=import_style=commonjs,binary:./ --grpc_out=grpc_js:./ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` ../protos/relay/datatransfer.proto ../protos/relay/events.proto ../protos/networks/networks.proto ../protos/driver/driver.proto ../protos/identity/agent.proto ../protos/common/interop_payload.proto ../protos/common/asset_locks.proto ../protos/common/asset_transfer.proto ../protos/common/ack.proto ../protos/common/query.proto ../protos/fabric/view_data.proto ../protos/corda/view_data.proto ../protos/common/state.proto ../protos/common/proofs.proto ../protos/common/verification_policy.proto ../protos/common/events.proto ../fabric-protos/msp/identities.proto ../fabric-protos/peer/proposal_response.proto ../fabric-protos/peer/proposal.proto ../fabric-protos/peer/chaincode.proto ../fabric-protos/common/policies.proto ../fabric-protos/msp/msp_principal.proto && protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=./ -I ../protos -I ../fabric-protos ../protos/relay/datatransfer.proto ../protos/relay/events.proto ../protos/networks/networks.proto ../protos/driver/driver.proto ../protos/identity/agent.proto ../protos/common/interop_payload.proto ../protos/common/asset_locks.proto ../protos/common/asset_transfer.proto ../protos/common/ack.proto ../protos/common/query.proto ../protos/fabric/view_data.proto ../protos/corda/view_data.proto ../protos/common/state.proto ../protos/common/proofs.proto ../protos/common/verification_policy.proto ../protos/common/events.proto ../fabric-protos/msp/identities.proto ../fabric-protos/peer/proposal_response.proto ../fabric-protos/peer/proposal.proto ../fabric-protos/peer/chaincode.proto ../fabric-protos/common/policies.proto ../fabric-protos/msp/msp_principal.proto" + "build": "sh ./build-protos.sh" }, "repository": { "type": "git", diff --git a/common/protos/common/events.proto b/common/protos/common/events.proto index 6c69c0646..aa3603398 100644 --- a/common/protos/common/events.proto +++ b/common/protos/common/events.proto @@ -3,47 +3,66 @@ syntax = "proto3"; package common.events; import "common/query.proto"; +import "common/state.proto"; option java_package = "com.weaver.protos.common.events"; option go_package = "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common"; enum EventType { - LedgerState = 0; - AssetLock = 1; - AssetClaim = 2; + LEDGER_STATE = 0; + ASSET_LOCK = 1; + ASSET_CLAIM = 2; } message EventMatcher { - EventType type = 1; - string transaction_func = 2; + EventType event_type = 1; + string event_class_id = 2; + string transaction_ledger_id = 3; + string transaction_contract_id = 4; + string transaction_func = 5; } + +enum EventSubOperation { + SUBSCRIBE = 0; + UNSUBSCRIBE = 1; + UPDATE = 2; +} + +// Below message is used to communicate between dest-relay and src-relay; +// and src-relay and src-driver. message EventSubscription { - EventMatcher eventMatcher = 1; - common.query.Query query = 2; + EventMatcher event_matcher = 1; + common.query.Query query = 2; + EventSubOperation operation = 3; } + message EventSubscriptionState { enum STATUS { // pending ACK from remote relay - PENDING_ACK = 0; + SUBSCRIBE_PENDING_ACK = 0; // Received ACK, waiting for event subscription confirmation from remote relay - PENDING = 1; - ERROR = 2; - SUCCESS = 3; + SUBSCRIBE_PENDING = 1; + SUBSCRIBED = 2; + UNSUBSCRIBE_PENDING_ACK = 3; + UNSUBSCRIBE_PENDING = 4; + UNSUBSCRIBED = 5; + ERROR = 6; }; string request_id = 1; STATUS status = 2; string message = 3; - EventMatcher eventMatcher = 4; - EventPublication eventPublicationSpec = 5; + EventMatcher event_matcher = 4; + EventPublication event_publication_spec = 5; } message ContractTransaction { - string driverId = 1; - string ledgerId = 2; - string contractId = 3; + string driver_id = 1; + string ledger_id = 2; + string contract_id = 3; string func = 4; repeated bytes args = 5; - uint64 replaceArgIndex = 6; + uint64 replace_arg_index = 6; + repeated string members = 7; } message EventPublication { @@ -51,4 +70,16 @@ message EventPublication { ContractTransaction ctx = 1; string app_url = 2; } -} \ No newline at end of file +} + +message EventStates { + repeated EventState states = 1; +} + +// the payload that is used for the communication between the requesting relay +// and its network +message EventState { + common.state.RequestState state = 1; + string event_id = 2; + string message = 3; +} diff --git a/common/protos/common/state.proto b/common/protos/common/state.proto index c25697128..9dd153cad 100644 --- a/common/protos/common/state.proto +++ b/common/protos/common/state.proto @@ -49,8 +49,12 @@ message RequestState { PENDING_ACK = 0; // Received ACK, waiting for data to be sent from remote relay PENDING = 1; - ERROR = 2; - COMPLETED = 3; + ERROR = 2; // View is not there, received error from remote relay + COMPLETED = 3; // Data Sharing completed Successfully + EVENT_RECEIVED = 4; // View is there and event is received from remote relay + EVENT_WRITTEN = 5; // Driver Successfully wrote the view to ledger + EVENT_WRITE_ERROR = 6; // View is there but driver failed to write + DELETED = 7; // Once network fetches this request state, mark it delete for cleanup later on }; string request_id = 1; STATUS status = 2; diff --git a/common/protos/driver/driver.proto b/common/protos/driver/driver.proto index 342d1ce87..3a39f76d1 100644 --- a/common/protos/driver/driver.proto +++ b/common/protos/driver/driver.proto @@ -5,10 +5,17 @@ package driver.driver; import "common/ack.proto"; import "common/query.proto"; import "common/events.proto"; +import "common/state.proto"; option java_package = "com.weaver.protos.driver.driver"; option go_package = "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/driver"; +// Data for a View processing by dest-driver +message WriteExternalStateMessage { + common.state.ViewPayload view_payload = 1; + common.events.ContractTransaction ctx = 2; +} + service DriverCommunication { // Data Sharing // the remote relay sends a RequestDriverState request to its driver with a @@ -18,4 +25,13 @@ service DriverCommunication { // Events Subscription // the src-relay uses this endpoint to forward the event subscription request from dest-relay to driver rpc SubscribeEvent(common.events.EventSubscription) returns (common.ack.Ack) {} + + // Recommended to have TLS mode on for this unsafe endpoint + // Relay uses this to get Query.requestor_signature and + // Query.certificate required for event subscription + rpc RequestSignedEventSubscriptionQuery(common.events.EventSubscription) returns (common.query.Query) {} + + // Events Publication + // the dest-relay calls the dest-driver on this end point to write the remote network state to the local ledger + rpc WriteExternalState(WriteExternalStateMessage) returns (common.ack.Ack) {} } \ No newline at end of file diff --git a/common/protos/identity/agent.proto b/common/protos/identity/agent.proto index e4d116da1..70c05ead3 100644 --- a/common/protos/identity/agent.proto +++ b/common/protos/identity/agent.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package identity.agent; import "common/ack.proto"; +import "common/membership.proto"; option java_package = "com.weaver.protos.identity.agent"; option go_package = "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/identity"; @@ -10,21 +11,49 @@ option go_package = "github.com/hyperledger-labs/weaver-dlt-interoperability/com // definitions of all messages used in the datatransfer protocol service IINAgent { // user or agent triggers a sync of external/foreign network unit's state - rpc SyncExternalState(NetworkUnitIdentity) returns (common.ack.Ack) {} + rpc SyncExternalState(SecurityDomainMemberIdentity) returns (common.ack.Ack) {} // Requesting network unit's state from a foreign IIN agent. - rpc RequestIdentityConfiguration(NetworkUnitIdentity) returns (common.ack.Ack){} + rpc RequestIdentityConfiguration(SecurityDomainMemberIdentityRequest) returns (common.ack.Ack){} // Handling network unit's state sent by a foreign IIN agent. - rpc SendIdentityConfiguration(NetworkUnitIdentity) returns (common.ack.Ack){} - // user or agent triggers a flow to collect signatures attesting an - // external/foreign network unit's state and recording to ledger - rpc FlowAndRecordAttestations(NetworkUnitIdentity) returns (common.ack.Ack) {} + rpc SendIdentityConfiguration(AttestedMembership) returns (common.ack.Ack){} // Requesting attestation from a local IIN agent. - rpc RequestAttestation(NetworkUnitIdentity) returns (common.ack.Ack){} + rpc RequestAttestation(CounterAttestedMembership) returns (common.ack.Ack){} // Handling attestation sent by a local IIN agent. - rpc SendAttestation(NetworkUnitIdentity) returns (common.ack.Ack){} + rpc SendAttestation(CounterAttestedMembership) returns (common.ack.Ack){} } -message NetworkUnitIdentity { - string network_id = 1; - string participant_id = 2; +// Unique identifier for a unit of a network that runs an IIN agent +message SecurityDomainMemberIdentity { + string security_domain = 1; + string member_id = 2; +} + +message SecurityDomainMemberIdentityRequest { + SecurityDomainMemberIdentity source_network = 1; + SecurityDomainMemberIdentity requesting_network = 2; + string nonce = 3; +} + +// Association of signature (over arbitrary data) and signer identity +message Attestation { + SecurityDomainMemberIdentity unit_identity = 1; + string certificate = 2; + string signature = 3; + string nonce = 4; +} + +// Attested security domain membership by a single member +message AttestedMembership { + string membership = 1; // 'common.membership.Membership': Serialized and Base64-encoded + Attestation attestation = 2; +} + +// Counter attestation over security domain membership attested by its participants +message CounterAttestedMembership { + message AttestedMembershipSet { + string membership = 1; // 'common.membership.Membership': Serialized and Base64-encoded + repeated Attestation attestations = 2; + } + string attested_membership_set = 1; // 'AttestedMembershipSet': Serialized and Base64-encoded + repeated Attestation attestations = 2; } diff --git a/common/protos/networks/networks.proto b/common/protos/networks/networks.proto index c00792d64..a6da84508 100644 --- a/common/protos/networks/networks.proto +++ b/common/protos/networks/networks.proto @@ -24,7 +24,12 @@ service Network { // endpoint for a client to subscribe to event via local relay initiating subscription flow. rpc SubscribeEvent(NetworkEventSubscription) returns (common.ack.Ack) {} // This rpc endpoint is for polling the local relay for subscription state. - rpc GetEventSubscriptionState(GetStateMessage) returns(common.events.EventSubscriptionState) {} + rpc GetEventSubscriptionState(GetStateMessage) returns (common.events.EventSubscriptionState) {} + // endpoint for a client to subscribe to event via local relay initiating subscription flow. + rpc UnsubscribeEvent(NetworkEventUnsubscription) returns (common.ack.Ack) {} + // endpoint for a client to fetch received events. + // Note: events are marked as deleted from relay database as soon as client fetches them. + rpc GetEventStates(GetStateMessage) returns(common.events.EventStates) {} } message DbName { @@ -50,8 +55,15 @@ message NetworkQuery { string requesting_org = 8; bool confidential = 9; } + +// Below message is used for network/client to dest-relay communication message NetworkEventSubscription { - common.events.EventMatcher eventMatcher = 1; + common.events.EventMatcher event_matcher = 1; NetworkQuery query = 2; - common.events.EventPublication eventPublicationSpec = 3; + common.events.EventPublication event_publication_spec = 3; +} + +message NetworkEventUnsubscription { + NetworkEventSubscription request = 1; + string request_id = 2; } diff --git a/common/protos/relay/events.proto b/common/protos/relay/events.proto index 2373a831f..af3ee11a1 100644 --- a/common/protos/relay/events.proto +++ b/common/protos/relay/events.proto @@ -4,6 +4,7 @@ package relay.events; import "common/ack.proto"; import "common/events.proto"; +import "common/state.proto"; option java_package = "com.weaver.protos.relay.events"; option go_package = "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/relay"; @@ -14,4 +15,14 @@ service EventSubscribe { // Src-relay based upon query (EventSubscription) forwards the same response (Ack) // from driver to the dest-relay by calling a new endpoint in dest-relay rpc SendSubscriptionStatus(common.ack.Ack) returns (common.ack.Ack) {} + // Src-driver status of event subscription (Ack) + // to the src-relay by calling a new endpoint in src-relay + rpc SendDriverSubscriptionStatus(common.ack.Ack) returns (common.ack.Ack) {} } + +service EventPublish { + // src-driver forwards the state as part of event subscription to src-relay + rpc SendDriverState(common.state.ViewPayload) returns (common.ack.Ack) {} + // src-relay will forward the state as part of event subscription to dest-relay + rpc SendState(common.state.ViewPayload) returns (common.ack.Ack) {} +} \ No newline at end of file diff --git a/core/drivers/corda-driver/VERSION b/core/drivers/corda-driver/VERSION new file mode 100644 index 000000000..434dcac4f --- /dev/null +++ b/core/drivers/corda-driver/VERSION @@ -0,0 +1 @@ +1.2.9 \ No newline at end of file diff --git a/core/drivers/corda-driver/build.gradle b/core/drivers/corda-driver/build.gradle index 27e12d535..4102f5035 100644 --- a/core/drivers/corda-driver/build.gradle +++ b/core/drivers/corda-driver/build.gradle @@ -7,10 +7,10 @@ buildscript { ext.grpc_kotlin_version = "0.1.3" // CURRENT_GRPC_KOTLIN_VERSION ext.corda_release_group = "net.corda" ext.corda_core_release_group = "net.corda" - ext.corda_version = "4.8.4" - ext.corda_core_version = "4.8.4" + ext.corda_version = "4.8" + ext.corda_core_version = "4.8" ext.arrow_version = "0.10.4" - ext.weaver_protos_version = "1.3.1" + ext.weaver_protos_version = "1.4.2" ext.weaver_corda_version = "1.2.9" repositories { diff --git a/core/drivers/corda-driver/docker-testnet-envs/.env.corda b/core/drivers/corda-driver/docker-testnet-envs/.env.corda index 72b72d6b5..e85be8ee5 100644 --- a/core/drivers/corda-driver/docker-testnet-envs/.env.corda +++ b/core/drivers/corda-driver/docker-testnet-envs/.env.corda @@ -3,7 +3,7 @@ DRIVER_PORT=9099 DRIVER_RPC_USERNAME=driverUser1 DRIVER_RPC_PASSWORD=test DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-corda-driver -DOCKER_TAG=1.2.9 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_default COMPOSE_PROJECT_NAME=corda COMPOSE_PROJECT_NETWORK=default diff --git a/core/drivers/corda-driver/docker-testnet-envs/.env.corda.tls b/core/drivers/corda-driver/docker-testnet-envs/.env.corda.tls index 399e7d645..70ef05b67 100644 --- a/core/drivers/corda-driver/docker-testnet-envs/.env.corda.tls +++ b/core/drivers/corda-driver/docker-testnet-envs/.env.corda.tls @@ -3,7 +3,7 @@ DRIVER_PORT=9099 DRIVER_RPC_USERNAME=driverUser1 DRIVER_RPC_PASSWORD=test DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-corda-driver -DOCKER_TAG=1.2.9 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_default COMPOSE_PROJECT_NAME=corda COMPOSE_PROJECT_NETWORK=default diff --git a/core/drivers/corda-driver/docker-testnet-envs/.env.corda2 b/core/drivers/corda-driver/docker-testnet-envs/.env.corda2 index daa6e2a4f..7df9207a0 100644 --- a/core/drivers/corda-driver/docker-testnet-envs/.env.corda2 +++ b/core/drivers/corda-driver/docker-testnet-envs/.env.corda2 @@ -3,7 +3,7 @@ DRIVER_PORT=9098 DRIVER_RPC_USERNAME=driverUser1 DRIVER_RPC_PASSWORD=test DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-corda-driver -DOCKER_TAG=1.2.9 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_network2_default COMPOSE_PROJECT_NAME=corda_network2 COMPOSE_PROJECT_NETWORK=default diff --git a/core/drivers/corda-driver/docker-testnet-envs/.env.corda2.tls b/core/drivers/corda-driver/docker-testnet-envs/.env.corda2.tls index 70fa382da..021ff29d0 100644 --- a/core/drivers/corda-driver/docker-testnet-envs/.env.corda2.tls +++ b/core/drivers/corda-driver/docker-testnet-envs/.env.corda2.tls @@ -3,7 +3,7 @@ DRIVER_PORT=9098 DRIVER_RPC_USERNAME=driverUser1 DRIVER_RPC_PASSWORD=test DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-corda-driver -DOCKER_TAG=1.2.9 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_network2_default COMPOSE_PROJECT_NAME=corda_network2 COMPOSE_PROJECT_NETWORK=default diff --git a/core/drivers/corda-driver/makefile b/core/drivers/corda-driver/makefile index 946db1beb..8206d870c 100644 --- a/core/drivers/corda-driver/makefile +++ b/core/drivers/corda-driver/makefile @@ -1,4 +1,7 @@ -include makefile.variables.docker +DOCKER_IMAGE_NAME ?= weaver-corda-driver +DOCKER_TAG ?= `cat ./VERSION` +DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs +GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability/core/drivers/corda-driver COMPOSE_ARG ?= @@ -23,15 +26,25 @@ build-refresh-dependencies: github.properties .PHONY: image-local image-local: build-local docker build -f Dockerfile.local -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) . + docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) $(DOCKER_IMAGE_NAME):latest .PHONY: image image: github.properties docker build --build-arg GIT_URL=$(GIT_URL) -f Dockerfile.remote -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) . +.PHONY: check-if-tag-exists +check-if-tag-exists: + !(DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) > /dev/null) + .PHONY: push-image -push-image: image +push-image: check-if-tag-exists image docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) + +.PHONY: push-image-latest +push-image-latest: + docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest + docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest .PHONY: run run: diff --git a/core/drivers/corda-driver/makefile.variables.docker b/core/drivers/corda-driver/makefile.variables.docker deleted file mode 100644 index 00feb6a87..000000000 --- a/core/drivers/corda-driver/makefile.variables.docker +++ /dev/null @@ -1,4 +0,0 @@ -DOCKER_IMAGE_NAME ?= weaver-corda-driver -DOCKER_TAG ?= 1.2.9 -DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs -GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability/core/drivers/corda-driver \ No newline at end of file diff --git a/core/drivers/fabric-driver/.env.docker.template b/core/drivers/fabric-driver/.env.docker.template index e456286d8..2340e435b 100644 --- a/core/drivers/fabric-driver/.env.docker.template +++ b/core/drivers/fabric-driver/.env.docker.template @@ -9,10 +9,10 @@ DRIVER_TLS=false DRIVER_TLS_CERT_PATH= DRIVER_TLS_KEY_PATH= INTEROP_CHAINCODE= +DB_PATH=driverdbs +WALLET_PATH= DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-driver -DOCKER_TAG=1.3.1 +DOCKER_TAG=1.4.0 EXTERNAL_NETWORK= COMPOSE_PROJECT_NAME= COMPOSE_PROJECT_NETWORK= -MOCK=false -DB_NAME=driverdb diff --git a/core/drivers/fabric-driver/.env.template b/core/drivers/fabric-driver/.env.template index 181a20513..312e81bcb 100644 --- a/core/drivers/fabric-driver/.env.template +++ b/core/drivers/fabric-driver/.env.template @@ -10,4 +10,5 @@ NETWORK_NAME=network1 DRIVER_CONFIG= INTEROP_CHAINCODE=interop MOCK=false -DB_NAME=driverdb +DB_PATH=driverdbs +WALLET_PATH= diff --git a/core/drivers/fabric-driver/.gitignore b/core/drivers/fabric-driver/.gitignore index c5745fc45..0b29d7b40 100644 --- a/core/drivers/fabric-driver/.gitignore +++ b/core/drivers/fabric-driver/.gitignore @@ -5,4 +5,6 @@ .env /fabric-protos package-lock.json -.npmrc \ No newline at end of file +.npmrc +driverdbs +weaver-fabric-interop-sdk diff --git a/core/drivers/fabric-driver/VERSION b/core/drivers/fabric-driver/VERSION new file mode 100644 index 000000000..e1df5de7a --- /dev/null +++ b/core/drivers/fabric-driver/VERSION @@ -0,0 +1 @@ +1.4.4 \ No newline at end of file diff --git a/core/drivers/fabric-driver/docker-compose.yml b/core/drivers/fabric-driver/docker-compose.yml index 01d4c9f0a..4c4140b2f 100644 --- a/core/drivers/fabric-driver/docker-compose.yml +++ b/core/drivers/fabric-driver/docker-compose.yml @@ -22,6 +22,7 @@ services: - DRIVER_TLS=${DRIVER_TLS} - DRIVER_TLS_CERT_PATH=${DRIVER_TLS_CERT_PATH} - DRIVER_TLS_KEY_PATH=${DRIVER_TLS_KEY_PATH} + - WALLET_PATH=${WALLET_PATH} volumes: - ${CONNECTION_PROFILE}:/fabric-driver/ccp.json - ${DRIVER_CONFIG}:/fabric-driver/config.json @@ -29,7 +30,7 @@ services: - ../../relay/credentials:/fabric-driver/credentials ports: - "${DRIVER_PORT}:${DRIVER_PORT}" - command: sh -c "npm run dev" + command: sh -c "npm run start" # This networks section is required for when the peers have networks specified networks: default: diff --git a/core/drivers/fabric-driver/docker-testnet-envs/.env.n1 b/core/drivers/fabric-driver/docker-testnet-envs/.env.n1 index f6b96b952..479d6416f 100644 --- a/core/drivers/fabric-driver/docker-testnet-envs/.env.n1 +++ b/core/drivers/fabric-driver/docker-testnet-envs/.env.n1 @@ -5,7 +5,7 @@ NETWORK_NAME=network1 DRIVER_PORT=9090 INTEROP_CHAINCODE=interop DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-driver -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network1_net COMPOSE_PROJECT_NAME=network1 COMPOSE_PROJECT_NETWORK=net diff --git a/core/drivers/fabric-driver/docker-testnet-envs/.env.n1.tls b/core/drivers/fabric-driver/docker-testnet-envs/.env.n1.tls index 539fad0f3..6adc02c40 100644 --- a/core/drivers/fabric-driver/docker-testnet-envs/.env.n1.tls +++ b/core/drivers/fabric-driver/docker-testnet-envs/.env.n1.tls @@ -5,7 +5,7 @@ NETWORK_NAME=network1 DRIVER_PORT=9090 INTEROP_CHAINCODE=interop DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-driver -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network1_net COMPOSE_PROJECT_NAME=network1 COMPOSE_PROJECT_NETWORK=net diff --git a/core/drivers/fabric-driver/docker-testnet-envs/.env.n2 b/core/drivers/fabric-driver/docker-testnet-envs/.env.n2 index 68cb7bbd0..f313ff278 100644 --- a/core/drivers/fabric-driver/docker-testnet-envs/.env.n2 +++ b/core/drivers/fabric-driver/docker-testnet-envs/.env.n2 @@ -5,7 +5,7 @@ NETWORK_NAME=network2 DRIVER_PORT=9095 INTEROP_CHAINCODE=interop DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-driver -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network2_net COMPOSE_PROJECT_NAME=network2 COMPOSE_PROJECT_NETWORK=net diff --git a/core/drivers/fabric-driver/docker-testnet-envs/.env.n2.tls b/core/drivers/fabric-driver/docker-testnet-envs/.env.n2.tls index bd40f8a3e..eea66e556 100644 --- a/core/drivers/fabric-driver/docker-testnet-envs/.env.n2.tls +++ b/core/drivers/fabric-driver/docker-testnet-envs/.env.n2.tls @@ -5,7 +5,7 @@ NETWORK_NAME=network2 DRIVER_PORT=9095 INTEROP_CHAINCODE=interop DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-driver -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network2_net COMPOSE_PROJECT_NAME=network2 COMPOSE_PROJECT_NETWORK=net diff --git a/core/drivers/fabric-driver/fabricDriver.dockerfile b/core/drivers/fabric-driver/fabricDriver.dockerfile index bbd20114b..064785036 100644 --- a/core/drivers/fabric-driver/fabricDriver.dockerfile +++ b/core/drivers/fabric-driver/fabricDriver.dockerfile @@ -21,16 +21,14 @@ ADD package.json . RUN npm install --unsafe-perm -ADD patches /fabric-driver/patches ADD server /fabric-driver/server ADD config.json . -ADD temp.pem . ADD tsconfig.json . ADD .eslintrc . ADD .prettierrc . RUN npm run build -RUN npm run postinstall +RUN rm /fabric-driver/.npmrc ARG GIT_URL LABEL org.opencontainers.image.source ${GIT_URL} diff --git a/core/drivers/fabric-driver/fabricDriver.dockerfile.local b/core/drivers/fabric-driver/fabricDriver.dockerfile.local index 5520a4471..7bab4220c 100644 --- a/core/drivers/fabric-driver/fabricDriver.dockerfile.local +++ b/core/drivers/fabric-driver/fabricDriver.dockerfile.local @@ -6,6 +6,7 @@ FROM node:14 AS builder-local WORKDIR /fabric-driver ADD protos-js /fabric-driver/protos-js +ADD weaver-fabric-interop-sdk /fabric-driver/weaver-fabric-interop-sdk # Remote build # FROM node:14 AS builder-remote @@ -19,16 +20,13 @@ ADD package.json . RUN npm install --unsafe-perm -ADD patches /fabric-driver/patches ADD server /fabric-driver/server ADD config.json . -ADD temp.pem . ADD tsconfig.json . ADD .eslintrc . ADD .prettierrc . RUN npm run build -RUN npm run postinstall ARG GIT_URL LABEL org.opencontainers.image.source ${GIT_URL} diff --git a/core/drivers/fabric-driver/makefile b/core/drivers/fabric-driver/makefile index 0d757c5bd..182453ad5 100644 --- a/core/drivers/fabric-driver/makefile +++ b/core/drivers/fabric-driver/makefile @@ -1,54 +1,64 @@ -include makefile.variables.docker +DOCKER_IMAGE_NAME ?= weaver-fabric-driver +DOCKER_TAG ?= `cat ./VERSION` +DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs +GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability/core/drivers/fabric-driver COMPOSE_ARG ?= - + build: .npmrc npm install npm run build - npm run postinstall -build-local: +protos-js: mkdir -p protos-js && \ cp -r ../../../common/protos-js/common ./protos-js/ && \ cp -r ../../../common/protos-js/corda ./protos-js/ && \ cp -r ../../../common/protos-js/driver ./protos-js/ && \ cp -r ../../../common/protos-js/fabric ./protos-js/ && \ + cp -r ../../../common/protos-js/identity ./protos-js/ && \ cp -r ../../../common/protos-js/msp ./protos-js/ && \ cp -r ../../../common/protos-js/networks ./protos-js/ && \ cp -r ../../../common/protos-js/peer ./protos-js/ && \ cp -r ../../../common/protos-js/relay ./protos-js/ && \ cp -r ../../../common/protos-js/package.json ./protos-js/ - cp package.json package-remote.json && \ + +weaver-fabric-interop-sdk: + mkdir -p weaver-fabric-interop-sdk && \ + cp -r ../../../sdks/fabric/interoperation-node-sdk/build ./weaver-fabric-interop-sdk/ && \ + cp -r ../../../sdks/fabric/interoperation-node-sdk/index.js ./weaver-fabric-interop-sdk/ && \ + cp -r ../../../sdks/fabric/interoperation-node-sdk/package.json ./weaver-fabric-interop-sdk/package.json + +build-local: protos-js weaver-fabric-interop-sdk + (cp package.json package-remote.json && \ cp package-local.json package.json && \ - npm install && \ - mv package-remote.json package.json + npm install) || \ + (mv package-remote.json package.json && exit 1) # Only if fails + mv package-remote.json package.json # Only if success npm run build - npm run postinstall -build-image-local: - mkdir -p protos-js && \ - cp -r ../../../common/protos-js/common ./protos-js/ && \ - cp -r ../../../common/protos-js/corda ./protos-js/ && \ - cp -r ../../../common/protos-js/driver ./protos-js/ && \ - cp -r ../../../common/protos-js/fabric ./protos-js/ && \ - cp -r ../../../common/protos-js/msp ./protos-js/ && \ - cp -r ../../../common/protos-js/networks ./protos-js/ && \ - cp -r ../../../common/protos-js/peer ./protos-js/ && \ - cp -r ../../../common/protos-js/relay ./protos-js/ && \ - cp -r ../../../common/protos-js/package.json ./protos-js/ +build-image-local: protos-js weaver-fabric-interop-sdk cp package.json package-remote.json cp package-local.json package.json - docker build --build-arg BUILD_TAG="local" --build-arg GIT_URL=$(GIT_URL) -t ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) -f fabricDriver.dockerfile.local . - mv package-remote.json package.json + (docker build --build-arg BUILD_TAG="local" --build-arg GIT_URL=$(GIT_URL) -t ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) -f fabricDriver.dockerfile.local . ) || \ + (mv package-remote.json package.json && exit 1) # Only if fails + mv package-remote.json package.json # Only if success rm -rf protos-js + docker tag ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) $(DOCKER_IMAGE_NAME):latest build-image: .npmrc docker build --build-arg BUILD_TAG="remote" --build-arg GIT_URL=$(GIT_URL) -t ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) -f fabricDriver.dockerfile . + +check-if-tag-exists: + !(DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) > /dev/null) -push-image: build-image +push-image: check-if-tag-exists build-image docker tag ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) +push-image-latest: + docker tag ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest + docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest + deploy: docker-compose $(COMPOSE_ARG) up -d @@ -61,4 +71,4 @@ clean: rm -rf node_modules package-lock.json out clean-local: - rm -rf node_modules package-lock.json out protos-js + rm -rf node_modules package-lock.json out protos-js weaver-fabric-interop-sdk diff --git a/core/drivers/fabric-driver/makefile.variables.docker b/core/drivers/fabric-driver/makefile.variables.docker deleted file mode 100644 index 24b88a456..000000000 --- a/core/drivers/fabric-driver/makefile.variables.docker +++ /dev/null @@ -1,4 +0,0 @@ -DOCKER_IMAGE_NAME ?= weaver-fabric-driver -DOCKER_TAG ?= 1.3.1 -DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs -GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability/core/drivers/fabric-driver \ No newline at end of file diff --git a/core/drivers/fabric-driver/package-local.json b/core/drivers/fabric-driver/package-local.json index 20b13d840..cd0454cf9 100644 --- a/core/drivers/fabric-driver/package-local.json +++ b/core/drivers/fabric-driver/package-local.json @@ -1,12 +1,11 @@ { "name": "fabric-driver", - "version": "1.3.0", + "version": "1.4.4", "description": "", - "main": "index.js", + "main": "out/server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "npm run tsc", - "postinstall": "patch-package", "tsc": "tsc", "start": "node out/server.js", "watch": "tsc --watch", @@ -21,6 +20,7 @@ "license": "ISC", "dependencies": { "@hyperledger-labs/weaver-protos-js": "file:./protos-js", + "@hyperledger-labs/weaver-fabric-interop-sdk": "file:./weaver-fabric-interop-sdk", "@fidm/x509": "^1.2.1", "@grpc/grpc-js": "^1.1.1", "@typescript-eslint/eslint-plugin": "^3.5.0", @@ -28,8 +28,8 @@ "dotenv": "^8.2.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-prettier": "^3.1.4", - "fabric-ca-client": "2.2.5", - "fabric-network": "2.2.5", + "fabric-ca-client": "^2.2.8", + "fabric-network": "^2.2.8", "level": "^8.0.0" }, "devDependencies": { diff --git a/core/drivers/fabric-driver/package.json b/core/drivers/fabric-driver/package.json index 0ad52fbd6..6416ee328 100644 --- a/core/drivers/fabric-driver/package.json +++ b/core/drivers/fabric-driver/package.json @@ -1,12 +1,11 @@ { "name": "fabric-driver", - "version": "1.3.0", + "version": "1.4.4", "description": "", - "main": "index.js", + "main": "out/server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "npm run tsc", - "postinstall": "patch-package", "tsc": "tsc", "start": "node out/server.js", "watch": "tsc --watch", @@ -20,7 +19,8 @@ "author": "", "license": "ISC", "dependencies": { - "@hyperledger-labs/weaver-protos-js": "^1.3.0", + "@hyperledger-labs/weaver-protos-js": "^1.4.4", + "@hyperledger-labs/weaver-fabric-interop-sdk": "^1.4.4", "@fidm/x509": "^1.2.1", "@grpc/grpc-js": "^1.1.1", "@typescript-eslint/eslint-plugin": "^3.5.0", @@ -28,8 +28,9 @@ "dotenv": "^8.2.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-prettier": "^3.1.4", - "fabric-ca-client": "2.2.5", - "fabric-network": "2.2.5" + "fabric-ca-client": "^2.2.8", + "fabric-network": "^2.2.8", + "level": "^8.0.0" }, "devDependencies": { "patch-package": "^6.2.2", diff --git a/core/drivers/fabric-driver/patches/fabric-network+2.2.0.patch b/core/drivers/fabric-driver/patches/fabric-network+2.2.0.patch deleted file mode 100644 index d471cf43d..000000000 --- a/core/drivers/fabric-driver/patches/fabric-network+2.2.0.patch +++ /dev/null @@ -1,105 +0,0 @@ -diff --git a/node_modules/fabric-network/lib/transaction.d.ts b/node_modules/fabric-network/lib/transaction.d.ts -index 1255f26..9344f1d 100644 ---- a/node_modules/fabric-network/lib/transaction.d.ts -+++ b/node_modules/fabric-network/lib/transaction.d.ts -@@ -84,7 +84,7 @@ export declare class Transaction { - * @throws {module:fabric-network.TimeoutError} If the transaction was successfully submitted to the orderer but - * timed out before a commit event was received from peers. - */ -- submit(...args: string[]): Promise; -+ submit(...args: string[]): Promise; - /** - * Evaluate a transaction function and return its results. - * The transaction function will be evaluated on the endorsing peers but -diff --git a/node_modules/fabric-network/lib/transaction.js b/node_modules/fabric-network/lib/transaction.js -index b8a1bdc..8177482 100644 ---- a/node_modules/fabric-network/lib/transaction.js -+++ b/node_modules/fabric-network/lib/transaction.js -@@ -172,7 +172,7 @@ class Transaction { - logger.debug('%s - build and send the endorsement', method); - // build the outbound request along with getting a new transactionId - // from the identity context -- endorsement.build(this.identityContext, proposalBuildRequest); -+ const proposal = endorsement.build(this.identityContext, proposalBuildRequest); - endorsement.sign(this.identityContext); - // ------- S E N D P R O P O S A L - // This is where the request gets sent to the peers -@@ -209,42 +209,42 @@ class Transaction { - const proposalResponse = await endorsement.send(proposalSendRequest); - try { - const result = getResponsePayload(proposalResponse); -- // ------- E V E N T M O N I T O R -- const eventHandler = this.eventHandlerStrategyFactory(endorsement.getTransactionId(), this.contract.network); -- await eventHandler.startListening(); -- const commit = endorsement.newCommit(); -- commit.build(this.identityContext); -- commit.sign(this.identityContext); -- // ----- C O M M I T E N D O R S E M E N T -- // this is where the endorsement results are sent to the orderer -- const commitSendRequest = {}; -- if (isInteger(transactionOptions.commitTimeout)) { -- commitSendRequest.requestTimeout = transactionOptions.commitTimeout * 1000; // in ms; -- } -- if (proposalSendRequest.handler) { -- logger.debug('%s - use discovery to commit', method); -- commitSendRequest.handler = proposalSendRequest.handler; -- } -- else { -- logger.debug('%s - use the orderers assigned to the channel', method); -- commitSendRequest.targets = channel.getCommitters(); -- } -- // by now we should have a discovery handler or use the target orderers -- // that have been assigned from the channel to perform the commit -- const commitResponse = await commit.send(commitSendRequest); -- logger.debug('%s - commit response %j', method, commitResponse); -- if (commitResponse.status !== 'SUCCESS') { -- const msg = `Failed to commit transaction %${endorsement.getTransactionId()}, orderer response status: ${commitResponse.status}`; -- logger.error('%s - %s', method, msg); -- eventHandler.cancelListening(); -- throw new Error(msg); -- } -- else { -- logger.debug('%s - successful commit', method); -- } -- logger.debug('%s - wait for the transaction to be committed on the peer', method); -- await eventHandler.waitForEvents(); -- return result; -+ // // ------- E V E N T M O N I T O R -+ // const eventHandler = this.eventHandlerStrategyFactory(endorsement.getTransactionId(), this.contract.network); -+ // await eventHandler.startListening(); -+ // const commit = endorsement.newCommit(); -+ // commit.build(this.identityContext); -+ // commit.sign(this.identityContext); -+ // // ----- C O M M I T E N D O R S E M E N T -+ // // this is where the endorsement results are sent to the orderer -+ // const commitSendRequest = {}; -+ // if (isInteger(transactionOptions.commitTimeout)) { -+ // commitSendRequest.requestTimeout = transactionOptions.commitTimeout * 1000; // in ms; -+ // } -+ // if (proposalSendRequest.handler) { -+ // logger.debug('%s - use discovery to commit', method); -+ // commitSendRequest.handler = proposalSendRequest.handler; -+ // } -+ // else { -+ // logger.debug('%s - use the orderers assigned to the channel', method); -+ // commitSendRequest.targets = channel.getCommitters(); -+ // } -+ // // by now we should have a discovery handler or use the target orderers -+ // // that have been assigned from the channel to perform the commit -+ // const commitResponse = await commit.send(commitSendRequest); -+ // logger.debug('%s - commit response %j', method, commitResponse); -+ // if (commitResponse.status !== 'SUCCESS') { -+ // const msg = `Failed to commit transaction %${endorsement.getTransactionId()}, orderer response status: ${commitResponse.status}`; -+ // logger.error('%s - %s', method, msg); -+ // eventHandler.cancelListening(); -+ // throw new Error(msg); -+ // } -+ // else { -+ // logger.debug('%s - successful commit', method); -+ // } -+ // logger.debug('%s - wait for the transaction to be committed on the peer', method); -+ // await eventHandler.waitForEvents(); -+ return {result, proposalResponse: proposalResponse.responses, proposal: proposal} ; - } - catch (err) { - err.responses = proposalResponse.responses; diff --git a/core/drivers/fabric-driver/readme.md b/core/drivers/fabric-driver/readme.md index 014035468..a2b29d9bf 100644 --- a/core/drivers/fabric-driver/readme.md +++ b/core/drivers/fabric-driver/readme.md @@ -93,6 +93,10 @@ Can pass in a config file for the driver to be run with: `DRIVER_CONFIG` (ex: DR `INTEROP_CHAINCODE` stores the name of the interop chaincode installed. +`DB_PATH` stores the path hosting the database files containing the event subscription information. + +`WALLET_PATH` stores the path hosting the user wallets to access a network. + NOTE: When specifying ensure that they match the config that the relay is using. **For docker-compose:*** diff --git a/core/drivers/fabric-driver/server/data/mock-network-config.json b/core/drivers/fabric-driver/server/data/mock-network-config.json deleted file mode 100644 index 37a7df4a1..000000000 --- a/core/drivers/fabric-driver/server/data/mock-network-config.json +++ /dev/null @@ -1 +0,0 @@ -{"members":{"org1.network1.com":{"type":"ca","value":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLakNDQWRHZ0F3SUJBZ0lVQkZUaTU2cm1qdW5KaVJFU3B5SlcwcTRzUkw0d0NnWUlLb1pJemowRUF3SXcKY2pFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1ROHdEUVlEVlFRSApFd1pFZFhKb1lXMHhHakFZQmdOVkJBb1RFVzl5WnpFdWJtVjBkMjl5YXpFdVkyOXRNUjB3R3dZRFZRUURFeFJqCllTNXZjbWN4TG01bGRIZHZjbXN4TG1OdmJUQWVGdzB5TURBM01qa3dORE0xTURCYUZ3MHpOVEEzTWpZd05ETTEKTURCYU1ISXhDekFKQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFJRXc1T2IzSjBhQ0JEWVhKdmJHbHVZVEVQTUEwRwpBMVVFQnhNR1JIVnlhR0Z0TVJvd0dBWURWUVFLRXhGdmNtY3hMbTVsZEhkdmNtc3hMbU52YlRFZE1Cc0dBMVVFCkF4TVVZMkV1YjNKbk1TNXVaWFIzYjNKck1TNWpiMjB3V1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkMKQUFRT05zSU96NW8rSGhLZ1NkSU9wcUdyVGN2SjN0QURrRnN5TWcwdlYzTVNvNmd5QXE1VjIzYzFnck80WDV4VQpZNzFaVlRQUXVva3Y2L1dJUVlJYXVtakRvMFV3UXpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvCkJBZ3dCZ0VCL3dJQkFUQWRCZ05WSFE0RUZnUVUxZyt0UG5naDJ3OGc5OXoxbXdzVmJrS2pBS2t3Q2dZSUtvWkkKemowRUF3SURSd0F3UkFJZ0dkU015RXppbW9Td2pUeUYrTm1Pd09MbjR4cGVNT2hldjVpZFJXcHkrWnNDSUZLQQowSThjQ2Q1dHc3elR1a3lqV01KaTczN0srNHpQSzZRREtJZXFsK1IxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"}}} \ No newline at end of file diff --git a/core/drivers/fabric-driver/server/dbConnector.ts b/core/drivers/fabric-driver/server/dbConnector.ts index 85a54e904..41850ec5d 100644 --- a/core/drivers/fabric-driver/server/dbConnector.ts +++ b/core/drivers/fabric-driver/server/dbConnector.ts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -const { Level } = require('level') +import { Level } from 'level'; +import * as path from 'path'; /* * Interfaces for all database connectors to be used for event subscriptions @@ -27,6 +28,8 @@ interface DBConnector { update(key: any, value: any): Promise; // interface to delete a key from the database delete(key: any): Promise; + // get iterator + filteredRead(keyFilterCallback : (key: any, targetKey: any) => boolean, targetKey: any): Promise>; // close the database connection close(): Promise; } @@ -41,8 +44,11 @@ class LevelDBConnector implements DBConnector { constructor( dbName: string ) { + if (!dbName || dbName.length == 0) { + dbName = "driverdb"; + } this.DB_NAME = dbName; - this.dbHandle = new Level(dbName, { valueEncoding: 'json' }); + this.dbHandle = new Level(path.join(process.env.DB_PATH ? process.env.DB_PATH : "./driverdbs", dbName), { valueEncoding: 'json' }); } async open( @@ -51,10 +57,14 @@ class LevelDBConnector implements DBConnector { await this.dbHandle.open(); } catch (error: any) { console.error(`failed to open database connection with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_DATABASE_NOT_OPEN' && error.cause && error.cause.code == 'LEVEL_LOCKED') { + throw new DBLockedError(error.toString()); + } else { + throw new DBNotOpenError(error.toString()); + } } - return Promise.resolve(true); + return true; } async insert( @@ -65,10 +75,14 @@ class LevelDBConnector implements DBConnector { await this.dbHandle.put(key, value); } catch (error: any) { console.error(`failed to insert key ${JSON.stringify(key)} with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } } - return Promise.resolve(true); + return true; } async read( @@ -80,7 +94,13 @@ class LevelDBConnector implements DBConnector { console.debug(`read() got value: ${JSON.stringify(value)}`) } catch (error: any) { console.error(`failed to read key ${JSON.stringify(key)} with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_NOT_FOUND') { + throw new DBKeyNotFoundError(error.toString()); + } else if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } } return value; @@ -94,7 +114,11 @@ class LevelDBConnector implements DBConnector { await this.dbHandle.put(key, value); } catch (error: any) { console.error(`failed to update key ${JSON.stringify(key)} with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } } return true; @@ -109,25 +133,94 @@ class LevelDBConnector implements DBConnector { await this.dbHandle.del(key); } catch (error: any) { console.error(`failed to delete key ${JSON.stringify(key)} with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_NOT_FOUND') { + throw new DBKeyNotFoundError(error.toString()); + } else if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } } return value; } + async filteredRead(keyFilterCallback : (key: any, targetKey: any) => boolean, targetKey: any): Promise> { + try { + let retVal = new Array(); + for await (const [key1, value1] of this.dbHandle.iterator()) { + if (keyFilterCallback(key1, targetKey)) { + retVal.push(value1); + } + } + + return retVal; + } catch (error: any) { + console.error(`filteredRead error: ${JSON.stringify(error)}`); + if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } + } + } + async close( ): Promise { try { await this.dbHandle.close(); } catch (error: any) { console.error(`failed to close database connection with error: ${JSON.stringify(error)}`); - throw new Error(error); + if (error.code == 'LEVEL_DATABASE_NOT_OPEN') { + throw new DBNotOpenError(error.toString()); + } else { + throw new DBError(error.toString()); + } } - return Promise.resolve(true); + return true; + } + + async readKeys( + ):Promise { + const keys = await this.dbHandle.keys().all(); + return keys; + } +} + +class DBKeyNotFoundError extends Error { + constructor(msg: string) { + super(`key not found in database: ${msg}`); + Object.setPrototypeOf(this, DBKeyNotFoundError.prototype); + } +} + +class DBNotOpenError extends Error { + constructor(msg: string) { + super(`database is not open: ${msg}`); + Object.setPrototypeOf(this, DBNotOpenError.prototype); + } +} + +class DBLockedError extends Error { + constructor(msg: string) { + super(`database already in use: ${msg}`); + Object.setPrototypeOf(this, DBLockedError.prototype); + } +} + +class DBError extends Error { + constructor(msg: string) { + super(`database error: ${msg}`); + Object.setPrototypeOf(this, DBError.prototype); } } export { - LevelDBConnector -} \ No newline at end of file + DBConnector, + LevelDBConnector, + DBLockedError, + DBKeyNotFoundError, + DBNotOpenError, + DBError +} diff --git a/core/drivers/fabric-driver/server/events.ts b/core/drivers/fabric-driver/server/events.ts new file mode 100644 index 000000000..de89e625d --- /dev/null +++ b/core/drivers/fabric-driver/server/events.ts @@ -0,0 +1,432 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import ack_pb from '@hyperledger-labs/weaver-protos-js/common/ack_pb'; +import eventsPb from '@hyperledger-labs/weaver-protos-js/common/events_pb'; +import events_grpc_pb from '@hyperledger-labs/weaver-protos-js/relay/events_grpc_pb'; +import queryPb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; +import { InteroperableHelper } from '@hyperledger-labs/weaver-fabric-interop-sdk'; +import { getDriverKeyCert } from "./walletSetup"; +import { DBConnector, DBKeyNotFoundError, LevelDBConnector } from "./dbConnector"; +import { checkIfArraysAreEqual, handlePromise, relayCallback } from "./utils"; +import { registerListenerForEventSubscription, unregisterListenerForEventSubscription } from "./listener"; +import { getNetworkGateway } from "./fabric-code"; +import { Gateway, Network, Contract } from "fabric-network"; +import state_pb from '@hyperledger-labs/weaver-protos-js/common/state_pb'; +import driverPb from '@hyperledger-labs/weaver-protos-js/driver/driver_pb'; + +const DB_NAME: string = "driverdb"; + +async function subscribeEventHelper( + call_request: eventsPb.EventSubscription, + client: events_grpc_pb.EventSubscribeClient, + network_name: string, +) { + const newRequestId = call_request.getQuery()!.getRequestId(); + const [requestId, error] = await handlePromise(addEventSubscription(call_request)); + if (error) { + const errorString: string = `error (thrown as part of async processing while storing to DB during subscribeEvent): ${JSON.stringify(error)}`; + console.error(errorString); + const ack_send_error = new ack_pb.Ack(); + ack_send_error.setRequestId(newRequestId); + ack_send_error.setMessage(errorString); + ack_send_error.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + console.log(`Sending to the relay the eventSubscription error Ack: ${JSON.stringify(ack_send_error.toObject())}`); + // Sending the fabric state to the relay. + client.sendDriverSubscriptionStatus(ack_send_error, relayCallback); + } else { + const ack_send = new ack_pb.Ack(); + if (newRequestId == requestId) { // event being subscribed for the first time + // Start an appropriate type of event listener for this event subscription if one is not already active + const [listenerHandle, error] = await handlePromise(registerListenerForEventSubscription(call_request, network_name)); + if (error) { + // Need to delete subscription in database too, for consistency + const [deletedSubscription, err] = + await handlePromise(deleteEventSubscription(call_request.getEventMatcher()!, newRequestId)); + if (err) { + const errorString: string = err.toString(); + console.error(errorString); + } + const errorString2 = error.toString(); + console.error(errorString2); + ack_send.setMessage(`Event subscription error: listener registration failed with error: ${errorString2}`); + ack_send.setStatus(ack_pb.Ack.STATUS.ERROR); + } else { + ack_send.setMessage('Event subscription is successful!'); + ack_send.setStatus(ack_pb.Ack.STATUS.OK); + } + } else { + // event being subscribed already exists + ack_send.setMessage(`Event subscription already exists with requestId: ${requestId}`); + ack_send.setStatus(ack_pb.Ack.STATUS.ERROR); + } + ack_send.setRequestId(newRequestId); + + // gRPC response. + console.log(`Sending to the relay the eventSubscription Ack: ${JSON.stringify(ack_send.toObject())}`); + + if (!process.env.RELAY_ENDPOINT) { + throw new Error('RELAY_ENDPOINT is not set.'); + } + + // Sending the fabric state to the relay. + client.sendDriverSubscriptionStatus(ack_send, relayCallback); + } +} + +async function unsubscribeEventHelper( + call_request: eventsPb.EventSubscription, + client: events_grpc_pb.EventSubscribeClient, + network_name: string, +) { + const [unregister, err] = + await handlePromise(unregisterListenerForEventSubscription(call_request.getEventMatcher()!, network_name)); + if (!unregister) { // Just log a warning. This is not critical. + console.warn('No listener running for the given subscription or unable to stop listener'); + } + if (err) { // Just log the error. This is not critical. + const errorString: string = `${JSON.stringify(err)}`; + console.error(errorString); + } + const newRequestId = call_request.getQuery()!.getRequestId(); + const [deletedSubscription, error] = + await handlePromise(deleteEventSubscription(call_request.getEventMatcher()!, newRequestId)); + if (error) { + const errorString: string = `error (thrown as part of async processing while deleting from DB during unsubscribeEvent): ${JSON.stringify(error)}`; + console.error(errorString); + const ack_send_error = new ack_pb.Ack(); + ack_send_error.setRequestId(newRequestId); + ack_send_error.setMessage(errorString); + ack_send_error.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + console.log(`Sending to the relay the eventSubscription error Ack: ${JSON.stringify(ack_send_error.toObject())}`); + // Sending the fabric state to the relay. + client.sendDriverSubscriptionStatus(ack_send_error, relayCallback); + } else { + const ack_send = new ack_pb.Ack(); + + // event got unsubscribed + ack_send.setMessage(`Event ${JSON.stringify(deletedSubscription.toObject())} unsubscription is successful!`); + ack_send.setStatus(ack_pb.Ack.STATUS.OK); + ack_send.setRequestId(newRequestId); + + // gRPC response. + console.log(`Sending to the relay the eventSubscription Ack: ${JSON.stringify(ack_send.toObject())}`); + + if (!process.env.RELAY_ENDPOINT) { + throw new Error('RELAY_ENDPOINT is not set.'); + } + + // Sending the fabric state to the relay. + client.sendDriverSubscriptionStatus(ack_send, relayCallback); + } +} + +async function addEventSubscription( + eventSub: eventsPb.EventSubscription +): Promise { + console.log(`adding to driver, subscription of the eventSub: ${JSON.stringify(eventSub.toObject())}`); + let db: DBConnector; + try { + // Create connection to a database + db = new LevelDBConnector(DB_NAME!); + await db.open(); + + // eventMatcher need to be non-null, hence apply the NaN assertion operator '!' + var eventMatcher: eventsPb.EventMatcher = eventSub.getEventMatcher()!; + // the serialized protobuf for eventMatcher below can be decoded to other formats like 'utf8' [.toString('utf8')] + const key: string = Buffer.from(eventMatcher.serializeBinary()).toString('base64'); + + // query need to be non-null, hence apply the NaN assertion operator '!' + var query: queryPb.Query = eventSub.getQuery()!; + // the serialized protobuf for query below can be decoded to other formats like 'utf8' [.toString('utf8')] + var querySerialized: string = Buffer.from(query.serializeBinary()).toString('base64'); + // serialized content of subscriptions is the value present in the key/value LevelDB corresponding to the key + var subscriptions: Array; + + try { + // fetch the current values in the DB against the given key + var subscriptionsSerialized: string = await db.read(key) as string; + subscriptions = JSON.parse(subscriptionsSerialized); + + console.debug(`subscriptions.length: ${subscriptions.length}`); + // check if the event to be subscribed is already present in the DB + for (const subscriptionSerialized of subscriptions) { + var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); + if (checkIfArraysAreEqual(subscription.getPolicyList(), query.getPolicyList()) && + subscription.getAddress() == query.getAddress() && + subscription.getRequestingRelay() == query.getRequestingRelay() && + subscription.getRequestingNetwork() == query.getRequestingNetwork() && + subscription.getCertificate() == query.getCertificate() && + subscription.getRequestingOrg() == query.getRequestingOrg() && + subscription.getConfidential() == query.getConfidential()) { + + console.log(`found subscription for query with requestId: ${subscription.getRequestId()}`); + await db.close(); + return subscription.getRequestId(); + } + } + + // case of key being present in the list + console.debug(`eventMatcher: ${JSON.stringify(eventMatcher.toObject())} is already present in the database`); + subscriptions.push(querySerialized); + } catch (error: any) { + let errorString = error.toString(); + if (error instanceof DBKeyNotFoundError) { + // case of read failing due to key not found + console.debug(`eventMatcher: ${JSON.stringify(eventMatcher.toObject())} is not present before in the database`); + subscriptions = new Array(); + subscriptions.push(querySerialized); + } else { + // case of read failing due to some other issue + console.error(`re-throwing error: ${errorString}`); + await db.close(); + throw new Error(error); + } + } + + console.debug(`subscriptions.length: ${subscriptions.length}`); + subscriptionsSerialized = JSON.stringify(subscriptions); + // insert the value against key in the DB (it can be the scenario of a new key addition, or update to the value of an existing key) + await db.insert(key, subscriptionsSerialized); + await db.close(); + + // TODO: register the event with fabric sdk + console.log(`end addEventSubscription() .. requestId: ${query.getRequestId()}`); + return query.getRequestId(); + + } catch(error: any) { + console.error(`Error during addEventSubscription(): ${JSON.stringify(error)}`); + await db?.close(); + throw new Error(error); + } +} + +const deleteEventSubscription = async ( + eventMatcher: eventsPb.EventMatcher, + requestId: string +): Promise => { + console.log(`deleting from driver subscription of the eventMatcher: ${JSON.stringify(eventMatcher.toObject())} with requestId: ${requestId}`); + var subscriptions: Array; + var retVal: eventsPb.EventSubscription = new eventsPb.EventSubscription(); + retVal.setEventMatcher(eventMatcher); + let db: DBConnector; + try { + // Create connection to a database + db = new LevelDBConnector(DB_NAME!); + await db.open(); + + const key: string = Buffer.from(eventMatcher.serializeBinary()).toString('base64'); + try { + // fetch the current values in the DB against the given key + var subscriptionsSerialized: string = await db.read(key) as string; + subscriptions = JSON.parse(subscriptionsSerialized); + + console.debug(`subscriptions.length: ${subscriptions.length}`); + var foundEntry: boolean = false; + for (var subscriptionSerialized of subscriptions) { + var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); + if (subscription.getRequestId() == requestId) { + console.debug(`deleting the subscription (with input requestId): ${JSON.stringify(subscription.toObject())}`); + subscriptions.splice(subscriptions.indexOf(subscriptionSerialized), 1); + retVal.setQuery(subscription); + foundEntry = true; + break; + } + } + + if (!foundEntry) { + throw new Error(`event subscription with requestId: ${requestId} is not found!`); + } + } catch (error: any) { + // error could be either due to key not being present in the database or some other issue with database access + console.error(`re-throwing error: ${JSON.stringify(error)}`); + await db.close(); + throw new Error(error); + } + + console.debug(`subscriptions.length: ${subscriptions.length}`); + if (subscriptions.length == 0) { + await db.delete(key); + } else { + subscriptionsSerialized = JSON.stringify(subscriptions); + await db.insert(key, subscriptionsSerialized); + } + + await db.close(); + console.log(`end deleteEventSubscription() .. retVal: ${JSON.stringify(retVal.toObject())}`); + return retVal; + } catch(error: any) { + console.error(`Error during delete: ${JSON.stringify(error)}`); + await db?.close(); + throw new Error(error); + } +} + +function filterEventMatcher(keySerialized: string, eventMatcher: eventsPb.EventMatcher) : boolean { + var item: eventsPb.EventMatcher = eventsPb.EventMatcher.deserializeBinary(Buffer.from(keySerialized, 'base64')); + if ((eventMatcher.getEventClassId() == '*' || eventMatcher.getEventClassId() == item.getEventClassId()) && + (eventMatcher.getTransactionContractId() == '*' || eventMatcher.getTransactionContractId() == item.getTransactionContractId()) && + (eventMatcher.getTransactionLedgerId() == '*' || eventMatcher.getTransactionLedgerId() == item.getTransactionLedgerId()) && + (eventMatcher.getTransactionFunc() == '*' || eventMatcher.getTransactionFunc() == item.getTransactionFunc().toLowerCase())) { + + return true; + } else { + return false; + } +} + +async function lookupEventSubscriptions( + eventMatcher: eventsPb.EventMatcher +): Promise> { + console.info(`finding the subscriptions with eventMatcher: ${JSON.stringify(eventMatcher.toObject())}`); + var subscriptions: Array; + var returnSubscriptions: Array = new Array(); + let db: DBConnector; + + try { + // Create connection to a database + db = new LevelDBConnector(DB_NAME!); + await db.open(); + + for (const subscriptionsSerialized of await db.filteredRead(filterEventMatcher, eventMatcher)) { + subscriptions = JSON.parse(subscriptionsSerialized) + for (const subscriptionSerialized of subscriptions) { + var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); + console.debug(`subscription: ${JSON.stringify(subscription.toObject())}`) + returnSubscriptions.push(subscription); + } + } + + console.debug(`returnSubscriptions.length: ${returnSubscriptions.length}`); + console.log(`end lookupEventSubscriptions()`); + await db.close(); + return returnSubscriptions; + + } catch (error: any) { + let errorString: string = error.toString(); + await db?.close(); + if (error instanceof DBKeyNotFoundError) { + // case of read failing due to key not found + returnSubscriptions = new Array(); + console.debug(`returnSubscriptions.length: ${returnSubscriptions.length}`); + return returnSubscriptions; + } else { + // case of read failing due to some other issue + console.error(`Error during lookup: ${errorString}`); + throw new Error(error); + } + } +} + +async function signEventSubscriptionQuery( + inputQuery: queryPb.Query +): Promise { + console.log(`driver ready to provide sign on query: ${JSON.stringify(inputQuery.toObject())}`); + let signedQuery = new queryPb.Query(); + + try { + signedQuery.setPolicyList(inputQuery.getPolicyList()); + signedQuery.setAddress(inputQuery.getAddress()); + signedQuery.setRequestingRelay(inputQuery.getRequestingRelay()); + signedQuery.setRequestingOrg(inputQuery.getRequestingOrg()); + signedQuery.setRequestingNetwork(inputQuery.getRequestingNetwork()); + signedQuery.setNonce(inputQuery.getNonce()); + signedQuery.setRequestId(inputQuery.getRequestId()); + signedQuery.setConfidential(inputQuery.getConfidential()); + + const keyCert = await getDriverKeyCert() + signedQuery.setCertificate(keyCert.cert); + signedQuery.setRequestorSignature( + InteroperableHelper.signMessage( + inputQuery.getAddress() + inputQuery.getNonce(), + keyCert.key.toBytes() + ).toString("base64") + ); + return signedQuery; + } catch (error: any) { + const errorString: string = `${JSON.stringify(error)}`; + console.error(`signing query failed with error: ${errorString}`); + throw new Error(error); + } +} + +async function writeExternalStateHelper( + writeExternalStateMessage: driverPb.WriteExternalStateMessage, + networkName: string +) : Promise { + const viewPayload: state_pb.ViewPayload = writeExternalStateMessage.getViewPayload(); + const ctx: eventsPb.ContractTransaction = writeExternalStateMessage.getCtx(); + const keyCert = await getDriverKeyCert(); + + const requestId: string = viewPayload.getRequestId(); + if (!viewPayload.getError()) { + + let interopArgIndices = [], viewsSerializedBase64 = [], addresses = [], viewContentsBase64 = []; + const view: state_pb.View = viewPayload.getView(); + + const result = InteroperableHelper.getResponseDataFromView(view, keyCert.key.toBytes()); + if (result.interopPayload.getConfidential()) { + viewContentsBase64.push(result.contents.toString("base64")); + } else { + viewContentsBase64.push(""); + } + + interopArgIndices.push(ctx.getReplaceArgIndex()); + addresses.push(result.interopPayload.getAddress()); + viewsSerializedBase64.push(Buffer.from(viewPayload.getView().serializeBinary()).toString("base64")); + + let ccArgsB64 = ctx.getArgsList(); + let ccArgsStr = []; + for (const ccArgB64 of ccArgsB64) { + ccArgsStr.push(Buffer.from(ccArgB64).toString('utf8')); + } + + let gateway: Gateway = await getNetworkGateway(networkName); + const network: Network = await gateway.getNetwork(ctx.getLedgerId()); + const interopContract: Contract = network.getContract(process.env.INTEROP_CHAINCODE ? process.env.INTEROP_CHAINCODE : 'interop'); + + const endorsingOrgs = ctx.getMembersList(); + const invokeObject = { + channel: ctx.getLedgerId(), + ccFunc: ctx.getFunc(), + ccArgs: ccArgsStr, + contractName: ctx.getContractId() + } + console.debug(`invokeObject.ccArgs: ${invokeObject.ccArgs}`) + + const [ response, responseError ] = await handlePromise(InteroperableHelper.submitTransactionWithRemoteViews( + interopContract, + invokeObject, + interopArgIndices, + addresses, + viewsSerializedBase64, + viewContentsBase64, + endorsingOrgs + )); + if (responseError) { + console.log(`Failed writing to the ledger with error: ${responseError}`); + gateway.disconnect(); + throw responseError; + } + gateway.disconnect(); + } else { + const errorString: string = `erroneous viewPayload identified in WriteExternalState processing`; + console.log(`error viewPayload.getError(): ${JSON.stringify(viewPayload.getError())}`); + throw new Error(errorString); + } +} + +export { + subscribeEventHelper, + unsubscribeEventHelper, + addEventSubscription, + deleteEventSubscription, + lookupEventSubscriptions, + signEventSubscriptionQuery, + writeExternalStateHelper +} diff --git a/core/drivers/fabric-driver/server/fabric-code.ts b/core/drivers/fabric-driver/server/fabric-code.ts index a3ed64029..117ba97b2 100644 --- a/core/drivers/fabric-driver/server/fabric-code.ts +++ b/core/drivers/fabric-driver/server/fabric-code.ts @@ -8,11 +8,11 @@ import { Gateway, Wallets } from 'fabric-network'; import { Endorser } from 'fabric-common'; import * as path from 'path'; import * as fs from 'fs'; -import * as fabproto6 from 'fabric-protos'; import query_pb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; import view_data from '@hyperledger-labs/weaver-protos-js/fabric/view_data_pb'; import proposalResponse from '@hyperledger-labs/weaver-protos-js/peer/proposal_response_pb'; import interopPayload from '@hyperledger-labs/weaver-protos-js/common/interop_payload_pb'; +import state_pb from '@hyperledger-labs/weaver-protos-js/common/state_pb'; import { Certificate } from '@fidm/x509'; import { getConfig } from './walletSetup'; @@ -21,22 +21,13 @@ const parseAddress = (address: string) => { const fabricArgs = addressList[2].split(':'); return { channel: fabricArgs[0], contract: fabricArgs[1], ccFunc: fabricArgs[2], args: fabricArgs.slice(3) }; }; + const getWallet = (walletPath: string) => { return Wallets.newFileSystemWallet(walletPath); }; -// Main invoke function wtih logic to handle policy and turn response from chaincode into a view. -// 1. Prepare credentials/gateway for communicating with fabric network -// 2. prepare info required for invoke (address/policy) -// 3. Set the endorser list for the transaction, this enforces that the list provided will endorse the proposed transaction -// 4. Prepare the view and return. -async function invoke( - query: query_pb.Query, - networkName: string, - requestingNetwork: string, - requestingOrg: string, -): Promise { - console.log('Running invoke on fabric network'); +// Get a handle to a network gateway using existing wallet credentials +const getNetworkGateway = async (networkName: string): Promise => { try { // load the network configuration const ccpPath = process.env.CONNECTION_PROFILE @@ -51,9 +42,9 @@ async function invoke( } const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8')); const config = getConfig(); - // 1. Prepare credentials/gateway for communicating with fabric network - // Create a new file system based wallet for managing identities. - const walletPath = path.join(process.cwd(), `wallet-${networkName}`); + + // Create a new file system-based wallet for managing identities. + const walletPath = process.env.WALLET_PATH ? process.env.WALLET_PATH : path.join(process.cwd(), `wallet-${networkName}`); const userName = config.relay.name; const wallet = await getWallet(walletPath); console.log(`Wallet path: ${walletPath}`); @@ -70,8 +61,30 @@ async function invoke( identity: `${userName}`, discovery: { enabled: true, asLocalhost: process.env.local === 'false' ? false : true }, }); - // 2. prepare info required for invoke (address/policy) + return gateway; + } catch (error) { + console.error(`Failed to instantiate network (channel): ${error}`); + throw error; + } +} + +// Main invoke function wtih logic to handle policy and turn response from chaincode into a view. +// 1. Prepare credentials/gateway for communicating with fabric network +// 2. Prepare info required for invoke (address/policy) +// 3. Set the endorser list for the transaction, this enforces that the list provided will endorse the proposed transaction +// 4. Prepare the view and return. +async function invoke( + query: query_pb.Query, + networkName: string, + funcName: string, + dynamicArg?: Buffer +): Promise { + console.log('Running query on fabric network'); + try { + // 1. Prepare credentials/gateway for communicating with fabric network + const gateway = await getNetworkGateway(networkName); + // 2. Prepare info required for query (address/policy) const parsedAddress = parseAddress(query.getAddress()); // Get the network (channel) our contract is deployed to. console.log(parsedAddress.channel); @@ -81,24 +94,46 @@ async function invoke( console.log(endorsers); // Get the contract from the network. console.log('policy', query.getPolicyList()); - const contract = network.getContract(process.env.INTEROP_CHAINCODE ? process.env.INTEROP_CHAINCODE : 'interop'); + const chaincodeId = process.env.INTEROP_CHAINCODE ? process.env.INTEROP_CHAINCODE : 'interop'; // LOGIC for getting identities from the provided policy. If none can be found it will default to all. const identities = query.getPolicyList(); console.log('Message: ', query.getAddress() + query.getNonce(), identities); + const cert = Certificate.fromPEM(Buffer.from(query.getCertificate())); + const orgName = cert.issuer.organizationName; console.log( 'CC ARGS', parsedAddress.ccFunc, ...parsedAddress.args, - requestingNetwork, - requestingOrg, + query.getRequestingNetwork(), + query.getRequestingOrg() ? query.getRequestingOrg() : orgName, query.getCertificate(), query.getRequestorSignature(), query.getAddress() + query.getNonce(), ); + const b64QueryBytes = Buffer.from(query.serializeBinary()).toString('base64'); + + const idx = gateway.identityContext.calculateTransactionId(); + const queryProposal = currentChannel.newQuery(chaincodeId); + let request; + if (funcName == 'HandleExternalRequest') { + request = { + fcn: funcName, + args: [b64QueryBytes], + generateTransactionId: false + }; + } else { + request = { + fcn: funcName, + args: [b64QueryBytes, dynamicArg ? dynamicArg.toString() : ""], + generateTransactionId: false + }; + } + queryProposal.build(idx, request); + queryProposal.sign(idx); // 3. Set the endorser list for the transaction, this enforces that the list provided will endorse the proposed transaction - const transaction = contract.createTransaction('HandleExternalRequest'); + let proposalRequest; if (identities.length > 0) { const endorserList = endorsers.filter((endorser: Endorser) => { //@ts-ignore @@ -106,23 +141,30 @@ async function invoke( const orgName = cert.issuer.organizationName; return identities.includes(endorser.mspid) || identities.includes(orgName); }); - console.log('Endorsers', endorserList); - transaction.setEndorsingPeers(endorserList); - console.log('Set endorsers'); + console.log('Set endorserList', endorserList); + proposalRequest = { + targets: endorserList, + requestTimeout: 30000 + }; } else { // When no identities provided it will default to all peers - transaction.setEndorsingPeers(endorsers); + console.log('Set endorsers', endorsers); + proposalRequest = { + targets: endorsers, + requestTimeout: 30000 + }; } - const b64QueryBytes = Buffer.from(query.serializeBinary()).toString('base64'); - // submit transaction and get result from chaincode - const read = await transaction.submit(b64QueryBytes); - console.log('Submittransactionresponse', read); + + // submit query transaction and get result from chaincode + const proposalResponseResult = await queryProposal.send(proposalRequest); + //console.debug(JSON.stringify(proposalResponseResult, null, 2)) + // 4. Prepare the view and return. const viewPayload = new view_data.FabricView(); const endorsements: proposalResponse.Endorsement[] = []; //TODO Fix ts error //@ts-ignore - read.proposalResponse.forEach((response) => { + proposalResponseResult.responses.forEach((response) => { console.log('Response', response); viewPayload.setProposalResponsePayload( proposalResponse.ProposalResponsePayload.deserializeBinary(response.payload), @@ -150,4 +192,23 @@ async function invoke( } } -export default invoke; +// Package view and send to relay +function packageFabricView( + query: query_pb.Query, + viewData: view_data.FabricView, +) { + const meta = new state_pb.Meta(); + meta.setTimestamp(new Date().toISOString()); + meta.setProofType('Notarization'); + meta.setSerializationFormat('STRING'); + meta.setProtocol(state_pb.Meta.Protocol.FABRIC); + const view = new state_pb.View(); + view.setMeta(meta); + view.setData(viewData ? viewData.serializeBinary() : Buffer.from('')); + const viewPayload = new state_pb.ViewPayload(); + viewPayload.setView(view); + viewPayload.setRequestId(query.getRequestId()); + return viewPayload; +} + +export { getNetworkGateway, invoke, packageFabricView }; diff --git a/core/drivers/fabric-driver/server/listener.ts b/core/drivers/fabric-driver/server/listener.ts new file mode 100644 index 000000000..82244042f --- /dev/null +++ b/core/drivers/fabric-driver/server/listener.ts @@ -0,0 +1,299 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as fabproto6 from 'fabric-protos'; +import { Gateway, Network, Contract, ContractEvent, BlockListener, ContractListener, BlockEvent } from 'fabric-network'; +import query_pb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; +import events_pb from '@hyperledger-labs/weaver-protos-js/common/events_pb'; +import { lookupEventSubscriptions } from './events'; +import { invoke, getNetworkGateway, packageFabricView } from './fabric-code'; +import { handlePromise, relayCallback, getRelayClientForEventPublish } from './utils'; +import { DBLockedError } from './dbConnector'; + +let networkGatewayMap = new Map(); +let networkChannelMap = new Map(); +let networkChannelContractMap = new Map(); +let channelBlockListenerMap = new Map(); +let channelBlockListenerCount = new Map(); +let channelContractListenerMap = new Map(); +let channelContractListenerCount = new Map(); + +function getChannelContractKey(channelId: string, contractId: string) { + return channelId + ':' + contractId; +} + +/** + * Register a block listener with a callback + **/ +const initBlockEventListenerForChannel = async ( + network: Network, + networkName: string, + channelId: string, +): Promise => { + const listener: BlockListener = async (event: BlockEvent) => { + // Parse the block data; typically there is only one element in this array but we will interate over it just to be safe + const blockData = ((event.blockData as fabproto6.common.Block).data as fabproto6.common.BlockData).data; + blockData.forEach((item) => { + const payload = Object.values(item)[Object.keys(item).indexOf('payload')]; + const payloadData = Object.values(payload)[Object.keys(payload).indexOf('data')]; + const transactions = payloadData.actions; + // Iterate through the transaction list + transactions.forEach(async (transaction: any) => { + // Get transaction chaincode ID + const chaincodeId = transaction.payload.chaincode_proposal_payload.input.chaincode_spec.chaincode_id.name; + if (transaction.payload.chaincode_proposal_payload.input.chaincode_spec.input.args.length > 0) { + // below way of fetching payload requires that the response has been set by the chaincode function via return value + const responsePayload = transaction.payload.action.proposal_response_payload.extension.response.payload; + // below way of fetching payload is similar to ContractEventListener in which we fetch event.payload + // const responsePayload = transaction.payload.action.proposal_response_payload.extension.events.payload; + // Get transaction function name: first argument according to convention + const chaincodeFunc = transaction.payload.chaincode_proposal_payload.input.chaincode_spec.input.args[0].toString(); + console.log('Trying to find match for channel', channelId, 'chaincode', chaincodeId, 'function', chaincodeFunc); + // Find all matching event subscriptions stored in the database + let eventMatcher = new events_pb.EventMatcher(); + eventMatcher.setEventType(events_pb.EventType.LEDGER_STATE); + eventMatcher.setEventClassId(''); // Only match subscriptions where class ID is not specified + eventMatcher.setTransactionLedgerId(channelId); + eventMatcher.setTransactionContractId(chaincodeId); + eventMatcher.setTransactionFunc(chaincodeFunc); + let eventSubscriptionQueries; + for (let i = 0 ; i < 10 ; i++) { + try{ + eventSubscriptionQueries = await lookupEventSubscriptions(eventMatcher); + break; + } catch(error) { + let errorString: string = error.toString(); + if (!(error instanceof DBLockedError)) { // Check if contention was preventing DB access + throw(error); + } + await new Promise(f => setTimeout(f, 2000)); // Sleep 2 seconds + } + } + // Iterate through the view requests in the matching event subscriptions + eventSubscriptionQueries.forEach(async (eventSubscriptionQuery: query_pb.Query) => { + console.log('Generating view and collecting proof for channel', channelId, 'chaincode', chaincodeId, 'function', chaincodeFunc, 'responsePayload', responsePayload.toString()); + // Trigger proof collection + const [result, invokeError] = await handlePromise( + invoke( + eventSubscriptionQuery, + networkName, + 'HandleEventRequest', + responsePayload + ), + ); + if (!invokeError) { + // Package view and send to relay + const client = getRelayClientForEventPublish(); + const viewPayload = packageFabricView(eventSubscriptionQuery, result); + + console.log('Sending block event'); + // Sending the Fabric event to the relay. + client.sendDriverState(viewPayload, relayCallback); + } + }) + } + }) + }) + }; + await network.addBlockListener(listener); + channelBlockListenerMap.set(channelId, listener); + console.log('Added block listener for channel', channelId); + return listener; +} + +/** + * Register a chaincode event listener with a callback + **/ +const initContractEventListener = ( + contract: Contract, + networkName: string, + channelId: string, + chaincodeId: string, +): any => { + const listener: ContractListener = async (event: ContractEvent) => { + console.log('Trying to find match for channel', channelId, 'chaincode', chaincodeId, 'event class', event.eventName); + // Find all matching event subscriptions stored in the database + let eventMatcher = new events_pb.EventMatcher(); + eventMatcher.setEventType(events_pb.EventType.LEDGER_STATE); + eventMatcher.setEventClassId(event.eventName); + eventMatcher.setTransactionLedgerId(channelId); + eventMatcher.setTransactionContractId(chaincodeId); + eventMatcher.setTransactionFunc('*'); + let eventSubscriptionQueries; + for (let i = 0 ; i < 10 ; i++) { + try{ + eventSubscriptionQueries = await lookupEventSubscriptions(eventMatcher); + break; + } catch(error) { + let errorString: string = error.toString(); + if (!(error instanceof DBLockedError)) { // Check if contention was preventing DB access + throw(error); + } + await new Promise(f => setTimeout(f, 2000)); // Sleep 2 seconds + } + } + // Iterate through the view requests in the matching event subscriptions + eventSubscriptionQueries.forEach(async (eventSubscriptionQuery: query_pb.Query) => { + console.log('Generating view and collecting proof for event class', event.eventName, 'channel', channelId, 'chaincode', chaincodeId, 'event.payload', event.payload.toString()); + // Trigger proof collection + const [result, invokeError] = await handlePromise( + invoke( + eventSubscriptionQuery, + networkName, + 'HandleEventRequest', + event.payload + ), + ); + if (!invokeError) { + // Package view and send to relay + const client = getRelayClientForEventPublish(); + const viewPayload = packageFabricView(eventSubscriptionQuery, result); + + console.log('Sending contract event'); + // Sending the Fabric event to the relay. + client.sendDriverState(viewPayload, relayCallback); + } + }) + }; + contract.addContractListener(listener); + channelContractListenerMap.set(getChannelContractKey(channelId, chaincodeId), listener); + console.log('Added contract listener for channel', channelId, 'and contract', chaincodeId); + return listener; +} + +/** + * Start an appropriate listener if there is currently none for the channel (or chaincode) this event subscription refers to. + **/ +const registerListenerForEventSubscription = async ( + eventSubscription: events_pb.EventSubscription, + networkName: string, +): Promise => { + // Lookup the event suscription from the database. + const eventMatcher = eventSubscription.getEventMatcher(); + if (!eventMatcher) { + throw new Error('No event matcher in event subscription'); + } + + const channelId = eventMatcher.getTransactionLedgerId(); + let gateway: Gateway, network: Network; + if (networkGatewayMap.has(networkName)) { + gateway = networkGatewayMap.get(networkName); + network = networkChannelMap.get(channelId); + if (!network) { + throw new Error('No network/channel handle found for existing gateway and channel ID: ' + channelId); + } + } else { + gateway = await getNetworkGateway(networkName); + networkGatewayMap.set(networkName, gateway); + network = await gateway.getNetwork(channelId); + networkChannelMap.set(channelId, network); + } + // Check if the event_class_id is specified in the event matcher field. + if (eventMatcher.getEventClassId().length === 0) { + // Check if there is an active block listener for the channel specified in this event subscription. + if (channelBlockListenerMap.has(channelId)) { + channelBlockListenerCount.set(channelId, channelBlockListenerCount.get(channelId) + 1); + } else { + // Start a block listener. + const listener = await initBlockEventListenerForChannel(network, networkName, channelId); + channelBlockListenerCount.set(channelId, 1); + return listener; + } + } else { + // Check if there is an active contract listener for the contract function specified in this event subscription. + const contractId = eventMatcher.getTransactionContractId(); + const channelContractKey = getChannelContractKey(channelId, contractId); + let contract: Contract; + if (networkChannelContractMap.has(channelContractKey)) { + contract = networkChannelContractMap.get(channelContractKey); + } else { + contract = network.getContract(contractId); + networkChannelContractMap.set(channelContractKey, contract); + } + if (channelContractListenerMap.has(channelContractKey)) { + channelContractListenerCount.set(channelContractKey, channelContractListenerCount.get(channelContractKey) + 1); + } else { + // Start a contract listener. + const listener = initContractEventListener(contract, networkName, channelId, contractId); + channelContractListenerCount.set(channelContractKey, 1); + return listener; + } + } + return null; // Listener was already running. Nothing to do. +} + +/** + * Decrement subscription count against an active listener. Stop the listener if the count is 0. + **/ +const unregisterListenerForEventSubscription = async ( + eventMatcher: events_pb.EventMatcher, + networkName: string, +): Promise => { + if (!eventMatcher) { + throw new Error('No event matcher in event subscription'); + } + + const channelId = eventMatcher.getTransactionLedgerId(); + let gateway: Gateway, network: Network; + if (networkGatewayMap.has(networkName)) { + gateway = networkGatewayMap.get(networkName); + network = networkChannelMap.get(channelId); + if (!network) { + throw new Error('No network/channel handle found for existing gateway and channel ID: ' + channelId); + } + } else { + gateway = await getNetworkGateway(networkName); + networkGatewayMap.set(networkName, gateway); + network = await gateway.getNetwork(channelId); + networkChannelMap.set(channelId, network); + } + // Check if the event_class_id is specified in the event matcher field. + if (eventMatcher.getEventClassId().length === 0) { + if (!channelBlockListenerMap.has(channelId)) { + return false; + } + channelBlockListenerCount.set(channelId, channelBlockListenerCount.get(channelId) - 1); + if (channelBlockListenerCount.get(channelId) === 0) { // Remove listener and counter + network.removeBlockListener(channelBlockListenerMap.get(channelId)); + channelBlockListenerCount.delete(channelId); + return channelBlockListenerMap.delete(channelId); + } else { + return true; + } + } else { + const contractId = eventMatcher.getTransactionContractId(); + const channelContractKey = getChannelContractKey(channelId, contractId); + let contract: Contract; + if (networkChannelContractMap.has(channelContractKey)) { + contract = networkChannelContractMap.get(channelContractKey); + } else { + contract = network.getContract(contractId); + networkChannelContractMap.set(channelContractKey, contract); + } + if (!channelContractListenerMap.has(channelContractKey)) { + return false; + } + channelContractListenerCount.set(channelContractKey, channelContractListenerCount.get(channelContractKey) - 1); + if (channelContractListenerCount.get(channelContractKey) === 0) { // Remove listener and counter + contract.removeContractListener(channelContractListenerMap.get(channelContractKey)); + channelContractListenerCount.delete(channelContractKey); + return channelContractListenerMap.delete(channelContractKey); + } else { + return true; + } + } +} + +/** + * Load event subscriptions from the driver database. + * Start a listener for each channel from which one of the subscribed events originate. + **/ +const loadEventSubscriptionsFromStorage = ( +): void => { + // TODO +} + +export { registerListenerForEventSubscription, unregisterListenerForEventSubscription, loadEventSubscriptionsFromStorage }; diff --git a/core/drivers/fabric-driver/server/server.ts b/core/drivers/fabric-driver/server/server.ts index d2942cdc5..f795c0268 100644 --- a/core/drivers/fabric-driver/server/server.ts +++ b/core/drivers/fabric-driver/server/server.ts @@ -7,20 +7,21 @@ import fs from 'fs'; import { Server, ServerCredentials, credentials } from '@grpc/grpc-js'; import ack_pb from '@hyperledger-labs/weaver-protos-js/common/ack_pb'; -import fabricView from '@hyperledger-labs/weaver-protos-js/fabric/view_data_pb'; import query_pb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; -import eventsPb, { EventMatcher } from '@hyperledger-labs/weaver-protos-js/common/events_pb'; +import fabricViewPb from '@hyperledger-labs/weaver-protos-js/fabric/view_data_pb'; +import eventsPb from '@hyperledger-labs/weaver-protos-js/common/events_pb'; import driver_pb_grpc from '@hyperledger-labs/weaver-protos-js/driver/driver_grpc_pb'; import datatransfer_grpc_pb from '@hyperledger-labs/weaver-protos-js/relay/datatransfer_grpc_pb'; import events_grpc_pb from '@hyperledger-labs/weaver-protos-js/relay/events_grpc_pb'; import state_pb from '@hyperledger-labs/weaver-protos-js/common/state_pb'; -import invoke from './fabric-code'; +import { invoke, packageFabricView } from './fabric-code'; import 'dotenv/config'; import { walletSetup } from './walletSetup'; -import { Certificate } from '@fidm/x509'; +import { subscribeEventHelper, unsubscribeEventHelper, signEventSubscriptionQuery, writeExternalStateHelper } from "./events" import * as path from 'path'; - -import { addEventSubscription, dbConnectionTest, eventSubscriptionTest } from "./utils" +import { handlePromise, relayCallback, getRelayClientForQueryResponse } from './utils'; +import { dbConnectionTest, eventSubscriptionTest } from "./tests" +import driverPb from '@hyperledger-labs/weaver-protos-js/driver/driver_pb'; const server = new Server(); console.log('driver def', JSON.stringify(driver_pb_grpc)); @@ -43,7 +44,7 @@ function mockCommunication(query: query_pb.Query) { const view = new state_pb.View(); view.setMeta(meta); //@ts-ignore - const viewDataBinary = fabricView.FabricView.deserializeBinary(mockedB64Data).serializeBinary(); + const viewDataBinary = fabricViewPb.FabricView.deserializeBinary(mockedB64Data).serializeBinary(); console.log('viewData', viewDataBinary); view.setData(viewDataBinary); const viewPayload = new state_pb.ViewPayload(); @@ -56,23 +57,10 @@ function mockCommunication(query: query_pb.Query) { process.env.RELAY_ENDPOINT, credentials.createInsecure(), ); - client.sendDriverState(viewPayload, function (err: any, response: any) { - console.log('Response:', response); - }); + client.sendDriverState(viewPayload, relayCallback); }, 3000); } -// A better way to handle errors for promises -function handlePromise(promise: Promise): Promise<[T?, Error?]> { - const result: Promise<[T?, Error?]> = promise - .then((data) => { - const response: [T?, Error?] = [data, undefined]; - return response; - }) - .catch((error) => Promise.resolve([undefined, error])); - return result; -} - // Handles communication with fabric network and sends resulting data to the relay const fabricCommunication = async (query: query_pb.Query, networkName: string) => { // Query object from requestor @@ -83,66 +71,58 @@ const fabricCommunication = async (query: query_pb.Query, networkName: string) = if (!process.env.RELAY_ENDPOINT) { throw new Error('RELAY_ENDPOINT is not set.'); } - let client; - if (process.env.RELAY_TLS === 'true') { - if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { - throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); - } - const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); - client = new datatransfer_grpc_pb.DataTransferClient( - process.env.RELAY_ENDPOINT, - credentials.createSsl(rootCert) - ); - } else { - client = new datatransfer_grpc_pb.DataTransferClient( - process.env.RELAY_ENDPOINT, - credentials.createInsecure() - ); - } - const cert = Certificate.fromPEM(Buffer.from(query.getCertificate())); - const orgName = cert.issuer.organizationName; // Invokes the fabric network const [result, invokeError] = await handlePromise( invoke( query, networkName, - query.getRequestingNetwork(), - query.getRequestingOrg() ? query.getRequestingOrg() : orgName, + 'HandleExternalRequest' ), ); + const client = getRelayClientForQueryResponse(); if (invokeError) { console.log('Invoke Error'); const errorViewPayload = new state_pb.ViewPayload(); errorViewPayload.setError(`Error: ${JSON.stringify(invokeError)}`); errorViewPayload.setRequestId(query.getRequestId()); // Send the error state to the relay - client.sendDriverState(errorViewPayload, function (err: any, response: any) { - console.log('Response:', response, 'Error: ', err); - }); + client.sendDriverState(errorViewPayload, relayCallback); } else { // Process response from invoke to send to relay console.log('Result of fabric invoke', result); console.log('Sending state'); - const meta = new state_pb.Meta(); - meta.setTimestamp(new Date().toISOString()); - meta.setProofType('Notarization'); - meta.setSerializationFormat('STRING'); - meta.setProtocol(state_pb.Meta.Protocol.FABRIC); - const view = new state_pb.View(); - view.setMeta(meta); - view.setData(result ? result.serializeBinary() : Buffer.from('')); - const viewPayload = new state_pb.ViewPayload(); - viewPayload.setView(view); - viewPayload.setRequestId(query.getRequestId()); + const viewPayload: state_pb.ViewPayload = packageFabricView(query, result); console.log('Sending state'); // Sending the fabric state to the relay. - client.sendDriverState(viewPayload, function (err: any, response: any) { - console.log('Response:', response, 'Error: ', err); - }); + client.sendDriverState(viewPayload, relayCallback); } }; +// If the events_grpc_pb.EventSubscribeClient() failes, then it throws an error which will be caught by the caller +async function getEventSubscriptionRelayClient( +): Promise { + let client: events_grpc_pb.EventSubscribeClient; + + if (process.env.RELAY_TLS === 'true') { + if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { + throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); + } + const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); + client = new events_grpc_pb.EventSubscribeClient( + process.env.RELAY_ENDPOINT, + credentials.createSsl(rootCert) + ); + } else { + client = new events_grpc_pb.EventSubscribeClient( + process.env.RELAY_ENDPOINT, + credentials.createInsecure() + ); + } + + return client; +} + // Service for receiving communication from a relay. Will communicate with the network and respond with an ack to the relay while the fabric communication is being completed. //@ts-ignore server.addService(driver_pb_grpc.DriverCommunicationService, { @@ -171,66 +151,43 @@ server.addService(driver_pb_grpc.DriverCommunicationService, { } }, subscribeEvent: (call: { request: eventsPb.EventSubscription }, callback: (_: any, object: ack_pb.Ack) => void) => { - const ack_response = new ack_pb.Ack(); - var newRequestId: string = call.request.getQuery()!.getRequestId() + const newRequestId: string = call.request.getQuery()!.getRequestId() + const subscriptionOp: eventsPb.EventSubOperation = call.request.getOperation(); console.log(`newRequestId: ${newRequestId}`); try { - if (process.env.MOCK === 'false') { - addEventSubscription(call.request).then((requestId) => { - if (newRequestId == requestId) { - // event being subscribed for the first time - ack_response.setMessage('Event subscription is successful!'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - - // the event listener logic follows here + if (process.env.MOCK !== 'true') { + getEventSubscriptionRelayClient().then((client) => { + if (subscriptionOp == eventsPb.EventSubOperation.SUBSCRIBE) { + subscribeEventHelper(call.request, client, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1'); + } else if (subscriptionOp == eventsPb.EventSubOperation.UNSUBSCRIBE) { + unsubscribeEventHelper(call.request, client, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1'); } else { - // event being subscribed already exists - ack_response.setMessage(`Event subscription already exists with requestId: ${requestId}`); - ack_response.setStatus(ack_pb.Ack.STATUS.ERROR); - } - ack_response.setRequestId(newRequestId); - - // gRPC response. - console.log(`Responding to the relay the eventSubscription Ack: ${JSON.stringify(ack_response.toObject())}`); - - if (!process.env.RELAY_ENDPOINT) { - throw new Error('RELAY_ENDPOINT is not set.'); + const errorString: string = `Error: subscribe operation ${subscriptionOp.toString()} not supported`; + console.error(errorString); + const ack_send_error = new ack_pb.Ack(); + ack_send_error.setRequestId(newRequestId); + ack_send_error.setMessage(errorString); + ack_send_error.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + console.log(`Sending to the relay the eventSubscription error Ack: ${JSON.stringify(ack_send_error.toObject())}`); + // Sending the fabric state to the relay. + client.sendDriverSubscriptionStatus(ack_send_error, relayCallback); } - let client; - if (process.env.RELAY_TLS === 'true') { - if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { - throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); - } - const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); - client = new events_grpc_pb.EventSubscribeClient( - process.env.RELAY_ENDPOINT, - credentials.createSsl(rootCert) - ); - } else { - client = new events_grpc_pb.EventSubscribeClient( - process.env.RELAY_ENDPOINT, - credentials.createInsecure() - ); - } - - // Sending the fabric state to the relay. - //client.sendDriverSubscriptionStatus(ack_response, function (err: any, response: any) { - // console.log('Response:', response, 'Error: ', err); - //}); - + }).catch((error) => { + console.error(`failed to get the relay client (as part of async processing) with error: ${JSON.stringify(error)}`); }); - const ack_submitted = new ack_pb.Ack(); - ack_submitted.setMessage('Procesing addEventSubscription'); - ack_submitted.setRequestId(newRequestId); - ack_submitted.setStatus(ack_pb.Ack.STATUS.OK); + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(newRequestId); + ack_response.setMessage('Procesing addEventSubscription'); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); // gRPC response. - console.log(`Responding to caller with Ack: ${JSON.stringify(ack_submitted.toObject())}`); - callback(null, ack_submitted); + console.log(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); + callback(null, ack_response); } else { dbConnectionTest().then((dbConnectTestStatus) => { if (dbConnectTestStatus == true) { - eventSubscriptionTest(call).then((eventSubscribeTestStatus) => { + eventSubscriptionTest(call.request).then((eventSubscribeTestStatus) => { if (eventSubscribeTestStatus == false) { console.error(`Failed eventSubscriptionTest()`); } @@ -242,21 +199,62 @@ server.addService(driver_pb_grpc.DriverCommunicationService, { }); } } catch (e) { - console.log(e); - ack_response.setMessage(newRequestId); - ack_response.setMessage(`Error: ${e}`); - ack_response.setStatus(ack_pb.Ack.STATUS.ERROR); + const errorString: string = `${JSON.stringify(e)}`; + console.log(`error: ${errorString}`); + const ack_error_response = new ack_pb.Ack(); + ack_error_response.setRequestId(newRequestId); + ack_error_response.setMessage(`Error: ${errorString}`); + ack_error_response.setStatus(ack_pb.Ack.STATUS.ERROR); // gRPC response. - console.error(`Responding to caller Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); + console.error(`Responding to caller with Ack: ${JSON.stringify(ack_error_response.toObject())}`); + callback(null, ack_error_response); } }, + requestSignedEventSubscriptionQuery: (call: { request: eventsPb.EventSubscription }, callback: (_: any, object: query_pb.Query) => void) => { + const ack_response = new ack_pb.Ack(); + + signEventSubscriptionQuery(call.request.getQuery()!).then((signedQuery) => { + // gRPC response. + console.log(`Responding to caller with signedQuery: ${JSON.stringify(signedQuery.toObject())}`); + callback(null, signedQuery); + }).catch((error) => { + const errorString: string = `${JSON.stringify(error)}`; + console.log(`error: ${errorString}`); + var emptyQuery: query_pb.Query = new query_pb.Query(); + emptyQuery.setRequestorSignature(errorString); + // gRPC response. + console.error(`Responding to caller with emptyQuery: ${JSON.stringify(emptyQuery.toObject())}`); + callback(null, emptyQuery); + }); + }, + writeExternalState: (call: { request: driverPb.WriteExternalStateMessage }, callback: (_: any, object: ack_pb.Ack) => void) => { + const viewPayload: state_pb.ViewPayload = call.request.getViewPayload(); + const requestId: string = viewPayload.getRequestId(); + + writeExternalStateHelper(call.request, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1').then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage('Successfully written to the ledger'); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + console.log(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); + callback(null, ack_response); + }).catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + console.log(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); + callback(null, ack_err_response); + }); + }, }); // Prepares required crypto material for communication with the fabric network const configSetup = async () => { // uses the network name to create a unique wallet path - const walletPath = path.join(process.cwd(), `wallet-${process.env.NETWORK_NAME}`); + const walletPath = process.env.WALLET_PATH ? process.env.WALLET_PATH : path.join(process.cwd(), `wallet-${process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1'}`); if (process.env.CONNECTION_PROFILE) { walletSetup( walletPath, @@ -292,4 +290,4 @@ if (process.env.DRIVER_TLS === 'true') { server.start(); }); }); -} \ No newline at end of file +} diff --git a/core/drivers/fabric-driver/server/tests.ts b/core/drivers/fabric-driver/server/tests.ts new file mode 100644 index 000000000..2722067a3 --- /dev/null +++ b/core/drivers/fabric-driver/server/tests.ts @@ -0,0 +1,124 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import eventsPb from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import queryPb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; +import { addEventSubscription, deleteEventSubscription, lookupEventSubscriptions } from "./events" +import { LevelDBConnector, DBConnector, DBNotOpenError, DBKeyNotFoundError, DBLockedError } from "./dbConnector" + +// test the LevelDB basic operations +async function dbConnectionTest( +): Promise { + console.log(`Start testing LevelDBConnector()`) + let db: DBConnector; + try { + // Create connection to a database + db = new LevelDBConnector(""); + + const key: string = 'key'; + var value: string = 'insert'; + + // Add the entry to the database + await db.insert(key, value); + + // Fetch the value of the key + value = await db.read(key); + console.log(`obtained : <${key}, ${value}>`); + + // Close the database connection + await db.close(); + + // Try to update the key before opening the database connection + try { + value = 'update'; + await db.update(key, value); + } catch (error: any) { + const errorString: string = `${JSON.stringify(error)}`; + if (error instanceof DBNotOpenError) { + console.log(`test success for DBNotOpenError`); + // open the database connection + await db.open(); + // try to update again the key + await db.update(key, value); + } else { + console.error(`re-throwing the error: ${errorString}`); + db.close(); + throw new Error(error); + } + } + + // Delete the key + await db.delete(key); + + // Try to read key that is already deleted + try { + await db.read(key); + } catch (error: any) { + const errorString: string = `${JSON.stringify(error)}`; + if (error instanceof DBKeyNotFoundError) { + console.log(`test success for DBKeyNotFoundError`); + } else { + console.error(`re-throwing the error: ${errorString}`); + db.close(); + throw new Error(error); + } + } + + // Try to open another connection which should fail + try { + let db2 = new LevelDBConnector(""); + await db2.open(); + } catch (error: any) { + const errorString: string = `${JSON.stringify(error)}`; + if (error instanceof DBLockedError) { + console.log(`test success for DBLockedError`); + } else { + console.error(`re-throwing the error: ${errorString}`); + throw new Error(error); + } + } + + await db.close(); + } catch (error) { + console.error(`Failed testing LevelDBConnector, with error: ${JSON.stringify(error)}`); + db.close(); + return false; + } + + console.log(`End testing LevelDBConnector()`); + return true; +} + +// test the event subscription operations: subscribeEvent, listEvents, deleteEvent +async function eventSubscriptionTest( + eventSub: eventsPb.EventSubscription +): Promise { + console.debug(`Start eventSubscriptionTest()`); + + try { + var eventMatcher: eventsPb.EventMatcher = eventSub.getEventMatcher()!; + await addEventSubscription(eventSub); + var subscriptions: Array = await lookupEventSubscriptions(eventMatcher) as Array; + + for (const subscription of subscriptions) { + if (subscription.getRequestId() == eventSub.getQuery()!.getRequestId()) { + await deleteEventSubscription(eventMatcher, subscription.getRequestId()); + break; + } + } + } catch (error) { + console.error(`Failed testing event subscription operations, with error: ${JSON.stringify(error)}`); + return false; + } + + console.debug(`End eventSubscriptionTest()`); + return true; +} + +export { + dbConnectionTest, + eventSubscriptionTest +} \ No newline at end of file diff --git a/core/drivers/fabric-driver/server/utils.ts b/core/drivers/fabric-driver/server/utils.ts index 773eb55a7..1d7282ac3 100644 --- a/core/drivers/fabric-driver/server/utils.ts +++ b/core/drivers/fabric-driver/server/utils.ts @@ -4,85 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import eventsPb from "@hyperledger-labs/weaver-protos-js/common/events_pb"; -import queryPb from '@hyperledger-labs/weaver-protos-js/common/query_pb'; - -import { LevelDBConnector } from "./dbConnector" - -// Create connection to a database -var db: any = new LevelDBConnector(process.env.DB_NAME!); - -// test the LevelDB basic operations -async function dbConnectionTest( -): Promise { - console.log(`Start testing LevelDBConnector for ${db.DB_NAME}`) - try { - const key: string = 'key'; - var value: string = 'insert'; - - // Add the entry to the database - await db.insert(key, value); - - // Fetch the value of the key - value = await db.read(key); - console.log(`obtained : <${key}, ${value}>`) - - // Close the database connection - await db.close(); - - // Try to update the key before opening the database connection - try { - value = 'update'; - await db.update(key, value); - } catch (error: any) { - const errorString: string = `${JSON.stringify(error)}`; - if (errorString.includes(`is not open`)) { - // open the database connection - await db.open(); - // try to update again the key - await db.update(key, value); - } else { - console.error(`re-throwing the error: ${errorString}`); - throw new Error(error); - } - } - - // Delete the key - await db.delete(key); - } catch (error) { - console.error(`Failed testing LevelDBConnector, with error: ${JSON.stringify(error)}`) - return false; - } - - console.log(`End testing LevelDBConnector for ${db.DB_NAME}`) - return true; -} - -// test the event subscription operations: subscribeEvent, listEvents, deleteEvent -async function eventSubscriptionTest( - call: any -): Promise { - console.debug(`Start eventSubscriptionTest()`) - - try { - var eventMatcher: eventsPb.EventMatcher = call.request.getEventmatcher()!; - await addEventSubscription(call.request); - var subscriptions: Array = await lookupEventSubscriptions(eventMatcher) as Array; - - for (const subscription of subscriptions) { - if (subscription.getRequestId() == call.request.getQuery().getRequestId()) { - await deleteEventSubscription(eventMatcher, subscription.getRequestId()); - break; - } - } - } catch (error) { - console.error(`Failed testing event subscription operations, with error: ${JSON.stringify(error)}`); - return false; - } - - console.debug(`End eventSubscriptionTest()`) - return true; -} +import fs from 'fs'; +import { credentials } from '@grpc/grpc-js'; +import datatransfer_grpc_pb from '@hyperledger-labs/weaver-protos-js/relay/datatransfer_grpc_pb'; +import events_grpc_pb from '@hyperledger-labs/weaver-protos-js/relay/events_grpc_pb'; function checkIfArraysAreEqual(x: Array, y: Array): boolean { if (x == y) { @@ -109,169 +34,70 @@ function checkIfArraysAreEqual(x: Array, y: Array): boolean { return true; } -async function addEventSubscription( - eventSub: eventsPb.EventSubscription -): Promise { - console.log(`adding to driver, subscription of the eventSub: ${JSON.stringify(eventSub.toObject())}`); - - try { - // eventMatcher need to be non-null, hence apply the NaN assertion operator '!' - var eventMatcher: eventsPb.EventMatcher = eventSub.getEventmatcher()!; - // the serialized protobuf for eventMatcher below can be decoded to other formats like 'utf8' [.toString('utf8')] - const key: string = Buffer.from(eventMatcher.serializeBinary()).toString('base64'); - - // query need to be non-null, hence apply the NaN assertion operator '!' - var query: queryPb.Query = eventSub.getQuery()!; - // the serialized protobuf for query below can be decoded to other formats like 'utf8' [.toString('utf8')] - var querySerialized: string = Buffer.from(query.serializeBinary()).toString('base64'); - // serialized content of subscriptions is the value present in the key/value LevelDB corresponding to the key - var subscriptions: Array; - - try { - // fetch the current values in the DB against the given key - var subscriptionsSerialized: string = await db.read(key) as string; - subscriptions = JSON.parse(subscriptionsSerialized); - - console.debug(`subscriptions.length: ${subscriptions.length}`); - // check if the event to be subscribed is already present in the DB - for (const subscriptionSerialized of subscriptions) { - var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); - if (checkIfArraysAreEqual(subscription.getPolicyList(), query.getPolicyList()) && - subscription.getAddress() == query.getAddress() && - subscription.getRequestingRelay() == query.getRequestingRelay() && - subscription.getRequestingNetwork() == query.getRequestingNetwork() && - subscription.getCertificate() == query.getCertificate() && - subscription.getRequestorSignature() == query.getRequestorSignature() && - subscription.getRequestingOrg() == query.getRequestingOrg() && - subscription.getConfidential() == query.getConfidential()) { - - console.log(`found subscription for query with requestId: ${subscription.getRequestId()}`); - return subscription.getRequestId(); - } - } - - // case of key being present in the list - console.debug(`eventMatcher: ${JSON.stringify(eventMatcher.toObject())} is already present in the database`); - subscriptions.push(querySerialized); - } catch (error: any) { - let errorString = `${JSON.stringify(error)}`; - if (errorString.includes('Error: NotFound:')) { - // case of read failing due to key not found - console.debug(`eventMatcher: ${JSON.stringify(eventMatcher.toObject())} is not present before in the database`); - subscriptions = new Array(); - subscriptions.push(querySerialized); - } else { - // case of read failing due to some other issue - console.error(`re-throwing error: ${errorString}`); - throw new Error(error); - } - } - - console.debug(`subscriptions.length: ${subscriptions.length}`); - subscriptionsSerialized = JSON.stringify(subscriptions); - // insert the value against key in the DB (it can be the scenario of a new key addition, or update to the value of an existing key) - await db.insert(key, subscriptionsSerialized); - - // TODO: register the event with fabric sdk - console.log(`end addEventSubscription() .. requestId: ${query.getRequestId()}`); - return query.getRequestId(); - - } catch(error: any) { - console.error(`Error during addEventSubscription(): ${JSON.stringify(error)}`); - throw new Error(error); +// handle callback +function relayCallback(err: any, response: any) { + if (response) { + console.log(`Response: ${JSON.stringify(response.toObject())}`); + } else if (err) { + console.log(`Error: ${JSON.stringify(err)}`); } } -const deleteEventSubscription = async ( - eventMatcher: eventsPb.EventMatcher, - requestId: string -): Promise => { - console.log(`deleting from driver subscription of the eventMatcher: ${JSON.stringify(eventMatcher.toObject())} with requestId: ${requestId}`); - var subscriptions: Array; - var retVal: eventsPb.EventSubscription = new eventsPb.EventSubscription(); - retVal.setEventmatcher(eventMatcher); - try { - const key: string = Buffer.from(eventMatcher.serializeBinary()).toString('base64'); - try { - // fetch the current values in the DB against the given key - var subscriptionsSerialized: string = await db.read(key) as string; - subscriptions = JSON.parse(subscriptionsSerialized); - - console.debug(`subscriptions.length: ${subscriptions.length}`); - for (var subscriptionSerialized of subscriptions) { - var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); - if (subscription.getRequestId() == requestId) { - console.debug(`deleting the subscription (with input requestId): ${JSON.stringify(subscription.toObject())}`); - subscriptions.splice(subscriptions.indexOf(subscriptionSerialized), 1); - retVal.setQuery(subscription); - break; - } - } - } catch (error: any) { - // error could be either due to key not being present in the database or some other issue with database access - console.error(`re-throwing error: ${JSON.stringify(error)}`); - throw new Error(error); - } +// A better way to handle errors for promises +function handlePromise(promise: Promise): Promise<[T?, Error?]> { + const result: Promise<[T?, Error?]> = promise + .then(data => { + const response: [T?, Error?] = [data, undefined] + return response + }) + .catch(error => Promise.resolve([undefined, error])) + return result +} - console.debug(`subscriptions.length: ${subscriptions.length}`); - if (subscriptions.length == 0) { - await db.delete(key); - } else { - subscriptionsSerialized = JSON.stringify(subscriptions); - await db.insert(key, subscriptionsSerialized); +function getRelayClientForQueryResponse() { + let client: datatransfer_grpc_pb.DataTransferClient; + if (process.env.RELAY_TLS === 'true') { + if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { + throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); } - - console.log(`end deleteEventSubscription() .. retVal: ${JSON.stringify(retVal.toObject())}`); - return retVal; - } catch(error: any) { - console.error(`Error during lookup: ${JSON.stringify(error)}`); - throw new Error(error); + const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); + client = new datatransfer_grpc_pb.DataTransferClient( + process.env.RELAY_ENDPOINT, + credentials.createSsl(rootCert) + ); + } else { + client = new datatransfer_grpc_pb.DataTransferClient( + process.env.RELAY_ENDPOINT, + credentials.createInsecure() + ); } + return client; } -async function lookupEventSubscriptions( - eventMatcher: eventsPb.EventMatcher -): Promise> { - console.info(`finding the subscriptions with eventMatcher: ${JSON.stringify(eventMatcher.toObject())}`); - var subscriptions: Array; - var returnSubscriptions: Array = new Array(); - - try { - var eventMatcher: eventsPb.EventMatcher = eventMatcher; - const key: string = Buffer.from(eventMatcher.serializeBinary()).toString('base64'); - - // fetch the current values in the DB against the given key - var subscriptionsSerialized: string = await db.read(key) as string; - subscriptions = JSON.parse(subscriptionsSerialized) - for (const subscriptionSerialized of subscriptions) { - var subscription: queryPb.Query = queryPb.Query.deserializeBinary(Buffer.from(subscriptionSerialized, 'base64')); - console.debug(`subscription: ${JSON.stringify(subscription.toObject())}`) - returnSubscriptions.push(subscription); - } - - console.debug(`returnSubscriptions.length: ${returnSubscriptions.length}`); - console.log(`end lookupEventSubscriptions()`); - return returnSubscriptions; - - } catch (error: any) { - let errorString: string = `${JSON.stringify(error)}` - if (errorString.includes('Error: NotFound:')) { - // case of read failing due to key not found - returnSubscriptions = new Array(); - console.debug(`returnSubscriptions.length: ${returnSubscriptions.length}`); - return returnSubscriptions; - } else { - // case of read failing due to some other issue - console.error(`Error during lookup: ${JSON.stringify(error)}`); - throw new Error(error); +function getRelayClientForEventPublish() { + let client: events_grpc_pb.EventPublishClient; + if (process.env.RELAY_TLS === 'true') { + if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { + throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); } + const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); + client = new events_grpc_pb.EventPublishClient( + process.env.RELAY_ENDPOINT, + credentials.createSsl(rootCert) + ); + } else { + client = new events_grpc_pb.EventPublishClient( + process.env.RELAY_ENDPOINT, + credentials.createInsecure() + ); } + return client; } export { - addEventSubscription, - deleteEventSubscription, - lookupEventSubscriptions, - dbConnectionTest, - eventSubscriptionTest -} \ No newline at end of file + checkIfArraysAreEqual, + handlePromise, + relayCallback, + getRelayClientForQueryResponse, + getRelayClientForEventPublish +} diff --git a/core/drivers/fabric-driver/server/walletSetup.ts b/core/drivers/fabric-driver/server/walletSetup.ts index adacb959a..9fb7f9cc8 100644 --- a/core/drivers/fabric-driver/server/walletSetup.ts +++ b/core/drivers/fabric-driver/server/walletSetup.ts @@ -4,8 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Wallets, X509Identity } from 'fabric-network'; +import { Wallets } from 'fabric-network'; import FabricCAServices from 'fabric-ca-client'; +import { handlePromise } from './utils'; +import { InteroperableHelper } from '@hyperledger-labs/weaver-fabric-interop-sdk' import * as path from 'path'; import * as fs from 'fs'; @@ -35,10 +37,10 @@ const walletSetup = async (walletPath: string, conn_profile_path: string, networ const config = getConfig(); // Create a new CA client for interacting with the CA. const org = ccp.client["organization"]; - console.log('Org ', org); + console.log('Org', org); const caName = ccp.organizations[org]["certificateAuthorities"][0]; - console.log('CA Name ', caName); - const caURL = ccp.certificateAuthorities[config.caUrl ? config.caUrl : caName].url; + console.log('CA Name', caName); + const caURL = config.caUrl ? config.caUrl : ccp.certificateAuthorities[caName].url; console.log('CA URL', caURL); const ca = new FabricCAServices(caURL); const ident = ca.newIdentityService(); @@ -108,4 +110,21 @@ const walletSetup = async (walletPath: string, conn_profile_path: string, networ throw new Error('Admin was not registered'); } }; -export { walletSetup, getConfig }; + +const getDriverKeyCert = async (): Promise => { + + const walletPath = process.env.WALLET_PATH ? process.env.WALLET_PATH : path.join(process.cwd(), `wallet-${process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1'}`); + const config = getConfig(); + const wallet = await Wallets.newFileSystemWallet(walletPath); + console.log(`Wallet path: ${walletPath}`); + + const [keyCert, keyCertError] = await handlePromise( + InteroperableHelper.getKeyAndCertForRemoteRequestbyUserName(wallet, config.relay.name) + ) + if (keyCertError) { + throw new Error(`Error getting key and cert ${keyCertError}`) + } + return keyCert; +} + +export { walletSetup, getConfig, getDriverKeyCert }; diff --git a/core/drivers/fabric-driver/temp.pem b/core/drivers/fabric-driver/temp.pem deleted file mode 100644 index 71278df8f..000000000 --- a/core/drivers/fabric-driver/temp.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICrTCCAlSgAwIBAgIUHCW/0mWLashHHoswLqUhi+QpDG8wCgYIKoZIzj0EAwIw -cjELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH -EwZEdXJoYW0xGjAYBgNVBAoTEW9yZzEubmV0d29yazEuY29tMR0wGwYDVQQDExRj -YS5vcmcxLm5ldHdvcmsxLmNvbTAeFw0yMDA3MjkwNDM2MDBaFw0yMTA3MjkwNDQx -MDBaMF0xCzAJBgNVBAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEUMBIG -A1UEChMLSHlwZXJsZWRnZXIxDzANBgNVBAsTBmNsaWVudDEOMAwGA1UEAxMFdXNl -cjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuh/rVCf8ODuw0IhnrM2iif2a7 -sGT8BIV1PEDU3SnqClmh+RV/3JyKl/TythzN/ZVnKE/tv5d3gVWbNstc97+So4Hc -MIHZMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQx/hLY -CNG4ezCqvgTKC/WwuSVnmDAfBgNVHSMEGDAWgBTWD60+eCHbDyD33PWbCxVuQqMA -qTAfBgNVHREEGDAWghRvYzUxMDM3NDczODAuaWJtLmNvbTBYBggqAwQFBgcIAQRM -eyJhdHRycyI6eyJoZi5BZmZpbGlhdGlvbiI6IiIsImhmLkVucm9sbG1lbnRJRCI6 -InVzZXIxIiwiaGYuVHlwZSI6ImNsaWVudCJ9fTAKBggqhkjOPQQDAgNHADBEAiAF -nsL6UuxTmJK9nhdMMP5lV7xnyYl1WyDizEQsfwuOZwIgXcwnHOaUDWYjfXtFSI5y -zZ9mr6PEkR4DtTHIRFaMV18= ------END CERTIFICATE----- \ No newline at end of file diff --git a/core/drivers/fabric-driver/tsconfig.json b/core/drivers/fabric-driver/tsconfig.json index ed6e4533c..37e3f701e 100644 --- a/core/drivers/fabric-driver/tsconfig.json +++ b/core/drivers/fabric-driver/tsconfig.json @@ -25,7 +25,7 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ + // "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ diff --git a/core/drivers/fabric-driver/wallet-network1/admin.id b/core/drivers/fabric-driver/wallet-network1/admin.id index 2c855f307..e5b4ba884 100644 --- a/core/drivers/fabric-driver/wallet-network1/admin.id +++ b/core/drivers/fabric-driver/wallet-network1/admin.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB6jCCAZGgAwIBAgIUHxlIrtjJD5bVRoClhhsPiYUF2ckwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDkwMFoXDTIyMDczMDA1NTQwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABN4PSXdYzB+NQ3W0zlhPDGIiBUZ/BvPx9sn8C08u8q7y0HuYyfbLqfQP\nqpitQT55vto8gILg6BEXYEshDcXrjMCjYDBeMA4GA1UdDwEB/wQEAwIHgDAMBgNV\nHRMBAf8EAjAAMB0GA1UdDgQWBBQFGbBZ2bD8FLQfye8wKFoWL88iejAfBgNVHSME\nGDAWgBRyhvWC+jgvOsuRSF6arXu2zl0g/DAKBggqhkjOPQQDAgNHADBEAiBOUsm9\nIi/CZ7AJaTMTNc+UMwi7UhGp4MQcDYAOcm/PWQIgUUwYAhp0i5CDCJrDsYXGnxqh\nT58Uxd1Vr6dCxym+wN4=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgb+llbCAwEAv3rtot\r\n/BmEPJVD0E+C/njeut9+Yz7dUimhRANCAATeD0l3WMwfjUN1tM5YTwxiIgVGfwbz\r\n8fbJ/AtPLvKu8tB7mMn2y6n0D6qYrUE+eb7aPICC4OgRF2BLIQ3F64zA\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB6jCCAZGgAwIBAgIUGR1th6phPuxVYid5izC/cAd/YHYwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjcwMFoXDTMyMDgwNDA2MzIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNLu/ESWWs8vOXBseLjpk52L7eS8fRJ1xHbY8pHRyKfaMFxkVo9nKSOe\nIxfkzZ+ga49ltyo5CEVrpo+9/VvMdeyjYDBeMA4GA1UdDwEB/wQEAwIHgDAMBgNV\nHRMBAf8EAjAAMB0GA1UdDgQWBBRf+RvqFtLHN/dP7tPVtTSA3TQDijAfBgNVHSME\nGDAWgBTOxwzHoYh5fG/dkEjDeENRQeyVPzAKBggqhkjOPQQDAgNHADBEAiAnbRjJ\nfonA7DLk7JDfN4EtAwObH4ed3LXb9+mj1pUrggIgTvXNJFo4+5K6v4J4sgb98Ns1\nyXff+jf0DYoXfg3dwyg=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgvVKn/bCUoTc998sj\r\n9SQqy+EkkM8jSr/JUkF1/IHkeIehRANCAATS7vxEllrPLzlwbHi46ZOdi+3kvH0S\r\ndcR22PKR0cin2jBcZFaPZykjniMX5M2foGuPZbcqOQhFa6aPvf1bzHXs\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/core/drivers/fabric-driver/wallet-network1/relay.id b/core/drivers/fabric-driver/wallet-network1/relay.id index dd2c77e24..d4ec38260 100644 --- a/core/drivers/fabric-driver/wallet-network1/relay.id +++ b/core/drivers/fabric-driver/wallet-network1/relay.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIChzCCAi2gAwIBAgIUWKNRifU+CDCSgJFDPuF8BBzf8KMwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDkwMFoXDTIyMDczMDA1NTQwMFowQjEwMA0G\nA1UECxMGY2xpZW50MAsGA1UECxMEb3JnMTASBgNVBAsTC2RlcGFydG1lbnQxMQ4w\nDAYDVQQDEwVyZWxheTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCozF3M1L2iI\nIR7RaYaPNvVcftGltoKegO9MBPdMhxByiBqSiqInwr5eUO83qNwUaXvwMVmS8v/4\nbg/0febq8eyjgdowgdcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFKfkp8twqOO0jw+v9H7e/yFZaNhCMB8GA1UdIwQYMBaAFHKG9YL6OC86\ny5FIXpqte7bOXSD8MHcGCCoDBAUGBwgBBGt7ImF0dHJzIjp7ImhmLkFmZmlsaWF0\naW9uIjoib3JnMS5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJRCI6InJlbGF5\nIiwiaGYuVHlwZSI6ImNsaWVudCIsInJlbGF5IjoidHJ1ZSJ9fTAKBggqhkjOPQQD\nAgNIADBFAiEA2ph3/nFY9qy2hr+0V2AGt9jEhDx/d6lYV+OrNOZcz4ACIAPeoFLG\nxbx3IAAD6OllR0BMXjLr3ptCsq1ZSUGlhK0p\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgyIRERhw6D+tCF1b0\r\n/WZCMHZONI7lxUAbiOwulotp/12hRANCAAQqMxdzNS9oiCEe0WmGjzb1XH7RpbaC\r\nnoDvTAT3TIcQcogakoqiJ8K+XlDvN6jcFGl78DFZkvL/+G4P9H3m6vHs\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIChzCCAi2gAwIBAgIUEb3YJ1WxG38rYB98nInUjKwjqH0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjcwMFoXDTMyMDgwNDA2MzIwMFowQjEwMA0G\nA1UECxMGY2xpZW50MAsGA1UECxMEb3JnMTASBgNVBAsTC2RlcGFydG1lbnQxMQ4w\nDAYDVQQDEwVyZWxheTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAqMFWah1Esy\n3NOd6Z5voukbtKiE7tCmzParS6ttNG3mzCf73cZpReSbKldXdttZWe+/k5ZJiPwU\n6+bOrn7I7LujgdowgdcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFH8m6m2tQSaHFsGliBbhfe01ACehMB8GA1UdIwQYMBaAFM7HDMehiHl8\nb92QSMN4Q1FB7JU/MHcGCCoDBAUGBwgBBGt7ImF0dHJzIjp7ImhmLkFmZmlsaWF0\naW9uIjoib3JnMS5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJRCI6InJlbGF5\nIiwiaGYuVHlwZSI6ImNsaWVudCIsInJlbGF5IjoidHJ1ZSJ9fTAKBggqhkjOPQQD\nAgNIADBFAiEA+2U+oxFetp7yRz79u+nVQtltcDqpNDk0RwpI5UhxEvoCICRpw9pV\nI9H3lkEJCsIO7R3qEBCbK2+cAlSn3/6tJSlU\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdFQhvrT/5VxwN3gt\r\nokqSCkVARLc4PBJRRsFD8xKZbtyhRANCAAQKjBVmodRLMtzTnemeb6LpG7SohO7Q\r\npsz2q0urbTRt5swn+93GaUXkmypXV3bbWVnvv5OWSYj8FOvmzq5+yOy7\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/core/drivers/fabric-driver/wallet-network2/admin.id b/core/drivers/fabric-driver/wallet-network2/admin.id index 1ae55c288..ecac419f8 100644 --- a/core/drivers/fabric-driver/wallet-network2/admin.id +++ b/core/drivers/fabric-driver/wallet-network2/admin.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB6jCCAZGgAwIBAgIUcl74d4kQXUuE0PaBDSNOGhp1HrIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDkwMFoXDTIyMDczMDA1NTQwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABJqfyV6xeUd4yeoeUuNboMPKRTCBTxaVLeqdMTK4sL7JCDzVecgq5udA\n6ueaDUT/DxHOjHiA4/Yq/Cxv+A5BL3ijYDBeMA4GA1UdDwEB/wQEAwIHgDAMBgNV\nHRMBAf8EAjAAMB0GA1UdDgQWBBRoxyJ6nA70Z2zlkFI398/cZIpGqjAfBgNVHSME\nGDAWgBS5xG0DXfVWPnA5kg786sSNHCiZ8TAKBggqhkjOPQQDAgNHADBEAiA+0Nd5\nZcw3DW6tgblWI1B9La9lXXKFxGJA3fc6nvOVowIgXQGS/PRgkKxMO+O3aqCNpKKM\nMSO4IrSs9fmeEjvIS+s=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFP8ZIMZ33nWmBO+Y\r\nJqubeP3ysmWtrCsF8AlDeafQd1ehRANCAASan8lesXlHeMnqHlLjW6DDykUwgU8W\r\nlS3qnTEyuLC+yQg81XnIKubnQOrnmg1E/w8Rzox4gOP2Kvwsb/gOQS94\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB6zCCAZGgAwIBAgIUIUnz6BX3PnvH2NSkRwhdDk9A09gwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjcwMFoXDTMyMDgwNDA2MzIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABDhughEJgo7liburjUMmJCcgCzzy46Fp+NSEAWnt0kiz7+IqGBDaWAtv\n9vkxSBGVvSwmW4svbZ5374+DeglJRE+jYDBeMA4GA1UdDwEB/wQEAwIHgDAMBgNV\nHRMBAf8EAjAAMB0GA1UdDgQWBBQIZQ7gFqXffKBpceoM9MDa4aozFzAfBgNVHSME\nGDAWgBThONcBHwYB3/nH40M2shP0PKZtmzAKBggqhkjOPQQDAgNIADBFAiEAn3vD\nS2slTCrwbbXoIxHKScy3+X+wfTwEIRsWJ8pvK0kCIEoxPaep7QSb9ATTbZT1ZenN\nIXImeItGxE3tdw2eq0j2\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgA1dbdty5wlVhvaHz\r\nk3tMqxiaobJ4WtTVHlAQCfCMSGKhRANCAAQ4boIRCYKO5Ym7q41DJiQnIAs88uOh\r\nafjUhAFp7dJIs+/iKhgQ2lgLb/b5MUgRlb0sJluLL22ed++Pg3oJSURP\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/core/drivers/fabric-driver/wallet-network2/relay.id b/core/drivers/fabric-driver/wallet-network2/relay.id index ae51e9f45..b14a5fbfb 100644 --- a/core/drivers/fabric-driver/wallet-network2/relay.id +++ b/core/drivers/fabric-driver/wallet-network2/relay.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIChjCCAi2gAwIBAgIULxdG78xMwWqGDVvfxN5bfhcI9nEwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDkwMFoXDTIyMDczMDA1NTQwMFowQjEwMA0G\nA1UECxMGY2xpZW50MAsGA1UECxMEb3JnMTASBgNVBAsTC2RlcGFydG1lbnQxMQ4w\nDAYDVQQDEwVyZWxheTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCM8ed3/O+6r\n+irE7f3LJwhmNEM/WSiuo0RahLKiqOUPAnZwrs9RTyg8Usj8WU+vZSMGtVHGFD+Y\ncZIljuSkeySjgdowgdcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFElmORX12RRa5jzLrHmar+uMXYyiMB8GA1UdIwQYMBaAFLnEbQNd9VY+\ncDmSDvzqxI0cKJnxMHcGCCoDBAUGBwgBBGt7ImF0dHJzIjp7ImhmLkFmZmlsaWF0\naW9uIjoib3JnMS5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJRCI6InJlbGF5\nIiwiaGYuVHlwZSI6ImNsaWVudCIsInJlbGF5IjoidHJ1ZSJ9fTAKBggqhkjOPQQD\nAgNHADBEAiAFrzIP8+i2b8IHOV/istJPKl/7ApDO3fJ31uGE57D9aAIgdGaUrPFS\njpaEwj5+c2VfXHTlTTUlZIGT9C6vTvquFTk=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgqbTBgiFPy+vUYOx+\r\nuIlucpEKPFuNECBauv8V3I56nWehRANCAAQjPHnd/zvuq/oqxO39yycIZjRDP1ko\r\nrqNEWoSyoqjlDwJ2cK7PUU8oPFLI/FlPr2UjBrVRxhQ/mHGSJY7kpHsk\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIChzCCAi2gAwIBAgIUcFecSeiNvsORvf1CCzeOArYngFEwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjcwMFoXDTMyMDgwNDA2MzIwMFowQjEwMA0G\nA1UECxMGY2xpZW50MAsGA1UECxMEb3JnMTASBgNVBAsTC2RlcGFydG1lbnQxMQ4w\nDAYDVQQDEwVyZWxheTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDAs7e4rYWM8\n5mhGGbWGVK8VruU5iJsHLN5Y0i05oFnXHdqJip5xh5j+pER73/5BXiuh1A8IbZ8x\nJJkQlyuDq4GjgdowgdcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFMedxIDZUSmoP6BmnYzZK8GvgdrbMB8GA1UdIwQYMBaAFOE41wEfBgHf\n+cfjQzayE/Q8pm2bMHcGCCoDBAUGBwgBBGt7ImF0dHJzIjp7ImhmLkFmZmlsaWF0\naW9uIjoib3JnMS5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJRCI6InJlbGF5\nIiwiaGYuVHlwZSI6ImNsaWVudCIsInJlbGF5IjoidHJ1ZSJ9fTAKBggqhkjOPQQD\nAgNIADBFAiEAydPSud2FJEj1SMkhGWytrj+54KQbTakZnnTvDRq3TfQCIFG52z1R\n0xDEj7GtDbtuYduaeb2NwEM3bv2dBI12nsAq\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgT2sdHg76GIlJg7tl\r\nH7eaUDHcPjxJI9yUF9+hucRo6dahRANCAAQwLO3uK2FjPOZoRhm1hlSvFa7lOYib\r\nByzeWNItOaBZ1x3aiYqecYeY/qREe9/+QV4rodQPCG2fMSSZEJcrg6uB\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/core/identity-management/iin-agent/package-local.json b/core/identity-management/iin-agent/package-local.json index f4946df75..c24d1cdba 100644 --- a/core/identity-management/iin-agent/package-local.json +++ b/core/identity-management/iin-agent/package-local.json @@ -1,6 +1,6 @@ { "name": "iin-agent", - "version": "1.3.0", + "version": "1.5.0", "description": "", "main": "index.js", "scripts": { diff --git a/core/identity-management/iin-agent/package.json b/core/identity-management/iin-agent/package.json index ae832cd19..392e005f5 100644 --- a/core/identity-management/iin-agent/package.json +++ b/core/identity-management/iin-agent/package.json @@ -1,6 +1,6 @@ { "name": "iin-agent", - "version": "1.3.0", + "version": "1.5.0", "description": "", "main": "index.js", "scripts": { @@ -19,7 +19,7 @@ "author": "", "license": "ISC", "dependencies": { - "@hyperledger-labs/weaver-protos-js": "^1.3.0", + "@hyperledger-labs/weaver-protos-js": "^1.5.0", "@fidm/x509": "^1.2.1", "@grpc/grpc-js": "^1.1.1", "@typescript-eslint/eslint-plugin": "^3.5.0", diff --git a/core/identity-management/iin-agent/src/common/ledgerBase.ts b/core/identity-management/iin-agent/src/common/ledgerBase.ts index 348f3d9d5..27b83a286 100644 --- a/core/identity-management/iin-agent/src/common/ledgerBase.ts +++ b/core/identity-management/iin-agent/src/common/ledgerBase.ts @@ -1,12 +1,16 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + export class LedgerBase { ledgerId: string; // Unique ID of a ledger in which the Weaver interoperation module is installed contractId: string; // Unique ID of the contract corresponding to the Weaver interoperation module installed in 'ledgerId' - private _isConnected: boolean // Flag indicating whether we are ready to invoke contracts on the ledger constructor(ledgerId: string, contractId: string) { this.ledgerId = ledgerId; this.contractId = contractId; - this._isConnected = false; } getLedgerID(): string { @@ -17,17 +21,13 @@ export class LedgerBase { return this.contractId; } - isConnected(): boolean { - return this._isConnected; - } - // Setup a user (with wallet and one or more identities) with contract invocation credentials async setupWalletIdentity() { } - // Preliminary configuration as a prerequisite for contract invocation - async setupLedgerConnection() { - this._isConnected = true; + // Collect security domain membership info + async getSecurityDomainMembership(securityDomain: string): Promise { + return {}; } // Invoke a contract to drive a transaction @@ -36,6 +36,7 @@ export class LedgerBase { } // Query a contract to fetch information from the ledger - async queryContract() { + async queryContract(): Promise { + return ""; } } diff --git a/core/identity-management/iin-agent/src/fabric-ledger/config.json b/core/identity-management/iin-agent/src/fabric-ledger/config.json new file mode 100644 index 000000000..f243fb64b --- /dev/null +++ b/core/identity-management/iin-agent/src/fabric-ledger/config.json @@ -0,0 +1,15 @@ +{ + "admin":{ + "name":"admin", + "secret":"adminpw" + }, + "agent": { + "name":"iin-agent", + "affiliation":"org1.department1", + "role": "client", + "attrs": [{ "name": "iin-agent", "value": "true", "ecert": true }] + }, + "mspId":"Org1MSP", + "ordererMspIds": ["OrdererMSP"], + "caUrl":"" +} diff --git a/core/identity-management/iin-agent/src/fabric-ledger/connector.ts b/core/identity-management/iin-agent/src/fabric-ledger/connector.ts new file mode 100644 index 000000000..1edd10089 --- /dev/null +++ b/core/identity-management/iin-agent/src/fabric-ledger/connector.ts @@ -0,0 +1,58 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Contract } from 'fabric-network'; +import { LedgerBase } from '../common/ledgerBase'; +import { walletSetup } from './walletUtils'; +import { getAllMSPConfigurations, invokeFabricChaincode, queryFabricChaincode } from './networkUtils'; +import * as path from 'path'; +import * as fs from 'fs'; + +export class FabricConnector extends LedgerBase { + connectionProfilePath: string; + configFilePath: string; + networkId: string; + orgMspId: string; + walletPath: string; + + constructor(ledgerId: string, contractId: string, networkId: string, connectionProfilePath: string, configFilePath: string, walletPath: string) { + super(ledgerId, contractId); + this.connectionProfilePath = connectionProfilePath ? connectionProfilePath : path.resolve(__dirname, './', 'connection_profile.json'); + this.configFilePath = configFilePath ? configFilePath : path.resolve(__dirname, './', 'config.json'); + this.networkId = networkId ? networkId : 'network1'; + if (!fs.existsSync(configFilePath)) { + throw new Error('Config does not exist at path: ' + configFilePath); + } + this.orgMspId = JSON.parse(fs.readFileSync(configFilePath, 'utf8').toString()).mspId; + this.walletPath = walletPath ? walletPath : path.join(process.cwd(), `wallet-${this.networkId}-${this.orgMspId}`); + } + + // Setup a user (with wallet and one or more identities) with contract invocation credentials + async setupWalletIdentity() { + walletSetup(this.walletPath, this.connectionProfilePath, this.configFilePath); + } + + // Collect security domain membership info + async getSecurityDomainMembership(securityDomain: string): Promise { + const memberships = getAllMSPConfigurations(this.walletPath, this.connectionProfilePath, this.configFilePath, this.ledgerId); + const securityDomainInfo = { + securityDomain: securityDomain, + members: memberships, + } + return securityDomainInfo; + } + + // Invoke a contract to drive a transaction + // TODO: Add parameters corresponding to the output of a flow among IIN agents + async invokeContract(): Promise { + return await invokeFabricChaincode(this.walletPath, this.connectionProfilePath, this.configFilePath, this.ledgerId, this.contractId, "", []); + } + + // Query a contract to fetch information from the ledger + async queryContract(): Promise { + return await queryFabricChaincode(this.walletPath, this.connectionProfilePath, this.configFilePath, this.ledgerId, this.contractId, "", []); + } +} diff --git a/core/identity-management/iin-agent/src/fabric-ledger/networkUtils.ts b/core/identity-management/iin-agent/src/fabric-ledger/networkUtils.ts new file mode 100644 index 000000000..fc1a6640a --- /dev/null +++ b/core/identity-management/iin-agent/src/fabric-ledger/networkUtils.ts @@ -0,0 +1,212 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Gateway } from 'fabric-network'; +import { Channel } from 'fabric-common'; +import * as path from 'path'; +import * as fs from 'fs'; +import { getWallet } from './walletUtils'; +import * as utils from "../common/utils"; + +// Get a handle to a network gateway using existing wallet credentials +const getNetworkGateway = async ( + walletPath: string, + connectionProfilePath: string, + configFilePath: string +): Promise => { + try { + // load the network configuration + if (!fs.existsSync(connectionProfilePath)) { + throw new Error('Connection profile does not exist at path: ' + connectionProfilePath); + } + const ccp = JSON.parse(fs.readFileSync(connectionProfilePath, 'utf8').toString()); + if (!fs.existsSync(configFilePath)) { + throw new Error('Config does not exist at path: ' + configFilePath); + } + const config = JSON.parse(fs.readFileSync(configFilePath, 'utf8').toString()); + + // Create a new file system-based wallet for managing identities. + const userName = config.agent.name; + const wallet = await getWallet(walletPath); + console.log(`Wallet path: ${walletPath}`); + // Check to see if we've already enrolled the user. + const identity = await wallet.get(userName); + if (!identity) { + console.log(`An identity for the user "${userName}.com" does not exist in the wallet`); + console.log('Run the registerUser.ts application before retrying'); + } + // Create a new gateway for connecting to our peer node. + const gateway = new Gateway(); + await gateway.connect(ccp, { + wallet, + identity: `${userName}`, + discovery: { enabled: true, asLocalhost: process.env.local === 'false' ? false : true }, + }); + return gateway; + } catch (error) { + console.error(`Failed to instantiate network (channel): ${error}`); + throw error; + } +} + +// Get a handle to a network gateway using existing wallet credentials +const getNetworkContract = async ( + walletPath: string, + connectionProfilePath: string, + configFilePath: string, + channelId: string, + chaincodeId: string, +): Promise => { + try { + const gateway = await getNetworkGateway(walletPath, connectionProfilePath, configFilePath); + if (!gateway) { + throw new Error('Unable to connect to the ledger!'); + } + const network = await gateway.getNetwork(channelId); + const contract = network.getContract(chaincodeId); + return { gateway: gateway, contract: contract }; + } catch (error) { + console.error(`Failed to connect to contract: ${error}`); + throw error; + } +} + +function getMembershipUnit(channel: Channel, mspId: string) { + const mspConfig = channel.getMsp(mspId); + let certs = []; + if (Array.isArray(mspConfig.rootCerts)) { + for (let i = 0; i < mspConfig.rootCerts.length; i++) { + certs.push(mspConfig.rootCerts[i]); + } + } else if (mspConfig.rootCerts.length !== 0) { + certs.push(mspConfig.rootCerts); + } + if (Array.isArray(mspConfig.intermediateCerts)) { + for (let i = 0; i < mspConfig.intermediateCerts.length; i++) { + certs.push(mspConfig.intermediateCerts[i]); + } + } else if (mspConfig.intermediateCerts.length !== 0) { + certs.push(mspConfig.intermediateCerts); + } + let membershipUnit: {[key:string]: object} = {}; + membershipUnit[mspId] = { + type: "certificate", + value: "", + chain: certs, + }; + return membershipUnit; +} + +async function getMSPConfiguration( + walletPath: string, + connectionProfilePath: string, + configFilePath: string, + channelId: string, +): Promise { + console.log('Running invocation on Fabric channel and chaincode'); + try { + const gateway = await getNetworkGateway(walletPath, connectionProfilePath, configFilePath); + if (!gateway) { + throw new Error('Unable to connect to the ledger!'); + } + const network = await gateway.getNetwork(channelId); + const config = JSON.parse(fs.readFileSync(configFilePath, 'utf8').toString()); + const membership = getMembershipUnit(network.getChannel(), config.mspId); + // Disconnect from the gateway. + gateway.disconnect(); + return membership; + } catch (error) { + console.error(`Failed to submit transaction: ${error}`); + throw error; + } +} + +async function getAllMSPConfigurations( + walletPath: string, + connectionProfilePath: string, + configFilePath: string, + channelId: string, +): Promise { + console.log('Running invocation on Fabric channel and chaincode'); + try { + const gateway = await getNetworkGateway(walletPath, connectionProfilePath, configFilePath); + if (!gateway) { + throw new Error('Unable to connect to the ledger!'); + } + const network = await gateway.getNetwork(channelId); + const config = JSON.parse(fs.readFileSync(configFilePath, 'utf8').toString()); + const mspIds = network.getChannel().getMspids(); + let memberships: {[key:string]: object} = {}; + for (let i = 0 ; i < mspIds.length ; i++) { + if (!config.ordererMspIds.includes(mspIds[i])) { + const membership = getMembershipUnit(network.getChannel(), config.mspId); + memberships[mspIds[i]] = membership[mspIds[i]]; + } + } + // Disconnect from the gateway. + gateway.disconnect(); + return memberships; + } catch (error) { + console.error(`Failed to submit transaction: ${error}`); + throw error; + } +} + +async function invokeFabricChaincode( + walletPath: string, + connectionProfilePath: string, + configFilePath: string, + channelId: string, + chaincodeId: string, + functionName: string, + args: Array, +): Promise { + console.log('Running invocation on Fabric channel and chaincode'); + try { + const gatewayAndContract = await getNetworkContract(walletPath, connectionProfilePath, configFilePath, channelId, chaincodeId); + const [result, submitError] = await utils.handlePromise( + gatewayAndContract.contract.submitTransaction(functionName, ...args), + ); + if (submitError) { + throw new Error(`submitTransaction Error: ${submitError}`); + } + // Disconnect from the gateway. + gatewayAndContract.gateway.disconnect(); + return result; + } catch (error) { + console.error(`Failed to submit transaction: ${error}`); + throw error; + } +} + +async function queryFabricChaincode( + walletPath: string, + connectionProfilePath: string, + configFilePath: string, + channelId: string, + chaincodeId: string, + functionName: string, + args: Array, +): Promise { + console.log('Running query on Fabric channel and chaincode'); + try { + const gatewayAndContract = await getNetworkContract(walletPath, connectionProfilePath, configFilePath, channelId, chaincodeId); + const [result, evalError] = await utils.handlePromise( + gatewayAndContract.contract.evaluateTransaction(functionName, ...args), + ); + if (evalError) { + throw new Error(`evaluateTransaction Error: ${evalError}`); + } + // Disconnect from the gateway. + gatewayAndContract.gateway.disconnect(); + return result; + } catch (error) { + console.error(`Failed to submit query: ${error}`); + throw error; + } +} + +export { getNetworkGateway, getNetworkContract, getMSPConfiguration, getAllMSPConfigurations, invokeFabricChaincode, queryFabricChaincode }; diff --git a/core/identity-management/iin-agent/src/fabric-ledger/walletUtils.ts b/core/identity-management/iin-agent/src/fabric-ledger/walletUtils.ts new file mode 100644 index 000000000..46bc05932 --- /dev/null +++ b/core/identity-management/iin-agent/src/fabric-ledger/walletUtils.ts @@ -0,0 +1,101 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Wallets } from 'fabric-network'; +import FabricCAServices from 'fabric-ca-client'; +import * as path from 'path'; +import * as fs from 'fs'; + +const getWallet = async (walletPath: string) => { + return await Wallets.newFileSystemWallet(walletPath); +}; + +const walletSetup = async (walletPath: string, conn_profile_path: string, config_file_path: string): Promise => { + if (!fs.existsSync(conn_profile_path)) { + throw new Error('Connection profile does not exist at path: ' + conn_profile_path); + } + const ccp = JSON.parse(fs.readFileSync(conn_profile_path, 'utf8').toString()); + if (!fs.existsSync(config_file_path)) { + throw new Error('Config does not exist at path: ' + config_file_path); + } + const config = JSON.parse(fs.readFileSync(config_file_path, 'utf8').toString()); + // Create a new CA client for interacting with the CA. + const org = ccp.client["organization"]; + console.log('Org', org); + const caName = ccp.organizations[org]["certificateAuthorities"][0]; + console.log('CA Name', caName); + const caURL = config.caUrl ? config.caUrl : ccp.certificateAuthorities[caName].url; + console.log('CA URL', caURL); + const ca = new FabricCAServices(caURL); + const ident = ca.newIdentityService(); + + const wallet = await getWallet(walletPath); + const adminName = config.admin.name; + const adminSecret = config.admin.secret; + // build a user object for authenticating with the CA // Check to see if we've already enrolled the admin user. + let adminIdentity = await wallet.get(adminName); + + if (adminIdentity) { + console.log('An identity for the admin user "admin" already exists in the wallet'); + } else { + // Enroll the admin user, and import the new identity into the wallet. + console.log('Enrolling Admin...', adminName, adminSecret); + const enrollment = await ca.enroll({ + enrollmentID: adminName, + enrollmentSecret: adminSecret, + }); + const x509Identity = { + credentials: { + certificate: enrollment.certificate, + privateKey: enrollment.key.toBytes(), + }, + mspId: config.mspId, + type: 'X.509', + }; + await wallet.put(adminName, x509Identity); + adminIdentity = await wallet.get(adminName); + } + if (adminIdentity) { + console.log(`Creating ${config.agent.name} Identity`); + const provider = wallet.getProviderRegistry().getProvider(adminIdentity.type); + const adminUser = await provider.getUserContext(adminIdentity, adminName); + const identity = await wallet.get(config.agent.name); + if (!identity) { + const secret = await ca.register( + { + affiliation: config.agent.affiliation, + enrollmentID: config.agent.name, + role: config.agent.role, + attrs: config.agent.attrs, + }, + adminUser, + ); + const enrollment = await ca.enroll({ + enrollmentID: config.agent.name, + enrollmentSecret: secret, + }); + const x509Identity = { + credentials: { + certificate: enrollment.certificate, + privateKey: enrollment.key.toBytes(), + }, + mspId: config.mspId, + type: 'X.509', + }; + await wallet.put(config.agent.name, x509Identity); + console.log(`${config.agent.name} Identity Created`); + } else { + console.log(`${config.agent.name} Identity Already exists`); + } + + return wallet; + } else { + console.error('Admin was not registered'); + throw new Error('Admin was not registered'); + } +}; + +export { getWallet, walletSetup }; diff --git a/core/identity-management/iin-agent/src/protocols/externalOperations.ts b/core/identity-management/iin-agent/src/protocols/externalOperations.ts index c5ae8a44d..f078da8d4 100644 --- a/core/identity-management/iin-agent/src/protocols/externalOperations.ts +++ b/core/identity-management/iin-agent/src/protocols/externalOperations.ts @@ -9,16 +9,22 @@ import { handlePromise} from '../common/utils'; // Handles communication with foreign IIN agents -export const syncExternalStateFromIINAgent = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('syncExternalStateFromIINAgent:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); +export const syncExternalStateFromIINAgent = async (securityDomainUnit: iin_agent_pb.SecurityDomainMemberIdentity) => { + console.log('syncExternalStateFromIINAgent:', securityDomainUnit.getSecurityDomain(), '-', securityDomainUnit.getMemberId()); }; -// Generates network unit's state/configuration -export const requestIdentityConfiguration = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('requestIdentityConfiguration:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); +// Generates security domain unit's state/configuration +export const requestIdentityConfiguration = async (request: iin_agent_pb.SecurityDomainMemberIdentityRequest) => { + console.log('requestIdentityConfiguration:', request.getSourceNetwork()!.getSecurityDomain(), '-', request.getSourceNetwork()!.getMemberId()); }; -// Processes foreign network unit's state/configuration received from a foreign IIN agent -export const sendIdentityConfiguration = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('sendIdentityConfiguration:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); +// Processes foreign security domain unit's state/configuration received from a foreign IIN agent +export const sendIdentityConfiguration = async (attestedMembership: iin_agent_pb.AttestedMembership) => { + const attestation = attestedMembership.getAttestation(); + if (attestation) { + const securityDomainUnit = attestation.getUnitIdentity(); + if (securityDomainUnit) { + console.log('sendIdentityConfiguration:', securityDomainUnit.getSecurityDomain(), '-', securityDomainUnit.getMemberId()); + } + } }; diff --git a/core/identity-management/iin-agent/src/protocols/localOperations.ts b/core/identity-management/iin-agent/src/protocols/localOperations.ts index 1b6dcbfd7..3111f0ba0 100644 --- a/core/identity-management/iin-agent/src/protocols/localOperations.ts +++ b/core/identity-management/iin-agent/src/protocols/localOperations.ts @@ -8,17 +8,12 @@ import iin_agent_pb from '@hyperledger-labs/weaver-protos-js/identity/agent_pb'; import { handlePromise} from '../common/utils'; -// Runs flows through local IIN agents -export const flowAndRecordAttestationsOnLedger = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('flowAndRecordAttestationsOnLedger:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); +// Generates attestations on a foreign security domain unit's state +export const requestAttestation = async (counterAttestedMembership: iin_agent_pb.CounterAttestedMembership) => { + console.log('requestAttestation:'); }; -// Generates attestations on a foreign network unit's state -export const requestAttestation = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('requestAttestation:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); -}; - -// Processes attestations on a foreign network unit's state received from a local IIN agent -export const sendAttestation = async (networkUnit: iin_agent_pb.NetworkUnitIdentity) => { - console.log('sendAttestation:', networkUnit.getNetworkId(), '-', networkUnit.getParticipantId()); +// Processes attestations on a foreign security domain unit's state received from a local IIN agent +export const sendAttestation = async (counterAttestedMembership: iin_agent_pb.CounterAttestedMembership) => { + console.log('sendAttestation:'); }; diff --git a/core/identity-management/iin-agent/src/server.ts b/core/identity-management/iin-agent/src/server.ts index 644818508..57b184209 100644 --- a/core/identity-management/iin-agent/src/server.ts +++ b/core/identity-management/iin-agent/src/server.ts @@ -13,7 +13,7 @@ import 'dotenv/config'; import { Certificate } from '@fidm/x509'; import * as path from 'path'; import { syncExternalStateFromIINAgent, requestIdentityConfiguration, sendIdentityConfiguration } from './protocols/externalOperations'; -import { flowAndRecordAttestationsOnLedger, requestAttestation, sendAttestation } from './protocols/localOperations'; +import { requestAttestation, sendAttestation } from './protocols/localOperations'; const iinAgentServer = new Server(); @@ -21,8 +21,8 @@ console.log('iin agent def', JSON.stringify(iin_agent_pb_grpc)); //@ts-ignore iinAgentServer.addService(iin_agent_pb_grpc.IINAgentService, { - // Service for syncing foreign network unit's state from its IIN agent. Will communicate with the user/agent triggering this process and respond with an ack to the caller while the sync is occurring. - syncExternalState: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { + // Service for syncing foreign security domain unit's state from its IIN agent. Will communicate with the user/agent triggering this process and respond with an ack to the caller while the sync is occurring. + syncExternalState: (call: { request: iin_agent_pb.SecurityDomainMemberIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { const ack_response = new ack_pb.Ack(); try { syncExternalStateFromIINAgent(call.request); @@ -42,8 +42,8 @@ iinAgentServer.addService(iin_agent_pb_grpc.IINAgentService, { callback(null, ack_response); } }, - // Service for receiving requests for one's network unit's state from foreign IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being generated. - requestIdentityConfiguration: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { + // Service for receiving requests for one's security domain unit's state from foreign IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being generated. + requestIdentityConfiguration: (call: { request: iin_agent_pb.SecurityDomainMemberIdentityRequest }, callback: (_: any, object: ack_pb.Ack) => void) => { const ack_response = new ack_pb.Ack(); try { requestIdentityConfiguration(call.request); @@ -63,8 +63,8 @@ iinAgentServer.addService(iin_agent_pb_grpc.IINAgentService, { callback(null, ack_response); } }, - // Service for receiving network unit states from foreign IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being processed. - sendIdentityConfiguration: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { + // Service for receiving security domain unit states from foreign IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being processed. + sendIdentityConfiguration: (call: { request: iin_agent_pb.AttestedMembership }, callback: (_: any, object: ack_pb.Ack) => void) => { const ack_response = new ack_pb.Ack(); try { sendIdentityConfiguration(call.request); @@ -84,29 +84,8 @@ iinAgentServer.addService(iin_agent_pb_grpc.IINAgentService, { callback(null, ack_response); } }, - // Service for starting a flow among local IIN agents to collect attestations on a foreign network unit's state. Will communicate with the user/agent triggering this process and respond with an ack to the caller while the flow is occurring. - flowAndRecordAttestations: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { - const ack_response = new ack_pb.Ack(); - try { - flowAndRecordAttestationsOnLedger(call.request); - ack_response.setMessage(''); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - ack_response.setRequestId(''); - // gRPC response. - console.log('Responding to caller'); - callback(null, ack_response); - } catch (e) { - console.log(e); - ack_response.setMessage(`Error: ${e}`); - ack_response.setStatus(ack_pb.Ack.STATUS.ERROR); - ack_response.setRequestId(''); - // gRPC response. - console.log('Responding to caller'); - callback(null, ack_response); - } - }, - // Service for receiving requests for attestations on foreign network unit states from local IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being generated. - requestAttestation: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { + // Service for receiving requests for attestations on foreign security domain unit states from local IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being generated. + requestAttestation: (call: { request: iin_agent_pb.CounterAttestedMembership }, callback: (_: any, object: ack_pb.Ack) => void) => { const ack_response = new ack_pb.Ack(); try { requestAttestation(call.request); @@ -126,8 +105,8 @@ iinAgentServer.addService(iin_agent_pb_grpc.IINAgentService, { callback(null, ack_response); } }, - // Service for receiving attestations on foreign network unit states from local IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being processed. - sendAttestation: (call: { request: iin_agent_pb.NetworkUnitIdentity }, callback: (_: any, object: ack_pb.Ack) => void) => { + // Service for receiving attestations on foreign security domain unit states from local IIN agents. Will communicate with the IIN agent caller and respond with an ack while the attestation is being processed. + sendAttestation: (call: { request: iin_agent_pb.CounterAttestedMembership }, callback: (_: any, object: ack_pb.Ack) => void) => { const ack_response = new ack_pb.Ack(); try { sendAttestation(call.request); diff --git a/core/network/besu/contracts/interop/manageAssetAny.sol b/core/network/besu/contracts/interop/manageAssetAny.sol new file mode 100644 index 000000000..162561959 --- /dev/null +++ b/core/network/besu/contracts/interop/manageAssetAny.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.8; + +import "./transferInterface.sol"; +import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; + +/** + * Hashed Timelock Contract on Assets in an Ethereum network (Support only for ERC20, ERC721 and ERC1155 tokens) + **/ + +contract AssetExchangeContract is ERC1155Holder { + mapping(bytes32 => LockContract) public lockContracts; + + struct LockContract { + address sender; + address receiver; + address assetContract; + uint256 amount; + bytes32 hashLock; + uint256 expirationTime; + uint8 status; + uint256 tokenId; + bytes data; + } + + struct transferInfo { + address sender; + address receiver; + uint256 amount; + } + + uint8 constant UNUSED = 0; + uint8 constant LOCKED = 1; + + event Lock( + address indexed sender, + address indexed receiver, + address assetContract, + uint256 amount, + bytes32 hashLock, + uint256 expirationTime, + bytes32 lockContractId + ); + + event Claim( + address indexed sender, + address indexed receiver, + bytes32 indexed lockContractId, + bytes32 hashLock, + bytes32 preimage + ); + + event Unlock( + address indexed sender, + address indexed receiver, + bytes32 indexed lockContractId + ); + + // The sender locks a asset with a hash lock and an expiry time + function lockAsset( + address receiver, + address assetContract, + uint256 amount, + bytes32 hashLock, + uint256 expirationTime, + uint256 tokenId, + bytes memory data + ) external returns (bytes32 lockContractId) { + address sender = msg.sender; + + // Checking the validity of the input parameters + require(amount > 0, "Amount should be greater than zero"); + transferStruct.Info memory transInfo = transferStruct.Info({ + sender: sender, + receiver: address(this), + amount: amount, + tokenId: tokenId, + data: data + }); + require( + transferInterface(assetContract).allowanceInterop(transInfo) == + true, + "Allowance of assets from the sender for the lock contract must be greater than the amount to be locked" + ); + require( + expirationTime > block.timestamp, + "Expiration time should be in the future" + ); + + // The identity of the lock contract is a hash of all the relevant parameters that will uniquely identify the contract + lockContractId = sha256( + abi.encodePacked( + sender, + receiver, + assetContract, + amount, + hashLock, + expirationTime + ) + ); + + require( + lockContracts[lockContractId].status == UNUSED, + "An active lock contract already exists with the same parameters" + ); + + // Locking amount by transfering them to the lockContract + + bool transferStatus = transferInterface(assetContract).transferInterop( + transInfo + ); + // bool transferStatus = ERC20(assetContract).transferFrom(sender, address(this), amount); + require( + transferStatus == true, + "ERC20 transferFrom failed from the sender to the lockContract" + ); + + lockContracts[lockContractId] = LockContract( + sender, + receiver, + assetContract, + amount, + hashLock, + expirationTime, + LOCKED, + tokenId, + data + ); + + emit Lock( + sender, + receiver, + assetContract, + amount, + hashLock, + expirationTime, + lockContractId + ); + } + + // The receiver claims the ownership of an asset locked for them once they obtain the preimage of the hashlock + function claimAsset(bytes32 lockContractId, bytes32 preimage) + external + returns (bool) + { + LockContract storage c = lockContracts[lockContractId]; + + // Check the validity of the claim + require(c.status == LOCKED, "lockContract is not active"); + require(block.timestamp < c.expirationTime, "lockContract has expired"); + require( + c.hashLock == sha256(abi.encodePacked(preimage)), + "Invalid preimage, its hash does not equal the hashLock" + ); + transferStruct.Info memory transInfo = transferStruct.Info({ + sender: address(this), + receiver: c.receiver, + amount: c.amount, + tokenId: c.tokenId, + data: c.data + }); + + c.assetContract.call( + abi.encodeWithSignature( + "approve(address,uint256)", + c.assetContract, + c.amount + ) + ); + c.assetContract.call( + abi.encodeWithSignature( + "setApprovalForAll(address,bool)", + c.assetContract, + true + ) + ); + + bool transferStatus = transferInterface(c.assetContract) + .transferInterop(transInfo); + require( + transferStatus == true, + "ERC20 transfer failed from the lockContract to the receiver" + ); + + emit Claim(c.sender, c.receiver, lockContractId, c.hashLock, preimage); + + return true; + } + + // Unlocking and reclaiming a locked asset for the sender after the expiration time. Can be called by anyone, not just the sender. + function unlockAsset(bytes32 lockContractId) external returns (bool) { + LockContract storage c = lockContracts[lockContractId]; + + // Validation checks + require( + c.status == LOCKED, + "There is no active lockContract with the specified ID" + ); + require(c.sender != address(0), "Sender address is invalid"); + require( + block.timestamp >= c.expirationTime, + "Lock contract has expired" + ); + transferStruct.Info memory transInfo = transferStruct.Info({ + sender: address(this), + receiver: c.sender, + amount: c.amount, + tokenId: c.tokenId, + data: c.data + }); + c.assetContract.call( + abi.encodeWithSignature( + "approve(address,uint256)", + c.assetContract, + c.amount + ) + ); + c.assetContract.call( + abi.encodeWithSignature( + "setApprovalForAll(address,bool)", + c.assetContract, + true + ) + ); + bool transferStatus = transferInterface(c.assetContract) + .transferInterop(transInfo); + require( + transferStatus == true, + "ERC20 transfer failed from the lockContract back to the sender" + ); + + emit Unlock(c.sender, c.receiver, lockContractId); + + return true; + } + + // Function to check if there is an active contract with the input lockContractId. + function isAssetLocked(bytes32 lockContractId) + external + view + returns (bool) + { + LockContract storage c = lockContracts[lockContractId]; + + bool lockContractStatus; + if (c.status == LOCKED) { + lockContractStatus = true; + } else { + lockContractStatus = false; + } + + return lockContractStatus; + } +} diff --git a/core/network/besu/interface/asset-exchange/transferInterface.sol b/core/network/besu/interface/asset-exchange/transferInterface.sol new file mode 100644 index 000000000..1f96fc7fe --- /dev/null +++ b/core/network/besu/interface/asset-exchange/transferInterface.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.8; + +/** + * Transfer Interface for asset exchange on Assets in an Ethereum network + **/ + +library transferStruct { + struct Info { + address sender; + address receiver; + uint256 amount; + uint256 tokenId; + bytes data; + } +} + +abstract contract transferInterface { + function transferInterop(transferStruct.Info memory info) + external + virtual + returns (bool success); + + function allowanceInterop(transferStruct.Info memory info) + external + virtual + returns (bool success); +} diff --git a/core/network/corda-interop-app/constants.properties b/core/network/corda-interop-app/constants.properties index 5f777f595..d01dafec3 100644 --- a/core/network/corda-interop-app/constants.properties +++ b/core/network/corda-interop-app/constants.properties @@ -1,7 +1,7 @@ cordaReleaseGroup=net.corda cordaCoreReleaseGroup=net.corda -cordaVersion=4.8.4 -cordaCoreVersion=4.8.4 +cordaVersion=4.8 +cordaCoreVersion=4.8 gradlePluginsVersion=5.0.12 kotlinVersion=1.3.72 junitVersion=4.12 @@ -11,4 +11,4 @@ slf4jVersion=1.7.25 nettyVersion=4.1.22.Final arrowVersion=0.10.4 -weaverVersion=1.3.1 +weaverVersion=1.4.2 diff --git a/core/network/corda-interop-app/interop-workflows/build.gradle b/core/network/corda-interop-app/interop-workflows/build.gradle index 01e8f91b4..fa6011c3a 100644 --- a/core/network/corda-interop-app/interop-workflows/build.gradle +++ b/core/network/corda-interop-app/interop-workflows/build.gradle @@ -63,6 +63,7 @@ configurations { dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + implementation 'com.google.code.gson:gson:2.9.1' testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" testCompile "junit:junit:$junit_version" diff --git a/core/network/corda-interop-app/interop-workflows/src/test/kotlin/com/weaver/corda/app/interop/WriteExternalStateTest.kt b/core/network/corda-interop-app/interop-workflows/src/test/kotlin/com/weaver/corda/app/interop/WriteExternalStateTest.kt index a099ce494..be15dc15e 100644 --- a/core/network/corda-interop-app/interop-workflows/src/test/kotlin/com/weaver/corda/app/interop/WriteExternalStateTest.kt +++ b/core/network/corda-interop-app/interop-workflows/src/test/kotlin/com/weaver/corda/app/interop/WriteExternalStateTest.kt @@ -18,6 +18,8 @@ import org.junit.BeforeClass import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import com.google.gson.Gson +import com.google.gson.annotations.SerializedName class WriteExternalStateTest { companion object { @@ -46,10 +48,16 @@ class WriteExternalStateTest { val fabricNetwork = "network1" val fabricRelayEndpoint = "relay-network1:9080" val fabricViewAddress = "mychannel:simplestate:Read:a" - - val b64FabricView = "CjIIAxIYMjAyMS0wOC0wOVQxMToxOToxNC41OTJaGgxOb3Rhcml6YXRpb24iBlNUUklORxKBDApKCMgBGkUKCEFyY3R1cnVzEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEaigMKIFDt2MRSUeTYAeOVPLZH7N+xPQ+ayZ2KwTWB2AlSLsXsEuUCCogCEmYKCl9saWZlY3ljbGUSWAooCiJuYW1lc3BhY2VzL2ZpZWxkcy9pbnRlcm9wL1NlcXVlbmNlEgIIBgosCiZuYW1lc3BhY2VzL2ZpZWxkcy9zaW1wbGVzdGF0ZS9TZXF1ZW5jZRICCAMSagoHaW50ZXJvcBJfCiMKHQBhY2Nlc3NDb250cm9sAENvcmRhX05ldHdvcmsAEgIICwogChoAbWVtYmVyc2hpcABDb3JkYV9OZXR3b3JrABICCA0KFgoQAPSPv79pbml0aWFsaXplZBICCAcSMgoLc2ltcGxlc3RhdGUSIwoWChAA9I+/v2luaXRpYWxpemVkEgIIBAoJCgFhEgQICRABGkoIyAEaRQoIQXJjdHVydXMSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YSIMEgdpbnRlcm9wGgExIqUICtkHCgdPcmcxTVNQEs0HLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvakNDQWttZ0F3SUJBZ0lVTWN4Y1FNWENUcThpVmlCZFUrRFNidTVjM2Rzd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl4TURjek1EQTFORGN3TUZvWERUSXlNRGN6TURBMU5USXdNRm93V3pFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRU5NQXNHQTFVRUN4TUVjR1ZsY2pFT01Bd0dBMVVFQXhNRmNHVmxjakF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUWk1uU1hRbyswcWhxTW5yYmxROTRsaExsdW9BeUxsMUQ1K2JPTkRmRXYKUU9IVU9HKy9XL0pqOUV1M1UwTCtNZTRzd1c1M3ZGYmJHNGtWLzZYQzFZMlFvNEhkTUlIYU1BNEdBMVVkRHdFQgovd1FFQXdJSGdEQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJSZXp2K3cyM1F3aWFYcGVYSUhBVGovCmJRSjByakFmQmdOVkhTTUVHREFXZ0JSeWh2V0Mramd2T3N1UlNGNmFyWHUyemwwZy9EQWlCZ05WSFJFRUd6QVoKZ2hkd1pXVnlNQzV2Y21jeExtNWxkSGR2Y21zeExtTnZiVEJXQmdncUF3UUZCZ2NJQVFSS2V5SmhkSFJ5Y3lJNgpleUpvWmk1QlptWnBiR2xoZEdsdmJpSTZJaUlzSW1obUxrVnVjbTlzYkcxbGJuUkpSQ0k2SW5CbFpYSXdJaXdpCmFHWXVWSGx3WlNJNkluQmxaWElpZlgwd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ09yVmZvbmJCOHh2RU8zYjcKbk1OOHdMK3VhNVV2RmVoSnlHS0RISFN0YURZQ0lHNURWdE42Wm03Q0J0dG1xQlJ6dWt5UzBpZ2p6cE9NMXNxTwpTZS94QS94eAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChJHMEUCIQCwTtxvaQhZmLWuBXJFtI0RUaBOxBB5O2ItCjekFUyMUwIgTrOPxQ/PSKDsj+mJTLfEcrK5+f80sqQoQFJr+qBLy2k=" - - val fabricCert = "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" + + data class TestData( + @SerializedName("view64") val B64View: String, + @SerializedName("confidential_view64") val B64ViewConfidential: String, + @SerializedName("confidential_view_content64") val B64ViewContents: String + ) + val fabricTestDataJSON = javaClass.getResource("/test_data/fabric_viewdata.json").readText(Charsets.UTF_8) + val fabricTestData = Gson().fromJson(fabricTestDataJSON, TestData::class.java) + + val fabricCert = javaClass.getResource("/test_data/fabric_cacert.pem").readText(Charsets.UTF_8) val fabricVerificationPolicy = VerificationPolicyState( securityDomain = fabricNetwork, @@ -67,8 +75,9 @@ class WriteExternalStateTest { chain = listOf("") )) ) - - val cordaB64View = "CjQIBBIcVHVlIE5vdiAxNyAwMDoxMzo0NiBHTVQgMjAyMBoMTm90YXJpemF0aW9uIgRKU09OEtYHCoQGClhhMjZHVW9WYythenlIMENUYjN2K2pTdmp3Y255M0hFd3AyMlJrdDkvZC9GcXN4WVVvYXhVWTdUOWNKRk9TVTZiVW42UFIwNmFVckxxdjZLbzZ1NG5CUT09Ep8FLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ3akNDQVYrZ0F3SUJBZ0lJVUprUXZtS20zNVl3RkFZSUtvWkl6ajBFQXdJR0NDcUdTTTQ5QXdFSE1DOHgKQ3pBSkJnTlZCQVlUQWtkQ01ROHdEUVlEVlFRSERBWk1iMjVrYjI0eER6QU5CZ05WQkFvTUJsQmhjblI1UVRBZQpGdzB5TURBM01qUXdNREF3TURCYUZ3MHlOekExTWpBd01EQXdNREJhTUM4eEN6QUpCZ05WQkFZVEFrZENNUTh3CkRRWURWUVFIREFaTWIyNWtiMjR4RHpBTkJnTlZCQW9NQmxCaGNuUjVRVEFxTUFVR0F5dGxjQU1oQU1NS2FSRUsKaGNUZ1NCTU16Szgxb1BVU1BvVm1HL2ZKTUxYcS91alNtc2U5bzRHSk1JR0dNQjBHQTFVZERnUVdCQlJNWHREcwpLRlp6VUxkUTNjMkRDVUV4M1QxQ1VEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUNoREFUCkJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFqQWZCZ05WSFNNRUdEQVdnQlI0aHdMdUxnZklaTUVXekc0bjNBeHcKZmdQYmV6QVJCZ29yQmdFRUFZT0tZZ0VCQkFNQ0FRWXdGQVlJS29aSXpqMEVBd0lHQ0NxR1NNNDlBd0VIQTBjQQpNRVFDSUM3SjQ2U3hERHozTGpETnJFUGpqd1AycHJnTUVNaDdyL2dKcG91UUhCaytBaUErS3pYRDBkNW1pSTg2CkQybVlLNEMzdFJsaTNYM1ZnbkNlOENPcWZZeXVRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0aBlBhcnR5QRLMAQpsW1NpbXBsZVN0YXRlKGtleT1ILCB2YWx1ZT0xLCBvd25lcj1PPVBhcnR5QSwgTD1Mb25kb24sIEM9R0IsIGxpbmVhcklkPTIzMTRkNmI3LTFlY2EtNDg5Mi04OGY4LTc2ZDg1YjhhODVjZCldElxsb2NhbGhvc3Q6OTA4MC9Db3JkYV9OZXR3b3JrL2xvY2FsaG9zdDoxMDAwNiNjb20uY29yZGFTaW1wbGVBcHBsaWNhdGlvbi5mbG93LkdldFN0YXRlQnlLZXk6SA==" + + val cordaTestDataJSON = javaClass.getResource("/test_data/corda_viewdata.json").readText(Charsets.UTF_8) + val cordaTestData = Gson().fromJson(cordaTestDataJSON, TestData::class.java) val cordaVerificationPolicy = VerificationPolicyState( securityDomain = "Corda_Network", @@ -77,12 +86,17 @@ class WriteExternalStateTest { Policy("signature", listOf("PartyA")) )) ) - + + val rootCACert = javaClass.getResource("/test_data/corda_cacert_root.pem").readText(Charsets.UTF_8) + val doormanCACert = javaClass.getResource("/test_data/corda_cacert_doorman.pem").readText(Charsets.UTF_8) + val nodeCACert = javaClass.getResource("/test_data/corda_cacert_node.pem").readText(Charsets.UTF_8) val certChain = listOf( - "-----BEGIN CERTIFICATE-----\nMIICCTCCAbCgAwIBAgIIcFe0qctqSucwCgYIKoZIzj0EAwIwWDEbMBkGA1UEAwwS\nQ29yZGEgTm9kZSBSb290IENBMQswCQYDVQQKDAJSMzEOMAwGA1UECwwFY29yZGEx\nDzANBgNVBAcMBkxvbmRvbjELMAkGA1UEBhMCVUswHhcNMTcwNTIyMDAwMDAwWhcN\nMjcwNTIwMDAwMDAwWjBYMRswGQYDVQQDDBJDb3JkYSBOb2RlIFJvb3QgQ0ExCzAJ\nBgNVBAoMAlIzMQ4wDAYDVQQLDAVjb3JkYTEPMA0GA1UEBwwGTG9uZG9uMQswCQYD\nVQQGEwJVSzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGlm6LFHrVkzfuUHin36\nJrm1aUMarX/NUZXw8n8gSiJmsZPlUEplJ+f/lzZMky5EZPTtCciG34pnOP0eiMd/\nJTCjZDBiMB0GA1UdDgQWBBR8rqnfuUgBKxOJC5rmRYUcORcHczALBgNVHQ8EBAMC\nAYYwIwYDVR0lBBwwGgYIKwYBBQUHAwEGCCsGAQUFBwMCBgRVHSUAMA8GA1UdEwEB\n/wQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgDaL4SguKsNeTT7SeUkFdoCBACeG8\nGqO4M1KlfimphQwCICiq00hDanT5W8bTLqE7GIGuplf/O8AABlpWrUg6uiUB\n-----END CERTIFICATE-----", - "-----BEGIN CERTIFICATE-----\nMIICXjCCAfugAwIBAgIIHVb6wd3RHhIwFAYIKoZIzj0EAwIGCCqGSM49AwEHMFgx\nGzAZBgNVBAMMEkNvcmRhIE5vZGUgUm9vdCBDQTELMAkGA1UECgwCUjMxDjAMBgNV\nBAsMBWNvcmRhMQ8wDQYDVQQHDAZMb25kb24xCzAJBgNVBAYTAlVLMB4XDTE4MDcx\nMDAwMDAwMFoXDTI3MDUyMDAwMDAwMFowYzELMAkGA1UEBhMCVVMxETAPBgNVBAcT\nCE5ldyBZb3JrMQ4wDAYDVQQLEwVDb3JkYTEWMBQGA1UEChMNUjMgSG9sZENvIExM\nQzEZMBcGA1UEAxMQQ29yZGEgRG9vcm1hbiBDQTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABAPL3qAm4WZms5ciBVoxMQXfK7uTmHRVvWfWQ+QVYP3bMHSguHZRzB3v\n7EOE8RZpGDan+w007Xj7XR0+xG9SxmCjgZkwgZYwHQYDVR0OBBYEFOvuLjAVKUCu\nGZge2G/jfX8HosITMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgGGMCMGA1Ud\nJQQcMBoGCCsGAQUFBwMBBggrBgEFBQcDAgYEVR0lADAfBgNVHSMEGDAWgBR8rqnf\nuUgBKxOJC5rmRYUcORcHczARBgorBgEEAYOKYgEBBAMCAQEwFAYIKoZIzj0EAwIG\nCCqGSM49AwEHA0cAMEQCIBmzQXpnCo9eAxkhwMt0bBr1Q0APJXF0KuBRsFBWAa6S\nAiBgx6G8G9Ij7B8+y65ItLKVcs7Kh6Rdnr5/1zB/yPwfrg==\n-----END CERTIFICATE-----", - "-----BEGIN CERTIFICATE-----\nMIICbTCCAgmgAwIBAgIIYRljUiZaGSkwFAYIKoZIzj0EAwIGCCqGSM49AwEHMGMx\nCzAJBgNVBAYTAlVTMREwDwYDVQQHEwhOZXcgWW9yazEOMAwGA1UECxMFQ29yZGEx\nFjAUBgNVBAoTDVIzIEhvbGRDbyBMTEMxGTAXBgNVBAMTEENvcmRhIERvb3JtYW4g\nQ0EwHhcNMjAwNzI0MDAwMDAwWhcNMjcwNTIwMDAwMDAwWjAvMQswCQYDVQQGEwJH\nQjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUEwWTATBgcqhkjOPQIB\nBggqhkjOPQMBBwNCAASFze6k3tINqGLsKTi0a50RpOUCysno1/1lwIfEqaboauuj\no6Ecfu8X1WnW92VrEZGKslIJzR8R0deOEJvBs0rzo4HQMIHNMB0GA1UdDgQWBBR4\nhwLuLgfIZMEWzG4n3AxwfgPbezAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB\nhjATBgNVHSUEDDAKBggrBgEFBQcDAjAfBgNVHSMEGDAWgBTr7i4wFSlArhmYHthv\n431/B6LCEzARBgorBgEEAYOKYgEBBAMCAQQwRQYDVR0eAQH/BDswOaA1MDOkMTAv\nMQswCQYDVQQGEwJHQjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUGh\nADAUBggqhkjOPQQDAgYIKoZIzj0DAQcDSAAwRQIhANXBVAebUsY9AMfjZedNYN14\nWy76Ru5vMSta3Av1d08lAiAi2GZWk5XwJoEYuhQHXsHQLZbXphAVk+Q5tVgMgywj\ntQ==\n-----END CERTIFICATE-----") + rootCACert, + doormanCACert, + nodeCACert) + /* val cordaCert = javaClass.getResource("/test_data/corda_cacert.pem").readText(Charsets.UTF_8) */ + val cordaMembership = MembershipState( securityDomain = "Corda_Network", members = mapOf("PartyA" to Member( @@ -96,6 +110,7 @@ class WriteExternalStateTest { fun `WriteExternalState tests`() { // Corda happy case // Create corda membership and verificationPolicy in vault + println(fabricCert) val future = partyA.startFlow(CreateVerificationPolicyState(cordaVerificationPolicy)) network.runNetwork() val linearId = future.getOrThrow() @@ -106,7 +121,7 @@ class WriteExternalStateTest { val linearId2 = future2.getOrThrow() assert(linearId2.isRight()) { "CreateMembershipState should return a Right(UniqueIdentifier)" } - val happyFuture = partyA.startFlow(WriteExternalStateInitiator(cordaB64View, "localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H")) + val happyFuture = partyA.startFlow(WriteExternalStateInitiator(cordaTestData.B64View, "localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H")) network.runNetwork() val happyLinearId = happyFuture.getOrThrow() assertTrue(happyLinearId.isRight()) @@ -123,7 +138,7 @@ class WriteExternalStateTest { val linearId4 = future4.getOrThrow() assert(linearId4.isRight()) { "CreateMembershipState should return a Right(UniqueIdentifier)" } - val happyFuture2 = partyA.startFlow(WriteExternalStateInitiator(b64FabricView, "${fabricRelayEndpoint}/${fabricNetwork}/${fabricViewAddress}")) + val happyFuture2 = partyA.startFlow(WriteExternalStateInitiator(fabricTestData.B64View, "${fabricRelayEndpoint}/${fabricNetwork}/${fabricViewAddress}")) network.runNetwork() val happyLinearId2 = happyFuture2.getOrThrow() assertTrue(happyLinearId2.isRight()) @@ -139,7 +154,7 @@ class WriteExternalStateTest { val linearId5 = future5.getOrThrow() assert(linearId5.isRight()) { "UpdateMembershipState should return a Right(UniqueIdentifier)" } - val unhappyFuture = partyA.startFlow(WriteExternalStateInitiator(cordaB64View, "localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H")) + val unhappyFuture = partyA.startFlow(WriteExternalStateInitiator(cordaTestData.B64View, "localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H")) network.runNetwork() val unhappyLinearId = unhappyFuture.getOrThrow() assertTrue(unhappyLinearId.isLeft()) @@ -150,4 +165,4 @@ class WriteExternalStateTest { } -} \ No newline at end of file +} diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_doorman.pem b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_doorman.pem new file mode 100644 index 000000000..4ca4d78eb --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_doorman.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICXjCCAfugAwIBAgIIHVb6wd3RHhIwFAYIKoZIzj0EAwIGCCqGSM49AwEHMFgx +GzAZBgNVBAMMEkNvcmRhIE5vZGUgUm9vdCBDQTELMAkGA1UECgwCUjMxDjAMBgNV +BAsMBWNvcmRhMQ8wDQYDVQQHDAZMb25kb24xCzAJBgNVBAYTAlVLMB4XDTE4MDcx +MDAwMDAwMFoXDTI3MDUyMDAwMDAwMFowYzELMAkGA1UEBhMCVVMxETAPBgNVBAcT +CE5ldyBZb3JrMQ4wDAYDVQQLEwVDb3JkYTEWMBQGA1UEChMNUjMgSG9sZENvIExM +QzEZMBcGA1UEAxMQQ29yZGEgRG9vcm1hbiBDQTBZMBMGByqGSM49AgEGCCqGSM49 +AwEHA0IABAPL3qAm4WZms5ciBVoxMQXfK7uTmHRVvWfWQ+QVYP3bMHSguHZRzB3v +7EOE8RZpGDan+w007Xj7XR0+xG9SxmCjgZkwgZYwHQYDVR0OBBYEFOvuLjAVKUCu +GZge2G/jfX8HosITMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgGGMCMGA1Ud +JQQcMBoGCCsGAQUFBwMBBggrBgEFBQcDAgYEVR0lADAfBgNVHSMEGDAWgBR8rqnf +uUgBKxOJC5rmRYUcORcHczARBgorBgEEAYOKYgEBBAMCAQEwFAYIKoZIzj0EAwIG +CCqGSM49AwEHA0cAMEQCIBmzQXpnCo9eAxkhwMt0bBr1Q0APJXF0KuBRsFBWAa6S +AiBgx6G8G9Ij7B8+y65ItLKVcs7Kh6Rdnr5/1zB/yPwfrg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_node.pem b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_node.pem new file mode 100644 index 000000000..6dfb29cb0 --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_node.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICbTCCAgmgAwIBAgIIYRljUiZaGSkwFAYIKoZIzj0EAwIGCCqGSM49AwEHMGMx +CzAJBgNVBAYTAlVTMREwDwYDVQQHEwhOZXcgWW9yazEOMAwGA1UECxMFQ29yZGEx +FjAUBgNVBAoTDVIzIEhvbGRDbyBMTEMxGTAXBgNVBAMTEENvcmRhIERvb3JtYW4g +Q0EwHhcNMjAwNzI0MDAwMDAwWhcNMjcwNTIwMDAwMDAwWjAvMQswCQYDVQQGEwJH +QjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUEwWTATBgcqhkjOPQIB +BggqhkjOPQMBBwNCAASFze6k3tINqGLsKTi0a50RpOUCysno1/1lwIfEqaboauuj +o6Ecfu8X1WnW92VrEZGKslIJzR8R0deOEJvBs0rzo4HQMIHNMB0GA1UdDgQWBBR4 +hwLuLgfIZMEWzG4n3AxwfgPbezAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB +hjATBgNVHSUEDDAKBggrBgEFBQcDAjAfBgNVHSMEGDAWgBTr7i4wFSlArhmYHthv +431/B6LCEzARBgorBgEEAYOKYgEBBAMCAQQwRQYDVR0eAQH/BDswOaA1MDOkMTAv +MQswCQYDVQQGEwJHQjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUGh +ADAUBggqhkjOPQQDAgYIKoZIzj0DAQcDSAAwRQIhANXBVAebUsY9AMfjZedNYN14 +Wy76Ru5vMSta3Av1d08lAiAi2GZWk5XwJoEYuhQHXsHQLZbXphAVk+Q5tVgMgywj +tQ== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_root.pem b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_root.pem new file mode 100644 index 000000000..3409b3d56 --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_cacert_root.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICCTCCAbCgAwIBAgIIcFe0qctqSucwCgYIKoZIzj0EAwIwWDEbMBkGA1UEAwwS +Q29yZGEgTm9kZSBSb290IENBMQswCQYDVQQKDAJSMzEOMAwGA1UECwwFY29yZGEx +DzANBgNVBAcMBkxvbmRvbjELMAkGA1UEBhMCVUswHhcNMTcwNTIyMDAwMDAwWhcN +MjcwNTIwMDAwMDAwWjBYMRswGQYDVQQDDBJDb3JkYSBOb2RlIFJvb3QgQ0ExCzAJ +BgNVBAoMAlIzMQ4wDAYDVQQLDAVjb3JkYTEPMA0GA1UEBwwGTG9uZG9uMQswCQYD +VQQGEwJVSzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGlm6LFHrVkzfuUHin36 +Jrm1aUMarX/NUZXw8n8gSiJmsZPlUEplJ+f/lzZMky5EZPTtCciG34pnOP0eiMd/ +JTCjZDBiMB0GA1UdDgQWBBR8rqnfuUgBKxOJC5rmRYUcORcHczALBgNVHQ8EBAMC +AYYwIwYDVR0lBBwwGgYIKwYBBQUHAwEGCCsGAQUFBwMCBgRVHSUAMA8GA1UdEwEB +/wQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgDaL4SguKsNeTT7SeUkFdoCBACeG8 +GqO4M1KlfimphQwCICiq00hDanT5W8bTLqE7GIGuplf/O8AABlpWrUg6uiUB +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_viewdata.json b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_viewdata.json new file mode 100644 index 000000000..6061c5a61 --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/corda_viewdata.json @@ -0,0 +1,7 @@ +{ + "view64": "CjQIBBIcVHVlIE5vdiAxNyAwMDoxMzo0NiBHTVQgMjAyMBoMTm90YXJpemF0aW9uIgRKU09OEtYHCoQGClhhMjZHVW9WYythenlIMENUYjN2K2pTdmp3Y255M0hFd3AyMlJrdDkvZC9GcXN4WVVvYXhVWTdUOWNKRk9TVTZiVW42UFIwNmFVckxxdjZLbzZ1NG5CUT09Ep8FLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ3akNDQVYrZ0F3SUJBZ0lJVUprUXZtS20zNVl3RkFZSUtvWkl6ajBFQXdJR0NDcUdTTTQ5QXdFSE1DOHgKQ3pBSkJnTlZCQVlUQWtkQ01ROHdEUVlEVlFRSERBWk1iMjVrYjI0eER6QU5CZ05WQkFvTUJsQmhjblI1UVRBZQpGdzB5TURBM01qUXdNREF3TURCYUZ3MHlOekExTWpBd01EQXdNREJhTUM4eEN6QUpCZ05WQkFZVEFrZENNUTh3CkRRWURWUVFIREFaTWIyNWtiMjR4RHpBTkJnTlZCQW9NQmxCaGNuUjVRVEFxTUFVR0F5dGxjQU1oQU1NS2FSRUsKaGNUZ1NCTU16Szgxb1BVU1BvVm1HL2ZKTUxYcS91alNtc2U5bzRHSk1JR0dNQjBHQTFVZERnUVdCQlJNWHREcwpLRlp6VUxkUTNjMkRDVUV4M1QxQ1VEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUNoREFUCkJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFqQWZCZ05WSFNNRUdEQVdnQlI0aHdMdUxnZklaTUVXekc0bjNBeHcKZmdQYmV6QVJCZ29yQmdFRUFZT0tZZ0VCQkFNQ0FRWXdGQVlJS29aSXpqMEVBd0lHQ0NxR1NNNDlBd0VIQTBjQQpNRVFDSUM3SjQ2U3hERHozTGpETnJFUGpqd1AycHJnTUVNaDdyL2dKcG91UUhCaytBaUErS3pYRDBkNW1pSTg2CkQybVlLNEMzdFJsaTNYM1ZnbkNlOENPcWZZeXVRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0aBlBhcnR5QRLMAQpsW1NpbXBsZVN0YXRlKGtleT1ILCB2YWx1ZT0xLCBvd25lcj1PPVBhcnR5QSwgTD1Mb25kb24sIEM9R0IsIGxpbmVhcklkPTIzMTRkNmI3LTFlY2EtNDg5Mi04OGY4LTc2ZDg1YjhhODVjZCldElxsb2NhbGhvc3Q6OTA4MC9Db3JkYV9OZXR3b3JrL2xvY2FsaG9zdDoxMDAwNiNjb20uY29yZGFTaW1wbGVBcHBsaWNhdGlvbi5mbG93LkdldFN0YXRlQnlLZXk6SA==", + + "confidential_view64": "", + + "confidential_view_content64": "" +} \ No newline at end of file diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_cacert.pem b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_cacert.pem new file mode 100644 index 000000000..3d82333d8 --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_cacert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUPB3O2Bl2ZRliIeSEesdgX0WDahwwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDA2MDIwMFoXDTM3MDczMTA2MDIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpn9XxzOTE3QD0G6q5i9dEnbR +ynT6X5YaFVEwAsdgQylYK7MbmmlkS2ZHBP4Qi5krf+Zwz9yU6zYAPqEZCemLFaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FCoR1JlvfQXesApniUWtci1cXiOMMAoGCCqGSM49BAMCA0gAMEUCIQCiBaH7Javq +m2FVNqBXsVn1uwbKYZVHxXH9CE7ANnUF3wIgJ4gjBRrPK4pwHFCd5Yg9Pn383pbd +zQkhznMIF4SBF4k= +-----END CERTIFICATE----- diff --git a/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_viewdata.json b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_viewdata.json new file mode 100644 index 000000000..3d2672272 --- /dev/null +++ b/core/network/corda-interop-app/interop-workflows/src/test/resources/test_data/fabric_viewdata.json @@ -0,0 +1,7 @@ +{ + "view64": "CjIIAxIYMjAyMi0wOC0wNFQxMDoyNDo0Ny42MDVaGgxOb3Rhcml6YXRpb24iBlNUUklORxKLGgrFBwjIARq/BwoGMTcuNjcxEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEi0wYtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBZTJnQXdJQkFnSVVSUlJDZGJaNjNpNTlNM3c2OFA1STI1cnoyTEF3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk5USXdNRm9YRFRJek1EZ3dOREEyTlRjd01Gb3dJVEVQTUEwRwpBMVVFQ3hNR1kyeHBaVzUwTVE0d0RBWURWUVFERXdWMWMyVnlNVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CkF3RUhBMElBQk5PZ29SYnJndGZYeHFhL21iQlFObXl4MVBJWExBdWFNV3BxQUl1MUx3MUxNMjh0SnRoT0pxWFUKejZFd0hMR2VMbGJ2U0VUNnhtb1hyZ0l2QkIxWndHNmpnYnN3Z2Jnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUF3RwpBMVVkRXdFQi93UUNNQUF3SFFZRFZSME9CQllFRk1zWFA3QmpNc21mVXVLZnVlVXNyWTc0cFgwR01COEdBMVVkCkl3UVlNQmFBRlB3ZTFMck51STMzVm0rRWRnTy9FL2pKaWhVMU1GZ0dDQ29EQkFVR0J3Z0JCRXg3SW1GMGRISnoKSWpwN0ltaG1Ma0ZtWm1sc2FXRjBhVzl1SWpvaUlpd2lhR1l1Ulc1eWIyeHNiV1Z1ZEVsRUlqb2lkWE5sY2pFaQpMQ0pvWmk1VWVYQmxJam9pWTJ4cFpXNTBJbjE5TUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUJCLzY4MVdmQlIrClFXSUdmaVlLT2szSHVSdE84SkZ3YlRpRWpuQWdDUnZuQWlCYTY5d1dZYVoyNVpSK0dheTY5ZVYrdkRaa1BNSFMKZ2RSakFJdGNLR3N0Rmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiokZWE3OWU2NjQtYTJmMi00YzlmLTg2NDMtZTYwNjAwODhmYzlhGpgKCiBVNNh9oMmGr6mjpkClfw32G8jILQMdz9o0hFOMbTk7vRLzCQqaAhJmCgpfbGlmZWN5Y2xlElgKKAoibmFtZXNwYWNlcy9maWVsZHMvaW50ZXJvcC9TZXF1ZW5jZRICCAYKLAombmFtZXNwYWNlcy9maWVsZHMvc2ltcGxlc3RhdGUvU2VxdWVuY2USAggDEn4KB2ludGVyb3AScwoeChgAYWNjZXNzQ29udHJvbABuZXR3b3JrMgASAggUChsKFQBtZW1iZXJzaGlwAG5ldHdvcmsyABICCBYKFgoQAPSPv79pbml0aWFsaXplZBICCAcKHAoWZTJlQ29uZmlkZW50aWFsaXR5RmxhZxICCAcSMAoLc2ltcGxlc3RhdGUSIQoWChAA9I+/v2luaXRpYWxpemVkEgIIBAoHCgFhEgIIGhrFBwjIARq/BwoGMTcuNjcxEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEi0wYtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBZTJnQXdJQkFnSVVSUlJDZGJaNjNpNTlNM3c2OFA1STI1cnoyTEF3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk5USXdNRm9YRFRJek1EZ3dOREEyTlRjd01Gb3dJVEVQTUEwRwpBMVVFQ3hNR1kyeHBaVzUwTVE0d0RBWURWUVFERXdWMWMyVnlNVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CkF3RUhBMElBQk5PZ29SYnJndGZYeHFhL21iQlFObXl4MVBJWExBdWFNV3BxQUl1MUx3MUxNMjh0SnRoT0pxWFUKejZFd0hMR2VMbGJ2U0VUNnhtb1hyZ0l2QkIxWndHNmpnYnN3Z2Jnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUF3RwpBMVVkRXdFQi93UUNNQUF3SFFZRFZSME9CQllFRk1zWFA3QmpNc21mVXVLZnVlVXNyWTc0cFgwR01COEdBMVVkCkl3UVlNQmFBRlB3ZTFMck51STMzVm0rRWRnTy9FL2pKaWhVMU1GZ0dDQ29EQkFVR0J3Z0JCRXg3SW1GMGRISnoKSWpwN0ltaG1Ma0ZtWm1sc2FXRjBhVzl1SWpvaUlpd2lhR1l1Ulc1eWIyeHNiV1Z1ZEVsRUlqb2lkWE5sY2pFaQpMQ0pvWmk1VWVYQmxJam9pWTJ4cFpXNTBJbjE5TUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUJCLzY4MVdmQlIrClFXSUdmaVlLT2szSHVSdE84SkZ3YlRpRWpuQWdDUnZuQWlCYTY5d1dZYVoyNVpSK0dheTY5ZVYrdkRaa1BNSFMKZ2RSakFJdGNLR3N0Rmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiokZWE3OWU2NjQtYTJmMi00YzlmLTg2NDMtZTYwNjAwODhmYzlhIgwSB2ludGVyb3AaATEipQgK2QcKB09yZzFNU1ASzQctLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ29qQ0NBa21nQXdJQkFnSVVHeDlQUksyN0ZOR0RVN012S3V3eGFRZXRaMTh3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk1ESXdNRm9YRFRJek1EZ3dOREEyTURjd01Gb3dXekVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRS0V3dEllWEJsCmNteGxaR2RsY2pFTk1Bc0dBMVVFQ3hNRWNHVmxjakVPTUF3R0ExVUVBeE1GY0dWbGNqQXdXVEFUQmdjcWhrak8KUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVF5ZmFPOFJSUW1JNzY1MXBlOUliU0diSGc5dHh0QUpQS1F6cHIzYzBmQgpZV0tFWmZTR2hUYWVnb21jNkhUVCtGNXhpMkV1YVZkZFo2cTBwMlh4MmRKRm80SGRNSUhhTUE0R0ExVWREd0VCCi93UUVBd0lIZ0RBTUJnTlZIUk1CQWY4RUFqQUFNQjBHQTFVZERnUVdCQlNNVDJ2c0xQVm1xV0xMbEFwbVpmSGIKSnFEamlEQWZCZ05WSFNNRUdEQVdnQlFxRWRTWmIzMEYzckFLWjRsRnJYSXRYRjRqakRBaUJnTlZIUkVFR3pBWgpnaGR3WldWeU1DNXZjbWN4TG01bGRIZHZjbXN4TG1OdmJUQldCZ2dxQXdRRkJnY0lBUVJLZXlKaGRIUnljeUk2CmV5Sm9aaTVCWm1acGJHbGhkR2x2YmlJNklpSXNJbWhtTGtWdWNtOXNiRzFsYm5SSlJDSTZJbkJsWlhJd0lpd2kKYUdZdVZIbHdaU0k2SW5CbFpYSWlmWDB3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWlE1YTNtekpaK3pmUDlyTwpjWU9vWEQ5UDVqeE1oUmNMQlBQZ0dnL2JLbllDSUNyM3FlSmdzeFgrRWlBV2drSjNHeFdjK1pRRnNzbTlqTWJBCnIxWGJmK0tJCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KEkcwRQIhAM1Gyv7e+SYniXLgB8iBuRqS4C/A9D36SLl4Zj/AkxrpAiByAoaBFpRIMEJsmGasggaQ4AUST+M2n8ctBZCHjDwRxQ==", + + "confidential_view64": "CjIIAxIYMjAyMi0wOC0wNFQxMDozMjoyMC4zMTlaGgxOb3Rhcml6YXRpb24iBlNUUklORxLrHAr0CAjIARruCAqyAQqNAQRdCc5yPbVtY77Ow/6sH6V8AOwbumdSxFq5T62tOT8LIThrPue3yCQBp7P5/6NoKRZR9grAbP9mVHiZ5814qf/DnXULpdh5O5EbVKSZX5BtmXCqTwpmZaqrQzAGgNXVzB8L6QSEVz48fp9X9SuA3r74mzNM5Ip6WbsNXnENpfifEbUfHcDUK28KHN9U+xogYzlOibmMtRdSuUyam+LQmZ5Y4/9X7AyhqEGNe0INblsSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YRgBItMGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWUyZ0F3SUJBZ0lVUlJSQ2RiWjYzaTU5TTN3NjhQNUkyNXJ6MkxBd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJOVEl3TUZvWERUSXpNRGd3TkRBMk5UY3dNRm93SVRFUE1BMEcKQTFVRUN4TUdZMnhwWlc1ME1RNHdEQVlEVlFRREV3VjFjMlZ5TVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OQpBd0VIQTBJQUJOT2dvUmJyZ3RmWHhxYS9tYkJRTm15eDFQSVhMQXVhTVdwcUFJdTFMdzFMTTI4dEp0aE9KcVhVCno2RXdITEdlTGxidlNFVDZ4bW9YcmdJdkJCMVp3RzZqZ2Jzd2diZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1Bd0cKQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZNc1hQN0JqTXNtZlV1S2Z1ZVVzclk3NHBYMEdNQjhHQTFVZApJd1FZTUJhQUZQd2UxTHJOdUkzM1ZtK0VkZ08vRS9qSmloVTFNRmdHQ0NvREJBVUdCd2dCQkV4N0ltRjBkSEp6CklqcDdJbWhtTGtGbVptbHNhV0YwYVc5dUlqb2lJaXdpYUdZdVJXNXliMnhzYldWdWRFbEVJam9pZFhObGNqRWkKTENKb1ppNVVlWEJsSWpvaVkyeHBaVzUwSW4xOU1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lCQi82ODFXZkJSKwpRV0lHZmlZS09rM0h1UnRPOEpGd2JUaUVqbkFnQ1J2bkFpQmE2OXdXWWFaMjVaUitHYXk2OWVWK3ZEWmtQTUhTCmdkUmpBSXRjS0dzdEZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoqJDQwZTFjMGUxLWJkZDctNDQ2MC04YzhhLWRlMTZhOWQyOGYwYRrJCwogZOyCYqcgmQJccj0IkSL3t+oNKIzv0PmJqnzbH2jfIV8SpAsKnAISZgoKX2xpZmVjeWNsZRJYCigKIm5hbWVzcGFjZXMvZmllbGRzL2ludGVyb3AvU2VxdWVuY2USAggGCiwKJm5hbWVzcGFjZXMvZmllbGRzL3NpbXBsZXN0YXRlL1NlcXVlbmNlEgIIAxJ+CgdpbnRlcm9wEnMKHgoYAGFjY2Vzc0NvbnRyb2wAbmV0d29yazIAEgIIJwobChUAbWVtYmVyc2hpcABuZXR3b3JrMgASAggpChYKEAD0j7+/aW5pdGlhbGl6ZWQSAggHChwKFmUyZUNvbmZpZGVudGlhbGl0eUZsYWcSAggHEjIKC3NpbXBsZXN0YXRlEiMKFgoQAPSPv79pbml0aWFsaXplZBICCAQKCQoBYRIECBsQARr0CAjIARruCAqyAQqNAQRdCc5yPbVtY77Ow/6sH6V8AOwbumdSxFq5T62tOT8LIThrPue3yCQBp7P5/6NoKRZR9grAbP9mVHiZ5814qf/DnXULpdh5O5EbVKSZX5BtmXCqTwpmZaqrQzAGgNXVzB8L6QSEVz48fp9X9SuA3r74mzNM5Ip6WbsNXnENpfifEbUfHcDUK28KHN9U+xogYzlOibmMtRdSuUyam+LQmZ5Y4/9X7AyhqEGNe0INblsSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YRgBItMGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWUyZ0F3SUJBZ0lVUlJSQ2RiWjYzaTU5TTN3NjhQNUkyNXJ6MkxBd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJOVEl3TUZvWERUSXpNRGd3TkRBMk5UY3dNRm93SVRFUE1BMEcKQTFVRUN4TUdZMnhwWlc1ME1RNHdEQVlEVlFRREV3VjFjMlZ5TVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OQpBd0VIQTBJQUJOT2dvUmJyZ3RmWHhxYS9tYkJRTm15eDFQSVhMQXVhTVdwcUFJdTFMdzFMTTI4dEp0aE9KcVhVCno2RXdITEdlTGxidlNFVDZ4bW9YcmdJdkJCMVp3RzZqZ2Jzd2diZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1Bd0cKQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZNc1hQN0JqTXNtZlV1S2Z1ZVVzclk3NHBYMEdNQjhHQTFVZApJd1FZTUJhQUZQd2UxTHJOdUkzM1ZtK0VkZ08vRS9qSmloVTFNRmdHQ0NvREJBVUdCd2dCQkV4N0ltRjBkSEp6CklqcDdJbWhtTGtGbVptbHNhV0YwYVc5dUlqb2lJaXdpYUdZdVJXNXliMnhzYldWdWRFbEVJam9pZFhObGNqRWkKTENKb1ppNVVlWEJsSWpvaVkyeHBaVzUwSW4xOU1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lCQi82ODFXZkJSKwpRV0lHZmlZS09rM0h1UnRPOEpGd2JUaUVqbkFnQ1J2bkFpQmE2OXdXWWFaMjVaUitHYXk2OWVWK3ZEWmtQTUhTCmdkUmpBSXRjS0dzdEZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoqJDQwZTFjMGUxLWJkZDctNDQ2MC04YzhhLWRlMTZhOWQyOGYwYSIMEgdpbnRlcm9wGgExIqUICtkHCgdPcmcxTVNQEs0HLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvakNDQWttZ0F3SUJBZ0lVR3g5UFJLMjdGTkdEVTdNdkt1d3hhUWV0WjE4d0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJNREl3TUZvWERUSXpNRGd3TkRBMk1EY3dNRm93V3pFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRU5NQXNHQTFVRUN4TUVjR1ZsY2pFT01Bd0dBMVVFQXhNRmNHVmxjakF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFReWZhTzhSUlFtSTc2NTFwZTlJYlNHYkhnOXR4dEFKUEtRenByM2MwZkIKWVdLRVpmU0doVGFlZ29tYzZIVFQrRjV4aTJFdWFWZGRaNnEwcDJYeDJkSkZvNEhkTUlIYU1BNEdBMVVkRHdFQgovd1FFQXdJSGdEQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJTTVQydnNMUFZtcVdMTGxBcG1aZkhiCkpxRGppREFmQmdOVkhTTUVHREFXZ0JRcUVkU1piMzBGM3JBS1o0bEZyWEl0WEY0ampEQWlCZ05WSFJFRUd6QVoKZ2hkd1pXVnlNQzV2Y21jeExtNWxkSGR2Y21zeExtTnZiVEJXQmdncUF3UUZCZ2NJQVFSS2V5SmhkSFJ5Y3lJNgpleUpvWmk1QlptWnBiR2xoZEdsdmJpSTZJaUlzSW1obUxrVnVjbTlzYkcxbGJuUkpSQ0k2SW5CbFpYSXdJaXdpCmFHWXVWSGx3WlNJNkluQmxaWElpZlgwd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ1pRNWEzbXpKWit6ZlA5ck8KY1lPb1hEOVA1anhNaFJjTEJQUGdHZy9iS25ZQ0lDcjNxZUpnc3hYK0VpQVdna0ozR3hXYytaUUZzc205ak1iQQpyMVhiZitLSQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChJHMEUCIQC4MR1TNTeK+FHqEStQkXTM+9kgF4v3SldTn8G3T8Wb1wIgWnDGTnmhr4gL/UmYdB+uQrYaF3IvGtlKZ4r0rDhczxg=", + + "confidential_view_content64": "CghBcmN0dXJ1cxIQTZKuC0jTLZxn3JowK/x2Xg==" +} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/.env.template b/core/network/fabric-interop-cc/.env.template new file mode 100644 index 000000000..67f81144c --- /dev/null +++ b/core/network/fabric-interop-cc/.env.template @@ -0,0 +1,10 @@ +CCID= +CHANNEL= +PEER= +ORG= +NETWORK= +DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-fabric-cc +DOCKER_TAG=1.4.0 +EXTERNAL_NETWORK= +COMPOSE_PROJECT_NAME= +COMPOSE_PROJECT_NETWORK= \ No newline at end of file diff --git a/core/network/fabric-interop-cc/.gitignore b/core/network/fabric-interop-cc/.gitignore index 97f005b91..a3b4dbb4e 100644 --- a/core/network/fabric-interop-cc/.gitignore +++ b/core/network/fabric-interop-cc/.gitignore @@ -15,4 +15,5 @@ # vendor/ protos fabric-protos -bin \ No newline at end of file +bin +.env diff --git a/core/network/fabric-interop-cc/Dockerfile b/core/network/fabric-interop-cc/Dockerfile index 92386d1bb..a413d3171 100644 --- a/core/network/fabric-interop-cc/Dockerfile +++ b/core/network/fabric-interop-cc/Dockerfile @@ -19,3 +19,6 @@ USER 1000 WORKDIR /app CMD ./interop + +ARG GIT_URL +LABEL org.opencontainers.image.source ${GIT_URL} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/Makefile b/core/network/fabric-interop-cc/contracts/interop/Makefile index e58c48a9b..6ebd5ed20 100644 --- a/core/network/fabric-interop-cc/contracts/interop/Makefile +++ b/core/network/fabric-interop-cc/contracts/interop/Makefile @@ -1,5 +1,7 @@ -run-vendor: +vendor: go mod vendor + +run-vendor: vendor cp -r ../../../../../common/protos-go/* vendor/github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/ cp -r ../../libs/* vendor/github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/ diff --git a/core/network/fabric-interop-cc/contracts/interop/README.md b/core/network/fabric-interop-cc/contracts/interop/README.md new file mode 100644 index 000000000..0eba78818 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/README.md @@ -0,0 +1,6 @@ + +# Weaver Fabric Interop Chaincode \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/VERSION b/core/network/fabric-interop-cc/contracts/interop/VERSION new file mode 100644 index 000000000..26ca59460 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/VERSION @@ -0,0 +1 @@ +1.5.1 diff --git a/core/network/fabric-interop-cc/contracts/interop/certificate_utils.go b/core/network/fabric-interop-cc/contracts/interop/certificate_utils.go index bf2d2270c..0e87d5f31 100644 --- a/core/network/fabric-interop-cc/contracts/interop/certificate_utils.go +++ b/core/network/fabric-interop-cc/contracts/interop/certificate_utils.go @@ -90,9 +90,9 @@ func verifyCaCertificate(cert *x509.Certificate, memberCertificate string) error return nil } -/* This function works for a Corda network's configuration - The assumption is that a Corda network has a single Root CA and Doorman CA, and one or more Node CAs corresponding to nodes. - This function will receive arguments for exactly one node with the following cert chain assumed: -> -> +/* This function will receive arguments for exactly one node with the following cert chain assumed: -> -> -> ...... + In a Fabric network, we assume that there are multiple MSPs, each having one or more Root CAs and zero or more Intermediate CAs. + In a Corda network, we assume that there is a single Root CA and Doorman CA, and one or more Node CAs corresponding to nodes. */ func verifyCertificateChain(cert *x509.Certificate, certPEMs []string) error { var parentCert *x509.Certificate @@ -112,7 +112,7 @@ func verifyCertificateChain(cert *x509.Certificate, certPEMs []string) error { errMsg := fmt.Sprintf("Certificate link for Subject %s with Parent Subject %s invalid", caCert.Subject.String(), parentCert.Subject.String()) return errors.New(errMsg) } - if i == len(certPEMs)-1 { + if i == len(certPEMs)-1 && cert != nil { err := validateCertificateUsingCA(cert, caCert, i == 1) if err != nil { return errors.New("Certificate link invalid for endorser") @@ -227,7 +227,7 @@ func validateSignature(message string, cert *x509.Certificate, signature string) pubKey := getECDSAPublicKeyFromCertificate(cert) if pubKey != nil { // Construct the message that was signed - hashed, err := computeSHA2Hash([]byte(message), 256) + hashed, err := computeSHA2Hash([]byte(message), pubKey.Params().BitSize) if err != nil { return err } @@ -241,6 +241,7 @@ func validateSignature(message string, cert *x509.Certificate, signature string) return errors.New("Missing or unsupported public key type") } } + func parseCert(certString string) (*x509.Certificate, error) { certBytes, _ := pem.Decode([]byte(certString)) diff --git a/core/network/fabric-interop-cc/contracts/interop/decoders.go b/core/network/fabric-interop-cc/contracts/interop/decoders.go index d05fd3cf0..e8b5fee0c 100644 --- a/core/network/fabric-interop-cc/contracts/interop/decoders.go +++ b/core/network/fabric-interop-cc/contracts/interop/decoders.go @@ -12,10 +12,14 @@ package main import ( + "encoding/base64" "encoding/json" "strings" + "fmt" "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/identity" + protoV2 "google.golang.org/protobuf/proto" ) func decodeMembership(jsonBytes []byte) (*common.Membership, error) { @@ -29,6 +33,19 @@ func decodeMembership(jsonBytes []byte) (*common.Membership, error) { return &decodeObj, nil } +func decodeCounterAttestedMembership(protoBytesBase64 string) (*identity.CounterAttestedMembership, error) { + var decodeObj identity.CounterAttestedMembership + protoBytes, err := base64.StdEncoding.DecodeString(protoBytesBase64) + if err != nil { + return nil, fmt.Errorf("Counter attested membership could not be decoded from base64: %s", err.Error()) + } + err = protoV2.Unmarshal(protoBytes, &decodeObj) + if err != nil { + return nil, fmt.Errorf("Unable to unmarshal counter attested membership: %s", err.Error()) + } + return &decodeObj, nil +} + func decodeVerificationPolicy(jsonBytes []byte) (*common.VerificationPolicy, error) { var decodeObj common.VerificationPolicy dec := json.NewDecoder(strings.NewReader(string(jsonBytes))) diff --git a/core/network/fabric-interop-cc/contracts/interop/go.mod b/core/network/fabric-interop-cc/contracts/interop/go.mod index 4cab15322..cd3a68ec9 100644 --- a/core/network/fabric-interop-cc/contracts/interop/go.mod +++ b/core/network/fabric-interop-cc/contracts/interop/go.mod @@ -5,10 +5,10 @@ go 1.16 require ( github.com/ethereum/go-ethereum v1.10.17 github.com/golang/protobuf v1.5.2 - github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.3.1 - github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.3.1 + github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.5.1 + github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.5.1 github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils v0.0.0-20220522111555-ae96e46bf4a1 - github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.3.1 + github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.5.1 github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 github.com/hyperledger/fabric-contract-api-go v1.1.1 github.com/hyperledger/fabric-protos-go v0.0.0-20210720123151-f0dc3e2a0871 diff --git a/core/network/fabric-interop-cc/contracts/interop/go.sum b/core/network/fabric-interop-cc/contracts/interop/go.sum index b5f888342..14f59d869 100644 --- a/core/network/fabric-interop-cc/contracts/interop/go.sum +++ b/core/network/fabric-interop-cc/contracts/interop/go.sum @@ -220,14 +220,14 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.3.0/go.mod h1:POCGO/RK9YDfgdhuyqjoD9tRNtWfK7Rh5AYYmsb1Chc= -github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.3.1 h1:83ZKi0fyaNfHjnc59Cqgr8Zma11hSqYSW46VIhBKaWo= -github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.3.1/go.mod h1:POCGO/RK9YDfgdhuyqjoD9tRNtWfK7Rh5AYYmsb1Chc= -github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.3.1 h1:oi2G8OoM2cdilGb+PeTDQRZx6mn15744NGkwJimiAOM= -github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.3.1/go.mod h1:u6CH8sOTS8ioB0ITKLIAvEvIK+UFzS/xDmQFYEmFVuw= +github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.5.1 h1:IaZCvIAkkRgeyU5T+D1npd2L/7zQESOYNR09XZFS8u8= +github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go v1.5.1/go.mod h1:POCGO/RK9YDfgdhuyqjoD9tRNtWfK7Rh5AYYmsb1Chc= +github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.5.1 h1:psneVt+MFOQY9K3a3Ur7tkZOSHCkNoTy9znU6qf5JXI= +github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/assetexchange v1.5.1/go.mod h1:u6CH8sOTS8ioB0ITKLIAvEvIK+UFzS/xDmQFYEmFVuw= github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils v0.0.0-20220522111555-ae96e46bf4a1 h1:F4AWvGjRRWSCWtW0wMD1SkYGnW5yly9NqmHICxHIrUw= github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils v0.0.0-20220522111555-ae96e46bf4a1/go.mod h1:Nke1cGAeCHSgK8x/+tjzojTAT5L/V6e7ERxPUSbnA/8= -github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.3.1 h1:0lAsGVvJD4/iTU6TVS3GUtAvaRnqGD/+sunSiOmoZq0= -github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.3.1/go.mod h1:GyKdWTtYDkT0CDiGJHRUWvQQ8jw+KlwBhiG8tATVVi4= +github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.5.1 h1:Ly857aoRE5TFL91dI6n5Ml9b71I2F4EY4vos6VIStbk= +github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils v1.5.1/go.mod h1:GyKdWTtYDkT0CDiGJHRUWvQQ8jw+KlwBhiG8tATVVi4= github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 h1:1cAZHHrBYFrX3bwQGhOZtOB4sCM9QWVppd81O8vsPXs= github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= diff --git a/core/network/fabric-interop-cc/contracts/interop/handle_external_request.go b/core/network/fabric-interop-cc/contracts/interop/handle_external_request.go index 9c92e0167..d53472ce8 100644 --- a/core/network/fabric-interop-cc/contracts/interop/handle_external_request.go +++ b/core/network/fabric-interop-cc/contracts/interop/handle_external_request.go @@ -12,13 +12,14 @@ import ( "encoding/base64" "errors" "fmt" + "strings" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + wutils "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils" "github.com/hyperledger/fabric-chaincode-go/shim" "github.com/hyperledger/fabric-contract-api-go/contractapi" log "github.com/sirupsen/logrus" - "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" protoV2 "google.golang.org/protobuf/proto" - wutils "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils" ) // HandleExternalRequest chaincode processes requests that come from external networks. @@ -29,77 +30,98 @@ import ( // 3. Checks the access control policy for the requester and view address is met // 4. Calls application chaincode func (s *SmartContract) HandleExternalRequest(ctx contractapi.TransactionContextInterface, b64QueryBytes string) (string, error) { - // Ensure that this function cannot be called by a client without relay permissions - relayAccessCheck, err := wutils.IsClientRelay(ctx.GetStub()) + queryBytes, err := base64.StdEncoding.DecodeString(b64QueryBytes) if err != nil { - return "", err + return "", logThenErrorf("Unable to base64 decode data: %s", err.Error()) } - if !relayAccessCheck { - return "", fmt.Errorf("Illegal access by relay") + var query common.Query + err = protoV2.Unmarshal(queryBytes, &query) + if err != nil { + return "", logThenErrorf("Unable to unmarshal query: %s", err.Error()) } - fmt.Println("Relay access check passed") + resp, err := handleRequest(s, ctx, query, query.Address) + return resp, err +} +func (s *SmartContract) HandleEventRequest(ctx contractapi.TransactionContextInterface, b64QueryBytes string, dynamicQueryArg string) (string, error) { queryBytes, err := base64.StdEncoding.DecodeString(b64QueryBytes) if err != nil { - errorMessage := fmt.Sprintf("Unable to base64 decode data: %s", err.Error()) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Unable to base64 decode data: %s", err.Error()) } var query common.Query err = protoV2.Unmarshal(queryBytes, &query) if err != nil { - errorMessage := fmt.Sprintf("Unable to unmarshal query: %s", err.Error()) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Unable to unmarshal query: %s", err.Error()) } + + queryAddress := query.Address + dynamicArgCount := strings.Count(query.Address, ":?") + // TODO: this is a stopgap logic and will be reviewed and possibly changed later + if dynamicArgCount > 1 { + return "", logThenErrorf("Expected 1 dynamic argument in the event query address, but found %d", dynamicArgCount) + } else if dynamicArgCount == 1 { + queryAddress = strings.Replace(query.Address, ":?", ":"+dynamicQueryArg, 1) + fmt.Println("There is 1 dynamic argument in the event query address, queryArg: ", dynamicQueryArg) + } else { + fmt.Println("There are no dynamic arguments in the event query address, queryArg: ", dynamicQueryArg) + } + + resp, err := handleRequest(s, ctx, query, queryAddress) + return resp, err +} + +// This function handleRequest handle requests that originate in external requests and have come through relays. +// +// The flow coordinates the following: +// 1. Checks the validity of query signature +// 2. Checks that the certificate of the requester is valid according to the network's Membership +// 3. Checks the access control policy for the requester and view address is met +// 4. Calls application chaincode +func handleRequest(s *SmartContract, ctx contractapi.TransactionContextInterface, query common.Query, queryAddress string) (string, error) { + // Ensure that this function cannot be called by a client without relay permissions + relayAccessCheck, err := wutils.IsClientRelay(ctx.GetStub()) + if err != nil { + return "", err + } + if !relayAccessCheck { + return "", fmt.Errorf("Illegal access by client without relay permissions") + } + fmt.Println("Relay access check passed") + x509Cert, err := parseCert(query.Certificate) if err != nil { - errorMessage := fmt.Sprintf("Unable to parse certificate: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Unable to parse certificate: %s", err) } // 1. Checks the validity of query signature signatureBytes, err := base64.StdEncoding.DecodeString(query.RequestorSignature) if err != nil { - errorMessage := fmt.Sprintf("Signature base64 decoding failed: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Signature base64 decoding failed: %s", err) } err = validateSignature(query.Address+query.Nonce, x509Cert, string(signatureBytes)) if err != nil { - errorMessage := fmt.Sprintf("Invalid Signature: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Invalid Signature: %s", err) } // 2. Checks that the certificate of the requester is valid according to the network's Membership if query.RequestingOrg == "" { query.RequestingOrg = x509Cert.Issuer.Organization[0] } - err = verifyMemberInSecurityDomain(s, ctx, x509Cert, query.RequestingNetwork, query.RequestingOrg) + err = verifyMemberInSecurityDomain(s, ctx, query.Certificate, query.RequestingNetwork, query.RequestingOrg) if err != nil { - errorMessage := fmt.Sprintf("Membership Verification failed: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Membership Verification failed: %s", err) } // 3. Checks the access control policy for the requester and view address is met - address, err := parseAddress(query.Address) + address, err := parseAddress(queryAddress) if err != nil { - errorMessage := fmt.Sprintf("Invalid address: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Invalid address: %s", err) } viewAddress, err := parseFabricViewAddress(address.ViewSegment) if err != nil { - errorMessage := fmt.Sprintf("Invalid view address: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Invalid view address: %s", err) } err = verifyAccessToCC(s, ctx, viewAddress, address.ViewSegment, &query) if err != nil { - errorMessage := fmt.Sprintf("CC Access Denied: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("CC Access Denied: %s", err) } // 4. Calls application chaincode arr := append([]string{viewAddress.CCFunc}, viewAddress.Args...) @@ -113,30 +135,22 @@ func (s *SmartContract) HandleExternalRequest(ctx contractapi.TransactionContext resp := "" if viewAddress.CCFunc == "GetHTLCHash" { if len(viewAddress.Args) > 2 { - errorMessage := fmt.Sprintf("Recieved more arguments than required 2 argument.") - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Recieved more arguments than required 2 argument.") } resp, err = s.GetHTLCHash(ctx, viewAddress.Args[0], viewAddress.Args[1]) } else if viewAddress.CCFunc == "GetHTLCHashByContractId" { if len(viewAddress.Args) > 1 { - errorMessage := fmt.Sprintf("Recieved more arguments than required 1 argument.") - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Recieved more arguments than required 1 argument.") } resp, err = s.GetHTLCHashByContractId(ctx, viewAddress.Args[0]) } else if viewAddress.CCFunc == "GetHTLCHashPreImage" { if len(viewAddress.Args) > 2 { - errorMessage := fmt.Sprintf("Recieved more arguments than required 2 argument.") - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Recieved more arguments than required 2 argument.") } resp, err = s.GetHTLCHashPreImage(ctx, viewAddress.Args[0], viewAddress.Args[1]) } else if viewAddress.CCFunc == "GetHTLCHashPreImageByContractId" { if len(viewAddress.Args) > 1 { - errorMessage := fmt.Sprintf("Recieved more arguments than required 1 argument.") - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Recieved more arguments than required 1 argument.") } resp, err = s.GetHTLCHashPreImageByContractId(ctx, viewAddress.Args[0]) } else { @@ -152,9 +166,7 @@ func (s *SmartContract) HandleExternalRequest(ctx contractapi.TransactionContext // General Interop Call to AppCC pbResp := ctx.GetStub().InvokeChaincode(viewAddress.Contract, byteArgs, viewAddress.Channel) if pbResp.Status != shim.OK { - errorMessage := fmt.Sprintf("Application chaincode invoke error: %s", string(pbResp.GetMessage())) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Application chaincode invoke error: %s", string(pbResp.GetMessage())) } // 5. Encrypt payload if necessary confFlag, err := ctx.GetStub().GetState(e2eConfidentialityKey) @@ -168,8 +180,7 @@ func (s *SmartContract) HandleExternalRequest(ctx contractapi.TransactionContext // Use already authenticated certificate as the source of the public key for encryption payload, err = generateConfidentialInteropPayloadAndHash(pbResp.Payload, query.Certificate) if err != nil { - log.Error(err) - return "", err + return "", logThenErrorf(err.Error()) } } else { payload = pbResp.Payload @@ -177,17 +188,15 @@ func (s *SmartContract) HandleExternalRequest(ctx contractapi.TransactionContext } interopPayloadStruct := common.InteropPayload{ - Address: query.Address, - Payload: payload, - Confidential: confidential, + Address: queryAddress, + Payload: payload, + Confidential: confidential, RequestorCertificate: query.Certificate, - Nonce: query.Nonce, + Nonce: query.Nonce, } interopPayloadBytes, err := protoV2.Marshal(&interopPayloadStruct) if err != nil { - errorMessage := fmt.Sprintf("Unable to marshal interop payload: %s", err) - log.Error(errorMessage) - return "", errors.New(errorMessage) + return "", logThenErrorf("Unable to marshal interop payload: %s", err) } return string(interopPayloadBytes), nil } diff --git a/core/network/fabric-interop-cc/contracts/interop/handle_external_request_test.go b/core/network/fabric-interop-cc/contracts/interop/handle_external_request_test.go index 9e0b21d5c..1e3a24ef5 100644 --- a/core/network/fabric-interop-cc/contracts/interop/handle_external_request_test.go +++ b/core/network/fabric-interop-cc/contracts/interop/handle_external_request_test.go @@ -23,14 +23,14 @@ import ( "testing" "time" + "github.com/golang/protobuf/proto" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + wtest "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils" "github.com/hyperledger/fabric-chaincode-go/shim" + mspProtobuf "github.com/hyperledger/fabric-protos-go/msp" pb "github.com/hyperledger/fabric-protos-go/peer" "github.com/stretchr/testify/require" - "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" - "github.com/golang/protobuf/proto" protoV2 "google.golang.org/protobuf/proto" - mspProtobuf "github.com/hyperledger/fabric-protos-go/msp" - wtest "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils" ) // function that supplies value that is to be returned by ctx.GetStub().GetCreator() @@ -132,6 +132,11 @@ func TestHandleExternalRequest(t *testing.T) { testHandleExternalRequestECDSAHappyCase(t, &query, validCertificate, key, signature, pbResp, &accessControlAsset, &membershipAsset) // ed25519 Cert and Signature testHandleExternalRequestED25519Signature(t, &query, pbResp, &accessControlAsset, &membershipAsset, template) + // Test event requests + // Invalid Cert + testHandleEventRequestInvalidDynamicQueryArgs(t, &query, validCertificate, signature) + // Happy case. ECDSA Cert and Valid Signature + testHandleEventRequestECDSAHappyCase(t, &query, validCertificate, key, signature, pbResp, &accessControlAsset, &membershipAsset) } func testHandleExternalRequestInvalidJSON(t *testing.T) { @@ -176,6 +181,7 @@ func testHandleExternalRequestSignatureCertificateMismatch(t *testing.T, query * _, err = interopcc.HandleExternalRequest(ctx, string(b64QueryBytes)) require.EqualError(t, err, fmt.Sprintf("Invalid Signature: asn1: structure error: tags don't match (16 vs {class:1 tag:19 length:105 isCompound:false}) {optional:false explicit:false application:false private:false defaultValue: tag: stringType:0 timeType:0 set:false omitEmpty:false} ECDSASignature @2")) + //require.EqualError(t, err, "Invalid Signature: Signature Verification failed. ECDSA VERIFY") } func testHandleExternalRequestInvalidCert(t *testing.T, query *common.Query) { @@ -195,6 +201,30 @@ func testHandleExternalRequestInvalidCert(t *testing.T, query *common.Query) { require.EqualError(t, err, fmt.Sprintf("Unable to parse certificate: Client cert not in a known PEM format")) } +func testHandleEventRequestInvalidDynamicQueryArgs(t *testing.T, query *common.Query, validCertificate string, signature []byte) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + chaincodeStub.GetCreatorReturns([]byte(getRelayCreator()), nil) + interopCCId := "interopcc" + wtest.SetMockStubCCId(chaincodeStub, interopCCId) + + // set incorrect values for this test case + queryAddress := query.Address + query.Address = "localhost:9080/network1/mychannel:interop:Read:?:?" + query.Certificate = validCertificate + b64Signature := base64.StdEncoding.EncodeToString(signature) + query.RequestorSignature = b64Signature + queryBytes, err := protoV2.Marshal(query) + require.NoError(t, err) + b64QueryBytes := base64.StdEncoding.EncodeToString(queryBytes) + + _, err = interopcc.HandleEventRequest(ctx, string(b64QueryBytes), "a") + require.EqualError(t, err, fmt.Sprintf("Expected 1 dynamic argument in the event query address, but found 2")) + + // restore the value of query.Address + query.Address = queryAddress +} + func testHandleExternalRequestECDSAHappyCase(t *testing.T, query *common.Query, validCertificate string, validPrivateKey *ecdsa.PrivateKey, signature []byte, pbResp pb.Response, accessControl *common.AccessControlPolicy, membership *common.Membership) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} @@ -210,11 +240,11 @@ func testHandleExternalRequestECDSAHappyCase(t *testing.T, query *common.Query, require.NoError(t, err) b64QueryBytes := base64.StdEncoding.EncodeToString(queryBytes) interopPayload := common.InteropPayload{ - Payload: []byte("17.12"), - Address: "localhost:9080/network1/mychannel:interop:Read:a", - Confidential: false, + Payload: []byte("17.12"), + Address: "localhost:9080/network1/mychannel:interop:Read:a", + Confidential: false, RequestorCertificate: query.Certificate, - Nonce: query.Nonce, + Nonce: query.Nonce, } interopPayloadBytes, err := protoV2.Marshal(&interopPayload) require.NoError(t, err) @@ -267,6 +297,109 @@ func testHandleExternalRequestECDSAHappyCase(t *testing.T, query *common.Query, require.Equal(t, confPayload.Hash, fmac) } +func testHandleEventRequestECDSAHappyCase(t *testing.T, query *common.Query, validCertificate string, validPrivateKey *ecdsa.PrivateKey, signature []byte, pbResp pb.Response, accessControl *common.AccessControlPolicy, membership *common.Membership) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + chaincodeStub.GetCreatorReturns([]byte(getRelayCreator()), nil) + interopCCId := "interopcc" + wtest.SetMockStubCCId(chaincodeStub, interopCCId) + query.Confidential = false + + // set correct values for the success case + query.Certificate = validCertificate + // This tests the case of no dynamic arguments in the event query address (and signature is on query with no dynamic args) + b64Signature := base64.StdEncoding.EncodeToString(signature) + query.RequestorSignature = b64Signature + queryBytes, err := protoV2.Marshal(query) + require.NoError(t, err) + b64QueryBytes := base64.StdEncoding.EncodeToString(queryBytes) + interopPayload := common.InteropPayload{ + Payload: []byte("17.12"), + Address: "localhost:9080/network1/mychannel:interop:Read:a", + Confidential: false, + RequestorCertificate: query.Certificate, + Nonce: query.Nonce, + } + interopPayloadBytes, err := protoV2.Marshal(&interopPayload) + require.NoError(t, err) + + // mock all the calls to the chaincode stub + membershipBytes, err := json.Marshal(membership) + require.NoError(t, err) + accessControlBytes, err := json.Marshal(accessControl) + require.NoError(t, err) + chaincodeStub.GetStateReturnsOnCall(0, membershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(1, accessControlBytes, nil) + chaincodeStub.InvokeChaincodeReturns(pbResp) + + interopResponse, err := interopcc.HandleEventRequest(ctx, string(b64QueryBytes), "a") + require.NoError(t, err) + var interopPayloadResp common.InteropPayload + err = protoV2.Unmarshal([]byte(interopResponse), &interopPayloadResp) + require.NoError(t, err) + require.False(t, interopPayloadResp.Confidential) + require.Equal(t, interopPayloadBytes, []byte(interopResponse)) + require.NoError(t, err) + + // This tests the case of one dynamic argument in the event query address (and signature is on query with one dynamic arg) + query.Address = "localhost:9080/network1/mychannel:interop:Read:?" + random := rand.Reader + hashed, err := computeSHA2Hash([]byte(query.Address+query.Nonce), validPrivateKey.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureDynamicArg, err := ecdsa.SignASN1(random, validPrivateKey, hashed) + require.NoError(t, err) + + b64Signature = base64.StdEncoding.EncodeToString(signatureDynamicArg) + query.RequestorSignature = b64Signature + queryBytes, err = protoV2.Marshal(query) + require.NoError(t, err) + b64QueryBytes = base64.StdEncoding.EncodeToString(queryBytes) + + // mock all the calls to the chaincode stub + chaincodeStub.GetStateReturnsOnCall(3, membershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(4, accessControlBytes, nil) + chaincodeStub.InvokeChaincodeReturns(pbResp) + + interopResponse, err = interopcc.HandleEventRequest(ctx, string(b64QueryBytes), "a") + require.NoError(t, err) + err = protoV2.Unmarshal([]byte(interopResponse), &interopPayloadResp) + require.NoError(t, err) + require.False(t, interopPayloadResp.Confidential) + require.Equal(t, interopPayloadBytes, []byte(interopResponse)) + require.NoError(t, err) + + // test the same request-response with encryption on + query.Confidential = true + queryBytes, err = protoV2.Marshal(query) + require.NoError(t, err) + b64QueryBytes = base64.StdEncoding.EncodeToString(queryBytes) + chaincodeStub.GetStateReturnsOnCall(6, membershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(7, accessControlBytes, nil) + chaincodeStub.InvokeChaincodeReturns(pbResp) + interopResponse, err = interopcc.HandleEventRequest(ctx, string(b64QueryBytes), "a") + require.NoError(t, err) + err = protoV2.Unmarshal([]byte(interopResponse), &interopPayloadResp) + require.NoError(t, err) + require.NotEqual(t, interopPayload.Payload, interopPayloadResp.Payload) + require.True(t, interopPayloadResp.Confidential) + require.Equal(t, interopPayloadResp.RequestorCertificate, validCertificate) + require.Equal(t, interopPayloadResp.Nonce, query.Nonce) + var confPayload common.ConfidentialPayload + err = protoV2.Unmarshal(interopPayloadResp.Payload, &confPayload) + require.NoError(t, err) + require.Equal(t, confPayload.HashType, common.ConfidentialPayload_HMAC) + decConfPayload, err := decryptDataWithPrivKey(validPrivateKey, confPayload.EncryptedPayload) + require.NoError(t, err) + var confPayloadContents common.ConfidentialPayloadContents + err = protoV2.Unmarshal(decConfPayload, &confPayloadContents) + require.NoError(t, err) + require.Equal(t, interopPayload.Payload, confPayloadContents.Payload) + mac := hmac.New(sha256.New, confPayloadContents.Random) + mac.Write(confPayloadContents.Payload) + fmac := mac.Sum(nil) + require.Equal(t, confPayload.Hash, fmac) +} + func testHandleExternalRequestED25519Signature(t *testing.T, query *common.Query, pbResp pb.Response, accessControl *common.AccessControlPolicy, fabricMembership *common.Membership, template x509.Certificate) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} diff --git a/core/network/fabric-interop-cc/contracts/interop/membership.go b/core/network/fabric-interop-cc/contracts/interop/membership.go index b217bc198..5c8e38cb4 100644 --- a/core/network/fabric-interop-cc/contracts/interop/membership.go +++ b/core/network/fabric-interop-cc/contracts/interop/membership.go @@ -10,28 +10,289 @@ package main import ( "crypto/x509" + "encoding/base64" "encoding/json" + "encoding/pem" "fmt" "github.com/hyperledger/fabric-contract-api-go/contractapi" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/identity" + protoV2 "google.golang.org/protobuf/proto" + wutils "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/utils" ) const membershipObjectType = "membership" +const membershipLocalSecurityDomain = "local-security-domain" + +// Check the validity of each certificate chain in this membership +func validateMemberCertChains(membership *common.Membership) error { + for _, member := range membership.Members { + if len(member.Chain) > 1 { + err := verifyCertificateChain(nil, member.Chain) + if err != nil { + return fmt.Errorf("Certificate chain corresponding to member %+v in security domain %s is invalid: %s", member, membership.SecurityDomain, err) + } + } + } + return nil +} + +// Validate 'identity.Attestation' object against a message byte array +func validateAttestation(attestation *identity.Attestation, messageBytes string) error { + // Parse local IIN Agent's certificate + certDecoded, _ := pem.Decode([]byte(attestation.Certificate)) + if certDecoded == nil { + fmt.Printf("Unable to decode cert PEM: %s\n", attestation.Certificate) + } + cert, err := x509.ParseCertificate(certDecoded.Bytes) + if err != nil { + fmt.Printf("Unable to parse certificate: %s\n", attestation.Certificate) + } + // We assume the signature is base64-encoded as it is a string type in the 'Attestation' protobuf + decodedSignature, err := base64.StdEncoding.DecodeString(attestation.Signature) + if err != nil { + return fmt.Errorf("Attestation signature could not be decoded from base64: %s", err.Error()) + } + err = validateSignature(messageBytes, cert, string(decodedSignature)) + if err != nil { + return fmt.Errorf("Unable to Validate Signature: %s", err.Error()) + } + return nil +} + +// Parse 'identity.CounterAttestedMembership' object and extract structures +func parseCounterAttestedMembership(counterAttestedMembershipSerialized string) (*identity.CounterAttestedMembership, *identity.CounterAttestedMembership_AttestedMembershipSet, *common.Membership, error) { + counterAttestedMembership, err := decodeCounterAttestedMembership(counterAttestedMembershipSerialized) + if err != nil { + return nil, nil, nil, fmt.Errorf("Counter Attested Membership Unmarshal error: %s", err) + } + decodedAttestedMembershipSet, err := base64.StdEncoding.DecodeString(counterAttestedMembership.AttestedMembershipSet) + if err != nil { + return nil, nil, nil, fmt.Errorf("Attested membership set could not be decoded from base64: %s", err.Error()) + } + var attestedMembershipSet identity.CounterAttestedMembership_AttestedMembershipSet + err = protoV2.Unmarshal(decodedAttestedMembershipSet, &attestedMembershipSet) + if err != nil { + return nil, nil, nil, fmt.Errorf("Unable to unmarshal attested membership set: %s", err.Error()) + } + decodedForeignMembership, err := base64.StdEncoding.DecodeString(attestedMembershipSet.Membership) + if err != nil { + return nil, nil, nil, fmt.Errorf("Foreign membership could not be decoded from base64: %s", err.Error()) + } + var foreignMembership common.Membership + err = protoV2.Unmarshal(decodedForeignMembership, &foreignMembership) + if err != nil { + return nil, nil, nil, fmt.Errorf("Unable to unmarshal membership: %s", err.Error()) + } + return counterAttestedMembership, &attestedMembershipSet, &foreignMembership, nil +} + +// Validate 'identity.CounterAttestedMembership' object and its embedded structures +func validateCounterAttestedMembership(s *SmartContract, ctx contractapi.TransactionContextInterface, counterAttestedMembership *identity.CounterAttestedMembership, attestedMembershipSet *identity.CounterAttestedMembership_AttestedMembershipSet, foreignMembership *common.Membership) error { + var err error + + // Match nonces across all attestations, local and foreign + matchedNonce := "" + for _, attestation := range append(counterAttestedMembership.Attestations, attestedMembershipSet.Attestations...) { + if matchedNonce == "" { + matchedNonce = attestation.Nonce + } else { + if matchedNonce != attestation.Nonce { + return fmt.Errorf("Mismatched nonces across two attestations: %s, %s", matchedNonce, attestation.Nonce) + } + } + } + + // Ensure valid attestations from all local IIN Agents + for _, attestation := range counterAttestedMembership.Attestations { + err = validateAttestation(attestation, counterAttestedMembership.AttestedMembershipSet + attestation.Nonce) + if err != nil { + return err + } + } + + // Validate foreign membership cert chains + err = validateMemberCertChains(foreignMembership) + if err != nil { + return err + } + + // Ensure authentic and valid attestations from all foreign IIN Agents + for _, attestation := range attestedMembershipSet.Attestations { + if attestation.UnitIdentity.SecurityDomain != foreignMembership.SecurityDomain { + return fmt.Errorf("Foreign agent security domain %s does not match attested membership security domain %s", + attestation.UnitIdentity.SecurityDomain, foreignMembership.SecurityDomain) + } + attesterCert, err := parseCert(attestation.Certificate) + if err != nil { + return fmt.Errorf("Unable to parse attester certificate") + } + err = verifyMemberInSecurityDomain2(s, ctx, "", attesterCert, foreignMembership, attestation.UnitIdentity.MemberId) + if err != nil { + return fmt.Errorf("Attester with certificate %+v is not a designated IIN Agent of org %s in security domain %s: %+v", + attesterCert, attestation.UnitIdentity.MemberId, attestation.UnitIdentity.SecurityDomain, err) + } + // Validate signature + err = validateAttestation(attestation, attestedMembershipSet.Membership + attestation.Nonce) + if err != nil { + return err + } + } + + return nil +} + +// CreateLocalMembership cc is used to store the local security domain's Membership in the ledger +func (s *SmartContract) CreateLocalMembership(ctx contractapi.TransactionContextInterface, membershipJSON string) error { + // Check if the caller has network admin privileges + if isAdmin, err := wutils.IsClientNetworkAdmin(ctx); err != nil { + return fmt.Errorf("Admin client check error: %s", err) + } else if !isAdmin { + return fmt.Errorf("Caller not a network admin; access denied") + } + + membership, err := decodeMembership([]byte(membershipJSON)) + if err != nil { + return fmt.Errorf("Unmarshal error: %s", err) + } + + membershipLocalKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membershipLocalSecurityDomain}) + acp, getErr := ctx.GetStub().GetState(membershipLocalKey) + if getErr != nil { + return getErr + } + if acp != nil { + return fmt.Errorf("Membership already exists for local membership id: %s. Use 'UpdateLocalMembership' to update.", membershipLocalSecurityDomain) + } + + // Check if certificates chains in this membership record are valid + err = validateMemberCertChains(membership) + if err != nil { + return err + } + + membershipBytes, err := json.Marshal(membership) + if err != nil { + return fmt.Errorf("Marshal error: %s", err) + } + return ctx.GetStub().PutState(membershipLocalKey, membershipBytes) +} + +// UpdateLocalMembership cc is used to update the existing local security domain's Membership in the ledger +func (s *SmartContract) UpdateLocalMembership(ctx contractapi.TransactionContextInterface, membershipJSON string) error { + // Check if the caller has network admin privileges + if isAdmin, err := wutils.IsClientNetworkAdmin(ctx); err != nil { + return fmt.Errorf("Admin client check error: %+v", err) + } else if !isAdmin { + return fmt.Errorf("Caller not a network admin; access denied") + } + + membership, err := decodeMembership([]byte(membershipJSON)) + if err != nil { + return fmt.Errorf("Unmarshal error: %s", err) + } + + membershipLocalKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membershipLocalSecurityDomain}) + _, getErr := s.GetMembershipBySecurityDomain(ctx, membershipLocalSecurityDomain) + if getErr != nil { + return getErr + } + + // Check if certificates chains in this membership record are valid + err = validateMemberCertChains(membership) + if err != nil { + return err + } + + membershipBytes, err := json.Marshal(membership) + if err != nil { + return fmt.Errorf("Marshal error: %s", err) + } + return ctx.GetStub().PutState(membershipLocalKey, membershipBytes) + +} // CreateMembership cc is used to store a Membership in the ledger -// TODO: Should we check here if certificates are valid -func (s *SmartContract) CreateMembership(ctx contractapi.TransactionContextInterface, membershipJSON string) error { +// TODO: Remove call to 'createMembership' after creating Corda IIN Agents. +func (s *SmartContract) CreateMembership(ctx contractapi.TransactionContextInterface, counterAttestedMembershipSerialized string) error { + // Check if the caller has IIN agent privileges + if isIINAgent, err := wutils.IsClientIINAgent(ctx); err != nil { + return fmt.Errorf("IIN Agent client check error: %s", err) + } else if !isIINAgent { + // Check if the caller has network admin privileges + if isAdmin, err := wutils.IsClientNetworkAdmin(ctx); err != nil { + return fmt.Errorf("Admin client check error: %s", err) + } else if !isAdmin { + return fmt.Errorf("Caller neither a network admin nor an IIN Agent; access denied") + } + return createMembership(ctx, counterAttestedMembershipSerialized) // HACK to handle unattested memberships (for Corda) for backward compatibility + } + + // Check if caller is one of the authorized IIN agents + callerId := ctx.GetClientIdentity() + callerCert, err := callerId.GetX509Certificate() + if err != nil { + return err + } + callerMemberUnit, err := callerId.GetMSPID() + if err != nil { + return err + } + err = verifyMemberInSecurityDomain1(s, ctx, "", callerCert, membershipLocalSecurityDomain, callerMemberUnit) + if err != nil { + return fmt.Errorf("Caller with identity %+v is not a designated IIN Agent of org %s: %+v", callerId, callerMemberUnit, err) + } + + // Parse the counter attested membership structure and extract the relevant objects + counterAttestedMembership, attestedMembershipSet, foreignMembership, err := parseCounterAttestedMembership(counterAttestedMembershipSerialized) + if err != nil { + return err + } + + // Check presence of membership on ledger first + membershipKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{foreignMembership.SecurityDomain}) + acp, getErr := ctx.GetStub().GetState(membershipKey) + if getErr != nil { + return getErr + } + if acp != nil { + return fmt.Errorf("Membership already exists for membership id: %s. Use 'UpdateMembership' to update.", foreignMembership.SecurityDomain) + } + + // Validate the counter attested membership structure and the structures embedded in it + err = validateCounterAttestedMembership(s, ctx, counterAttestedMembership, attestedMembershipSet, foreignMembership) + if err != nil { + return err + } + + membershipBytes, err := json.Marshal(foreignMembership) + if err != nil { + return fmt.Errorf("Marshal error: %s", err) + } + return ctx.GetStub().PutState(membershipKey, membershipBytes) +} + +// createMembership is used by a network admin to store a Membership in the ledger with an unattested membership +// TODO: Remove this function after creating Corda IIN Agents. Retaining this temporarily for backward compatibility. +func createMembership(ctx contractapi.TransactionContextInterface, membershipJSON string) error { membership, err := decodeMembership([]byte(membershipJSON)) if err != nil { return fmt.Errorf("Unmarshal error: %s", err) } + // Check if certificates chains in this membership record are valid + err = validateMemberCertChains(membership) + if err != nil { + return err + } + membershipKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membership.SecurityDomain}) acp, getErr := ctx.GetStub().GetState(membershipKey) if getErr != nil { return getErr } if acp != nil { - return fmt.Errorf("Membership already exists for membership id: %s", membership.SecurityDomain) + return fmt.Errorf("Membership already exists for membership id: %s. Use 'UpdateMembership' to update.", membership.SecurityDomain) } membershipBytes, err := json.Marshal(membership) @@ -42,11 +303,76 @@ func (s *SmartContract) CreateMembership(ctx contractapi.TransactionContextInter } // UpdateMembership cc is used to update an existing Membership in the ledger -func (s *SmartContract) UpdateMembership(ctx contractapi.TransactionContextInterface, membershipJSON string) error { +// TODO: Remove call to 'updateMembership' after creating Corda IIN Agents. +func (s *SmartContract) UpdateMembership(ctx contractapi.TransactionContextInterface, counterAttestedMembershipSerialized string) error { + // Check if the caller has IIN agent privileges + if isIINAgent, err := wutils.IsClientIINAgent(ctx); err != nil { + return fmt.Errorf("IIN Agent client check error: %s", err) + } else if !isIINAgent { + // Check if the caller has network admin privileges + if isAdmin, err := wutils.IsClientNetworkAdmin(ctx); err != nil { + return fmt.Errorf("Admin client check error: %s", err) + } else if !isAdmin { + return fmt.Errorf("Caller neither a network admin nor an IIN Agent; access denied") + } + return updateMembership(s, ctx, counterAttestedMembershipSerialized) // HACK to handle unattested memberships (for Corda) for backward compatibility + } + + // Check if caller is one of the authorized IIN agents + callerId := ctx.GetClientIdentity() + callerCert, err := callerId.GetX509Certificate() + if err != nil { + return err + } + callerMemberUnit, err := callerId.GetMSPID() + if err != nil { + return err + } + err = verifyMemberInSecurityDomain1(s, ctx, "", callerCert, membershipLocalSecurityDomain, callerMemberUnit) + if err != nil { + return fmt.Errorf("Caller with identity %+v is not a designated IIN Agent: %+v", callerId, err) + } + + // Parse the counter attested membership structure and extract the relevant objects + counterAttestedMembership, attestedMembershipSet, foreignMembership, err := parseCounterAttestedMembership(counterAttestedMembershipSerialized) + if err != nil { + return err + } + + // Check presence of membership on ledger first + membershipKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{foreignMembership.SecurityDomain}) + _, getErr := s.GetMembershipBySecurityDomain(ctx, foreignMembership.SecurityDomain) + if getErr != nil { + return getErr + } + + // Validate the counter attested membership structure and the structures embedded in it + err = validateCounterAttestedMembership(s, ctx, counterAttestedMembership, attestedMembershipSet, foreignMembership) + if err != nil { + return err + } + + membershipBytes, err := json.Marshal(foreignMembership) + if err != nil { + return fmt.Errorf("Marshal error: %s", err) + } + return ctx.GetStub().PutState(membershipKey, membershipBytes) + +} + +// updateMembership is used by a network admin to update an existing Membership in the ledger with an unattested membership +// TODO: Remove this function after creating Corda IIN Agents. Retaining this temporarily for backward compatibility. +func updateMembership(s *SmartContract, ctx contractapi.TransactionContextInterface, membershipJSON string) error { membership, err := decodeMembership([]byte(membershipJSON)) if err != nil { return fmt.Errorf("Unmarshal error: %s", err) } + // Check if certificates chains in this membership record are valid + err = validateMemberCertChains(membership) + if err != nil { + return err + } + membershipKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membership.SecurityDomain}) _, getErr := s.GetMembershipBySecurityDomain(ctx, membership.SecurityDomain) if getErr != nil { @@ -61,8 +387,40 @@ func (s *SmartContract) UpdateMembership(ctx contractapi.TransactionContextInter } +// DeleteLocalMembership cc is used to delete the local security domain Membership in the ledger +func (s *SmartContract) DeleteLocalMembership(ctx contractapi.TransactionContextInterface) error { + // Check if the caller has network admin privileges + if isAdmin, err := wutils.IsClientNetworkAdmin(ctx); err != nil { + return fmt.Errorf("Admin client check error: %s", err) + } else if !isAdmin { + return fmt.Errorf("Caller not a network admin; access denied") + } + + membershipLocalKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membershipLocalSecurityDomain}) + bytes, err := ctx.GetStub().GetState(membershipLocalKey) + if err != nil { + return err + } + if bytes == nil { + return fmt.Errorf("Local membership with id: %s does not exist", membershipLocalSecurityDomain) + } + err = ctx.GetStub().DelState(membershipLocalKey) + if err != nil { + return fmt.Errorf("failed to delete asset %s: %v", membershipLocalKey, err) + } + + return nil +} + // DeleteMembership cc is used to delete an existing Membership in the ledger func (s *SmartContract) DeleteMembership(ctx contractapi.TransactionContextInterface, membershipID string) error { + // Check if the caller has IIN agent privileges + if isIINAgent, err := wutils.IsClientIINAgent(ctx); err != nil { + return fmt.Errorf("IIN Agent client check error: %s", err) + } else if !isIINAgent { + return fmt.Errorf("Caller not an IIN Agent; access denied") + } + membershipKey, err := ctx.GetStub().CreateCompositeKey(membershipObjectType, []string{membershipID}) bytes, err := ctx.GetStub().GetState(membershipKey) if err != nil { @@ -96,11 +454,21 @@ func (s *SmartContract) GetMembershipBySecurityDomain(ctx contractapi.Transactio // verifyMemberInSecurityDomain function verifies the identity of the requester according to // the Membership for the external network the request originated from. -func verifyMemberInSecurityDomain(s *SmartContract, ctx contractapi.TransactionContextInterface, cert *x509.Certificate, securityDomain string, requestingOrg string) error { - err := isCertificateWithinExpiry(cert) +// This takes a certificate encoded in PEM format as argument. +// It assumes that the relevant membership info is on the ledger. +func verifyMemberInSecurityDomain(s *SmartContract, ctx contractapi.TransactionContextInterface, certPEM string, securityDomain string, requestingOrg string) error { + cert, err := parseCert(certPEM) if err != nil { - return err + return fmt.Errorf("Unable to parse certificate: %s", err.Error()) } + return verifyMemberInSecurityDomain1(s, ctx, certPEM, cert, securityDomain, requestingOrg) +} + +// verifyMemberInSecurityDomain1 function verifies the identity of the requester according to +// the Membership for the external network the request originated from. +// This takes a decoded X.509 certificate as argument (and optionally the certificate in PEM format too). +// It assumes that the relevant membership info is on the ledger. +func verifyMemberInSecurityDomain1(s *SmartContract, ctx contractapi.TransactionContextInterface, certPEM string, cert *x509.Certificate, securityDomain string, requestingOrg string) error { membershipString, err := s.GetMembershipBySecurityDomain(ctx, securityDomain) if err != nil { return err @@ -109,16 +477,32 @@ func verifyMemberInSecurityDomain(s *SmartContract, ctx contractapi.TransactionC if err != nil { return fmt.Errorf("Failed to unmarshal membership: %s", err.Error()) } + return verifyMemberInSecurityDomain2(s, ctx, certPEM, cert, membership, requestingOrg) +} + +// verifyMemberInSecurityDomain2 function verifies the identity of the requester according to +// the Membership for the external network the request originated from. +// This takes a decoded X.509 certificate as argument (and optionally the certificate in PEM format too). +// It takes a membership structure as argument. +func verifyMemberInSecurityDomain2(s *SmartContract, ctx contractapi.TransactionContextInterface, certPEM string, cert *x509.Certificate, membership *common.Membership, requestingOrg string) error { + err := isCertificateWithinExpiry(cert) + if err != nil { + return err + } member, ok := membership.Members[requestingOrg] if ok == false { return fmt.Errorf("Member does not exist for org: %s", requestingOrg) } switch member.Type { case "ca": - // TODO: Add check for if cert and member.Value are the same verifyCaCertificate(cert, member.Value, true) - err := verifyCaCertificate(cert, member.Value) - if err != nil { - return err + if member.Value == "" { + return fmt.Errorf("CA member certificate is blank") + } + if certPEM != member.Value { // The CA is automatically a member of the security domain + err := verifyCaCertificate(cert, member.Value) + if err != nil { + return err + } } case "certificate": chain := member.Chain diff --git a/core/network/fabric-interop-cc/contracts/interop/membership_test.go b/core/network/fabric-interop-cc/contracts/interop/membership_test.go index c3a457f66..127ef773a 100644 --- a/core/network/fabric-interop-cc/contracts/interop/membership_test.go +++ b/core/network/fabric-interop-cc/contracts/interop/membership_test.go @@ -8,8 +8,13 @@ package main import ( "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" "crypto/x509" "crypto/x509/pkix" + "encoding/base64" "encoding/json" "encoding/pem" "fmt" @@ -17,46 +22,298 @@ import ( "testing" "time" + "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils/mocks" "github.com/stretchr/testify/require" "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" + "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/identity" + protoV2 "google.golang.org/protobuf/proto" wtest "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils" ) -var member = common.Member{ - Value: "membervalue", - Type: "membertype", - Chain: []string{"chain"}, +var securityDomainId = "2345" +var foreignMemberId1 = "foreign-member1" +var foreignMemberId2 = "foreign-member2" +var localSecurityDomainId = "6789" +var localMemberId1 = "local-member1" +var localMemberId2 = "local-member2" +var nonce = "nonce" + +func getMembership() (common.Member, common.Member) { + member1 := common.Member{ + Value: "", + Type: "certificate", + Chain: []string{"chain1"}, + } + + member2 := common.Member{ + Value: "", + Type: "certificate", + Chain: []string{"chain2"}, + } + + return member1, member2 +} + +func publicKey(priv interface{}) interface{} { + switch k := priv.(type) { + case *rsa.PrivateKey: + return &k.PublicKey + case *ecdsa.PrivateKey: + return &k.PublicKey + default: + return nil + } +} + +func createX509Certificate(caCert *x509.Certificate, caCertPrivKey *ecdsa.PrivateKey) ([]byte, *ecdsa.PrivateKey, error) { + var priv, privKey interface{} + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate serial number: %s", err) + } + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{"Hyperledger"}, + }, + NotBefore: time.Now(), + NotAfter: time.Now().AddDate(1, 0, 0), // 1 year expiry duration + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + BasicConstraintsValid: true, + SignatureAlgorithm: x509.ECDSAWithSHA384, + //SignatureAlgorithm: x509.ECDSAWithSHA256, + } + priv, err = ecdsa.GenerateKey(elliptic.P384(), rand.Reader) + //priv, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if caCertPrivKey == nil { + privKey = priv + } else { + privKey = caCertPrivKey + } + var newCertBytes []byte + // the 'x509.CreateCertificate' function returns the certificate data in asn1 form. + if caCert == nil { + newCertBytes, err = x509.CreateCertificate(rand.Reader, &template, &template, publicKey(priv), privKey) + } else { + newCertBytes, err = x509.CreateCertificate(rand.Reader, &template, caCert, publicKey(priv), privKey) + } + if err != nil { + return nil, nil, fmt.Errorf("failed to create certificate: %s", err) + } + + return newCertBytes, priv.(*ecdsa.PrivateKey), err } -var membershipAsset = common.Membership{ - SecurityDomain: "2345", - Members: map[string]*common.Member{"member1": &member}, +func x509CertToPem(certBytes []byte) (string, error) { + certBlock := &pem.Block{ Type: "CERTIFICATE", Bytes: certBytes } + var certBuf bytes.Buffer + err := pem.Encode(&certBuf, certBlock) + if err != nil { + return "", fmt.Errorf("failed to encode in PEM format: %s", err) + } + return certBuf.String(), err +} + +func generateCertChain(length int) ([]string, []*ecdsa.PrivateKey, error) { + var certChain = make([]string, length) + var keyChain = make([]*ecdsa.PrivateKey, length) + caCertBytes, caKey, err := createX509Certificate(nil, nil) + keyChain[0] = caKey + if err != nil { + return []string{}, []*ecdsa.PrivateKey{}, err + } + caCert, _ := x509.ParseCertificate(caCertBytes) + certChain[0], err = x509CertToPem(caCertBytes) + if err != nil { + return []string{}, []*ecdsa.PrivateKey{}, err + } + for i := 1; i < length; i++ { + certBytes, key, err := createX509Certificate(caCert, caKey) + if err != nil { + return []string{}, []*ecdsa.PrivateKey{}, err + } + caKey = key + keyChain[i] = key + caCert, _ = x509.ParseCertificate(certBytes) + certChain[i], err = x509CertToPem(certBytes) + if err != nil { + return []string{}, []*ecdsa.PrivateKey{}, err + } + } + return certChain, keyChain, nil } func TestGetMembershipBySecurityDomain(t *testing.T) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ "member1": &member1, "member2": &member2}, + } + // Case when no Membership is found - acString, getError := interopcc.GetMembershipBySecurityDomain(ctx, "2345") - require.EqualError(t, getError, fmt.Sprintf("Membership with id: %s does not exist", "2345")) + acString, getError := interopcc.GetMembershipBySecurityDomain(ctx, securityDomainId) + require.EqualError(t, getError, fmt.Sprintf("Membership with id: %s does not exist", securityDomainId)) require.Equal(t, acString, "") value, err := json.Marshal(&membershipAsset) require.NoError(t, err) chaincodeStub.GetStateReturns(value, nil) // Case when Membership is found - assetRead, err := interopcc.GetMembershipBySecurityDomain(ctx, "2345") + assetRead, err := interopcc.GetMembershipBySecurityDomain(ctx, securityDomainId) require.NoError(t, err) require.Equal(t, assetRead, string(value)) } -func TestCreateMembership(t *testing.T) { +func setClientAdmin(attr string) (string, bool, error) { + if attr == "network-admin" { + return "", true, nil + } else { + return "", false, nil + } +} + +func setClientIINAgent(attr string) (string, bool, error) { + if attr == "iin-agent" { + return "", true, nil + } else { + return "", false, nil + } +} + +func TestCreateLocalMembership(t *testing.T) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ "member1": &member1, "member2": &member2}, + } + membershipBytes, err := json.Marshal(&membershipAsset) require.NoError(t, err) - // Case when no a Membership is found + + // Case when caller is not an admin + err = interopcc.CreateLocalMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, "Caller not a network admin; access denied") + // Case when no Membership is found + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.CreateLocalMembership(ctx, string(membershipBytes)) + require.NoError(t, err) + + // Valid cert chain + member := &member1 + member.Chain, _, _ = generateCertChain(3) + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.CreateLocalMembership(ctx, string(membershipBytes)) + require.NoError(t, err) + + // Invalid cert chain + cert_0 := member.Chain[0] + member.Chain[0] = member.Chain[2] + member.Chain[2] = cert_0 + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.CreateLocalMembership(ctx, string(membershipBytes)) + require.Error(t, err) + + // Invalid Input check + cert_0 = member.Chain[0] + member.Chain[0] = member.Chain[2] + member.Chain[2] = cert_0 + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.CreateLocalMembership(ctx, "Invalid Input") + require.EqualError(t, err, fmt.Sprintf("Unmarshal error: invalid character 'I' looking for beginning of value")) + // Membership already exists + chaincodeStub.GetStateReturns([]byte{}, nil) + err = interopcc.CreateLocalMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, fmt.Sprintf("Membership already exists for local membership id: %s. Use 'UpdateLocalMembership' to update.", membershipLocalSecurityDomain)) +} + +func TestUpdateLocalMembership(t *testing.T) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ "member1": &member1, "member2": &member2}, + } + + membershipBytes, err := json.Marshal(&membershipAsset) + require.NoError(t, err) + + // Case when caller is not an admin + err = interopcc.UpdateLocalMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, "Caller not a network admin; access denied") + // Case when no Membership is found + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.UpdateLocalMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", membershipLocalSecurityDomain)) + + // Valid cert chain + member := &member1 + member.Chain, _, _ = generateCertChain(3) + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.UpdateLocalMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", membershipLocalSecurityDomain)) + + // Membership already exists update the Membership + chaincodeStub.GetStateReturns(membershipBytes, nil) + err = interopcc.UpdateLocalMembership(ctx, string(membershipBytes)) + require.NoError(t, err) + + // Invalid cert chain + cert_0 := member.Chain[0] + member.Chain[0] = member.Chain[2] + member.Chain[2] = cert_0 + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.UpdateLocalMembership(ctx, string(membershipBytes)) + require.Error(t, err) + + // Invalid Input check + cert_0 = member.Chain[0] + member.Chain[0] = member.Chain[2] + member.Chain[2] = cert_0 + membershipBytes, err = json.Marshal(&membershipAsset) + require.NoError(t, err) + err = interopcc.UpdateLocalMembership(ctx, "Invalid Input") + require.EqualError(t, err, fmt.Sprintf("Unmarshal error: invalid character 'I' looking for beginning of value")) +} + +// TODO: Remove later. Keeping for backward compatibility. +func TestCreateMembershipUnattested(t *testing.T) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ "member1": &member1, "member2": &member2}, + } + + membershipBytes, err := json.Marshal(&membershipAsset) + require.NoError(t, err) + + // Case when caller is not an admin + err = interopcc.CreateMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, "Caller neither a network admin nor an IIN Agent; access denied") + // Case when no Membership is found + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) err = interopcc.CreateMembership(ctx, string(membershipBytes)) require.NoError(t, err) // Invalid Input check @@ -65,45 +322,766 @@ func TestCreateMembership(t *testing.T) { // Membership already exists chaincodeStub.GetStateReturns([]byte{}, nil) err = interopcc.CreateMembership(ctx, string(membershipBytes)) - require.EqualError(t, err, fmt.Sprintf("Membership already exists for membership id: %s", membershipAsset.SecurityDomain)) + require.EqualError(t, err, fmt.Sprintf("Membership already exists for membership id: %s. Use 'UpdateMembership' to update.", membershipAsset.SecurityDomain)) } -func TestUpdateMembership(t *testing.T) { +func TestCreateMembership(t *testing.T) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ foreignMemberId1: &member1, foreignMemberId2: &member2}, + } + + // Generate foreign network member 1 CA structure and client credentials + certChain1, keys1, _ := generateCertChain(3) + member1.Chain = certChain1 + decodedCert1, _ := pem.Decode([]byte(member1.Chain[2])) + cert1, _ := x509.ParseCertificate(decodedCert1.Bytes) + certBytes1, key1, err := createX509Certificate(cert1, keys1[2]) + certPem1, _ := x509CertToPem(certBytes1) + attestation1 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: securityDomainId, + MemberId: foreignMemberId1, + }, + Certificate: certPem1, + Signature: "", + Nonce: nonce, + } + // Generate foreign network member 2 CA structure and client credentials + certChain2, keys2, _ := generateCertChain(3) + member2.Chain = certChain2 + decodedCert2, _ := pem.Decode([]byte(member2.Chain[2])) + cert2, _ := x509.ParseCertificate(decodedCert2.Bytes) + certBytes2, key2, err := createX509Certificate(cert2, keys2[2]) + certPem2, _ := x509CertToPem(certBytes2) + attestation2 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: securityDomainId, + MemberId: foreignMemberId2, + }, + Certificate: certPem2, + Signature: "", + Nonce: nonce, + } + // Marshal membership for signature + membershipBytesPlain, err := protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr := base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce := []byte(membershipBytesStr + nonce) + // Generate member 2 attestation + random1 := rand.Reader + hashed1, err := computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err := ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + // Generate member 2 attestation + random2 := rand.Reader + hashed2, err := computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err := ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + // Generate attested foreign membership + attestedMembershipSet := identity.CounterAttestedMembership_AttestedMembershipSet { + Membership: membershipBytesStr, + Attestations: []*identity.Attestation{&attestation1, &attestation2}, + } + + // Generate local members + localCertChain1, localKeyChain1, _ := generateCertChain(3) + localMember1 := common.Member{ + Value: "", + Type: "certificate", + Chain: localCertChain1, + } + localCertChain2, localKeyChain2, _ := generateCertChain(3) + localMember2 := common.Member{ + Value: "", + Type: "certificate", + Chain: localCertChain2, + } + localMembershipAsset := common.Membership{ + SecurityDomain: localSecurityDomainId, + Members: map[string]*common.Member{ localMemberId1: &localMember1, localMemberId2: &localMember2}, + } + + // Generate local attesters + decodedLocalCert1, _ := pem.Decode([]byte(localCertChain1[2])) + certLocal1, _ := x509.ParseCertificate(decodedLocalCert1.Bytes) + certLocalBytes1, keyLocal1, err := createX509Certificate(certLocal1, localKeyChain1[2]) + certLocalPem1, _ := x509CertToPem(certLocalBytes1) + attestationLocal1 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: localSecurityDomainId, + MemberId: localMemberId1, + }, + Certificate: certLocalPem1, + Signature: "", + Nonce: nonce, + } + decodedLocalCert2, _ := pem.Decode([]byte(localCertChain2[2])) + certLocal2, _ := x509.ParseCertificate(decodedLocalCert2.Bytes) + certLocalBytes2, keyLocal2, err := createX509Certificate(certLocal2, localKeyChain2[2]) + certLocalPem2, _ := x509CertToPem(certLocalBytes2) + attestationLocal2 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: localSecurityDomainId, + MemberId: localMemberId2, + }, + Certificate: certLocalPem2, + Signature: "", + Nonce: nonce, + } + // Marshal attested membership set for signature + attestedMembershipSetBytesPlain, err := protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr := base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce := []byte(attestedMembershipSetBytesStr + nonce) + // Generate member 2 attestation + randomLocal1 := rand.Reader + hashedLocal1, err := computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err := ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + // Generate member 2 attestation + randomLocal2 := rand.Reader + hashedLocal2, err := computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err := ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + // Generate counter attested foreign membership + counterAttestedMembership := identity.CounterAttestedMembership{ + AttestedMembershipSet: attestedMembershipSetBytesStr, + Attestations: []*identity.Attestation{&attestationLocal1, &attestationLocal2}, + } + + // Record membership info: should fail because the caller is not an IIN Agent + counterAttestedMembershipBytesPlain, err := protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes := base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Caller neither a network admin nor an IIN Agent; access denied") + + // Record membership info: should fail because the local IIN Agent is not registered + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientIINAgent) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.Error(t, err) + + // Record local membership info + localMembershipBytes, err := json.Marshal(&localMembershipAsset) + require.NoError(t, err) + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.CreateLocalMembership(ctx, string(localMembershipBytes)) + require.NoError(t, err) + + // Record membership info: should succeed now + chaincodeStub.GetStateReturnsOnCall(2, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(3, nil, nil) + clientIdentity.GetAttributeValueCalls(setClientIINAgent) + certLocalAgent2, _ := x509.ParseCertificate(certLocalBytes2) + clientIdentity.GetX509CertificateReturns(certLocalAgent2, nil) + clientIdentity.GetMSPIDReturns(localMemberId2, nil) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.NoError(t, err) + + // Record membership info again: should fail because membership has already been recorded against this security domain + chaincodeStub.GetStateReturnsOnCall(4, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(5, []byte{}, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Membership already exists for membership id: %s. Use 'UpdateMembership' to update.", membershipAsset.SecurityDomain)) + + // One of the local signatures is invalid: should fail + hashedLocal2, err = computeSHA2Hash([]byte("invalid"), keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(6, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(7, nil, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Unable to Validate Signature: Signature Verification failed. ECDSA VERIFY") + + // One of the foreign signatures is invalid: should fail + hashed2, err = computeSHA2Hash([]byte("invalid"), key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(8, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(9, nil, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Unable to Validate Signature: Signature Verification failed. ECDSA VERIFY") + + // One of the foreign attestations has an invalid nonce: should fail + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestation1.Nonce = "invalid-nonce" + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(10, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(11, nil, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Mismatched nonces across two attestations: %s, %s", nonce, attestation1.Nonce)) + + // Foreign membership has an invalid cert chain: should fail + attestation1.Nonce = nonce + tmpCert := member1.Chain[0] + member1.Chain[0] = member1.Chain[1] + member1.Chain[1] = tmpCert + membershipBytesPlain, err = protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr = base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce = []byte(membershipBytesStr + nonce) + hashed1, err = computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err = ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSet.Membership = membershipBytesStr + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(12, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(13, nil, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.Error(t, err) + + // Foreign attestation has invalid security domain: should fail + tmpCert = member1.Chain[0] + member1.Chain[0] = member1.Chain[1] + member1.Chain[1] = tmpCert + membershipAsset.SecurityDomain = "invalid" + membershipBytesPlain, err = protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr = base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce = []byte(membershipBytesStr + nonce) + hashed1, err = computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err = ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSet.Membership = membershipBytesStr + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(14, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(15, nil, nil) + err = interopcc.CreateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Foreign agent security domain %s does not match attested membership security domain invalid", securityDomainId)) +} + +// TODO: Remove later. Keeping for backward compatibility. +func TestUpdateMembershipUnattested(t *testing.T) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ "member1": &member1, "member2": &member2}, + } + membershipBytes, err := json.Marshal(&membershipAsset) require.NoError(t, err) + + // Case when caller is not an admin + err = interopcc.UpdateMembership(ctx, string(membershipBytes)) + require.EqualError(t, err, "Caller neither a network admin nor an IIN Agent; access denied") + // Case when no Membership is found + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) err = interopcc.UpdateMembership(ctx, string(membershipBytes)) require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", membershipAsset.SecurityDomain)) // Invalid Input check - chaincodeStub.GetStateReturns(membershipBytes, nil) + chaincodeStub.GetStateReturns([]byte{}, nil) err = interopcc.UpdateMembership(ctx, "Invalid Input") require.EqualError(t, err, fmt.Sprintf("Unmarshal error: invalid character 'I' looking for beginning of value")) - - // Membership already exists update the Membership - chaincodeStub.GetStateReturns(membershipBytes, nil) + // Membership already exists; Update it + chaincodeStub.GetStateReturns([]byte{}, nil) err = interopcc.UpdateMembership(ctx, string(membershipBytes)) require.NoError(t, err) } +func TestUpdateMembership(t *testing.T) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + + member1, member2 := getMembership() + membershipAsset := common.Membership{ + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{ foreignMemberId1: &member1, foreignMemberId2: &member2}, + } + + // Generate foreign network member 1 CA structure and client credentials + certChain1, keys1, _ := generateCertChain(3) + member1.Chain = certChain1 + decodedCert1, _ := pem.Decode([]byte(member1.Chain[2])) + cert1, _ := x509.ParseCertificate(decodedCert1.Bytes) + certBytes1, key1, err := createX509Certificate(cert1, keys1[2]) + certPem1, _ := x509CertToPem(certBytes1) + attestation1 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: securityDomainId, + MemberId: foreignMemberId1, + }, + Certificate: certPem1, + Signature: "", + Nonce: nonce, + } + // Generate foreign network member 2 CA structure and client credentials + certChain2, keys2, _ := generateCertChain(3) + member2.Chain = certChain2 + decodedCert2, _ := pem.Decode([]byte(member2.Chain[2])) + cert2, _ := x509.ParseCertificate(decodedCert2.Bytes) + certBytes2, key2, err := createX509Certificate(cert2, keys2[2]) + certPem2, _ := x509CertToPem(certBytes2) + attestation2 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: securityDomainId, + MemberId: foreignMemberId2, + }, + Certificate: certPem2, + Signature: "", + Nonce: nonce, + } + // Marshal membership for signature + membershipBytesPlain, err := protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr := base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce := []byte(membershipBytesStr + nonce) + // Generate member 2 attestation + random1 := rand.Reader + hashed1, err := computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err := ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + // Generate member 2 attestation + random2 := rand.Reader + hashed2, err := computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err := ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + // Generate attested foreign membership + attestedMembershipSet := identity.CounterAttestedMembership_AttestedMembershipSet { + Membership: membershipBytesStr, + Attestations: []*identity.Attestation{&attestation1, &attestation2}, + } + + // Generate local members + localCertChain1, localKeyChain1, _ := generateCertChain(3) + localMember1 := common.Member{ + Value: "", + Type: "certificate", + Chain: localCertChain1, + } + localCertChain2, localKeyChain2, _ := generateCertChain(3) + localMember2 := common.Member{ + Value: "", + Type: "certificate", + Chain: localCertChain2, + } + localMembershipAsset := common.Membership{ + SecurityDomain: localSecurityDomainId, + Members: map[string]*common.Member{ localMemberId1: &localMember1, localMemberId2: &localMember2}, + } + + // Generate local attesters + decodedLocalCert1, _ := pem.Decode([]byte(localCertChain1[2])) + certLocal1, _ := x509.ParseCertificate(decodedLocalCert1.Bytes) + certLocalBytes1, keyLocal1, err := createX509Certificate(certLocal1, localKeyChain1[2]) + certLocalPem1, _ := x509CertToPem(certLocalBytes1) + attestationLocal1 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: localSecurityDomainId, + MemberId: localMemberId1, + }, + Certificate: certLocalPem1, + Signature: "", + Nonce: nonce, + } + decodedLocalCert2, _ := pem.Decode([]byte(localCertChain2[2])) + certLocal2, _ := x509.ParseCertificate(decodedLocalCert2.Bytes) + certLocalBytes2, keyLocal2, err := createX509Certificate(certLocal2, localKeyChain2[2]) + certLocalPem2, _ := x509CertToPem(certLocalBytes2) + attestationLocal2 := identity.Attestation { + UnitIdentity: &identity.SecurityDomainMemberIdentity { + SecurityDomain: localSecurityDomainId, + MemberId: localMemberId2, + }, + Certificate: certLocalPem2, + Signature: "", + Nonce: nonce, + } + // Marshal attested membership set for signature + attestedMembershipSetBytesPlain, err := protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr := base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce := []byte(attestedMembershipSetBytesStr + nonce) + // Generate member 2 attestation + randomLocal1 := rand.Reader + hashedLocal1, err := computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err := ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + // Generate member 2 attestation + randomLocal2 := rand.Reader + hashedLocal2, err := computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err := ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + // Generate counter attested foreign membership + counterAttestedMembership := identity.CounterAttestedMembership{ + AttestedMembershipSet: attestedMembershipSetBytesStr, + Attestations: []*identity.Attestation{&attestationLocal1, &attestationLocal2}, + } + + // Record membership info: should fail because the caller is not an IIN Agent + counterAttestedMembershipBytesPlain, err := protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes := base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + require.NoError(t, err) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Caller neither a network admin nor an IIN Agent; access denied") + + // Record membership info: should fail because the local IIN Agent is not registered + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientIINAgent) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.Error(t, err) + + // Record local membership info + localMembershipBytes, err := json.Marshal(&localMembershipAsset) + require.NoError(t, err) + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.CreateLocalMembership(ctx, string(localMembershipBytes)) + require.NoError(t, err) + + // Record membership info: should fail because membership has not been recorded previously + chaincodeStub.GetStateReturnsOnCall(2, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(3, nil, nil) + clientIdentity.GetAttributeValueCalls(setClientIINAgent) + certLocalAgent2, _ := x509.ParseCertificate(certLocalBytes2) + clientIdentity.GetX509CertificateReturns(certLocalAgent2, nil) + clientIdentity.GetMSPIDReturns(localMemberId2, nil) + ctx.GetClientIdentityReturns(clientIdentity) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", securityDomainId)) + + // Record membership info again: should succeed now + chaincodeStub.GetStateReturnsOnCall(4, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(5, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.NoError(t, err) + + // One of the local signatures is invalid: should fail + hashedLocal2, err = computeSHA2Hash([]byte("invalid"), keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(6, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(7, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Unable to Validate Signature: Signature Verification failed. ECDSA VERIFY") + + // One of the foreign signatures is invalid: should fail + hashed2, err = computeSHA2Hash([]byte("invalid"), key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(8, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(9, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, "Unable to Validate Signature: Signature Verification failed. ECDSA VERIFY") + + // One of the foreign attestations has an invalid nonce: should fail + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestation1.Nonce = "invalid-nonce" + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(10, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(11, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Mismatched nonces across two attestations: %s, %s", nonce, attestation1.Nonce)) + + // Foreign membership has an invalid cert chain: should fail + attestation1.Nonce = nonce + tmpCert := member1.Chain[0] + member1.Chain[0] = member1.Chain[1] + member1.Chain[1] = tmpCert + membershipBytesPlain, err = protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr = base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce = []byte(membershipBytesStr + nonce) + hashed1, err = computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err = ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSet.Membership = membershipBytesStr + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(12, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(13, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.Error(t, err) + + // Foreign attestation has invalid security domain: should fail + tmpCert = member1.Chain[0] + member1.Chain[0] = member1.Chain[1] + member1.Chain[1] = tmpCert + membershipAsset.SecurityDomain = "invalid" + membershipBytesPlain, err = protoV2.Marshal(&membershipAsset) + require.NoError(t, err) + membershipBytesStr = base64.StdEncoding.EncodeToString(membershipBytesPlain) + membershipBytesWithNonce = []byte(membershipBytesStr + nonce) + hashed1, err = computeSHA2Hash(membershipBytesWithNonce, key1.PublicKey.Params().BitSize) + require.NoError(t, err) + signature1, err = ecdsa.SignASN1(random1, key1, hashed1) + require.NoError(t, err) + attestation1.Signature = base64.StdEncoding.EncodeToString(signature1) + hashed2, err = computeSHA2Hash(membershipBytesWithNonce, key2.PublicKey.Params().BitSize) + require.NoError(t, err) + signature2, err = ecdsa.SignASN1(random2, key2, hashed2) + require.NoError(t, err) + attestation2.Signature = base64.StdEncoding.EncodeToString(signature2) + attestedMembershipSet.Membership = membershipBytesStr + attestedMembershipSetBytesPlain, err = protoV2.Marshal(&attestedMembershipSet) + require.NoError(t, err) + attestedMembershipSetBytesStr = base64.StdEncoding.EncodeToString(attestedMembershipSetBytesPlain) + attestedMembershipSetBytesWithNonce = []byte(attestedMembershipSetBytesStr + nonce) + hashedLocal1, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal1.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal1, err = ecdsa.SignASN1(randomLocal1, keyLocal1, hashedLocal1) + require.NoError(t, err) + attestationLocal1.Signature = base64.StdEncoding.EncodeToString(signatureLocal1) + hashedLocal2, err = computeSHA2Hash(attestedMembershipSetBytesWithNonce, keyLocal2.PublicKey.Params().BitSize) + require.NoError(t, err) + signatureLocal2, err = ecdsa.SignASN1(randomLocal2, keyLocal2, hashedLocal2) + require.NoError(t, err) + attestationLocal2.Signature = base64.StdEncoding.EncodeToString(signatureLocal2) + counterAttestedMembership.AttestedMembershipSet = attestedMembershipSetBytesStr + counterAttestedMembershipBytesPlain, err = protoV2.Marshal(&counterAttestedMembership) + require.NoError(t, err) + counterAttestedMembershipBytes = base64.StdEncoding.EncodeToString(counterAttestedMembershipBytesPlain) + chaincodeStub.GetStateReturnsOnCall(14, localMembershipBytes, nil) + chaincodeStub.GetStateReturnsOnCall(15, []byte{}, nil) + err = interopcc.UpdateMembership(ctx, counterAttestedMembershipBytes) + require.EqualError(t, err, fmt.Sprintf("Foreign agent security domain %s does not match attested membership security domain invalid", securityDomainId)) +} + +func TestDeleteLocalMembership(t *testing.T) { + ctx, chaincodeStub := wtest.PrepMockStub() + interopcc := SmartContract{} + + // Case when caller is not an IIN Agent + err := interopcc.DeleteLocalMembership(ctx) + require.EqualError(t, err, "Caller not a network admin; access denied") + + // Case when a Membership exists + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientAdmin) + ctx.GetClientIdentityReturns(clientIdentity) + chaincodeStub.GetStateReturns([]byte{}, nil) + err = interopcc.DeleteLocalMembership(ctx) + require.NoError(t, err) + + // Case when no Membership is found + chaincodeStub.GetStateReturns(nil, nil) + err = interopcc.DeleteLocalMembership(ctx) + require.EqualError(t, err, fmt.Sprintf("Local membership with id: %s does not exist", membershipLocalSecurityDomain)) + + // Handle GetState Error + chaincodeStub.GetStateReturns(nil, fmt.Errorf("unable to retrieve asset")) + err = interopcc.DeleteLocalMembership(ctx) + require.EqualError(t, err, fmt.Sprintf("unable to retrieve asset")) +} + func TestDeleteMembership(t *testing.T) { ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} + // Case when caller is not an IIN Agent + err := interopcc.DeleteMembership(ctx, securityDomainId) + require.EqualError(t, err, "Caller not an IIN Agent; access denied") + // Case when a Membership exists + clientIdentity := &mocks.ClientIdentity{} + clientIdentity.GetAttributeValueCalls(setClientIINAgent) + ctx.GetClientIdentityReturns(clientIdentity) chaincodeStub.GetStateReturns([]byte{}, nil) - err := interopcc.DeleteMembership(ctx, "2343") + err = interopcc.DeleteMembership(ctx, securityDomainId) require.NoError(t, err) // Case when no Membership is found chaincodeStub.GetStateReturns(nil, nil) - err = interopcc.DeleteMembership(ctx, "2343") - require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", "2343")) + err = interopcc.DeleteMembership(ctx, securityDomainId) + require.EqualError(t, err, fmt.Sprintf("Membership with id: %s does not exist", securityDomainId)) // Handle GetState Error chaincodeStub.GetStateReturns(nil, fmt.Errorf("unable to retrieve asset")) - err = interopcc.DeleteMembership(ctx, "2343") + err = interopcc.DeleteMembership(ctx, securityDomainId) require.EqualError(t, err, fmt.Sprintf("unable to retrieve asset")) } @@ -120,8 +1098,8 @@ func TestVerifyMembership(t *testing.T) { Subject: pkix.Name{ CommonName: "example-a.com", }, - NotBefore: now.Add(-threeDays), - NotAfter: now.Add(threeDays), + NotBefore: now.Add(-threeDays), + NotAfter: now.Add(threeDays), SerialNumber: big.NewInt(1337), } @@ -136,6 +1114,7 @@ func TestVerifyMembership(t *testing.T) { // convert pem cert to x509 cert x509Cert, err := parseCert(string(pemCert)) require.NoError(t, err) + require.NotNil(t, x509Cert) // make membership var member = common.Member{ @@ -145,8 +1124,8 @@ func TestVerifyMembership(t *testing.T) { } var membershipAsset = common.Membership{ - SecurityDomain: "2345", - Members: map[string]*common.Member{"member1": &member}, + SecurityDomain: securityDomainId, + Members: map[string]*common.Member{"member1": &member}, } membershipBytes, err := json.Marshal(&membershipAsset) require.NoError(t, err) @@ -155,11 +1134,11 @@ func TestVerifyMembership(t *testing.T) { // Test: Happy case chaincodeStub.GetStateReturns(membershipBytes, nil) - err = verifyMemberInSecurityDomain(&interopcc, ctx, x509Cert, "test", "member1") + err = verifyMemberInSecurityDomain(&interopcc, ctx, string(pemCert), "test", "member1") require.NoError(t, err) // Test: Unknown requesting Org - err = verifyMemberInSecurityDomain(&interopcc, ctx, x509Cert, "test", "unknown_member") + err = verifyMemberInSecurityDomain(&interopcc, ctx, string(pemCert), "test", "unknown_member") require.EqualError(t, err, "Member does not exist for org: unknown_member") // Test: Unknown cert type @@ -167,6 +1146,6 @@ func TestVerifyMembership(t *testing.T) { membershipBytes, err = json.Marshal(&membershipAsset) require.NoError(t, err) chaincodeStub.GetStateReturns(membershipBytes, nil) - err = verifyMemberInSecurityDomain(&interopcc, ctx, x509Cert, "test", "member1") + err = verifyMemberInSecurityDomain(&interopcc, ctx, string(pemCert), "test", "member1") require.EqualError(t, err, "Certificate type not supported: unknown") } diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_doorman.pem b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_doorman.pem new file mode 100644 index 000000000..4ca4d78eb --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_doorman.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICXjCCAfugAwIBAgIIHVb6wd3RHhIwFAYIKoZIzj0EAwIGCCqGSM49AwEHMFgx +GzAZBgNVBAMMEkNvcmRhIE5vZGUgUm9vdCBDQTELMAkGA1UECgwCUjMxDjAMBgNV +BAsMBWNvcmRhMQ8wDQYDVQQHDAZMb25kb24xCzAJBgNVBAYTAlVLMB4XDTE4MDcx +MDAwMDAwMFoXDTI3MDUyMDAwMDAwMFowYzELMAkGA1UEBhMCVVMxETAPBgNVBAcT +CE5ldyBZb3JrMQ4wDAYDVQQLEwVDb3JkYTEWMBQGA1UEChMNUjMgSG9sZENvIExM +QzEZMBcGA1UEAxMQQ29yZGEgRG9vcm1hbiBDQTBZMBMGByqGSM49AgEGCCqGSM49 +AwEHA0IABAPL3qAm4WZms5ciBVoxMQXfK7uTmHRVvWfWQ+QVYP3bMHSguHZRzB3v +7EOE8RZpGDan+w007Xj7XR0+xG9SxmCjgZkwgZYwHQYDVR0OBBYEFOvuLjAVKUCu +GZge2G/jfX8HosITMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgGGMCMGA1Ud +JQQcMBoGCCsGAQUFBwMBBggrBgEFBQcDAgYEVR0lADAfBgNVHSMEGDAWgBR8rqnf +uUgBKxOJC5rmRYUcORcHczARBgorBgEEAYOKYgEBBAMCAQEwFAYIKoZIzj0EAwIG +CCqGSM49AwEHA0cAMEQCIBmzQXpnCo9eAxkhwMt0bBr1Q0APJXF0KuBRsFBWAa6S +AiBgx6G8G9Ij7B8+y65ItLKVcs7Kh6Rdnr5/1zB/yPwfrg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_node.pem b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_node.pem new file mode 100644 index 000000000..6dfb29cb0 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_node.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICbTCCAgmgAwIBAgIIYRljUiZaGSkwFAYIKoZIzj0EAwIGCCqGSM49AwEHMGMx +CzAJBgNVBAYTAlVTMREwDwYDVQQHEwhOZXcgWW9yazEOMAwGA1UECxMFQ29yZGEx +FjAUBgNVBAoTDVIzIEhvbGRDbyBMTEMxGTAXBgNVBAMTEENvcmRhIERvb3JtYW4g +Q0EwHhcNMjAwNzI0MDAwMDAwWhcNMjcwNTIwMDAwMDAwWjAvMQswCQYDVQQGEwJH +QjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUEwWTATBgcqhkjOPQIB +BggqhkjOPQMBBwNCAASFze6k3tINqGLsKTi0a50RpOUCysno1/1lwIfEqaboauuj +o6Ecfu8X1WnW92VrEZGKslIJzR8R0deOEJvBs0rzo4HQMIHNMB0GA1UdDgQWBBR4 +hwLuLgfIZMEWzG4n3AxwfgPbezAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB +hjATBgNVHSUEDDAKBggrBgEFBQcDAjAfBgNVHSMEGDAWgBTr7i4wFSlArhmYHthv +431/B6LCEzARBgorBgEEAYOKYgEBBAMCAQQwRQYDVR0eAQH/BDswOaA1MDOkMTAv +MQswCQYDVQQGEwJHQjEPMA0GA1UEBwwGTG9uZG9uMQ8wDQYDVQQKDAZQYXJ0eUGh +ADAUBggqhkjOPQQDAgYIKoZIzj0DAQcDSAAwRQIhANXBVAebUsY9AMfjZedNYN14 +Wy76Ru5vMSta3Av1d08lAiAi2GZWk5XwJoEYuhQHXsHQLZbXphAVk+Q5tVgMgywj +tQ== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_root.pem b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_root.pem new file mode 100644 index 000000000..3409b3d56 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_cacert_root.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICCTCCAbCgAwIBAgIIcFe0qctqSucwCgYIKoZIzj0EAwIwWDEbMBkGA1UEAwwS +Q29yZGEgTm9kZSBSb290IENBMQswCQYDVQQKDAJSMzEOMAwGA1UECwwFY29yZGEx +DzANBgNVBAcMBkxvbmRvbjELMAkGA1UEBhMCVUswHhcNMTcwNTIyMDAwMDAwWhcN +MjcwNTIwMDAwMDAwWjBYMRswGQYDVQQDDBJDb3JkYSBOb2RlIFJvb3QgQ0ExCzAJ +BgNVBAoMAlIzMQ4wDAYDVQQLDAVjb3JkYTEPMA0GA1UEBwwGTG9uZG9uMQswCQYD +VQQGEwJVSzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGlm6LFHrVkzfuUHin36 +Jrm1aUMarX/NUZXw8n8gSiJmsZPlUEplJ+f/lzZMky5EZPTtCciG34pnOP0eiMd/ +JTCjZDBiMB0GA1UdDgQWBBR8rqnfuUgBKxOJC5rmRYUcORcHczALBgNVHQ8EBAMC +AYYwIwYDVR0lBBwwGgYIKwYBBQUHAwEGCCsGAQUFBwMCBgRVHSUAMA8GA1UdEwEB +/wQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgDaL4SguKsNeTT7SeUkFdoCBACeG8 +GqO4M1KlfimphQwCICiq00hDanT5W8bTLqE7GIGuplf/O8AABlpWrUg6uiUB +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/corda_viewdata.json b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_viewdata.json new file mode 100644 index 000000000..6061c5a61 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/corda_viewdata.json @@ -0,0 +1,7 @@ +{ + "view64": "CjQIBBIcVHVlIE5vdiAxNyAwMDoxMzo0NiBHTVQgMjAyMBoMTm90YXJpemF0aW9uIgRKU09OEtYHCoQGClhhMjZHVW9WYythenlIMENUYjN2K2pTdmp3Y255M0hFd3AyMlJrdDkvZC9GcXN4WVVvYXhVWTdUOWNKRk9TVTZiVW42UFIwNmFVckxxdjZLbzZ1NG5CUT09Ep8FLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ3akNDQVYrZ0F3SUJBZ0lJVUprUXZtS20zNVl3RkFZSUtvWkl6ajBFQXdJR0NDcUdTTTQ5QXdFSE1DOHgKQ3pBSkJnTlZCQVlUQWtkQ01ROHdEUVlEVlFRSERBWk1iMjVrYjI0eER6QU5CZ05WQkFvTUJsQmhjblI1UVRBZQpGdzB5TURBM01qUXdNREF3TURCYUZ3MHlOekExTWpBd01EQXdNREJhTUM4eEN6QUpCZ05WQkFZVEFrZENNUTh3CkRRWURWUVFIREFaTWIyNWtiMjR4RHpBTkJnTlZCQW9NQmxCaGNuUjVRVEFxTUFVR0F5dGxjQU1oQU1NS2FSRUsKaGNUZ1NCTU16Szgxb1BVU1BvVm1HL2ZKTUxYcS91alNtc2U5bzRHSk1JR0dNQjBHQTFVZERnUVdCQlJNWHREcwpLRlp6VUxkUTNjMkRDVUV4M1QxQ1VEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUNoREFUCkJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFqQWZCZ05WSFNNRUdEQVdnQlI0aHdMdUxnZklaTUVXekc0bjNBeHcKZmdQYmV6QVJCZ29yQmdFRUFZT0tZZ0VCQkFNQ0FRWXdGQVlJS29aSXpqMEVBd0lHQ0NxR1NNNDlBd0VIQTBjQQpNRVFDSUM3SjQ2U3hERHozTGpETnJFUGpqd1AycHJnTUVNaDdyL2dKcG91UUhCaytBaUErS3pYRDBkNW1pSTg2CkQybVlLNEMzdFJsaTNYM1ZnbkNlOENPcWZZeXVRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0aBlBhcnR5QRLMAQpsW1NpbXBsZVN0YXRlKGtleT1ILCB2YWx1ZT0xLCBvd25lcj1PPVBhcnR5QSwgTD1Mb25kb24sIEM9R0IsIGxpbmVhcklkPTIzMTRkNmI3LTFlY2EtNDg5Mi04OGY4LTc2ZDg1YjhhODVjZCldElxsb2NhbGhvc3Q6OTA4MC9Db3JkYV9OZXR3b3JrL2xvY2FsaG9zdDoxMDAwNiNjb20uY29yZGFTaW1wbGVBcHBsaWNhdGlvbi5mbG93LkdldFN0YXRlQnlLZXk6SA==", + + "confidential_view64": "", + + "confidential_view_content64": "" +} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_cacert.pem b/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_cacert.pem new file mode 100644 index 000000000..cd84e020a --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_cacert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUPB3O2Bl2ZRliIeSEesdgX0WDahwwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDA2MDIwMFoXDTM3MDczMTA2MDIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpn9XxzOTE3QD0G6q5i9dEnbR +ynT6X5YaFVEwAsdgQylYK7MbmmlkS2ZHBP4Qi5krf+Zwz9yU6zYAPqEZCemLFaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FCoR1JlvfQXesApniUWtci1cXiOMMAoGCCqGSM49BAMCA0gAMEUCIQCiBaH7Javq +m2FVNqBXsVn1uwbKYZVHxXH9CE7ANnUF3wIgJ4gjBRrPK4pwHFCd5Yg9Pn383pbd +zQkhznMIF4SBF4k= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_viewdata.json b/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_viewdata.json new file mode 100644 index 000000000..3d2672272 --- /dev/null +++ b/core/network/fabric-interop-cc/contracts/interop/test_data/fabric_viewdata.json @@ -0,0 +1,7 @@ +{ + "view64": "CjIIAxIYMjAyMi0wOC0wNFQxMDoyNDo0Ny42MDVaGgxOb3Rhcml6YXRpb24iBlNUUklORxKLGgrFBwjIARq/BwoGMTcuNjcxEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEi0wYtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBZTJnQXdJQkFnSVVSUlJDZGJaNjNpNTlNM3c2OFA1STI1cnoyTEF3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk5USXdNRm9YRFRJek1EZ3dOREEyTlRjd01Gb3dJVEVQTUEwRwpBMVVFQ3hNR1kyeHBaVzUwTVE0d0RBWURWUVFERXdWMWMyVnlNVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CkF3RUhBMElBQk5PZ29SYnJndGZYeHFhL21iQlFObXl4MVBJWExBdWFNV3BxQUl1MUx3MUxNMjh0SnRoT0pxWFUKejZFd0hMR2VMbGJ2U0VUNnhtb1hyZ0l2QkIxWndHNmpnYnN3Z2Jnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUF3RwpBMVVkRXdFQi93UUNNQUF3SFFZRFZSME9CQllFRk1zWFA3QmpNc21mVXVLZnVlVXNyWTc0cFgwR01COEdBMVVkCkl3UVlNQmFBRlB3ZTFMck51STMzVm0rRWRnTy9FL2pKaWhVMU1GZ0dDQ29EQkFVR0J3Z0JCRXg3SW1GMGRISnoKSWpwN0ltaG1Ma0ZtWm1sc2FXRjBhVzl1SWpvaUlpd2lhR1l1Ulc1eWIyeHNiV1Z1ZEVsRUlqb2lkWE5sY2pFaQpMQ0pvWmk1VWVYQmxJam9pWTJ4cFpXNTBJbjE5TUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUJCLzY4MVdmQlIrClFXSUdmaVlLT2szSHVSdE84SkZ3YlRpRWpuQWdDUnZuQWlCYTY5d1dZYVoyNVpSK0dheTY5ZVYrdkRaa1BNSFMKZ2RSakFJdGNLR3N0Rmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiokZWE3OWU2NjQtYTJmMi00YzlmLTg2NDMtZTYwNjAwODhmYzlhGpgKCiBVNNh9oMmGr6mjpkClfw32G8jILQMdz9o0hFOMbTk7vRLzCQqaAhJmCgpfbGlmZWN5Y2xlElgKKAoibmFtZXNwYWNlcy9maWVsZHMvaW50ZXJvcC9TZXF1ZW5jZRICCAYKLAombmFtZXNwYWNlcy9maWVsZHMvc2ltcGxlc3RhdGUvU2VxdWVuY2USAggDEn4KB2ludGVyb3AScwoeChgAYWNjZXNzQ29udHJvbABuZXR3b3JrMgASAggUChsKFQBtZW1iZXJzaGlwAG5ldHdvcmsyABICCBYKFgoQAPSPv79pbml0aWFsaXplZBICCAcKHAoWZTJlQ29uZmlkZW50aWFsaXR5RmxhZxICCAcSMAoLc2ltcGxlc3RhdGUSIQoWChAA9I+/v2luaXRpYWxpemVkEgIIBAoHCgFhEgIIGhrFBwjIARq/BwoGMTcuNjcxEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEi0wYtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBZTJnQXdJQkFnSVVSUlJDZGJaNjNpNTlNM3c2OFA1STI1cnoyTEF3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk5USXdNRm9YRFRJek1EZ3dOREEyTlRjd01Gb3dJVEVQTUEwRwpBMVVFQ3hNR1kyeHBaVzUwTVE0d0RBWURWUVFERXdWMWMyVnlNVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CkF3RUhBMElBQk5PZ29SYnJndGZYeHFhL21iQlFObXl4MVBJWExBdWFNV3BxQUl1MUx3MUxNMjh0SnRoT0pxWFUKejZFd0hMR2VMbGJ2U0VUNnhtb1hyZ0l2QkIxWndHNmpnYnN3Z2Jnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUF3RwpBMVVkRXdFQi93UUNNQUF3SFFZRFZSME9CQllFRk1zWFA3QmpNc21mVXVLZnVlVXNyWTc0cFgwR01COEdBMVVkCkl3UVlNQmFBRlB3ZTFMck51STMzVm0rRWRnTy9FL2pKaWhVMU1GZ0dDQ29EQkFVR0J3Z0JCRXg3SW1GMGRISnoKSWpwN0ltaG1Ma0ZtWm1sc2FXRjBhVzl1SWpvaUlpd2lhR1l1Ulc1eWIyeHNiV1Z1ZEVsRUlqb2lkWE5sY2pFaQpMQ0pvWmk1VWVYQmxJam9pWTJ4cFpXNTBJbjE5TUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUJCLzY4MVdmQlIrClFXSUdmaVlLT2szSHVSdE84SkZ3YlRpRWpuQWdDUnZuQWlCYTY5d1dZYVoyNVpSK0dheTY5ZVYrdkRaa1BNSFMKZ2RSakFJdGNLR3N0Rmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiokZWE3OWU2NjQtYTJmMi00YzlmLTg2NDMtZTYwNjAwODhmYzlhIgwSB2ludGVyb3AaATEipQgK2QcKB09yZzFNU1ASzQctLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ29qQ0NBa21nQXdJQkFnSVVHeDlQUksyN0ZOR0RVN012S3V3eGFRZXRaMTh3Q2dZSUtvWkl6ajBFQXdJdwphREVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLCkV3dEllWEJsY214bFpHZGxjakVQTUEwR0ExVUVDeE1HUm1GaWNtbGpNUmt3RndZRFZRUURFeEJtWVdKeWFXTXQKWTJFdGMyVnlkbVZ5TUI0WERUSXlNRGd3TkRBMk1ESXdNRm9YRFRJek1EZ3dOREEyTURjd01Gb3dXekVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRS0V3dEllWEJsCmNteGxaR2RsY2pFTk1Bc0dBMVVFQ3hNRWNHVmxjakVPTUF3R0ExVUVBeE1GY0dWbGNqQXdXVEFUQmdjcWhrak8KUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVF5ZmFPOFJSUW1JNzY1MXBlOUliU0diSGc5dHh0QUpQS1F6cHIzYzBmQgpZV0tFWmZTR2hUYWVnb21jNkhUVCtGNXhpMkV1YVZkZFo2cTBwMlh4MmRKRm80SGRNSUhhTUE0R0ExVWREd0VCCi93UUVBd0lIZ0RBTUJnTlZIUk1CQWY4RUFqQUFNQjBHQTFVZERnUVdCQlNNVDJ2c0xQVm1xV0xMbEFwbVpmSGIKSnFEamlEQWZCZ05WSFNNRUdEQVdnQlFxRWRTWmIzMEYzckFLWjRsRnJYSXRYRjRqakRBaUJnTlZIUkVFR3pBWgpnaGR3WldWeU1DNXZjbWN4TG01bGRIZHZjbXN4TG1OdmJUQldCZ2dxQXdRRkJnY0lBUVJLZXlKaGRIUnljeUk2CmV5Sm9aaTVCWm1acGJHbGhkR2x2YmlJNklpSXNJbWhtTGtWdWNtOXNiRzFsYm5SSlJDSTZJbkJsWlhJd0lpd2kKYUdZdVZIbHdaU0k2SW5CbFpYSWlmWDB3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWlE1YTNtekpaK3pmUDlyTwpjWU9vWEQ5UDVqeE1oUmNMQlBQZ0dnL2JLbllDSUNyM3FlSmdzeFgrRWlBV2drSjNHeFdjK1pRRnNzbTlqTWJBCnIxWGJmK0tJCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KEkcwRQIhAM1Gyv7e+SYniXLgB8iBuRqS4C/A9D36SLl4Zj/AkxrpAiByAoaBFpRIMEJsmGasggaQ4AUST+M2n8ctBZCHjDwRxQ==", + + "confidential_view64": "CjIIAxIYMjAyMi0wOC0wNFQxMDozMjoyMC4zMTlaGgxOb3Rhcml6YXRpb24iBlNUUklORxLrHAr0CAjIARruCAqyAQqNAQRdCc5yPbVtY77Ow/6sH6V8AOwbumdSxFq5T62tOT8LIThrPue3yCQBp7P5/6NoKRZR9grAbP9mVHiZ5814qf/DnXULpdh5O5EbVKSZX5BtmXCqTwpmZaqrQzAGgNXVzB8L6QSEVz48fp9X9SuA3r74mzNM5Ip6WbsNXnENpfifEbUfHcDUK28KHN9U+xogYzlOibmMtRdSuUyam+LQmZ5Y4/9X7AyhqEGNe0INblsSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YRgBItMGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWUyZ0F3SUJBZ0lVUlJSQ2RiWjYzaTU5TTN3NjhQNUkyNXJ6MkxBd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJOVEl3TUZvWERUSXpNRGd3TkRBMk5UY3dNRm93SVRFUE1BMEcKQTFVRUN4TUdZMnhwWlc1ME1RNHdEQVlEVlFRREV3VjFjMlZ5TVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OQpBd0VIQTBJQUJOT2dvUmJyZ3RmWHhxYS9tYkJRTm15eDFQSVhMQXVhTVdwcUFJdTFMdzFMTTI4dEp0aE9KcVhVCno2RXdITEdlTGxidlNFVDZ4bW9YcmdJdkJCMVp3RzZqZ2Jzd2diZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1Bd0cKQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZNc1hQN0JqTXNtZlV1S2Z1ZVVzclk3NHBYMEdNQjhHQTFVZApJd1FZTUJhQUZQd2UxTHJOdUkzM1ZtK0VkZ08vRS9qSmloVTFNRmdHQ0NvREJBVUdCd2dCQkV4N0ltRjBkSEp6CklqcDdJbWhtTGtGbVptbHNhV0YwYVc5dUlqb2lJaXdpYUdZdVJXNXliMnhzYldWdWRFbEVJam9pZFhObGNqRWkKTENKb1ppNVVlWEJsSWpvaVkyeHBaVzUwSW4xOU1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lCQi82ODFXZkJSKwpRV0lHZmlZS09rM0h1UnRPOEpGd2JUaUVqbkFnQ1J2bkFpQmE2OXdXWWFaMjVaUitHYXk2OWVWK3ZEWmtQTUhTCmdkUmpBSXRjS0dzdEZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoqJDQwZTFjMGUxLWJkZDctNDQ2MC04YzhhLWRlMTZhOWQyOGYwYRrJCwogZOyCYqcgmQJccj0IkSL3t+oNKIzv0PmJqnzbH2jfIV8SpAsKnAISZgoKX2xpZmVjeWNsZRJYCigKIm5hbWVzcGFjZXMvZmllbGRzL2ludGVyb3AvU2VxdWVuY2USAggGCiwKJm5hbWVzcGFjZXMvZmllbGRzL3NpbXBsZXN0YXRlL1NlcXVlbmNlEgIIAxJ+CgdpbnRlcm9wEnMKHgoYAGFjY2Vzc0NvbnRyb2wAbmV0d29yazIAEgIIJwobChUAbWVtYmVyc2hpcABuZXR3b3JrMgASAggpChYKEAD0j7+/aW5pdGlhbGl6ZWQSAggHChwKFmUyZUNvbmZpZGVudGlhbGl0eUZsYWcSAggHEjIKC3NpbXBsZXN0YXRlEiMKFgoQAPSPv79pbml0aWFsaXplZBICCAQKCQoBYRIECBsQARr0CAjIARruCAqyAQqNAQRdCc5yPbVtY77Ow/6sH6V8AOwbumdSxFq5T62tOT8LIThrPue3yCQBp7P5/6NoKRZR9grAbP9mVHiZ5814qf/DnXULpdh5O5EbVKSZX5BtmXCqTwpmZaqrQzAGgNXVzB8L6QSEVz48fp9X9SuA3r74mzNM5Ip6WbsNXnENpfifEbUfHcDUK28KHN9U+xogYzlOibmMtRdSuUyam+LQmZ5Y4/9X7AyhqEGNe0INblsSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YRgBItMGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWUyZ0F3SUJBZ0lVUlJSQ2RiWjYzaTU5TTN3NjhQNUkyNXJ6MkxBd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJOVEl3TUZvWERUSXpNRGd3TkRBMk5UY3dNRm93SVRFUE1BMEcKQTFVRUN4TUdZMnhwWlc1ME1RNHdEQVlEVlFRREV3VjFjMlZ5TVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OQpBd0VIQTBJQUJOT2dvUmJyZ3RmWHhxYS9tYkJRTm15eDFQSVhMQXVhTVdwcUFJdTFMdzFMTTI4dEp0aE9KcVhVCno2RXdITEdlTGxidlNFVDZ4bW9YcmdJdkJCMVp3RzZqZ2Jzd2diZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1Bd0cKQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZNc1hQN0JqTXNtZlV1S2Z1ZVVzclk3NHBYMEdNQjhHQTFVZApJd1FZTUJhQUZQd2UxTHJOdUkzM1ZtK0VkZ08vRS9qSmloVTFNRmdHQ0NvREJBVUdCd2dCQkV4N0ltRjBkSEp6CklqcDdJbWhtTGtGbVptbHNhV0YwYVc5dUlqb2lJaXdpYUdZdVJXNXliMnhzYldWdWRFbEVJam9pZFhObGNqRWkKTENKb1ppNVVlWEJsSWpvaVkyeHBaVzUwSW4xOU1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lCQi82ODFXZkJSKwpRV0lHZmlZS09rM0h1UnRPOEpGd2JUaUVqbkFnQ1J2bkFpQmE2OXdXWWFaMjVaUitHYXk2OWVWK3ZEWmtQTUhTCmdkUmpBSXRjS0dzdEZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoqJDQwZTFjMGUxLWJkZDctNDQ2MC04YzhhLWRlMTZhOWQyOGYwYSIMEgdpbnRlcm9wGgExIqUICtkHCgdPcmcxTVNQEs0HLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvakNDQWttZ0F3SUJBZ0lVR3g5UFJLMjdGTkdEVTdNdkt1d3hhUWV0WjE4d0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl5TURnd05EQTJNREl3TUZvWERUSXpNRGd3TkRBMk1EY3dNRm93V3pFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRU5NQXNHQTFVRUN4TUVjR1ZsY2pFT01Bd0dBMVVFQXhNRmNHVmxjakF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFReWZhTzhSUlFtSTc2NTFwZTlJYlNHYkhnOXR4dEFKUEtRenByM2MwZkIKWVdLRVpmU0doVGFlZ29tYzZIVFQrRjV4aTJFdWFWZGRaNnEwcDJYeDJkSkZvNEhkTUlIYU1BNEdBMVVkRHdFQgovd1FFQXdJSGdEQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJTTVQydnNMUFZtcVdMTGxBcG1aZkhiCkpxRGppREFmQmdOVkhTTUVHREFXZ0JRcUVkU1piMzBGM3JBS1o0bEZyWEl0WEY0ampEQWlCZ05WSFJFRUd6QVoKZ2hkd1pXVnlNQzV2Y21jeExtNWxkSGR2Y21zeExtTnZiVEJXQmdncUF3UUZCZ2NJQVFSS2V5SmhkSFJ5Y3lJNgpleUpvWmk1QlptWnBiR2xoZEdsdmJpSTZJaUlzSW1obUxrVnVjbTlzYkcxbGJuUkpSQ0k2SW5CbFpYSXdJaXdpCmFHWXVWSGx3WlNJNkluQmxaWElpZlgwd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ1pRNWEzbXpKWit6ZlA5ck8KY1lPb1hEOVA1anhNaFJjTEJQUGdHZy9iS25ZQ0lDcjNxZUpnc3hYK0VpQVdna0ozR3hXYytaUUZzc205ak1iQQpyMVhiZitLSQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChJHMEUCIQC4MR1TNTeK+FHqEStQkXTM+9kgF4v3SldTn8G3T8Wb1wIgWnDGTnmhr4gL/UmYdB+uQrYaF3IvGtlKZ4r0rDhczxg=", + + "confidential_view_content64": "CghBcmN0dXJ1cxIQTZKuC0jTLZxn3JowK/x2Xg==" +} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/contracts/interop/write_external_state.go b/core/network/fabric-interop-cc/contracts/interop/write_external_state.go index 474118c63..aa5a93a70 100644 --- a/core/network/fabric-interop-cc/contracts/interop/write_external_state.go +++ b/core/network/fabric-interop-cc/contracts/interop/write_external_state.go @@ -248,7 +248,7 @@ func verifyCordaNotarization(s *SmartContract, ctx contractapi.TransactionContex } signerList = append(signerList, value.Id) // 4. Check the certificates are valid according to the Membership. - err = verifyMemberInSecurityDomain(s, ctx, x509Cert, securityDomain, value.Id) + err = verifyMemberInSecurityDomain(s, ctx, value.Certificate, securityDomain, value.Id) if err != nil { return fmt.Errorf("Verify membership failed. Certificate not valid: %s", err.Error()) } @@ -312,7 +312,7 @@ func verifyFabricNotarization(s *SmartContract, ctx contractapi.TransactionConte } org := serialisedIdentity.Mspid // 4. Check each of the endorser certificates matches the member's entry in the network's Membership. - err = verifyMemberInSecurityDomain(s, ctx, x509Cert, securityDomain, org) + err = verifyMemberInSecurityDomain(s, ctx, string(serialisedIdentity.IdBytes), securityDomain, org) if err != nil { return fmt.Errorf("Verify membership failed. Certificate not valid: %s", err.Error()) } diff --git a/core/network/fabric-interop-cc/contracts/interop/write_external_state_test.go b/core/network/fabric-interop-cc/contracts/interop/write_external_state_test.go index a8d0472d2..4401afa99 100644 --- a/core/network/fabric-interop-cc/contracts/interop/write_external_state_test.go +++ b/core/network/fabric-interop-cc/contracts/interop/write_external_state_test.go @@ -11,6 +11,7 @@ package main import ( "encoding/json" "testing" + "io/ioutil" "github.com/hyperledger/fabric-protos-go/peer" "github.com/stretchr/testify/require" @@ -18,67 +19,77 @@ import ( wtest "github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/libs/testutils" ) -var cordaB64View = `CjQIBBIcVHVlIE5vdiAxNyAwMDoxMzo0NiBHTVQgMjAyMBoMTm90YXJpemF0aW9uIgRKU09OEtYHCoQGClhhMjZHVW9WYythenlIMENUYjN2K2pTdmp3Y255M0hFd3AyMlJrdDkvZC9GcXN4WVVvYXhVWTdUOWNKRk9TVTZiVW42UFIwNmFVckxxdjZLbzZ1NG5CUT09Ep8FLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ3akNDQVYrZ0F3SUJBZ0lJVUprUXZtS20zNVl3RkFZSUtvWkl6ajBFQXdJR0NDcUdTTTQ5QXdFSE1DOHgKQ3pBSkJnTlZCQVlUQWtkQ01ROHdEUVlEVlFRSERBWk1iMjVrYjI0eER6QU5CZ05WQkFvTUJsQmhjblI1UVRBZQpGdzB5TURBM01qUXdNREF3TURCYUZ3MHlOekExTWpBd01EQXdNREJhTUM4eEN6QUpCZ05WQkFZVEFrZENNUTh3CkRRWURWUVFIREFaTWIyNWtiMjR4RHpBTkJnTlZCQW9NQmxCaGNuUjVRVEFxTUFVR0F5dGxjQU1oQU1NS2FSRUsKaGNUZ1NCTU16Szgxb1BVU1BvVm1HL2ZKTUxYcS91alNtc2U5bzRHSk1JR0dNQjBHQTFVZERnUVdCQlJNWHREcwpLRlp6VUxkUTNjMkRDVUV4M1QxQ1VEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUNoREFUCkJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFqQWZCZ05WSFNNRUdEQVdnQlI0aHdMdUxnZklaTUVXekc0bjNBeHcKZmdQYmV6QVJCZ29yQmdFRUFZT0tZZ0VCQkFNQ0FRWXdGQVlJS29aSXpqMEVBd0lHQ0NxR1NNNDlBd0VIQTBjQQpNRVFDSUM3SjQ2U3hERHozTGpETnJFUGpqd1AycHJnTUVNaDdyL2dKcG91UUhCaytBaUErS3pYRDBkNW1pSTg2CkQybVlLNEMzdFJsaTNYM1ZnbkNlOENPcWZZeXVRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0aBlBhcnR5QRLMAQpsW1NpbXBsZVN0YXRlKGtleT1ILCB2YWx1ZT0xLCBvd25lcj1PPVBhcnR5QSwgTD1Mb25kb24sIEM9R0IsIGxpbmVhcklkPTIzMTRkNmI3LTFlY2EtNDg5Mi04OGY4LTc2ZDg1YjhhODVjZCldElxsb2NhbGhvc3Q6OTA4MC9Db3JkYV9OZXR3b3JrL2xvY2FsaG9zdDoxMDAwNiNjb20uY29yZGFTaW1wbGVBcHBsaWNhdGlvbi5mbG93LkdldFN0YXRlQnlLZXk6SA==` -var cordaMember = common.Member{ - Value: "-----BEGIN CERTIFICATE-----\nMIIBwjCCAV+gAwIBAgIIUJkQvmKm35YwFAYIKoZIzj0EAwIGCCqGSM49AwEHMC8x\nCzAJBgNVBAYTAkdCMQ8wDQYDVQQHDAZMb25kb24xDzANBgNVBAoMBlBhcnR5QTAe\nFw0yMDA3MjQwMDAwMDBaFw0yNzA1MjAwMDAwMDBaMC8xCzAJBgNVBAYTAkdCMQ8w\nDQYDVQQHDAZMb25kb24xDzANBgNVBAoMBlBhcnR5QTAqMAUGAytlcAMhAMMKaREK\nhcTgSBMMzK81oPUSPoVmG/fJMLXq/ujSmse9o4GJMIGGMB0GA1UdDgQWBBRMXtDs\nKFZzULdQ3c2DCUEx3T1CUDAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIChDAT\nBgNVHSUEDDAKBggrBgEFBQcDAjAfBgNVHSMEGDAWgBR4hwLuLgfIZMEWzG4n3Axw\nfgPbezARBgorBgEEAYOKYgEBBAMCAQYwFAYIKoZIzj0EAwIGCCqGSM49AwEHA0cA\nMEQCIC7J46SxDDz3LjDNrEPjjwP2prgMEMh7r/gJpouQHBk+AiA+KzXD0d5miI86\nD2mYK4C3tRli3X3VgnCe8COqfYyuQg==\n-----END CERTIFICATE-----", - Type: "certificate", - Chain: []string{}, +type TestData struct { + B64View string `json:"view64"` + B64ViewConfidential string `json:"confidential_view64"` + B64ViewContents string `json:"confidential_view_content64"` } -var cordaMembership = common.Membership{ - SecurityDomain: "Corda_Network", - Members: map[string]*common.Member{"PartyA": &cordaMember}, -} - -var cordaVerificationPolicy = common.VerificationPolicy{ - SecurityDomain: "Corda_Network", - Identifiers: []*common.Identifier{{ - Pattern: "localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:*", - Policy: &common.Policy{ - Criteria: []string{"PartyA"}, - Type: "signature", - }, - }}, -} - -var fabricNetwork = "network1" -var fabricRelayEndpoint = "relay-network1:9080" -var fabricPattern = "mychannel:simplestate:Read:a" -var fabricViewAddress = fabricRelayEndpoint + "/" + fabricNetwork + "/" + fabricPattern - -var b64View = "CjIIAxIYMjAyMS0wOC0wOVQxMToxOToxNC41OTJaGgxOb3Rhcml6YXRpb24iBlNUUklORxKBDApKCMgBGkUKCEFyY3R1cnVzEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEaigMKIFDt2MRSUeTYAeOVPLZH7N+xPQ+ayZ2KwTWB2AlSLsXsEuUCCogCEmYKCl9saWZlY3ljbGUSWAooCiJuYW1lc3BhY2VzL2ZpZWxkcy9pbnRlcm9wL1NlcXVlbmNlEgIIBgosCiZuYW1lc3BhY2VzL2ZpZWxkcy9zaW1wbGVzdGF0ZS9TZXF1ZW5jZRICCAMSagoHaW50ZXJvcBJfCiMKHQBhY2Nlc3NDb250cm9sAENvcmRhX05ldHdvcmsAEgIICwogChoAbWVtYmVyc2hpcABDb3JkYV9OZXR3b3JrABICCA0KFgoQAPSPv79pbml0aWFsaXplZBICCAcSMgoLc2ltcGxlc3RhdGUSIwoWChAA9I+/v2luaXRpYWxpemVkEgIIBAoJCgFhEgQICRABGkoIyAEaRQoIQXJjdHVydXMSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YSIMEgdpbnRlcm9wGgExIqUICtkHCgdPcmcxTVNQEs0HLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvakNDQWttZ0F3SUJBZ0lVTWN4Y1FNWENUcThpVmlCZFUrRFNidTVjM2Rzd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl4TURjek1EQTFORGN3TUZvWERUSXlNRGN6TURBMU5USXdNRm93V3pFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRU5NQXNHQTFVRUN4TUVjR1ZsY2pFT01Bd0dBMVVFQXhNRmNHVmxjakF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUWk1uU1hRbyswcWhxTW5yYmxROTRsaExsdW9BeUxsMUQ1K2JPTkRmRXYKUU9IVU9HKy9XL0pqOUV1M1UwTCtNZTRzd1c1M3ZGYmJHNGtWLzZYQzFZMlFvNEhkTUlIYU1BNEdBMVVkRHdFQgovd1FFQXdJSGdEQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJSZXp2K3cyM1F3aWFYcGVYSUhBVGovCmJRSjByakFmQmdOVkhTTUVHREFXZ0JSeWh2V0Mramd2T3N1UlNGNmFyWHUyemwwZy9EQWlCZ05WSFJFRUd6QVoKZ2hkd1pXVnlNQzV2Y21jeExtNWxkSGR2Y21zeExtTnZiVEJXQmdncUF3UUZCZ2NJQVFSS2V5SmhkSFJ5Y3lJNgpleUpvWmk1QlptWnBiR2xoZEdsdmJpSTZJaUlzSW1obUxrVnVjbTlzYkcxbGJuUkpSQ0k2SW5CbFpYSXdJaXdpCmFHWXVWSGx3WlNJNkluQmxaWElpZlgwd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ09yVmZvbmJCOHh2RU8zYjcKbk1OOHdMK3VhNVV2RmVoSnlHS0RISFN0YURZQ0lHNURWdE42Wm03Q0J0dG1xQlJ6dWt5UzBpZ2p6cE9NMXNxTwpTZS94QS94eAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChJHMEUCIQCwTtxvaQhZmLWuBXJFtI0RUaBOxBB5O2ItCjekFUyMUwIgTrOPxQ/PSKDsj+mJTLfEcrK5+f80sqQoQFJr+qBLy2k=" - -var b64ViewConfidential = "CjIIAxIYMjAyMi0wNC0yOVQxODo0Njo1OC45NzJaGgxOb3Rhcml6YXRpb24iBlNUUklORxLpHAr0CAjIARruCAqyAQqNAQTmm12BRo0TmKw6iwCuxSIgm7ZwEGib20B8e/z2pOkkkzBLPQHUqDYV9Fi4o9SJRhWG+6xWJ5Ohb9QeFjad9p4fnz6GfE3Y4nniiOPMQoDiMbzu0WMorzaPtdCrQAXTXlbPGvE89TDi7FimFpkW/Uq+GDUShvcVv4FiUe55YrgX1XUZzQPYHQipulpiiRogAeXsECkdXiDOcqaoeuUhyX02kmYMDnPRIBhWY6mlnIYSOXJlbGF5LW5ldHdvcmsxOjkwODAvbmV0d29yazEvbXljaGFubmVsOnNpbXBsZXN0YXRlOlJlYWQ6YRgBItMGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSekNDQWUyZ0F3SUJBZ0lVR3ZEU01HMzlvN2JhYUNaS2lobE0vVWRseDVZd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEl4TURrd056QTVNVGN3TUZvWERUSXlNRGt3TnpBNU1qSXdNRm93SVRFUE1BMEcKQTFVRUN4TUdZMnhwWlc1ME1RNHdEQVlEVlFRREV3VjFjMlZ5TVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OQpBd0VIQTBJQUJGWkRvc0NOaStBNkQ0YjRkRHJ0NWFHdzBQQjdmUlQwcDRoZ1RucWsxVVdmNTJVOGpPSVhnayt0CldGeklDSjBMdGM2aVpXRUtkZUl1NlV6Sy9RMmV0RTZqZ2Jzd2diZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1Bd0cKQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZDMlBGbjRzaUNMR1hsLy90ZEFHVElKZVVlSjFNQjhHQTFVZApJd1FZTUJhQUZMbkViUU5kOVZZK2NEbVNEdnpxeEkwY0tKbnhNRmdHQ0NvREJBVUdCd2dCQkV4N0ltRjBkSEp6CklqcDdJbWhtTGtGbVptbHNhV0YwYVc5dUlqb2lJaXdpYUdZdVJXNXliMnhzYldWdWRFbEVJam9pZFhObGNqRWkKTENKb1ppNVVlWEJsSWpvaVkyeHBaVzUwSW4xOU1Bb0dDQ3FHU000OUJBTUNBMGdBTUVVQ0lRQ0RhOXlsbHpmRQpHa28zQy9IOFp4U0p3ZTFlNklnV0xuc1VJTjlFY3gzK3BRSWdQSXUvRTB2bHdjamd1TDV4amI2aUFKRnNxZTFWClI5OUlwRjlTb1VRNUNqTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoqJDU3NTRiOTQ4LWM4MGYtNDUwYS1hNzA1LWY1NmM3NTA2MjMxNhrHCwogFcRWeu2pvbBCYfrDN0psmIG56fC7F8Ju5dCMIIjGDH8SogsKmgISZgoKX2xpZmVjeWNsZRJYCigKIm5hbWVzcGFjZXMvZmllbGRzL2ludGVyb3AvU2VxdWVuY2USAggGCiwKJm5hbWVzcGFjZXMvZmllbGRzL3NpbXBsZXN0YXRlL1NlcXVlbmNlEgIIAxJ+CgdpbnRlcm9wEnMKHgoYAGFjY2Vzc0NvbnRyb2wAbmV0d29yazIAEgIIDgobChUAbWVtYmVyc2hpcABuZXR3b3JrMgASAggQChYKEAD0j7+/aW5pdGlhbGl6ZWQSAggHChwKFmUyZUNvbmZpZGVudGlhbGl0eUZsYWcSAggHEjAKC3NpbXBsZXN0YXRlEiEKFgoQAPSPv79pbml0aWFsaXplZBICCAQKBwoBYRICCAga9AgIyAEa7ggKsgEKjQEE5ptdgUaNE5isOosArsUiIJu2cBBom9tAfHv89qTpJJMwSz0B1Kg2FfRYuKPUiUYVhvusVieToW/UHhY2nfaeH58+hnxN2OJ54ojjzEKA4jG87tFjKK82j7XQq0AF015WzxrxPPUw4uxYphaZFv1Kvhg1Eob3Fb+BYlHueWK4F9V1Gc0D2B0IqbpaYokaIAHl7BApHV4gznKmqHrlIcl9NpJmDA5z0SAYVmOppZyGEjlyZWxheS1uZXR3b3JrMTo5MDgwL25ldHdvcmsxL215Y2hhbm5lbDpzaW1wbGVzdGF0ZTpSZWFkOmEYASLTBi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUnpDQ0FlMmdBd0lCQWdJVUd2RFNNRzM5bzdiYWFDWktpaGxNL1VkbHg1WXdDZ1lJS29aSXpqMEVBd0l3CmFERUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUsKRXd0SWVYQmxjbXhsWkdkbGNqRVBNQTBHQTFVRUN4TUdSbUZpY21sak1Sa3dGd1lEVlFRREV4Qm1ZV0p5YVdNdApZMkV0YzJWeWRtVnlNQjRYRFRJeE1Ea3dOekE1TVRjd01Gb1hEVEl5TURrd056QTVNakl3TUZvd0lURVBNQTBHCkExVUVDeE1HWTJ4cFpXNTBNUTR3REFZRFZRUURFd1YxYzJWeU1UQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKQXdFSEEwSUFCRlpEb3NDTmkrQTZENGI0ZERydDVhR3cwUEI3ZlJUMHA0aGdUbnFrMVVXZjUyVThqT0lYZ2srdApXRnpJQ0owTHRjNmlaV0VLZGVJdTZVeksvUTJldEU2amdic3dnYmd3RGdZRFZSMFBBUUgvQkFRREFnZUFNQXdHCkExVWRFd0VCL3dRQ01BQXdIUVlEVlIwT0JCWUVGQzJQRm40c2lDTEdYbC8vdGRBR1RJSmVVZUoxTUI4R0ExVWQKSXdRWU1CYUFGTG5FYlFOZDlWWStjRG1TRHZ6cXhJMGNLSm54TUZnR0NDb0RCQVVHQndnQkJFeDdJbUYwZEhKegpJanA3SW1obUxrRm1abWxzYVdGMGFXOXVJam9pSWl3aWFHWXVSVzV5YjJ4c2JXVnVkRWxFSWpvaWRYTmxjakVpCkxDSm9aaTVVZVhCbElqb2lZMnhwWlc1MEluMTlNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNEYTl5bGx6ZkUKR2tvM0MvSDhaeFNKd2UxZTZJZ1dMbnNVSU45RWN4MytwUUlnUEl1L0Uwdmx3Y2pndUw1eGpiNmlBSkZzcWUxVgpSOTlJcEY5U29VUTVDak09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKiQ1NzU0Yjk0OC1jODBmLTQ1MGEtYTcwNS1mNTZjNzUwNjIzMTYiDBIHaW50ZXJvcBoBMSKlCArZBwoHT3JnMU1TUBLNBy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDb2pDQ0FrbWdBd0lCQWdJVU1jeGNRTVhDVHE4aVZpQmRVK0RTYnU1YzNkc3dDZ1lJS29aSXpqMEVBd0l3CmFERUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUsKRXd0SWVYQmxjbXhsWkdkbGNqRVBNQTBHQTFVRUN4TUdSbUZpY21sak1Sa3dGd1lEVlFRREV4Qm1ZV0p5YVdNdApZMkV0YzJWeWRtVnlNQjRYRFRJeE1EY3pNREExTkRjd01Gb1hEVEl5TURjek1EQTFOVEl3TUZvd1d6RUxNQWtHCkExVUVCaE1DVlZNeEZ6QVZCZ05WQkFnVERrNXZjblJvSUVOaGNtOXNhVzVoTVJRd0VnWURWUVFLRXd0SWVYQmwKY214bFpHZGxjakVOTUFzR0ExVUVDeE1FY0dWbGNqRU9NQXdHQTFVRUF4TUZjR1ZsY2pBd1dUQVRCZ2NxaGtqTwpQUUlCQmdncWhrak9QUU1CQndOQ0FBVFpNblNYUW8rMHFocU1ucmJsUTk0bGhMbHVvQXlMbDFENStiT05EZkV2ClFPSFVPRysvVy9KajlFdTNVMEwrTWU0c3dXNTN2RmJiRzRrVi82WEMxWTJRbzRIZE1JSGFNQTRHQTFVZER3RUIKL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1CMEdBMVVkRGdRV0JCUmV6dit3MjNRd2lhWHBlWElIQVRqLwpiUUowcmpBZkJnTlZIU01FR0RBV2dCUnlodldDK2pndk9zdVJTRjZhclh1MnpsMGcvREFpQmdOVkhSRUVHekFaCmdoZHdaV1Z5TUM1dmNtY3hMbTVsZEhkdmNtc3hMbU52YlRCV0JnZ3FBd1FGQmdjSUFRUktleUpoZEhSeWN5STYKZXlKb1ppNUJabVpwYkdsaGRHbHZiaUk2SWlJc0ltaG1Ma1Z1Y205c2JHMWxiblJKUkNJNkluQmxaWEl3SWl3aQphR1l1Vkhsd1pTSTZJbkJsWlhJaWZYMHdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdPclZmb25iQjh4dkVPM2I3Cm5NTjh3TCt1YTVVdkZlaEp5R0tESEhTdGFEWUNJRzVEVnRONlptN0NCdHRtcUJSenVreVMwaWdqenBPTTFzcU8KU2UveEEveHgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoSRzBFAiEApQJHQ6Cn36u44EtWW713lnDj2y8xQUTGRczi/FGucKwCIH3zsuTHrS5w6mEALO8fgY6tVI9TLtDiz6Abnm8GiIUe" - -var b64ViewContents = "CghBcmN0dXJ1cxIQev6XmXObPZZ3lyo7WO9gmw==" - -var fabricCert = "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" - - -var network2Member = common.Member{ - Value: fabricCert, - Type: "ca", - Chain: []string{}, -} - -var network1Membership = common.Membership{ - SecurityDomain: fabricNetwork, - Members: map[string]*common.Member{"Org1MSP": &network2Member}, -} +func TestWriteExternalState(t *testing.T) { -var network1VerificationPolicy = common.VerificationPolicy{ - SecurityDomain: fabricNetwork, - Identifiers: []*common.Identifier{{ - Pattern: fabricPattern, - Policy: &common.Policy{ - Criteria: []string{"Org1MSP"}, - Type: "signature", - }, - }}, -} -func TestWriteExternalState(t *testing.T) { + var cordaTestDataBytes, _ = ioutil.ReadFile("./test_data/corda_viewdata.json") + var cordaTestData TestData + json.Unmarshal(cordaTestDataBytes, &cordaTestData) + var cordaRootCACert, _ = ioutil.ReadFile("./test_data/corda_cacert_root.pem") + var cordaDoormanCACert, _ = ioutil.ReadFile("./test_data/corda_cacert_doorman.pem") + var cordaNodeCACert, _ = ioutil.ReadFile("./test_data/corda_cacert_node.pem") + + var cordaMember = common.Member{ + Value: "", + Type: "certificate", + Chain: []string{string(cordaRootCACert), string(cordaDoormanCACert), string(cordaNodeCACert)}, + } + + var cordaMembership = common.Membership{ + SecurityDomain: "Corda_Network", + Members: map[string]*common.Member{"PartyA": &cordaMember}, + } + + var cordaVerificationPolicy = common.VerificationPolicy{ + SecurityDomain: "Corda_Network", + Identifiers: []*common.Identifier{{ + Pattern: "localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:*", + Policy: &common.Policy{ + Criteria: []string{"PartyA"}, + Type: "signature", + }, + }}, + } + + var fabricNetwork = "network1" + var fabricRelayEndpoint = "relay-network1:9080" + var fabricPattern = "mychannel:simplestate:Read:a" + var fabricViewAddress = fabricRelayEndpoint + "/" + fabricNetwork + "/" + fabricPattern + + var fabricTestDataBytes, _ = ioutil.ReadFile("./test_data/fabric_viewdata.json") + var fabricTestData TestData + json.Unmarshal(fabricTestDataBytes, &fabricTestData) + + var fabricCaCertNetwork1, _ = ioutil.ReadFile("./test_data/fabric_cacert.pem") + + var network1Member = common.Member{ + Value: string(fabricCaCertNetwork1), + Type: "ca", + Chain: []string{}, + } + + var network1Membership = common.Membership{ + SecurityDomain: fabricNetwork, + Members: map[string]*common.Member{"Org1MSP": &network1Member}, + } + + var network1VerificationPolicy = common.VerificationPolicy{ + SecurityDomain: fabricNetwork, + Identifiers: []*common.Identifier{{ + Pattern: fabricPattern, + Policy: &common.Policy{ + Criteria: []string{"Org1MSP"}, + Type: "signature", + }, + }}, + } // Happy case: Fabric ctx, chaincodeStub := wtest.PrepMockStub() interopcc := SmartContract{} @@ -95,26 +106,26 @@ func TestWriteExternalState(t *testing.T) { Payload: []byte("I am a result"), }) - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{b64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{""}) require.NoError(t, err) // Test success with encrypted view payload chaincodeStub.GetStateReturnsOnCall(2, network1VerificationPolicyBytes, nil) chaincodeStub.GetStateReturnsOnCall(3, network1MembershipBytes, nil) - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{b64ViewConfidential}, []string{b64ViewContents}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{fabricTestData.B64ViewConfidential}, []string{fabricTestData.B64ViewContents}) require.NoError(t, err) // Test failures when invalid or insufficient arguments are supplied - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{2}, []string{fabricViewAddress}, []string{b64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{2}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{""}) require.EqualError(t, err, "Index 2 out of bounds of array (length 2)") - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{0, 1}, []string{fabricViewAddress}, []string{b64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{0, 1}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{""}) require.EqualError(t, err, "Number of argument indices for substitution (2) does not match number of addresses (1)") err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{}, []string{""}) require.EqualError(t, err, "Number of addresses (1) does not match number of views (0)") - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{b64View}, []string{}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{}) require.EqualError(t, err, "Number of addresses (1) does not match number of view contents (0)") // Happy case: Corda @@ -132,7 +143,7 @@ func TestWriteExternalState(t *testing.T) { Message: "", Payload: []byte("I am a result"), }) - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{"localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H"}, []string{cordaB64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{"localhost:9081/Corda_Network/localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:H"}, []string{cordaTestData.B64View}, []string{""}) require.NoError(t, err) // Test case: Invalid cert in Membership @@ -143,7 +154,7 @@ func TestWriteExternalState(t *testing.T) { require.NoError(t, err) chaincodeStub.GetStateReturnsOnCall(0, network1VerificationPolicyBytes, nil) chaincodeStub.GetStateReturnsOnCall(1, invalidMembershipBytes, nil) - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{b64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{""}) require.EqualError(t, err, "VerifyView error: Verify membership failed. Certificate not valid: Client cert not in a known PEM format") // Test case: Invalid policy in verification policy @@ -153,6 +164,6 @@ func TestWriteExternalState(t *testing.T) { invalidVerificationPolicyBytes, err := json.Marshal(&network1VerificationPolicy) require.NoError(t, err) chaincodeStub.GetStateReturnsOnCall(0, invalidVerificationPolicyBytes, nil) - err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{b64View}, []string{""}) + err = interopcc.WriteExternalState(ctx, fabricNetwork, "mychannel", "Write", []string{"test-key", ""}, []int{1}, []string{fabricViewAddress}, []string{fabricTestData.B64View}, []string{""}) require.EqualError(t, err, "VerifyView error: Unable to resolve verification policy: Verification Policy Error: Failed to find verification policy matching view address: " + fabricPattern) } diff --git a/core/network/fabric-interop-cc/docker-compose.yml b/core/network/fabric-interop-cc/docker-compose.yml new file mode 100644 index 000000000..0cb7d0bae --- /dev/null +++ b/core/network/fabric-interop-cc/docker-compose.yml @@ -0,0 +1,23 @@ +# +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + +version: '2' +services: + fabric-driver: + image: ${DOCKER_IMAGE_NAME}:${DOCKER_TAG} + container_name: weaver-faric-${CHANNEL}-${PEER}-${ORG}-${NETWORK} + environment: + - CC_NAME=interop + - EXTERNAL_SERVICE=true + - CHAINCODE_ADDRESS=0.0.0.0:7052 + - CHAINCODE_CCID=${CCID} + ports: + - 7052:7052 +# This networks section is required for when the peers have networks specified +networks: + default: + external: + name: ${EXTERNAL_NETWORK} diff --git a/core/network/fabric-interop-cc/external-service/connection.json b/core/network/fabric-interop-cc/external-service/connection.json new file mode 100644 index 000000000..b8bb7272a --- /dev/null +++ b/core/network/fabric-interop-cc/external-service/connection.json @@ -0,0 +1,9 @@ +{ + "address": "weaver-fabric-mychannel-peer0-org1-network1:7052", + "dial_timeout": "10s", + "tls_required": "false", + "client_auth_required": "false", + "client_key": "-----BEGIN EC PRIVATE KEY----- ... -----END EC PRIVATE KEY-----", + "client_cert": "-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----", + "root_cert": "-----BEGIN CERTIFICATE---- ... -----END CERTIFICATE-----" +} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/external-service/metadata.json b/core/network/fabric-interop-cc/external-service/metadata.json new file mode 100644 index 000000000..d70d6317c --- /dev/null +++ b/core/network/fabric-interop-cc/external-service/metadata.json @@ -0,0 +1,5 @@ +{ + "path":"", + "type":"external", + "label":"weavercc" +} \ No newline at end of file diff --git a/core/network/fabric-interop-cc/interfaces/asset-mgmt/README.md b/core/network/fabric-interop-cc/interfaces/asset-mgmt/README.md new file mode 100644 index 000000000..51321fdec --- /dev/null +++ b/core/network/fabric-interop-cc/interfaces/asset-mgmt/README.md @@ -0,0 +1,6 @@ + +# Asset Management Interface \ No newline at end of file diff --git a/core/network/fabric-interop-cc/interfaces/asset-mgmt/VERSION b/core/network/fabric-interop-cc/interfaces/asset-mgmt/VERSION new file mode 100644 index 000000000..26ca59460 --- /dev/null +++ b/core/network/fabric-interop-cc/interfaces/asset-mgmt/VERSION @@ -0,0 +1 @@ +1.5.1 diff --git a/core/network/fabric-interop-cc/libs/assetexchange/README.md b/core/network/fabric-interop-cc/libs/assetexchange/README.md new file mode 100644 index 000000000..190c2221d --- /dev/null +++ b/core/network/fabric-interop-cc/libs/assetexchange/README.md @@ -0,0 +1,6 @@ + +# Asset Exchange Library \ No newline at end of file diff --git a/core/network/fabric-interop-cc/libs/assetexchange/VERSION b/core/network/fabric-interop-cc/libs/assetexchange/VERSION new file mode 100644 index 000000000..26ca59460 --- /dev/null +++ b/core/network/fabric-interop-cc/libs/assetexchange/VERSION @@ -0,0 +1 @@ +1.5.1 diff --git a/core/network/fabric-interop-cc/libs/utils/README.md b/core/network/fabric-interop-cc/libs/utils/README.md new file mode 100644 index 000000000..b9af0ac48 --- /dev/null +++ b/core/network/fabric-interop-cc/libs/utils/README.md @@ -0,0 +1,6 @@ + +# Utils Library \ No newline at end of file diff --git a/core/network/fabric-interop-cc/libs/utils/VERSION b/core/network/fabric-interop-cc/libs/utils/VERSION new file mode 100644 index 000000000..26ca59460 --- /dev/null +++ b/core/network/fabric-interop-cc/libs/utils/VERSION @@ -0,0 +1 @@ +1.5.1 diff --git a/core/network/fabric-interop-cc/libs/utils/utils.go b/core/network/fabric-interop-cc/libs/utils/utils.go index fd9c33dcf..e84f4c1b4 100644 --- a/core/network/fabric-interop-cc/libs/utils/utils.go +++ b/core/network/fabric-interop-cc/libs/utils/utils.go @@ -80,6 +80,22 @@ func IsClientRelay(stub shim.ChaincodeStubInterface) (bool, error) { return ok, err } +// Check if the calling client has an attribute in its signing certificate indicating that it is a privileged network administrator +func IsClientNetworkAdmin(ctx contractapi.TransactionContextInterface) (bool, error) { + // check if caller certificate has the attribute "network-admin" + // we don't care about the actual value of the attribute for now + _, ok, err := ctx.GetClientIdentity().GetAttributeValue("network-admin") + return ok, err +} + +// Check if the calling client has an IIN Agent attribute in its signing certificate +func IsClientIINAgent(ctx contractapi.TransactionContextInterface) (bool, error) { + // check if caller certificate has the attribute "iin-agent" + // we don't care about the actual value of the attribute for now + _, ok, err := ctx.GetClientIdentity().GetAttributeValue("iin-agent") + return ok, err +} + // Check if the caller is the Interop Chaincode func IsCallerInteropChaincode(stub shim.ChaincodeStubInterface) (bool, error) { interopChaincodeID, err := stub.GetState(GetInteropChaincodeIDKey()) @@ -150,7 +166,7 @@ func marshalAssetPledge(pledge *common.AssetPledge) (string, error) { return "", err } assetPledgeBase64 := base64.StdEncoding.EncodeToString(assetPledgeBytes) - return assetPledgeBase64, nil + return assetPledgeBase64, nil } func unmarshalAssetPledge(assetPledgeBase64 string) (*common.AssetPledge, error) { pledge := &common.AssetPledge{} @@ -190,7 +206,6 @@ func unmarshalAssetClaimStatus(claimStatusBase64 string) (*common.AssetClaimStat return claimStatus, err } return claimStatus, nil - } // PledgeAsset locks an asset for transfer to a different ledger/network. @@ -198,9 +213,9 @@ func PledgeAsset(ctx contractapi.TransactionContextInterface, assetJSON []byte, if assetIdOrQuantity == "" { return "", fmt.Errorf("no asset ID or unit count provided") } - + pledgeId := generatePledgeId(ctx, assetType, assetIdOrQuantity, owner, remoteNetworkId, recipientCert, expiryTimeSecs) - + pledgeKey := getAssetPledgeKey(pledgeId) pledgeBytes, err := ctx.GetStub().GetState(pledgeKey) if err != nil { @@ -253,7 +268,7 @@ func ClaimRemoteAsset(ctx contractapi.TransactionContextInterface, pledgeId, cla if pledgeId == "" { return nil, fmt.Errorf("pledgeId can not be empty") } - + pledge, err := unmarshalAssetPledge(pledgeBytes64) if err != nil { return nil, err @@ -299,13 +314,13 @@ func ClaimRemoteAsset(ctx contractapi.TransactionContextInterface, pledgeId, cla if err != nil { // No Record of claim return pledge.AssetDetails, ctx.GetStub().PutState(claimKey, claimBytes) } - + lookupClaimStatus := &common.AssetClaimStatus{} err = proto.Unmarshal(lookupClaimBytes, lookupClaimStatus) if lookupClaimStatus.ClaimStatus { // Previous claim was successful return nil, fmt.Errorf("asset has already been claimed") } - + // Else proceed to claim return pledge.AssetDetails, ctx.GetStub().PutState(claimKey, claimBytes) } @@ -420,12 +435,12 @@ func GetAssetPledgeStatus(ctx contractapi.TransactionContextInterface, pledgeId, if lookupPledge.Recipient != recipientCert || lookupPledge.RemoteNetworkID != recipientNetworkId { return nil, pledgeBytes64, pledgeBytes64, nil // Return blank } - + lookupPledgeBytes64, err := marshalAssetPledge(lookupPledge) if err != nil { return nil, pledgeBytes64, pledgeBytes64, err } - + return lookupPledge.AssetDetails, lookupPledgeBytes64, pledgeBytes64, nil } @@ -451,7 +466,7 @@ func GetAssetPledgeDetails(ctx contractapi.TransactionContextInterface, pledgeId if err != nil { return nil, "", err } - + return lookupPledge.AssetDetails, lookupPledgeBytes64, nil } diff --git a/core/network/fabric-interop-cc/makefile b/core/network/fabric-interop-cc/makefile index 6bfda1f81..f448cb080 100644 --- a/core/network/fabric-interop-cc/makefile +++ b/core/network/fabric-interop-cc/makefile @@ -1,4 +1,9 @@ -.PHONY: build protos all clean +DOCKER_IMAGE_NAME ?= weaver-fabric-cc +DOCKER_TAG ?= `cat contracts/interop/VERSION` +DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs +GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc + +.PHONY: build protos all clean image push-image check-if-tag-exists all: build @@ -6,5 +11,23 @@ build: echo "Building chaincode binary" ./scripts/build.sh +list-names: + echo ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) + +image: + (cd contracts/interop && make run-vendor) + docker build --build-arg GIT_URL=$(GIT_URL) -t ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) . + +check-if-tag-exists: + !(DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) > /dev/null) + +push-image: check-if-tag-exists image + docker tag ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) + docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG) + +push-image-latest: + docker tag ${DOCKER_IMAGE_NAME}:$(DOCKER_TAG) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest + docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest + clean: rm -rf ./bin diff --git a/core/relay/.env.template b/core/relay/.env.template index 8cd7655be..cb1da1cf9 100644 --- a/core/relay/.env.template +++ b/core/relay/.env.template @@ -2,7 +2,7 @@ PATH_TO_CONFIG= RELAY_NAME=<"name" in config toml file> RELAY_PORT= DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=1.4.2 EXTERNAL_NETWORK= COMPOSE_PROJECT_NAME= COMPOSE_PROJECT_NETWORK= \ No newline at end of file diff --git a/core/relay/.env.template.2 b/core/relay/.env.template.2 index 13d1c0013..dbc0291cd 100644 --- a/core/relay/.env.template.2 +++ b/core/relay/.env.template.2 @@ -7,7 +7,7 @@ DRIVER_NAME= RELAY_NAME= RELAY_PORT= DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=1.4.2 EXTERNAL_NETWORK= COMPOSE_PROJECT_NAME= COMPOSE_PROJECT_NETWORK= diff --git a/core/relay/Cargo.lock b/core/relay/Cargo.lock index a4947ace3..344042653 100644 --- a/core/relay/Cargo.lock +++ b/core/relay/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.10" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.31" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "arrayvec" @@ -46,9 +46,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.31" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -75,43 +75,48 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bincode" -version = "1.2.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "byteorder", - "serde 1.0.110", + "serde 1.0.139", ] [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" -version = "3.4.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "0.5.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" +checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" [[package]] name = "cc" -version = "1.0.54" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -143,20 +148,36 @@ dependencies = [ "lazy_static", "nom", "rust-ini", - "serde 1.0.110", + "serde 1.0.139", "serde-hjson", "serde_json", "toml", "yaml-rust", ] +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "crc32fast" -version = "1.2.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", ] [[package]] @@ -187,9 +208,27 @@ dependencies = [ [[package]] name = "either" -version = "1.5.3" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] [[package]] name = "fixedbitset" @@ -203,6 +242,31 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "fs2" version = "0.4.3" @@ -210,7 +274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -231,9 +295,9 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -246,9 +310,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -256,15 +320,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -273,17 +337,16 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ - "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -291,9 +354,9 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" @@ -303,9 +366,9 @@ checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.5" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -314,10 +377,8 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project", + "pin-project-lite 0.2.9", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] @@ -332,52 +393,70 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "h2" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" +checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" dependencies = [ - "bytes", + "bytes 0.5.6", "fnv", "futures-core", "futures-sink", "futures-util", "http", "indexmap", - "log", "slab", "tokio", "tokio-util", + "tracing", + "tracing-futures", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "heck" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "http" -version = "0.2.1" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes", + "bytes 1.2.0", "fnv", - "itoa", + "itoa 1.0.2", ] [[package]] @@ -386,23 +465,29 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes", + "bytes 0.5.6", "http", ] [[package]] name = "httparse" -version = "1.3.4" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" [[package]] name = "hyper" -version = "0.13.5" +version = "0.13.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" +checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" dependencies = [ - "bytes", + "bytes 0.5.6", "futures-channel", "futures-core", "futures-util", @@ -410,23 +495,57 @@ dependencies = [ "http", "http-body", "httparse", - "itoa", - "log", - "net2", - "pin-project", - "time", + "httpdate", + "itoa 0.4.8", + "pin-project 1.0.11", + "socket2", "tokio", "tower-service", + "tracing", "want", ] +[[package]] +name = "hyper-tls" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" +dependencies = [ + "bytes 0.5.6", + "hyper", + "native-tls", + "tokio", + "tokio-tls", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.3.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", ] [[package]] @@ -438,6 +557,12 @@ dependencies = [ "libc", ] +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + [[package]] name = "itertools" version = "0.8.2" @@ -449,15 +574,21 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "js-sys" -version = "0.3.39" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -493,9 +624,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.70" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "linked-hash-map" @@ -509,19 +640,19 @@ dependencies = [ [[package]] name = "linked-hash-map" -version = "0.5.3" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "listenfd" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492158e732f2e2de81c592f0a2427e57e12cd3d59877378fe7af624b6bbe0ca1" +checksum = "809e514e2cb8a9624701346ea3e694c1766d76778e343e537d873c1c366e79a7" dependencies = [ "libc", - "uuid 0.6.5", - "winapi 0.3.8", + "uuid", + "winapi 0.3.9", ] [[package]] @@ -535,13 +666,19 @@ dependencies = [ [[package]] name = "log" -version = "0.4.8" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", ] +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -550,24 +687,40 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "mio" -version = "0.6.22" +version = "0.6.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" dependencies = [ "cfg-if 0.1.10", "fuchsia-zircon", @@ -596,9 +749,27 @@ dependencies = [ [[package]] name = "multimap" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8883adfde9756c1d30b0f519c9b8c502a94b41ac62f696453c37c7fc0a958ce" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] [[package]] name = "net2" @@ -608,7 +779,7 @@ checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" dependencies = [ "cfg-if 0.1.10", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -628,23 +799,68 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.11", + "num-traits 0.2.15", ] [[package]] name = "num-traits" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "once_cell" -version = "1.4.0" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" + +[[package]] +name = "openssl" +version = "0.10.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" +checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "parking_lot" @@ -665,9 +881,9 @@ dependencies = [ "cfg-if 0.1.10", "cloudabi", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "smallvec", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -688,18 +904,38 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.17" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef0f924a5ee7ea9cbcea77529dba45f8a9ba9f622419fe3386ca581a3ae9d5a" +dependencies = [ + "pin-project-internal 0.4.30", +] + +[[package]] +name = "pin-project" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" +checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" dependencies = [ - "pin-project-internal", + "pin-project-internal 1.0.11", ] [[package]] name = "pin-project-internal" -version = "0.4.17" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851c8d0ce9bebe43790dedfc86614c23494ac9f423dd618d3a61fc693eafe61e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" +checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" dependencies = [ "proc-macro2", "quote", @@ -708,41 +944,41 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.1.5" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "pin-project-lite" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] -name = "ppv-lite86" -version = "0.2.8" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "proc-macro-hack" -version = "0.5.16" +name = "pkg-config" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] -name = "proc-macro-nested" -version = "0.1.6" +name = "ppv-lite86" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.17" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1502d12e458c49a4c9cbff560d0fe0060c252bc29799ed94ca2ed4bb665a0101" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -751,7 +987,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" dependencies = [ - "bytes", + "bytes 0.5.6", "prost-derive", ] @@ -761,7 +997,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ - "bytes", + "bytes 0.5.6", "heck", "itertools", "log", @@ -792,15 +1028,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" dependencies = [ - "bytes", + "bytes 0.5.6", "prost", ] [[package]] name = "quote" -version = "1.0.6" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -811,7 +1047,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", "rand_core", @@ -835,7 +1071,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", ] [[package]] @@ -858,31 +1094,39 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] [[package]] name = "regex" -version = "1.3.9" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.18" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "relay" -version = "0.0.1" +version = "1.4.2" dependencies = [ "base64 0.13.0", "bincode", @@ -890,28 +1134,66 @@ dependencies = [ "futures", "listenfd", "prost", - "serde 1.0.110", + "reqwest", + "serde 1.0.139", + "serde_json", "sled", "tokio", "tonic", "tonic-build", - "uuid 0.8.1", + "uuid", ] [[package]] name = "remove_dir_all" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", +] + +[[package]] +name = "reqwest" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +dependencies = [ + "base64 0.13.0", + "bytes 0.5.6", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite 0.2.9", + "serde 1.0.139", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", ] [[package]] name = "ring" -version = "0.16.14" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06b3fefa4f12272808f809a0af618501fdaba41a58963c5fb72238ab0be09603" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ "cc", "libc", @@ -919,7 +1201,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -943,9 +1225,19 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "schannel" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] [[package]] name = "scopeguard" @@ -955,14 +1247,37 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted", ] +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "0.8.23" @@ -971,9 +1286,9 @@ checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.110" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" +checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" dependencies = [ "serde_derive", ] @@ -993,9 +1308,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.110" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" +checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" dependencies = [ "proc-macro2", "quote", @@ -1004,13 +1319,13 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.53" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa", + "itoa 1.0.2", "ryu", - "serde 1.0.110", + "serde 1.0.139", ] [[package]] @@ -1022,11 +1337,26 @@ dependencies = [ "serde 0.8.23", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.2", + "ryu", + "serde 1.0.139", +] + [[package]] name = "slab" -version = "0.4.2" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "sled" @@ -1046,9 +1376,20 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi 0.3.9", +] [[package]] name = "spin" @@ -1064,71 +1405,67 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" -version = "1.0.24" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87bc5b2815ebb664de0392fdf1b95b6d10e160f86d9f64ff65e5679841ca06a" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "tempfile" -version = "3.1.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", + "fastrand", "libc", - "rand", - "redox_syscall", + "redox_syscall 0.2.13", "remove_dir_all", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] -name = "thread_local" -version = "1.0.1" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ - "lazy_static", + "tinyvec_macros", ] [[package]] -name = "time" -version = "0.1.43" +name = "tinyvec_macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi 0.3.8", -] +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "0.2.21" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" +checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" dependencies = [ - "bytes", + "bytes 0.5.6", "fnv", "futures-core", "iovec", "lazy_static", "memchr", "mio", - "pin-project-lite", + "pin-project-lite 0.1.12", "slab", "tokio-macros", ] [[package]] name = "tokio-macros" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" dependencies = [ "proc-macro2", "quote", @@ -1147,27 +1484,37 @@ dependencies = [ "webpki", ] +[[package]] +name = "tokio-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ - "bytes", + "bytes 0.5.6", "futures-core", "futures-sink", "log", - "pin-project-lite", + "pin-project-lite 0.1.12", "tokio", ] [[package]] name = "toml" -version = "0.5.6" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ - "serde 1.0.110", + "serde 1.0.139", ] [[package]] @@ -1179,14 +1526,14 @@ dependencies = [ "async-stream", "async-trait", "base64 0.11.0", - "bytes", + "bytes 0.5.6", "futures-core", "futures-util", "http", "http-body", "hyper", "percent-encoding", - "pin-project", + "pin-project 0.4.30", "prost", "prost-derive", "tokio", @@ -1240,7 +1587,7 @@ dependencies = [ "futures-core", "futures-util", "indexmap", - "pin-project", + "pin-project 0.4.30", "rand", "slab", "tokio", @@ -1260,7 +1607,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4887dc2a65d464c8b9b66e0e4d51c2fd6cf5b3373afc72805b0a60bce00446a" dependencies = [ "futures-core", - "pin-project", + "pin-project 0.4.30", "tokio", "tower-layer", "tower-service", @@ -1274,15 +1621,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f6b5000c3c54d269cc695dff28136bb33d08cbf1df2c48129e143ab65bf3c2a" dependencies = [ "futures-core", - "pin-project", + "pin-project 0.4.30", "tower-service", ] [[package]] name = "tower-layer" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35d656f2638b288b33495d1053ea74c40dc05ec0b92084dd71ca5566c4ed1dc" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" [[package]] name = "tower-limit" @@ -1291,7 +1638,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92c3040c5dbed68abffaa0d4517ac1a454cd741044f33ab0eefab6b8d1361404" dependencies = [ "futures-core", - "pin-project", + "pin-project 0.4.30", "tokio", "tower-layer", "tower-load", @@ -1306,7 +1653,7 @@ checksum = "8cc79fc3afd07492b7966d7efa7c6c50f8ed58d768a6075dd7ae6591c5d2017b" dependencies = [ "futures-core", "log", - "pin-project", + "pin-project 0.4.30", "tokio", "tower-discover", "tower-service", @@ -1319,7 +1666,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f021e23900173dc315feb4b6922510dae3e79c689b74c089112066c11f0ae4e" dependencies = [ "futures-core", - "pin-project", + "pin-project 0.4.30", "tower-layer", "tower-service", ] @@ -1355,7 +1702,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6727956aaa2f8957d4d9232b308fe8e4e65d99db30f42b225646e86c9b6a952" dependencies = [ "futures-core", - "pin-project", + "pin-project 0.4.30", "tokio", "tower-layer", "tower-service", @@ -1363,9 +1710,9 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tower-timeout" @@ -1373,7 +1720,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "127b8924b357be938823eaaec0608c482d40add25609481027b96198b2e4b31e" dependencies = [ - "pin-project", + "pin-project 0.4.30", "tokio", "tower-layer", "tower-service", @@ -1387,27 +1734,28 @@ checksum = "d1093c19826d33807c72511e68f73b4a0469a3f22c2bd5f7d5212178b4b89674" dependencies = [ "futures-core", "futures-util", - "pin-project", + "pin-project 0.4.30", "tower-service", ] [[package]] name = "tracing" -version = "0.1.14" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c6b59d116d218cb2d990eb06b77b64043e0268ef7323aae63d8b30ae462923" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "log", + "pin-project-lite 0.2.9", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.8" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" dependencies = [ "proc-macro2", "quote", @@ -1416,40 +1764,64 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.10" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "tracing-futures" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project", + "pin-project 1.0.11", "tracing", ] [[package]] name = "try-lock" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "unicode-segmentation" -version = "1.6.0" +name = "unicase" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] [[package]] -name = "unicode-xid" -version = "0.2.0" +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" + +[[package]] +name = "unicode-normalization" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "untrusted" @@ -1458,28 +1830,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "uuid" -version = "0.6.5" +name = "url" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ - "cfg-if 0.1.10", + "form_urlencoded", + "idna", + "matches", + "percent-encoding", ] [[package]] name = "uuid" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "rand", + "getrandom 0.2.7", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" @@ -1497,21 +1878,29 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.62" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", + "serde 1.0.139", + "serde_json", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.62" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -1522,11 +1911,23 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.62" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1534,9 +1935,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.62" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -1547,15 +1948,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.62" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.39" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", @@ -1563,9 +1964,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.21.3" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ "ring", "untrusted", @@ -1588,9 +1989,9 @@ checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", @@ -1614,6 +2015,58 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -1626,9 +2079,9 @@ dependencies = [ [[package]] name = "yaml-rust" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ - "linked-hash-map 0.5.3", + "linked-hash-map 0.5.6", ] diff --git a/core/relay/Cargo.toml b/core/relay/Cargo.toml index acb3e0289..c759b2e04 100644 --- a/core/relay/Cargo.toml +++ b/core/relay/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "relay" -version = "0.0.1" -authors = ["Antony Targett ", "Nick Waywood "] +version = "1.4.2" +authors = ["Antony Targett ", "Nick Waywood ", "Sandeep Nishad /dev/null) + .PHONY: push-server -push-server: build-server-local +push-server: check-if-tag-exists build-server-local @echo -e "\033[1mPUSH\033[0m - Pushing Docker image (relay server)..." docker tag $(DOCKER_IMAGE_SERVER) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_SERVER) docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_SERVER) + +.PHONY: push-server +push-server-latest: + @echo -e "\033[1mPUSH\033[0m - Pushing Docker image Latest tag (relay server)..." + docker tag $(DOCKER_IMAGE_SERVER) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_SERVER_LATEST) + docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_SERVER_LATEST) .PHONY: push-client push-client: build-client diff --git a/core/relay/Makefile.variables.docker b/core/relay/Makefile.variables.docker deleted file mode 100644 index 8f3a6a9a2..000000000 --- a/core/relay/Makefile.variables.docker +++ /dev/null @@ -1,4 +0,0 @@ -DOCKER_IMAGE_NAME ?= weaver-relay -DOCKER_TAG ?= 1.3.1 -DOCKER_REGISTRY ?= ghcr.io/hyperledger-labs -GIT_URL = https://github.com/hyperledger-labs/weaver-dlt-interoperability \ No newline at end of file diff --git a/core/relay/VERSION b/core/relay/VERSION new file mode 100644 index 000000000..c9929e36a --- /dev/null +++ b/core/relay/VERSION @@ -0,0 +1 @@ +1.4.2 \ No newline at end of file diff --git a/core/relay/config/Corda_Relay.toml b/core/relay/config/Corda_Relay.toml index e3f34da92..5316f022c 100644 --- a/core/relay/config/Corda_Relay.toml +++ b/core/relay/config/Corda_Relay.toml @@ -54,6 +54,6 @@ tls=false tlsca_cert_path="credentials/fabric_ca_cert.pem" [drivers.Dummy] hostname="localhost" -port="9095" +port="9092" tls=false tlsca_cert_path="credentials/fabric_ca_cert.pem" diff --git a/core/relay/config/Dummy_Relay.toml b/core/relay/config/Dummy_Relay.toml index 06df94f58..9aaf75db2 100644 --- a/core/relay/config/Dummy_Relay.toml +++ b/core/relay/config/Dummy_Relay.toml @@ -5,6 +5,11 @@ db_path="db/Dummy_Relay/requests" # This will be replaced by the task queue. remote_db_path="db/Dummy_Relay/remote_request" +# FOR TLS +cert_path="credentials/fabric_cert.pem" +key_path="credentials/fabric_key" +tls=false + # Networks map is used to identity the network behind the relay # by its network name so the request can be routed to the right driver [networks] @@ -16,18 +21,33 @@ network="Dummy" [relays.Corda_Relay] hostname="localhost" port="9081" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" +[relays.Dummy_Relay] +hostname="localhost" +port="9085" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" [relays.Fabric_Relay2] hostname="localhost" port="9083" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" # host and port of the driver identified by networks map [drivers] [drivers.Fabric] hostname="localhost" port="9090" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" [drivers.Corda] hostname="localhost" port="9099" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" [drivers.Dummy] hostname="localhost" port="9092" +tls=false +tlsca_cert_path="credentials/fabric_ca_cert.pem" diff --git a/core/relay/docker/testnet-envs/.env.corda b/core/relay/docker/testnet-envs/.env.corda index 6ba6d3342..ddba41ec2 100644 --- a/core/relay/docker/testnet-envs/.env.corda +++ b/core/relay/docker/testnet-envs/.env.corda @@ -7,7 +7,7 @@ DRIVER_NAME=corda-driver-Corda_Network RELAY_NAME=relay-corda RELAY_PORT=9081 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_default COMPOSE_PROJECT_NAME=corda COMPOSE_PROJECT_NETWORK=default diff --git a/core/relay/docker/testnet-envs/.env.corda.tls b/core/relay/docker/testnet-envs/.env.corda.tls index 494eb7c6c..df5e570de 100644 --- a/core/relay/docker/testnet-envs/.env.corda.tls +++ b/core/relay/docker/testnet-envs/.env.corda.tls @@ -7,7 +7,7 @@ DRIVER_NAME=corda-driver-Corda_Network RELAY_NAME=relay-corda RELAY_PORT=9081 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_default COMPOSE_PROJECT_NAME=corda COMPOSE_PROJECT_NETWORK=default diff --git a/core/relay/docker/testnet-envs/.env.corda2 b/core/relay/docker/testnet-envs/.env.corda2 index 4f958487b..436b5e5e2 100644 --- a/core/relay/docker/testnet-envs/.env.corda2 +++ b/core/relay/docker/testnet-envs/.env.corda2 @@ -7,7 +7,7 @@ DRIVER_NAME=corda-driver-Corda_Network2 RELAY_NAME=relay-corda2 RELAY_PORT=9082 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_network2_default COMPOSE_PROJECT_NAME=corda_network2 COMPOSE_PROJECT_NETWORK=default diff --git a/core/relay/docker/testnet-envs/.env.corda2.tls b/core/relay/docker/testnet-envs/.env.corda2.tls index 1f11398d1..0c8183111 100644 --- a/core/relay/docker/testnet-envs/.env.corda2.tls +++ b/core/relay/docker/testnet-envs/.env.corda2.tls @@ -7,7 +7,7 @@ DRIVER_NAME=corda-driver-Corda_Network2 RELAY_NAME=relay-corda2 RELAY_PORT=9082 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=corda_network2_default COMPOSE_PROJECT_NAME=corda_network2 COMPOSE_PROJECT_NETWORK=default diff --git a/core/relay/docker/testnet-envs/.env.n1 b/core/relay/docker/testnet-envs/.env.n1 index 147dadc64..94f418953 100644 --- a/core/relay/docker/testnet-envs/.env.n1 +++ b/core/relay/docker/testnet-envs/.env.n1 @@ -7,7 +7,7 @@ DRIVER_NAME=fabric-driver-network1 RELAY_NAME=relay-network1 RELAY_PORT=9080 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network1_net COMPOSE_PROJECT_NAME=network1 COMPOSE_PROJECT_NETWORK=net diff --git a/core/relay/docker/testnet-envs/.env.n1.tls b/core/relay/docker/testnet-envs/.env.n1.tls index bb3fb4cc7..e7d63b13f 100644 --- a/core/relay/docker/testnet-envs/.env.n1.tls +++ b/core/relay/docker/testnet-envs/.env.n1.tls @@ -7,7 +7,7 @@ DRIVER_NAME=fabric-driver-network1 RELAY_NAME=relay-network1 RELAY_PORT=9080 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network1_net COMPOSE_PROJECT_NAME=network1 COMPOSE_PROJECT_NETWORK=net diff --git a/core/relay/docker/testnet-envs/.env.n2 b/core/relay/docker/testnet-envs/.env.n2 index e63771fbf..bbe7c89ec 100644 --- a/core/relay/docker/testnet-envs/.env.n2 +++ b/core/relay/docker/testnet-envs/.env.n2 @@ -7,7 +7,7 @@ DRIVER_NAME=fabric-driver-network2 RELAY_NAME=relay-network2 RELAY_PORT=9083 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network2_net COMPOSE_PROJECT_NAME=network2 COMPOSE_PROJECT_NETWORK=net diff --git a/core/relay/docker/testnet-envs/.env.n2.tls b/core/relay/docker/testnet-envs/.env.n2.tls index 15705dd1e..9c08d2671 100644 --- a/core/relay/docker/testnet-envs/.env.n2.tls +++ b/core/relay/docker/testnet-envs/.env.n2.tls @@ -7,7 +7,7 @@ DRIVER_NAME=fabric-driver-network2 RELAY_NAME=relay-network2 RELAY_PORT=9083 DOCKER_IMAGE_NAME=ghcr.io/hyperledger-labs/weaver-relay-server -DOCKER_TAG=1.3.1 +DOCKER_TAG=latest EXTERNAL_NETWORK=network2_net COMPOSE_PROJECT_NAME=network2 COMPOSE_PROJECT_NETWORK=net diff --git a/core/relay/driver/driver.rs b/core/relay/driver/driver.rs index 4db184bc4..5232c27d2 100644 --- a/core/relay/driver/driver.rs +++ b/core/relay/driver/driver.rs @@ -6,6 +6,7 @@ use common::query::Query; use common::events::EventSubscription; use common::state::{view_payload, Meta, meta, ViewPayload, View}; use driver::driver::driver_communication_server::{DriverCommunication, DriverCommunicationServer}; +use driver::driver::WriteExternalStateMessage; // External modules use config; @@ -52,6 +53,8 @@ pub struct DriverCommunicationService { pub struct URI { port: String, hostname: String, + tls: bool, + tlsca_cert_path: String, } #[tonic::async_trait] @@ -115,7 +118,104 @@ impl DriverCommunication for DriverCommunicationService { return Ok(Response::new(reply)); } async fn subscribe_event(&self, request: Request) -> Result, Status> { - Err(tonic::Status::unimplemented("method not implemented")) + println!("Driver: Got a event subscription request from {:?}", request.remote_addr()); + let into_inner = request.into_inner().clone(); + let query = into_inner.query.clone().expect(""); + let request_id = query.clone().request_id.to_string(); + + let relay_port = self + .config_lock + .read() + .await + .get_str("port") + .expect("Port table does not exist"); + let relay_hostname = self + .config_lock + .read() + .await + .get_str("hostname") + .expect("Hostname table does not exist"); + let client_addr = format!("http://{}:{}", relay_hostname, relay_port); + println!("Remote relay... {:?}", client_addr.clone()); + let client_result = + relay::events::event_subscribe_client::EventSubscribeClient::connect(client_addr) + .await; + match client_result { + Ok(client) => { + // Sends Mocked payload back. + tokio::spawn(async move { + let my_time = time::Duration::from_millis(3000); + sleep(my_time); + let ack = Ack { + status: ack::Status::Ok as i32, + request_id: request_id, + message: "".to_string(), + }; + println!("Sending ack to remote relay... {:?}", ack.clone()); + let response = client.clone().send_driver_subscription_status(ack).await; + println!("Ack from remote relay={:?}", response); + }); + } + Err(e) => { + // TODO: Add better error handling (Attempt a few times?) + panic!("Failed to connect to client. Error: {}", e.to_string()); + } + } + + let reply = Ack { + status: ack::Status::Ok as i32, + request_id: query.clone().request_id.to_string(), + message: "".to_string(), + }; + + return Ok(Response::new(reply)); + } + async fn request_signed_event_subscription_query(&self, request: Request) -> Result, Status> { + let received_query = request.into_inner().clone().query.expect("Err"); + let signed_query: Query = Query { + policy: received_query.policy, + address: received_query.address, + requesting_relay: received_query.requesting_relay, + requesting_org: received_query.requesting_org, + requesting_network: received_query.requesting_network, + certificate: "dummy-driver-certificate".to_string(), + requestor_signature: "dummy-driver-signature".to_string(), + nonce: received_query.nonce, + request_id: received_query.request_id, + confidential: received_query.confidential, + }; + return Ok(Response::new(signed_query)); + } + async fn write_external_state(&self, request: Request) -> Result, Status> { + let view_payload = request.into_inner().view_payload.expect("Error"); + let request_id = view_payload.clone().request_id.to_string(); + match view_payload.state { + Some(state) => match state { + view_payload::State::Error(error) => { + let reply = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Error received: {:?}", error).to_string(), + }; + return Ok(Response::new(reply)); + } + view_payload::State::View(_view) => { + let reply = Ack { + status: ack::Status::Ok as i32, + request_id: request_id.to_string(), + message: "Successfully written".to_string(), + }; + return Ok(Response::new(reply)); + } + } + None => {} + } + let reply_error = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: "Error".to_string(), + }; + return Ok(Response::new(reply_error)); } } diff --git a/core/relay/src/client.rs b/core/relay/src/client.rs index 5513cdd6b..2c279b4ae 100644 --- a/core/relay/src/client.rs +++ b/core/relay/src/client.rs @@ -2,15 +2,28 @@ mod pb; mod relay_proto; use futures::future::{BoxFuture, FutureExt}; use pb::common::ack::ack; -use pb::common::state::request_state; -use pb::networks::networks::{network_client::NetworkClient, GetStateMessage, NetworkQuery}; +use pb::common::state::{request_state, view_payload, ViewPayload, View, Meta, meta}; +use pb::common::events::{event_subscription_state, EventMatcher, EventPublication, event_publication, ContractTransaction}; +use pb::relay::events::{event_publish_client::EventPublishClient}; +use pb::networks::networks::{network_client::NetworkClient, GetStateMessage, NetworkQuery, NetworkEventSubscription, NetworkEventUnsubscription}; use relay_proto::get_url; use std::env; use std::thread::sleep; use std::time; +use serde_json; #[tokio::main] async fn main() -> Result<(), Box> { + println!("\nData Sharing Test"); + datasharing().await?; + println!("\nEvent: Driver Subscription Test"); + event_suscribe(true).await?; + println!("\nEvent: Client Subscription Test"); + event_suscribe(false).await?; + Ok(()) +} + +async fn datasharing() -> Result<(), Box> { let args: Vec = env::args().collect(); let net_addr = format!("http://{}", get_url(&args)); let mut network_client = NetworkClient::connect(net_addr).await?; @@ -35,11 +48,17 @@ async fn main() -> Result<(), Box> { Some(ack_status) => match ack_status { ack::Status::Ok => { poll_for_state(request_id.to_string(), network_client).await; - println!("Success!"); + println!("Data Sharing: Success!"); + } + ack::Status::Error => { + println!("An error occurred in request_state call"); + std::process::exit(1); } - ack::Status::Error => println!("An error occurred in request_state call"), }, - None => println!("The returned Ack has no status"), + None => { + println!("The returned Ack has no status"); + std::process::exit(1); + } } Ok(()) } @@ -61,13 +80,353 @@ fn poll_for_state( Some(request_status) => { if request_status == request_state::Status::Pending { poll_for_state(request_id, network_client).await; + } else if request_status == request_state::Status::Error { + println!("Error"); + std::process::exit(1); } } - None => println!("No status returned from get state request"), + None => { + println!("No status returned from get state request"); + std::process::exit(1); + } }; } - Err(error) => println!("Error getting state response"), + Err(_error) => { + println!("Error getting state response"); + std::process::exit(1); + } } } .boxed() } + + +async fn event_suscribe(driver: bool) -> Result<(), Box> { + let args: Vec = env::args().collect(); + let net_addr = format!("http://{}", get_url(&args)); + let mut network_client = NetworkClient::connect(net_addr).await?; + // localhost:9081/Corda_Network/test + // {locationsegment}/{Network_id}/{query} + // localhost:9081/Corda_Network/mychannel:simplestate:read:TestState + let network_query = NetworkQuery { + policy: vec!["test".to_string()], + address: args[2].to_string(), + requesting_relay: "".to_string(), + requesting_network: "".to_string(), + requesting_org: "".to_string(), + certificate: "test".to_string(), + requestor_signature: "test".to_string(), + nonce: "test".to_string(), + confidential: false, + }; + let event_matcher = EventMatcher { + event_type: 0, + event_class_id: "test".to_string(), + transaction_ledger_id: "test".to_string(), + transaction_contract_id: "test".to_string(), + transaction_func: "test".to_string(), + }; + let tmp; + if driver { + let ctx = ContractTransaction { + driver_id: "Dummy_Network".to_string(), + ledger_id: "abc".to_string(), + contract_id: "abc".to_string(), + func: "abc".to_string(), + args: vec![], + replace_arg_index: 0, + members: vec![], + }; + tmp = event_publication::PublicationTarget::Ctx(ctx); + } else { + tmp = event_publication::PublicationTarget::AppUrl("abc".to_string()); + } + let event_publication_spec = EventPublication { + publication_target: std::option::Option::Some(tmp), + }; + let request = tonic::Request::new(NetworkEventSubscription { + event_matcher: std::option::Option::Some(event_matcher), + query: std::option::Option::Some(network_query), + event_publication_spec: std::option::Option::Some(event_publication_spec), + }); + let response = network_client.subscribe_event(request).await?; + println!("RESPONSE={:?}", response); + let request_id = &response.get_ref().request_id; + match ack::Status::from_i32(response.get_ref().status) { + Some(ack_status) => match ack_status { + ack::Status::Ok => { + poll_for_event_subscription(request_id.clone().to_string(), network_client).await; + } + ack::Status::Error => { + println!("An error occurred in subscribe_event call"); + std::process::exit(1); + } + }, + None => { + println!("The returned Ack has no status"); + std::process::exit(1); + } + } + println!("\n"); + let result = event_publish_test(request_id.to_string(), driver).await; + match result { + Ok(()) => { + println!("Publish test: Successful"); + }, + Err(error) => { + println!("Error during Publish Test: {:?}", error); + std::process::exit(1); + } + } + println!("\n"); + return event_unsuscribe(request_id.to_string(), driver).await; +} + +async fn event_unsuscribe(request_id: String, driver: bool) -> Result<(), Box> { + let args: Vec = env::args().collect(); + let net_addr = format!("http://{}", get_url(&args)); + let mut network_client = NetworkClient::connect(net_addr).await?; + // localhost:9081/Corda_Network/test + // {locationsegment}/{Network_id}/{query} + // localhost:9081/Corda_Network/mychannel:simplestate:read:TestState + let network_query = NetworkQuery { + policy: vec!["test".to_string()], + address: args[2].to_string(), + requesting_relay: "".to_string(), + requesting_network: "".to_string(), + requesting_org: "".to_string(), + certificate: "test".to_string(), + requestor_signature: "test".to_string(), + nonce: "test".to_string(), + confidential: false, + }; + let event_matcher = EventMatcher { + event_type: 0, + event_class_id: "test".to_string(), + transaction_ledger_id: "test".to_string(), + transaction_contract_id: "test".to_string(), + transaction_func: "test".to_string(), + }; + let tmp; + if driver { + let ctx = ContractTransaction { + driver_id: "Dummy_Network".to_string(), + ledger_id: "abc".to_string(), + contract_id: "abc".to_string(), + func: "abc".to_string(), + args: vec![], + replace_arg_index: 0, + members: vec![], + }; + tmp = event_publication::PublicationTarget::Ctx(ctx); + } else { + tmp = event_publication::PublicationTarget::AppUrl("abc".to_string()); + } + let event_publication_spec = EventPublication { + publication_target: std::option::Option::Some(tmp), + }; + let net_event_sub = NetworkEventSubscription { + event_matcher: std::option::Option::Some(event_matcher), + query: std::option::Option::Some(network_query), + event_publication_spec: std::option::Option::Some(event_publication_spec), + }; + let request = tonic::Request::new(NetworkEventUnsubscription { + request: std::option::Option::Some(net_event_sub), + request_id: request_id, + }); + let response = network_client.unsubscribe_event(request).await?; + println!("RESPONSE={:?}", response); + let request_id = &response.get_ref().request_id; + match ack::Status::from_i32(response.get_ref().status) { + Some(ack_status) => match ack_status { + ack::Status::Ok => { + poll_for_event_subscription(request_id.to_string(), network_client).await; + } + ack::Status::Error => { + println!("An error occurred in unsubscribe_event call"); + std::process::exit(1); + } + }, + None => { + println!("The returned Ack has no status"); + std::process::exit(1); + } + } + Ok(()) +} + +fn poll_for_event_subscription( + request_id: String, + mut network_client: NetworkClient, +) -> BoxFuture<'static, ()> { + async move { + sleep(time::Duration::from_millis(2000)); + let request = tonic::Request::new(GetStateMessage { + request_id: request_id.to_string(), + }); + let result = network_client.get_event_subscription_state(request).await; + match result { + Ok(response) => { + println!("Get Event Subscription State response: {:?}", response); + match event_subscription_state::Status::from_i32(response.get_ref().status) { + Some(request_status) => { + println!("Received status: {:?}", response); + if request_status == event_subscription_state::Status::SubscribePending || + request_status == event_subscription_state::Status::UnsubscribePending || + request_status == event_subscription_state::Status::SubscribePendingAck || + request_status == event_subscription_state::Status::SubscribePendingAck { + poll_for_event_subscription(request_id, network_client).await; + } else if request_status == event_subscription_state::Status::Subscribed { + println!("Event Subscription: Success!"); + } else if request_status == event_subscription_state::Status::Unsubscribed { + println!("Event Unsubscription: Success!"); + } else { + println!("Error: {:?}", response.get_ref().message.to_string()); + std::process::exit(1); + } + } + None => { + println!("No status returned from get state request"); + std::process::exit(1); + } + }; + } + Err(_error) => { + println!("Error getting state response"); + std::process::exit(1); + } + } + } + .boxed() +} + +async fn event_publish_test(request_id: String, driver: bool) -> Result<(), Box> { + let args: Vec = env::args().collect(); + let net_addr = format!("http://{}", get_url(&args)); + let mut client = EventPublishClient::connect(net_addr.to_string()).await?; + // localhost:9081/Corda_Network/test + // {locationsegment}/{Network_id}/{query} + // localhost:9081/Corda_Network/mychannel:simplestate:read:TestState + let meta = Meta { + proof_type: "abc".to_string(), + protocol: meta::Protocol::Fabric as i32, + serialization_format: "abc".to_string(), + timestamp: "abc".to_string(), + }; + let data: Vec = vec![104, 101, 108, 108, 111]; + let view = View { + meta: Some(meta), + data: data, + }; + let view_payload = ViewPayload { + request_id: request_id.to_string(), + state: Some(view_payload::State::View(view)), + }; + let view_payload_err = ViewPayload { + request_id: request_id.to_string(), + state: Some(view_payload::State::Error("mock error".to_string())), + }; + + let response = client.send_driver_state(view_payload.clone()).await?; + if ack::Status::from_i32(response.get_ref().status).expect("No Valid Status") != ack::Status::Ok { + println!("An error occurred in send driver state call {:?}", response.get_ref().message); + std::process::exit(1); + } + + sleep(time::Duration::from_millis(2000)); + + let response_err = client.send_driver_state(view_payload_err.clone()).await?; + if ack::Status::from_i32(response_err.get_ref().status).expect("No Valid Status") != ack::Status::Ok { + println!("An error occurred in send driver state call {:?}", response.get_ref().message); + std::process::exit(1); + } + + sleep(time::Duration::from_millis(2000)); + + let mut network_client = NetworkClient::connect(net_addr.to_string()).await?; + let request = tonic::Request::new(GetStateMessage { + request_id: request_id.to_string(), + }); + + // Check if states status are correct. + let event_states_res = network_client.get_event_states(request).await; + match event_states_res { + Ok(response) => { + let mut event_states = response.into_inner().states; + println!("Received States: {:?}", event_states); + let event_state = event_states.pop().expect("No State"); + let event_state_status = event_state.clone().state.expect("No RequestState").status; + if driver { + if request_state::Status::from_i32(event_state_status).expect("No Valid Status") != request_state::Status::EventWritten { + println!("Error: event not got written to ledger: {:?}", event_state.message.to_string()); + std::process::exit(1); + } + } else { + if request_state::Status::from_i32(event_state_status).expect("No Valid Status") != request_state::Status::EventReceived { + println!("Error: event status not correct: expected 4, received {:?}", event_state_status); + std::process::exit(1); + } + } + let event_state_json = serde_json::to_string(&event_state.clone().state.expect("No RequestState").state); + let view_payload_json = serde_json::to_string(&view_payload.clone().state); + if event_state_json.expect("stringify error") != view_payload_json.expect("stringify error") { + println!("Error: event state different than what is send: \nExpected: {:?}, \nReceived: {:?}", event_state.state, view_payload.state); + std::process::exit(1); + } + let event_state_err = event_states.pop().expect("No State"); + let event_state_err_status = event_state_err.clone().state.expect("No RequestState").status; + if driver { + if request_state::Status::from_i32(event_state_err_status.clone()).expect("No Valid Status") != request_state::Status::EventWriteError { + println!("Error: event status not correct: expected 6, received {:?}", event_state_err_status); + std::process::exit(1); + } + } else { + if request_state::Status::from_i32(event_state_err_status.clone()).expect("No Valid Status") != request_state::Status::Error { + println!("Error: event status not correct: expected 2, received {:?}", event_state_err_status); + std::process::exit(1); + } + } + let event_state_err_json = serde_json::to_string(&event_state_err.clone().state.expect("No RequestState").state); + let view_payload_err_json = serde_json::to_string(&view_payload_err.clone().state); + if event_state_err_json.expect("stringify error") != view_payload_err_json.expect("stringify error") { + println!("Error: event state different than what is send: \nExpected: {:?}, \nReceived: {:?}", event_state_err.state, view_payload_err.state); + std::process::exit(1); + } + }, + Err(error) => { + println!("An error occurred while getting event states: {:?}.", error); + std::process::exit(1); + } + } + + let request_2 = tonic::Request::new(GetStateMessage { + request_id: request_id.to_string(), + }); + // Check if states are deleted after first fetch. + let event_states_res = network_client.get_event_states(request_2).await; + match event_states_res { + Ok(response) => { + let mut event_states = response.into_inner().states; + println!("Received States 2nd: {:?}", event_states); + let event_state = event_states.pop().expect("No State"); + let event_state_status = event_state.state.expect("No RequestState").status; + if request_state::Status::from_i32(event_state_status.clone()).expect("No Valid Status") != request_state::Status::Deleted { + println!("Error: event status not correct: expected 7, received {:?}", event_state_status); + std::process::exit(1); + } + let event_state_err = event_states.pop().expect("No State"); + let event_state_err_status = event_state_err.state.expect("No RequestState").status; + if request_state::Status::from_i32(event_state_err_status.clone()).expect("No Valid Status") != request_state::Status::Deleted { + println!("Error: event status not correct: expected 7, received {:?}", event_state_err_status); + std::process::exit(1); + } + }, + Err(error) => { + println!("An error occurred while getting event states: {:?}.", error); + std::process::exit(1); + } + } + + Ok(()) +} + diff --git a/core/relay/src/db.rs b/core/relay/src/db.rs index ca9112dbd..5d035d2d0 100644 --- a/core/relay/src/db.rs +++ b/core/relay/src/db.rs @@ -24,4 +24,18 @@ impl Database { bincode::deserialize(&db_value[..]).map_err(|e| Error::BincodeError(e)); decoded_result } + pub fn unset(&self, key: String) -> Result { + let req_db = open(&self.db_path).unwrap(); + let db_value = (req_db.get(format!("b{}", key))?) + .ok_or_else(|| Error::Simple(format!("No value for key: {}", key)))?; + let decoded_result: Result = + bincode::deserialize(&db_value[..]).map_err(|e| Error::BincodeError(e)); + req_db.remove(format!("b{}", key))?; + decoded_result + } + pub fn has_key(&self, key: String) -> Result { + let req_db = open(&self.db_path).unwrap(); + let result = req_db.contains_key(format!("b{}", key))?; + Ok(result) + } } diff --git a/core/relay/src/error.rs b/core/relay/src/error.rs index 5182953d8..1a91966f4 100644 --- a/core/relay/src/error.rs +++ b/core/relay/src/error.rs @@ -11,6 +11,7 @@ pub enum Error { StatusError(tonic::Status), SledError(sled::Error), ConfigError(config::ConfigError), + ReqwestError(reqwest::Error), } impl From for Error { @@ -46,3 +47,9 @@ impl From for Error { Error::StatusError(e) } } + +impl From for Error { + fn from(e: reqwest::Error) -> Self { + Error::ReqwestError(e) + } +} diff --git a/core/relay/src/main.rs b/core/relay/src/main.rs index d13a79de9..4a90984e2 100644 --- a/core/relay/src/main.rs +++ b/core/relay/src/main.rs @@ -2,10 +2,12 @@ use pb::networks::networks::network_server::NetworkServer; use pb::relay::datatransfer::data_transfer_server::DataTransferServer; use pb::relay::events::event_subscribe_server::EventSubscribeServer; +use pb::relay::events::event_publish_server::EventPublishServer; // Internal modules use services::data_transfer_service::DataTransferService; use services::event_subscribe_service::EventSubscribeService; +use services::event_publish_service::EventPublishService; use services::network_service::NetworkService; // External modules @@ -56,6 +58,9 @@ async fn main() -> Result<(), Box> { let event_subscribe = EventSubscribeService { config_lock: RwLock::new(settings.clone()), }; + let event_publish = EventPublishService { + config_lock: RwLock::new(settings.clone()), + }; let network = NetworkService { config_lock: RwLock::new(settings.clone()), }; @@ -70,6 +75,7 @@ async fn main() -> Result<(), Box> { .tls_config(ServerTlsConfig::new().identity(identity)) .add_service(DataTransferServer::new(relay)) .add_service(EventSubscribeServer::new(event_subscribe)) + .add_service(EventPublishServer::new(event_publish)) .add_service(NetworkServer::new(network)); server.serve(addr).await?; } else { @@ -77,6 +83,7 @@ async fn main() -> Result<(), Box> { let server = Server::builder() .add_service(DataTransferServer::new(relay)) .add_service(EventSubscribeServer::new(event_subscribe)) + .add_service(EventPublishServer::new(event_publish)) .add_service(NetworkServer::new(network)); server.serve(addr).await?; } diff --git a/core/relay/src/relay_proto.rs b/core/relay/src/relay_proto.rs index d1311113c..4e72f6d0c 100644 --- a/core/relay/src/relay_proto.rs +++ b/core/relay/src/relay_proto.rs @@ -15,6 +15,7 @@ pub struct Address { pub network_id: String, } +#[allow(dead_code)] pub fn parse_address(address: String) -> Result { println!("Address to be parsed: {}", address); let v: Vec<&str> = address.split('/').collect(); @@ -31,6 +32,7 @@ pub fn parse_address(address: String) -> Result { }) } +#[allow(dead_code)] fn parse_location(location: String) -> Result { let v: Vec<&str> = location.split(":").collect(); if v.len() != 2 { @@ -47,6 +49,7 @@ fn parse_location(location: String) -> Result { }) } +#[allow(dead_code)] pub fn get_url(args: &[String]) -> String { let port = if args.len() >= 2 { args[1].clone() diff --git a/core/relay/src/services/data_transfer_service.rs b/core/relay/src/services/data_transfer_service.rs index 86db3af41..5b65ccdf0 100644 --- a/core/relay/src/services/data_transfer_service.rs +++ b/core/relay/src/services/data_transfer_service.rs @@ -2,37 +2,24 @@ use crate::pb::common::ack::{ack, Ack}; use crate::pb::common::query::Query; use crate::pb::common::state::{request_state, view_payload, RequestState, ViewPayload}; -use crate::pb::driver::driver::driver_communication_client::DriverCommunicationClient; use crate::pb::relay::datatransfer::data_transfer_client::DataTransferClient; use crate::pb::relay::datatransfer::data_transfer_server::DataTransfer; // Internal modules use crate::db::Database; use crate::error::Error; use crate::relay_proto::{parse_address, LocationSegment}; +use crate::services::helpers::{get_driver, get_driver_client}; +use crate::services::types::{Driver}; // external modules use config; -use serde; use tokio::sync::RwLock; use tonic::{Request, Response, Status}; -use base64::{encode, decode}; use tonic::transport::{Certificate, Channel, ClientTlsConfig}; pub struct DataTransferService { pub config_lock: RwLock, } -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct Driver { - port: String, - hostname: String, - tls: bool, - tlsca_cert_path: String, -} - -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct Network { - network: String, -} /// DataTransferService is the gRPC server implementation that handles the logic for /// communication of the data transfer protocol between two relays. @@ -206,46 +193,19 @@ fn request_state_helper( .set(&request_id.to_string(), &query) .map_err(|e| Error::Simple(format!("DB Failure: {:?}", e)))?; let parsed_address = parse_address(query.address.to_string())?; - // get the driver type from the networks map - let networks_table = conf - .get_table("networks") - .map_err(|e| Error::Simple(format!("Unable to find networks table. Error: {:?}", e)))?; - let network_table = networks_table - .get::(&parsed_address.network_id.to_string()) - .ok_or(Error::Simple(format!( - "Unable to find Network_id \"{}\" in config", - parsed_address.network_id.to_string() - )))?; - let network_type = network_table - .clone() - .try_into::() - .expect("Error in config file networks table") - .clone(); - // get the driver host:port from the drivers map - let drivers_table = conf - .get_table("drivers") - .map_err(|e| Error::Simple(format!("Unable to find driver table. Error: {:?}", e)))?; - let driver_table = drivers_table - .get::(&network_type.network) - .ok_or(Error::Simple(format!( - "Unable to find driver port for network: {}", - parsed_address.network_id.to_string() - )))?; - let driver_info = driver_table - .clone() - .try_into::() - .expect("Error in config file drivers table") - .clone(); - let port = driver_info.port.to_string(); - let hostname = driver_info.hostname.to_string(); - let tls = driver_info.tls; - let tlsca_cert_path = driver_info.tlsca_cert_path.to_string(); - spawn_request_driver_state(query, hostname, port, tls, tlsca_cert_path, conf.clone()); - return Ok(Ack { - status: ack::Status::Ok as i32, - request_id, - message: "".to_string(), - }); + let result = get_driver(parsed_address.network_id.to_string(), conf.clone()); + match result { + Ok(driver_info) => { + spawn_request_driver_state(query, driver_info, conf.clone()); + return Ok(Ack { + status: ack::Status::Ok as i32, + request_id, + message: "".to_string(), + }); + }, + Err(e) => Err(e), + } + } /// send_driver_state is run on the remote relay. Runs when the driver sends the @@ -283,31 +243,9 @@ fn send_driver_state_helper( async fn spawn_request_driver_state_helper( query: Query, - hostname: String, - port: String, - use_tls: bool, - tlsca_cert_path: String, + driver_info: Driver, ) -> Result<(), Error> { - let driver_address = format!("http://{}:{}", hostname, port); - let client; - if use_tls { - let pem = tokio::fs::read(tlsca_cert_path).await?; - let ca = Certificate::from_pem(pem); - - let tls = ClientTlsConfig::new() - .ca_certificate(ca) - .domain_name(hostname); - - let channel = Channel::from_shared(driver_address).unwrap() - .tls_config(tls) - .connect() - .await - .unwrap(); - - client = DriverCommunicationClient::new(channel); - } else { - client = DriverCommunicationClient::connect(driver_address).await?; - } + let client = get_driver_client(driver_info).await?; println!("Sending request to driver with query {:?}", query.clone()); let ack = client .clone() @@ -327,9 +265,9 @@ async fn spawn_request_driver_state_helper( } // Function that starts a thread which sends the query information to the driver -fn spawn_request_driver_state(query: Query, hostname: String, port: String, use_tls: bool, tlsca_cert_path: String, conf: config::Config) { +fn spawn_request_driver_state(query: Query, driver_info: Driver, conf: config::Config) { tokio::spawn(async move { - let result = spawn_request_driver_state_helper(query.clone(), hostname, port, use_tls, tlsca_cert_path).await; + let result = spawn_request_driver_state_helper(query.clone(), driver_info).await; match result { Ok(_) => { // Do nothing diff --git a/core/relay/src/services/event_publish_service.rs b/core/relay/src/services/event_publish_service.rs new file mode 100644 index 000000000..a5f27f46f --- /dev/null +++ b/core/relay/src/services/event_publish_service.rs @@ -0,0 +1,368 @@ +// Internal generated modules +use crate::pb::common::ack::{ack, Ack}; +use crate::pb::common::query::Query; +use crate::pb::common::state::{request_state, view_payload, RequestState, ViewPayload}; +use crate::pb::common::events::{EventSubscription, EventSubscriptionState, event_publication, EventPublication, EventState, EventStates}; +use crate::pb::relay::events::event_publish_client::EventPublishClient; +use crate::pb::relay::events::event_publish_server::EventPublish; +use crate::pb::driver::driver::WriteExternalStateMessage; + +// Internal modules +use crate::db::Database; +use crate::error::Error; +use crate::relay_proto::LocationSegment; +use crate::services::helpers::{get_driver, get_driver_client, get_event_subscription_key, get_event_publication_key, update_event_state}; + +// external modules +use config; +use tokio::sync::RwLock; +use tonic::{Request, Response, Status}; +use uuid::Uuid; +use tonic::transport::{Certificate, Channel, ClientTlsConfig}; +use reqwest; + +pub struct EventPublishService { + pub config_lock: RwLock, +} + +/// EventPublishService is the gRPC server implementation that handles the logic for +/// communicating event published from driver to the remote relay. +#[tonic::async_trait] +impl EventPublish for EventPublishService { + // src-driver forwards the state as part of event subscription to src-relay + async fn send_driver_state( + &self, + request: Request, + ) -> Result, Status> { + let state = request.into_inner().clone(); + let state_clone = state.clone(); + println!("Received State from driver: {:?}", state_clone.request_id); + match state_clone.state.as_ref().unwrap() { + view_payload::State::View(v) => println!("View Meta: {:?}, View Data: {:?}", v.meta, base64::encode(&v.data)), + view_payload::State::Error(e) => println!("Error: {:?}", e), + } + let request_id = state.request_id.to_string(); + let conf = self.config_lock.read().await; + // Database access/storage + let remote_db = Database { + db_path: conf.get_str("remote_db_path").unwrap(), + }; + + let result = + send_driver_state_helper(request_id.to_string(), remote_db, conf.clone(), state); + match result { + Ok(resp) => { + let reply = Ok(resp); + println!("Sending back Ack to driver: {:?}\n", reply); + return reply; + } + Err(e) => { + // NOTE: No way to send another state to Relay, if it reaches this error the next will also error. + let reply = Ok(Response::new(Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Error: {:?}", e), + })); + println!("Sending back Ack to driver: {:?}\n", reply); + return reply; + } + } + } + // src-relay will forward the state as part of event subscription to dest-relay + async fn send_state(&self, request: Request) -> Result, Status> { + let request_view_payload = request.into_inner().clone(); + println!( + "Event: Received state from remote relay: Request ID = {:?}", + request_view_payload.request_id + ); + match request_view_payload.state.as_ref().unwrap() { + view_payload::State::View(v) => println!("View Meta: {:?}, View Data: {:?}", v.meta, base64::encode(&v.data)), + view_payload::State::Error(e) => println!("Error: {:?}", e), + } + let request_id = &request_view_payload.request_id.to_string(); + let conf = self.config_lock.read().await.clone(); + // Database access/storage + let db = Database { + db_path: conf.get_str("db_path").unwrap(), + }; + let result = send_state_helper(request_view_payload, request_id.to_string(), db, conf); + + match result { + Ok(_) => { + let reply = Ok(Response::new(Ack { + status: ack::Status::Ok as i32, + request_id: request_id.to_string(), + message: "".to_string(), + })); + println!("Event: Sending back Ack to remote relay: {:?}", reply); + reply + }, + Err(e) => { + let reply = Ok(Response::new(Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("{:?}", e), + })); + println!("Event: Sending back Ack to remote relay: {:?}", reply); + reply + } + } + } + +} + + +/// send_driver_state is run on the remote relay. Runs when the driver sends the +/// state or error back to the remote relay. +fn send_driver_state_helper( + request_id: String, + remote_db: Database, + conf: config::Config, + state: ViewPayload, +) -> Result, Error> { + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let event_sub: EventSubscription = remote_db + .get::(event_sub_key.to_string()) + .map_err(|e| Error::GetQuery(format!("Failed to get event subscription from db. Error: {:?}", e)))?; + let query: &Query = &event_sub.clone().query.expect("Unexpected Error: Query not found in event subscription"); + let relays_table = conf.get_table("relays")?; + let relay_uri = relays_table + .get(&query.requesting_relay.to_string()) + .ok_or(Error::Simple("Relay name not found".to_string()))?; + let uri = relay_uri.clone().try_into::()?; + spawn_send_state( + state, + uri.hostname.to_string(), + uri.port.to_string(), + uri.tls, + uri.tlsca_cert_path.to_string(), + ); + let reply = Ack { + status: ack::Status::Ok as i32, + request_id, + message: "".to_string(), + }; + + return Ok(Response::new(reply)); +} + +// spawn_send_state sends data from the remote relay back to the requesting relay +// When it errors it currently logs to console. Needs improving +fn spawn_send_state(state: ViewPayload, requestor_host: String, requester_port: String, use_tls: bool, tlsca_cert_path: String) { + tokio::spawn(async move { + println!("Event Publish: Sending state back to requesting relay: Request ID = {:?}", state.request_id); + match state.state.as_ref().unwrap() { + view_payload::State::View(v) => println!("View Meta: {:?}, View Data: {:?}", v.meta, base64::encode(&v.data)), + view_payload::State::Error(e) => println!("Error: {:?}", e), + } + let client_addr = format!("http://{}:{}", requestor_host, requester_port); + if use_tls { + let pem = tokio::fs::read(tlsca_cert_path).await.unwrap(); + let ca = Certificate::from_pem(pem); + + let tls = ClientTlsConfig::new() + .ca_certificate(ca) + .domain_name(requestor_host); + + let channel = Channel::from_shared(client_addr).unwrap() + .tls_config(tls) + .connect() + .await + .unwrap(); + + let mut client_result = EventPublishClient::new(channel); + let response = client_result.send_state(state).await; + println!("Event Publish: Response ACK from requesting relay={:?}\n", response); + } else { + let client_result = EventPublishClient::connect(client_addr).await; + match client_result { + Ok(client) => { + let response = client.clone().send_state(state).await; + println!("Event Publish: Response ACK from requesting relay={:?}\n", response); + // Not returning anything here + } + Err(e) => { + // TODO: Add better error handling (Attempt a few times?) + println!( + "Event Publish: Failed to connect to client: ${:?}. Error: {}\n", + requester_port, + e.to_string() + ); + // TODO: Handle this error thorugh join handle after thread completes. + // Not actually returning anything here yet + } + } + } + }); +} + +/// send_state is run on the requesting relay when a remote relay sends a result back to the requesting relay +fn send_state_helper( + state: ViewPayload, + request_id: String, + db: Database, + conf: config::Config +) -> Result<(), Error> { + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let event_sub_state: EventSubscriptionState = db.get::(event_sub_key.to_string()) + .map_err(|err| Error::GetQuery(format!("Failed to get event subscription state from db. Error: {:?}", err)))?; + + let event_publish_key = get_event_publication_key(request_id.to_string()); + let event_id = Uuid::new_v4(); + let target; + match state.clone().state { + Some(data) => match data { + view_payload::State::View(payload) => { + let request_state = RequestState { + status: request_state::Status::EventReceived as i32, + request_id: request_id.to_string(), + state: Some(request_state::State::View(payload)), + }; + target = EventState { + state: Some(request_state), + event_id: event_id.to_string(), + message: "Successfully received state for event subscribed".to_string(), + }; + } + view_payload::State::Error(error) => { + let request_state = RequestState { + status: request_state::Status::Error as i32, + request_id: request_id.to_string(), + state: Some(request_state::State::Error(error)), + }; + target = EventState { + state: Some(request_state), + event_id: event_id.to_string(), + message: "Received error for the event subscribed".to_string(), + }; + } + }, + None => { + let request_state = RequestState { + status: request_state::Status::Error as i32, + request_id: request_id.to_string(), + state: Some(request_state::State::Error("Missing state".to_string())), + }; + target = EventState { + state: Some(request_state), + event_id: event_id.to_string(), + message: "No state received for the event subscribed".to_string(), + }; + } + }; + let mut event_states_list: Vec = Vec::new(); + event_states_list.push(target.clone()); + if db.has_key(event_publish_key.to_string())? { + let mut curr_event_states: EventStates = db.get::(event_publish_key.to_string()).expect("SendState: Unexpected DB Error"); + event_states_list.append(&mut curr_event_states.states); + } + + let event_states: EventStates = EventStates { + states: event_states_list, + }; + + db.set(&event_publish_key, &event_states) + .expect("Failed to insert into DB"); + + spawn_handle_event( + state, + event_sub_state.event_publication_spec.expect("No Publication Spec stored in event subscription state"), + request_id, + event_id.to_string(), + conf + ); + + return Ok(()); +} + +// Calls handle_event and updates status of event_state depending upon the success or failure. +fn spawn_handle_event(state: ViewPayload, publication_spec: EventPublication, request_id: String, event_id: String, conf: config::Config) { + tokio::spawn(async move { + println!("Event Publish: Sending state to subscriber: Request ID = {:?}", request_id.to_string()); + match state.state.as_ref().unwrap() { + view_payload::State::View(v) => println!("View Meta: {:?}, View Data: {:?}", v.meta, base64::encode(&v.data)), + view_payload::State::Error(e) => println!("Error: {:?}", e), + } + let result = handle_event(state, publication_spec, conf.clone()).await; + match result { + Ok(message) => { + if message.contains("written") { + // Update published event status to written to request_id, event_id in db + update_event_state( + request_id, + event_id, + request_state::Status::EventWritten, + conf.get_str("db_path").unwrap(), + message.to_string(), + ) + } + println!("Success: {}", message.to_string()); + } + Err(e) => { + // Update published event status to error and error message to request_id, event_id in db + println!("Write Error: {:?}", e); + update_event_state( + request_id, + event_id, + request_state::Status::EventWriteError, + conf.get_str("db_path").unwrap(), + format!("Write Error: {:?}", e), + ) + } + }; + }); +} + +// Sends event payload to either driver or app_url depending upon publication spec during subscription +async fn handle_event( + state: ViewPayload, + publication_spec: EventPublication, + conf: config::Config +) -> Result { + return match publication_spec.publication_target { + Some(data) => match data { + event_publication::PublicationTarget::Ctx(ctx) => { + let driver_id = ctx.clone().driver_id.to_string(); + let result = get_driver(driver_id.to_string(), conf.clone()); + match result { + Ok(driver_info) => { + let client = get_driver_client(driver_info).await?; + println!("Sending Received Event to driver: {:?}", state.clone()); + let write_external_state_message: WriteExternalStateMessage = WriteExternalStateMessage { + view_payload: Some(state), + ctx: Some(ctx), + }; + let ack = client + .clone() + .write_external_state(write_external_state_message) + .await? + .into_inner(); + println!("Response ACK from driver={:?}\n", ack); + let status = ack::Status::from_i32(ack.status) + .ok_or(Error::Simple("Status from Driver error".to_string()))?; + match status { + ack::Status::Ok => Ok(format!("Successfully written to ledger based on ContractTransaction")), + ack::Status::Error => Err(Error::Simple(format!("Error from driver: {}", ack.message))), + } + }, + Err(e) => Err(e), + } + } + event_publication::PublicationTarget::AppUrl(app_url) => { + let app_url_clone = app_url.clone(); + tokio::spawn(async move { + let client = reqwest::Client::new(); + let res = client.post(&app_url_clone) + .json(&state) + .send() + .await; + println!("Result from app: {:?}", res); + }); + Ok(format!("Published to app url: {}", app_url.to_string())) + } + }, + None => { + Ok(format!("Cannot publish event received: No publication target found.")) + } + }; +} \ No newline at end of file diff --git a/core/relay/src/services/event_subscribe_service.rs b/core/relay/src/services/event_subscribe_service.rs index f982d606b..fd9e803b7 100644 --- a/core/relay/src/services/event_subscribe_service.rs +++ b/core/relay/src/services/event_subscribe_service.rs @@ -1,47 +1,377 @@ // Internal generated modules use crate::pb::common::ack::{ack, Ack}; -use crate::pb::common::events::EventSubscription; -use crate::pb::driver::driver::driver_communication_client::DriverCommunicationClient; +use crate::pb::common::query::Query; +use crate::pb::common::events::{EventSubOperation, EventSubscription}; use crate::pb::relay::events::event_subscribe_client::EventSubscribeClient; use crate::pb::relay::events::event_subscribe_server::EventSubscribe; // Internal modules use crate::db::Database; use crate::error::Error; use crate::relay_proto::{parse_address, LocationSegment}; +use crate::services::helpers::{update_event_subscription_status, get_driver, get_driver_client, get_event_subscription_key}; +use crate::services::types::{Driver}; // external modules use config; -use serde; use tokio::sync::RwLock; use tonic::{Request, Response, Status}; -use base64::{encode, decode}; use tonic::transport::{Certificate, Channel, ClientTlsConfig}; pub struct EventSubscribeService { pub config_lock: RwLock, } -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct Driver { - port: String, - hostname: String, - tls: bool, - tlsca_cert_path: String, -} - -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct Network { - network: String, -} -/// DataTransferService is the gRPC server implementation that handles the logic for -/// communication of the data transfer protocol between two relays. +/// EventSubscribeService is the gRPC server implementation that handles the logic for +/// communicating event subscription request between two relays and driver. #[tonic::async_trait] impl EventSubscribe for EventSubscribeService { + // Dest-relay will call this endpoint of src-relay to request for event Subscription/Unsubscription async fn subscribe_event(&self, request: Request) -> Result, Status> { - Err(tonic::Status::unimplemented("method not implemented")) + println!( + "Got a Event Subscription request from {:?} - {:?}", + request.remote_addr(), + request + ); + let event_subscription = request.into_inner().clone(); + let query = event_subscription.query.clone().expect("No query passed with EventSubscription request"); + let request_id = query.request_id.to_string(); + + let conf = self.config_lock.read().await; + // Database access/storage + let remote_db = Database { + db_path: conf.get_str("remote_db_path").unwrap(), + }; + match subscribe_event_helper(remote_db, request_id.to_string(), event_subscription, conf.clone()) { + Ok(ack) => { + let reply = Ok(Response::new(ack)); + println!("Sending back Ack: {:?}\n", reply); + reply + } + Err(e) => { + println!("EventSubscription from Driver failed."); + let reply = Ok(Response::new(Ack { + status: ack::Status::Error as i32, + request_id, + message: format!("Error: EventSubscription from Driver failed. {:?}", e), + })); + println!("Sending back Ack: {:?}\n", reply); + reply + } + } } + + // send_driver_subscription_status is run on the src relay. + // Run when the src driver sends the ack back to the src relay + async fn send_driver_subscription_status( + &self, + request: Request, + ) -> Result, Status> { + let ack = request.into_inner().clone(); + let ack_clone = ack.clone(); + println!("Received Ack from driver: {:?}", ack_clone.request_id); + + let request_id = ack.request_id.to_string(); + let conf = self.config_lock.read().await; + // Database access/storage + let remote_db = Database { + db_path: conf.get_str("remote_db_path").unwrap(), + }; + + let result = + send_driver_subscription_status_helper(request_id.to_string(), remote_db, conf.clone(), ack); + match result { + Ok(resp) => { + let reply = Ok(resp); + println!("Sending back Ack to driver: {:?}\n", reply); + return reply; + } + Err(e) => { + // NOTE: No way to send another ack to Relay, if it reaches this error the next will also error. + let reply = Ok(Response::new(Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Error: {:?}", e), + })); + println!("Sending back Ack to driver: {:?}\n", reply); + return reply; + } + } + } + + // Src-relay will call this endpoint of dest-relay to send Subscription/Unsubscription response. async fn send_subscription_status(&self, request: Request) -> Result, Status> { - Err(tonic::Status::unimplemented("method not implemented")) + let request_ack = request.into_inner().clone(); + println!( + "Received Ack from remote relay for Event Subscription Request ID = {:?}", + request_ack.request_id + ); + let request_id = &request_ack.request_id.to_string(); + let conf = self.config_lock.read().await.clone(); + // Database access/storage + let db_path = conf.get_str("db_path").unwrap(); + + let result = send_subscription_status_helper(request_ack, request_id.clone().to_string(), db_path); + + match result { + Ok(_) => println!("Successfully set event subscription status in DB."), + Err(e) => println!("Setting value in DB failed: {:?}", e), + } + let reply = Ok(Response::new(Ack { + status: ack::Status::Ok as i32, + request_id: request_id.to_string(), + message: "".to_string(), + })); + println!("Sending back Ack to remote relay: {:?}", reply); + reply } +} + + +/// subscribe_event is run on the remote relay to subscribe to the event that was +/// requested from the requesting relay +fn subscribe_event_helper( + remote_db: Database, + request_id: String, + event_subscription: EventSubscription, + conf: config::Config, +) -> Result { + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let _set_event_sub = remote_db + .set(&event_sub_key.to_string(), &event_subscription) + .map_err(|e| Error::Simple(format!("DB Failure: {:?}", e)))?; + + let query = event_subscription.query.clone().expect("No query passed with EventSubscription request"); + let parsed_address = parse_address(query.address.to_string())?; + let result = get_driver(parsed_address.network_id.to_string(), conf.clone()); + match result { + Ok(driver_info) => { + spawn_driver_subscribe_event(event_subscription, driver_info, conf.clone()); + return Ok(Ack { + status: ack::Status::Ok as i32, + request_id, + message: "".to_string(), + }); + }, + Err(e) => Err(e), + } +} + +// Function that starts a thread which sends the event subscription request to the driver +fn spawn_driver_subscribe_event(event_subscription: EventSubscription, driver_info: Driver, conf: config::Config) { + tokio::spawn(async move { + let result = spawn_driver_subscribe_event_helper(event_subscription.clone(), driver_info).await; + match result { + Ok(_) => { + // Do nothing + println!("Ack Ok from driver\n") + } + Err(e) => { + println!("Error sending event subscription request to driver: {:?}\n", e); + // In Error case we send an error_ack to requesting relay. + let query = event_subscription.query.clone().expect("No query passed with EventSubscription request"); + let request_id = query.request_id.to_string(); + // Database access/storage + let remote_db = Database { + db_path: conf.get_str("remote_db_path").unwrap(), + }; + let error_ack = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Driver Error: {:?}", e), + }; + let result = send_driver_subscription_status_helper( + request_id.to_string(), + remote_db, + conf.clone(), + error_ack, + ); + match result { + Ok(_) => { + println!( + "Driver's subscribe_event error successfully sent back to requesting relay" + ); + } + Err(e) => println!("Error sending Ack: {:?}", e), + } + } + } + }); +} + +async fn spawn_driver_subscribe_event_helper( + event_subscription: EventSubscription, + driver_info: Driver, +) -> Result<(), Error> { + let client = get_driver_client(driver_info).await?; + println!("Sending EventSubscription Request to driver: {:?}", event_subscription.clone()); + let ack = client + .clone() + .subscribe_event(event_subscription) + .await? + .into_inner(); + println!("Response ACK from driver={:?}\n", ack); + let status = ack::Status::from_i32(ack.status) + .ok_or(Error::Simple("Status from Driver error".to_string()))?; + match status { + ack::Status::Ok => { + // Do nothing + return Ok(()); + } + ack::Status::Error => Err(Error::Simple(format!("Error from driver: {}", ack.message))), + } +} + + +/// send_driver_subscription_status is run on the remote relay. Runs when the driver sends the +/// ack back to the remote relay or if there was an error making the +/// suscribe_event gRPC call. +fn send_driver_subscription_status_helper( + request_id: String, + remote_db: Database, + conf: config::Config, + ack: Ack, +) -> Result, Error> { + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let event_sub: EventSubscription = remote_db + .get::(event_sub_key.to_string()) + .map_err(|err| Error::GetQuery(format!("Failed to get event subscription from db. Error: {:?}", err)))?; + let query: Query = event_sub.query.clone().expect("Unexpected Error: Query not found in event subscription"); + let operation = EventSubOperation::from_i32(event_sub.operation) + .ok_or(Error::Simple("Error: No Event Subscription operation defined".to_string()))?; + let unsubscribe = operation == EventSubOperation::Unsubscribe; + let relays_table = conf.get_table("relays")?; + let relay_uri = relays_table + .get(&query.requesting_relay.to_string()) + .ok_or(Error::Simple("Relay name not found".to_string()))?; + let uri = relay_uri.clone().try_into::()?; + spawn_send_subscription_status( + ack, + uri.hostname.to_string(), + uri.port.to_string(), + uri.tls, + uri.tlsca_cert_path.to_string(), + unsubscribe, + remote_db + ); + let reply = Ack { + status: ack::Status::Ok as i32, + request_id, + message: "".to_string(), + }; + + return Ok(Response::new(reply)); +} + + +// spawn_send_subscription_status sends event subscription status from the remote relay back +// to the requesting relay. +// When it errors it currently logs to console. Needs improving +fn spawn_send_subscription_status( + ack: Ack, + requestor_host: String, + requester_port: String, + use_tls: bool, + tlsca_cert_path: String, + unsubscribe: bool, + remote_db: Database, +) { + tokio::spawn(async move { + let request_id = ack.clone().request_id; + println!("Sending Subscription Status back to requesting relay: Request ID = {:?}", request_id); + let client_addr = format!("http://{}:{}", requestor_host, requester_port); + let mut response: Result, tonic::Status> = Err(tonic::Status::unimplemented("uninitialized")); + if use_tls { + let pem = tokio::fs::read(tlsca_cert_path).await.unwrap(); + let ca = Certificate::from_pem(pem); + + let tls = ClientTlsConfig::new() + .ca_certificate(ca) + .domain_name(requestor_host); + + let channel = Channel::from_shared(client_addr.clone()).unwrap() + .tls_config(tls) + .connect() + .await + .unwrap(); + + let mut client_result = EventSubscribeClient::new(channel); + response = client_result.send_subscription_status(ack.clone()).await; + println!("Response ACK from requesting relay={:?}\n", response); + } else { + let client_result = EventSubscribeClient::connect(client_addr.clone()).await; + match client_result { + Ok(client) => { + response = client.clone().send_subscription_status(ack.clone()).await; + println!("Response ACK from requesting relay={:?}\n", response); + // Not returning anything here + } + Err(e) => { + // TODO: Add better error handling (Attempt a few times?) + println!( + "Failed to connect to client: ${:?}. Error: {}\n", + requester_port, + e.to_string() + ); + // TODO: Handle this error thorugh join handle after thread completes. + // Not actually returning anything here yet + } + } + } + if unsubscribe { + println!("\nUnsubscribe Operation, deleting entry from remote_db\n"); + match response { + Ok(response_ack) => { + println!("Response ACK from relay={:?}\n", ack); + match ack::Status::from_i32(response_ack.into_inner().status) { + Some(status) => match status { + ack::Status::Ok => { + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let db_result = remote_db.unset::(event_sub_key); + match db_result { + Ok(old_state) => { + println!("Removed EventSubscription from database: {:?}", old_state); + }, + Err(e) => { + println!("EventSubscription Request not found. Error: {:?}", e); + } + } + }, + ack::Status::Error => { + println!("Error from relay: {}", ack.message) + } + } + None => { + println!("Error: No Ack Status from relay") + } + } + } + Err(_e) => { + println!("Error: error connecting to relay at {}", client_addr); + } + } + } + }); +} + +fn send_subscription_status_helper( + request_ack: Ack, + request_id: String, + db_path: String, +) -> Result<(), Error> { + match ack::Status::from_i32(request_ack.status) { + Some(status) => update_event_subscription_status( + request_id.to_string(), + status, + db_path.to_string(), + request_ack.message.to_string(), + ), + None => update_event_subscription_status( + request_id.to_string(), + ack::Status::Error, + db_path.to_string(), + "Status is not supported or is invalid".to_string(), + ), + }; + return Ok(()); } \ No newline at end of file diff --git a/core/relay/src/services/helpers.rs b/core/relay/src/services/helpers.rs new file mode 100644 index 000000000..873d7c7f2 --- /dev/null +++ b/core/relay/src/services/helpers.rs @@ -0,0 +1,292 @@ +use crate::pb::common::ack::{ack}; +use crate::pb::common::query::Query; +use crate::pb::common::state::{request_state, RequestState}; +use crate::pb::common::events::{event_subscription_state, EventSubscriptionState}; +use crate::pb::common::events::{EventSubscription, EventStates, EventState}; +use crate::pb::driver::driver::driver_communication_client::DriverCommunicationClient; + +use crate::db::Database; +use crate::services::types::{Driver, Network}; +use crate::error::Error; + +use config; +use tonic::transport::{Certificate, Channel, ClientTlsConfig}; + +// Locally scoped function to update request status in db. This function is +// called for the first time after an Ack is received from the remote relay. +// A locally created EventSubscriptionState with status PENDING or ERROR is stored. +// When a response is received from the remote relay it will write the +// returned EventSubscriptionState with status SUCCESS or ERROR. +pub fn update_event_subscription_status( + curr_request_id: String, + new_status: ack::Status, + curr_db_path: String, + message: String, +) { + let db = Database { + db_path: curr_db_path, + }; + let event_sub_key = get_event_subscription_key(curr_request_id.clone()); + let result = db.get::(event_sub_key.to_string()); + match result { + Ok(fetched_event_sub_state) => { + let target: EventSubscriptionState; + if new_status == ack::Status::Ok { + match event_subscription_state::Status::from_i32(fetched_event_sub_state.status) { + Some(status) => match status { + event_subscription_state::Status::UnsubscribePendingAck => { + target = EventSubscriptionState { + status: event_subscription_state::Status::UnsubscribePending as i32, + request_id: curr_request_id.clone(), + message: message.to_string(), + event_matcher: fetched_event_sub_state.event_matcher, + event_publication_spec: fetched_event_sub_state.event_publication_spec + }; + }, + event_subscription_state::Status::UnsubscribePending => { + target = EventSubscriptionState { + status: event_subscription_state::Status::Unsubscribed as i32, + request_id: curr_request_id.clone(), + message: message.to_string(), + event_matcher: fetched_event_sub_state.event_matcher, + event_publication_spec: fetched_event_sub_state.event_publication_spec + }; + }, + event_subscription_state::Status::SubscribePendingAck => { + target = EventSubscriptionState { + status: event_subscription_state::Status::SubscribePending as i32, + request_id: curr_request_id.clone(), + message: message.to_string(), + event_matcher: fetched_event_sub_state.event_matcher.clone(), + event_publication_spec: fetched_event_sub_state.event_publication_spec.clone(), + }; + }, + event_subscription_state::Status::SubscribePending => { + target = EventSubscriptionState { + status: event_subscription_state::Status::Subscribed as i32, + request_id: curr_request_id.clone(), + message: message.to_string(), + event_matcher: fetched_event_sub_state.event_matcher.clone(), + event_publication_spec: fetched_event_sub_state.event_publication_spec.clone(), + }; + }, + _ => { + target = EventSubscriptionState { + status: event_subscription_state::Status::Error as i32, + request_id: curr_request_id.clone(), + message: "Status is not supported or is invalid".to_string(), + event_matcher: fetched_event_sub_state.event_matcher.clone(), + event_publication_spec: fetched_event_sub_state.event_publication_spec.clone(), + }; + }, + }, + None => { + target = EventSubscriptionState { + status: event_subscription_state::Status::Error as i32, + request_id: curr_request_id.clone(), + message: "No event subscription status set in database".to_string(), + event_matcher: fetched_event_sub_state.event_matcher.clone(), + event_publication_spec: fetched_event_sub_state.event_publication_spec.clone(), + }; + }, + } + } else { + target = EventSubscriptionState { + status: event_subscription_state::Status::Error as i32, + request_id: curr_request_id.clone(), + message: message.to_string(), + event_matcher: fetched_event_sub_state.event_matcher.clone(), + event_publication_spec: fetched_event_sub_state.event_publication_spec.clone(), + }; + } + + // Panic if this fails, atm the panic is just logged by the tokio runtime + db.set(&event_sub_key.to_string(), &target) + .expect("Failed to insert into DB"); + println!("Successfully written EventSubscriptionState to database"); + println!("{:?}\n", db.get::(event_sub_key.to_string()).unwrap()) + + }, + Err(e) => { + println!("EventSubscription Request not found. Error: {:?}", e); + }, + } +} + +pub fn get_driver( + network_id: String, + conf: config::Config, +) -> Result { + // get the driver type from the networks map + let networks_table = conf + .get_table("networks") + .map_err(|e| Error::Simple(format!("Unable to find networks table. Error: {:?}", e)))?; + let network_table = networks_table + .get::(&network_id.to_string()) + .ok_or(Error::Simple(format!( + "Unable to find Network_id \"{}\" in config", + network_id.to_string() + )))?; + let network_type = network_table + .clone() + .try_into::() + .expect("Error in config file networks table") + .clone(); + // get the driver host:port from the drivers map + let drivers_table = conf + .get_table("drivers") + .map_err(|e| Error::Simple(format!("Unable to find driver table. Error: {:?}", e)))?; + let driver_table = drivers_table + .get::(&network_type.network) + .ok_or(Error::Simple(format!( + "Unable to find driver port for network: {}", + network_id.to_string() + )))?; + let driver_info = driver_table + .clone() + .try_into::() + .expect("Error in config file drivers table"); + return Ok(driver_info); +} + +pub async fn get_driver_client( + driver_info: Driver, +) -> Result, Error> { + let port = driver_info.port.to_string(); + let hostname = driver_info.hostname.to_string(); + let use_tls = driver_info.tls; + let tlsca_cert_path = driver_info.tlsca_cert_path.to_string(); + let driver_address = format!("http://{}:{}", hostname, port); + let client; + if use_tls { + let pem = tokio::fs::read(tlsca_cert_path).await?; + let ca = Certificate::from_pem(pem); + + let tls = ClientTlsConfig::new() + .ca_certificate(ca) + .domain_name(hostname); + + let channel = Channel::from_shared(driver_address).unwrap() + .tls_config(tls) + .connect() + .await + .unwrap(); + + client = DriverCommunicationClient::new(channel); + } else { + client = DriverCommunicationClient::connect(driver_address).await?; + } + return Ok(client) +} + + +pub async fn driver_sign_subscription_helper( + event_subscription: EventSubscription, + request_id: String, + driver_id: String, + conf: config::Config, +) -> Result { + let result = get_driver(driver_id.to_string(), conf.clone()); + match result { + Ok(driver_info) => { + let client = get_driver_client(driver_info).await?; + println!("Sending Sign EventSubscription Request to driver: {:?}", event_subscription.clone()); + let signed_query = client + .clone() + .request_signed_event_subscription_query(event_subscription) + .await? + .into_inner(); + if signed_query.clone().request_id.to_string() == request_id.to_string() { + println!("Signed Query Response from driver={:?}\n", signed_query); + return Ok(signed_query) + } + Err(Error::Simple(format!("Error while requesting signature from driver: {:?}", signed_query))) + }, + Err(e) => Err(e), + } +} + +pub fn update_event_state( + request_id: String, + event_id: String, + new_status: request_state::Status, + curr_db_path: String, + message: String, +) { + let db = Database { + db_path: curr_db_path, + }; + let event_publish_key = get_event_publication_key(request_id.to_string()); + let result = db.get::(event_publish_key.to_string()); + match result { + Ok(fetched_event_states) => { + let mut updated_event_states: Vec = Vec::new(); + for fetched_event_state in fetched_event_states.states { + if fetched_event_state.event_id.to_string() == event_id.to_string() { + let new_request_state: RequestState = RequestState { + status: new_status as i32, + request_id: request_id.to_string(), + state: fetched_event_state.state.expect("No State found").state, + }; + let new_event_state: EventState = EventState { + state: Some(new_request_state), + event_id: event_id.to_string(), + message: message.to_string(), + }; + updated_event_states.push(new_event_state); + } + else { + updated_event_states.push(fetched_event_state); + } + } + // Panic if this fails, atm the panic is just logged by the tokio runtime + db.set(&event_publish_key.to_string(), &updated_event_states) + .expect("Failed to insert into DB"); + println!("Successfully updated EventStates in database"); + println!("{:?}\n", updated_event_states); + }, + Err(e) => { + println!("EventStates not found. Error: {:?}", e); + }, + } +} + +pub fn try_mark_request_state_deleted(state: RequestState, request_id: String, db: Database) { + let state_status = request_state::Status::from_i32(state.clone().status).expect("No Status"); + if state_status == request_state::Status::Error || + state_status == request_state::Status::Completed { + let deleted_request_state = RequestState { + status: request_state::Status::Deleted as i32, + request_id: request_id.to_string(), + state: state.state, + }; + db.set(&request_id, &deleted_request_state) + .expect("RequestState Delete: Failed to insert into DB"); + } +} + +pub fn mark_event_states_deleted(fetched_event_states: EventStates, request_id: String, event_publish_key: String, db: Database) { + let mut updated_event_states: Vec = Vec::new(); + for fetched_event_state in fetched_event_states.states { + let deleted_request_state = RequestState { + status: request_state::Status::Deleted as i32, + request_id: request_id.to_string(), + state: fetched_event_state.state.expect("No State found").state, + }; + let deleted_event_state = EventState { + state: Some(deleted_request_state), + event_id: fetched_event_state.event_id, + message: fetched_event_state.message.to_string(), + }; + updated_event_states.push(deleted_event_state); + } + + db.set(&event_publish_key.to_string(), &updated_event_states) + .expect("EventState Delete: Failed to insert into DB"); +} +pub fn get_event_subscription_key(request_id: String) -> String { + return format!("event_sub_{}", request_id); +} +pub fn get_event_publication_key(request_id: String) -> String { + return format!("event_pub_{}", request_id); +} \ No newline at end of file diff --git a/core/relay/src/services/mod.rs b/core/relay/src/services/mod.rs index 11bcbce30..dde7ea28b 100644 --- a/core/relay/src/services/mod.rs +++ b/core/relay/src/services/mod.rs @@ -1,3 +1,6 @@ pub mod data_transfer_service; pub mod network_service; pub mod event_subscribe_service; +pub mod event_publish_service; +pub mod helpers; +pub mod types; diff --git a/core/relay/src/services/network_service.rs b/core/relay/src/services/network_service.rs index 32655d27f..d631b87f3 100644 --- a/core/relay/src/services/network_service.rs +++ b/core/relay/src/services/network_service.rs @@ -2,13 +2,15 @@ use crate::pb::common::ack::{ack, Ack}; use crate::pb::common::query::Query; use crate::pb::common::state::{request_state, RequestState}; -use crate::pb::common::events::{event_subscription_state, EventSubscriptionState}; +use crate::pb::common::events::{EventSubscription, event_subscription_state, EventSubscriptionState, EventSubOperation, event_publication, EventPublication, EventStates}; use crate::pb::networks::networks::network_server::Network; -use crate::pb::networks::networks::{DbName, GetStateMessage, NetworkQuery, RelayDatabase, NetworkEventSubscription}; +use crate::pb::networks::networks::{DbName, GetStateMessage, NetworkQuery, RelayDatabase, NetworkEventSubscription, NetworkEventUnsubscription}; use crate::pb::relay::datatransfer::data_transfer_client::DataTransferClient; +use crate::pb::relay::events::event_subscribe_client::EventSubscribeClient; use crate::relay_proto::{parse_address, LocationSegment}; // Internal modules use crate::db::Database; +use crate::services::helpers::{update_event_subscription_status, driver_sign_subscription_helper, try_mark_request_state_deleted, mark_event_states_deleted, get_event_publication_key, get_event_subscription_key}; // External modules use config; @@ -16,7 +18,6 @@ use sled::open; use tokio::sync::RwLock; use tonic::{Code, Request, Response, Status}; use uuid::Uuid; -use base64::{encode, decode}; use tonic::transport::{Certificate, Channel, ClientTlsConfig}; @@ -37,7 +38,8 @@ impl Network for NetworkService { let db = Database { db_path: conf.get_str("db_path").unwrap(), }; - let result = db.get::(request.into_inner().request_id); + let request_id = request.into_inner().request_id; + let result = db.get::(request_id.to_string()); match result { Ok(request_state) => { println!("Sending back RequestState to network: Request ID = {:?}, Status = {:?}", @@ -46,6 +48,8 @@ impl Network for NetworkService { ); match request_state.state.as_ref() { Some(state) => { + // Because already state is passed to client, deleting the state if status is completed or error + try_mark_request_state_deleted(request_state.clone(), request_id.to_string(), db); match state { request_state::State::View(v) => println!("View Meta: {:?}, View Data: {:?}", v.meta, base64::encode(&v.data)), request_state::State::Error(e) => println!("Error: {:?}", e), @@ -73,14 +77,34 @@ impl Network for NetworkService { let mut curr_key = req_db.get_gt("").unwrap(); while let Some(key) = curr_key { - let decoded_result: Result = - bincode::deserialize(&key.1[..]); // println!("{:?}", key); let decoded_key = std::str::from_utf8(&key.0[..]).unwrap(); - requests.insert( - format!("{:?}", decoded_key), - format!("{:?}", decoded_result), - ); + + if decoded_key.to_string().contains(&"event_sub".to_string()) { + let decoded_result: Result = + bincode::deserialize(&key.1[..]); + requests.insert( + format!("{:?}", decoded_key), + format!("{:?}", decoded_result), + ); + println!("Event Sub {:?} => {:?}", decoded_key, decoded_result); + } else if decoded_key.to_string().contains(&"event_pub".to_string()) { + let decoded_result: Result = + bincode::deserialize(&key.1[..]); + requests.insert( + format!("{:?}", decoded_key), + format!("{:?}", decoded_result), + ); + println!("Event Pub {:?} => {:?}", decoded_key, decoded_result); + } else { + let decoded_result: Result = + bincode::deserialize(&key.1[..]); + requests.insert( + format!("{:?}", decoded_key), + format!("{:?}", decoded_result), + ); + println!("RequestState {:?} => {:?}", decoded_key, decoded_result); + } curr_key = req_db.get_gt(key.0).unwrap(); } return Ok(Response::new(RelayDatabase { pairs: requests })); @@ -168,13 +192,292 @@ impl Network for NetworkService { // Subscribe Event Endpoints async fn subscribe_event(&self, request: Request) -> Result, Status> { - Err(tonic::Status::unimplemented("method not implemented")) + println!( + "Got a Network Event Subscription request from {:?} - {:?}", + request.remote_addr(), + request + ); + let conf = self.config_lock.read().await.clone(); + // Database access/storage + let db = Database { + db_path: conf.get_str("db_path").unwrap(), + }; + + let request_id = Uuid::new_v4(); + let network_event_subscription = request.into_inner().clone(); + + // Initial request state stored in DB. + let target: EventSubscriptionState = EventSubscriptionState { + status: event_subscription_state::Status::SubscribePendingAck as i32, + request_id: request_id.to_string(), + message: "".to_string(), + event_matcher: network_event_subscription.event_matcher.clone(), + event_publication_spec: network_event_subscription.event_publication_spec.clone() + }; + + // Create EventSubscription + let network_query = network_event_subscription.query.clone().expect("No query passed with NetworkEventSubscription request"); + let relay_name = conf.get_str("name").unwrap(); + let query: Query = Query { + policy: network_query.policy, + address: network_query.address, + requesting_relay: relay_name, + requesting_org: network_query.requesting_org, + requesting_network: network_query.requesting_network, + certificate: network_query.certificate, + requestor_signature: network_query.requestor_signature, + nonce: network_query.nonce, + request_id: request_id.to_string(), + confidential: network_query.confidential, + }; + let event_subscription: EventSubscription = EventSubscription { + event_matcher: network_event_subscription.event_matcher, + query: Some(query), + operation: EventSubOperation::Subscribe as i32, + }; + let event_publication_spec = network_event_subscription.event_publication_spec.clone().expect("No Event Publication Specification passed with NetworkEventSubscription request"); + + return event_subscription_helper(event_subscription, event_publication_spec, target, request_id.to_string(), db, conf).await; } + async fn get_event_subscription_state( &self, request: Request, ) -> Result, Status> { - Err(tonic::Status::unimplemented("method not implemented")) + println!("\nReceived GetEventSubscriptionState request from network: {:?}", request); + let conf = self.config_lock.read().await.clone(); + let db = Database { + db_path: conf.get_str("db_path").unwrap(), + }; + let event_sub_key = get_event_subscription_key(request.into_inner().request_id); + let result = db.get::(event_sub_key.to_string()); + match result { + Ok(fetched_event_sub_state) => { + match event_subscription_state::Status::from_i32(fetched_event_sub_state.status) { + Some(status) => match status { + event_subscription_state::Status::Unsubscribed => { + let result = db.unset::(event_sub_key.to_string()); + match result { + Ok(old_state) => { + println!("Removed EventSubscription from database: {:?}", old_state); + }, + Err(e) => { + println!("EventSubscription Request not found. Error: {:?}", e); + } + } + }, + _ => {}, + }, + None => {}, + } + + println!("Sending back EventSubscriptionState to network: Request ID = {:?}, Status = {:?}", + fetched_event_sub_state.request_id, + fetched_event_sub_state.status + ); + return Ok(Response::new(fetched_event_sub_state)); + }, + Err(e) => Err(Status::new( + Code::NotFound, + format!("Event Subscription Request not found. Error: {:?}", e), + )), + } + } + // Unsubscribe Event Endpoints + async fn unsubscribe_event(&self, request: Request) -> Result, Status> { + println!( + "Got a Network Event Unubscription request from {:?} - {:?}", + request.remote_addr(), + request + ); + let conf = self.config_lock.read().await.clone(); + // Database access/storage + let db = Database { + db_path: conf.get_str("db_path").unwrap(), + }; + + let net_event_sub = request.into_inner().clone(); + let network_event_subscription = net_event_sub.request.clone().expect("No network event subscription passed"); + let request_id = net_event_sub.request_id.to_string(); + + // Initial request state stored in DB. + let target: EventSubscriptionState = EventSubscriptionState { + status: event_subscription_state::Status::UnsubscribePendingAck as i32, + request_id: request_id.to_string(), + message: "".to_string(), + event_matcher: network_event_subscription.event_matcher.clone(), + event_publication_spec: network_event_subscription.event_publication_spec.clone() + }; + + // Create EventSubscription + let network_query = network_event_subscription.query.clone().expect("No query passed with NetworkEventSubscription request"); + let relay_name = conf.get_str("name").unwrap(); + let query: Query = Query { + policy: network_query.policy, + address: network_query.address, + requesting_relay: relay_name, + requesting_org: network_query.requesting_org, + requesting_network: network_query.requesting_network, + certificate: network_query.certificate, + requestor_signature: network_query.requestor_signature, + nonce: network_query.nonce, + request_id: request_id.to_string(), + confidential: network_query.confidential, + }; + let event_subscription: EventSubscription = EventSubscription { + event_matcher: network_event_subscription.event_matcher, + query: Some(query), + operation: EventSubOperation::Unsubscribe as i32, + }; + let event_publication_spec = network_event_subscription.event_publication_spec.clone().expect("No Event Publication Specification passed with NetworkEventSubscription request"); + + return event_subscription_helper(event_subscription, event_publication_spec, target, request_id.to_string(), db, conf).await; + } + + // Fetch EventStates for given subscription request identified by request_id. + async fn get_event_states( + &self, + request: Request, + ) -> Result, Status> { + println!("\nReceived GetEventStates request from network: {:?}", request); + let conf = self.config_lock.read().await.clone(); + let db = Database { + db_path: conf.get_str("db_path").unwrap(), + }; + let request_id = request.into_inner().request_id; + let event_publish_key = get_event_publication_key(request_id.to_string()); + let result = db.get::(event_publish_key.to_string()); + match result { + Ok(fetched_event_states) => { + mark_event_states_deleted(fetched_event_states.clone(), request_id.to_string(), event_publish_key.to_string(), db); + println!("Sending back EventStates to network: Request ID = {:?}: {:?}", + request_id.to_string(), + fetched_event_states.clone() + ); + return Ok(Response::new(fetched_event_states)); + }, + Err(e) => Err(Status::new( + Code::NotFound, + format!("EventStates not found for request_id: {}. Error: {:?}", request_id.to_string(), e), + )), + } + } +} + +async fn event_subscription_helper( + req_event_subscription: EventSubscription, + event_publication_spec: EventPublication, + target_status: EventSubscriptionState, + request_id: String, + db: Database, + conf: config::Config, +) -> Result, Status> { + let event_subscription; + + // Check if driver is subscribing/unsubscribing + match event_publication_spec.publication_target { + Some(data) => match data { + event_publication::PublicationTarget::Ctx(ctx) => { + let driver_id = ctx.clone().driver_id.to_string(); + println!("Requesting Driver {} to sign", driver_id.clone().to_string()); + let result = driver_sign_subscription_helper( + req_event_subscription.clone(), + request_id.to_string(), + driver_id.to_string(), + conf.clone(), + ).await; + match result { + Ok(signed_query) => { + event_subscription = EventSubscription { + event_matcher: req_event_subscription.event_matcher, + query: Some(signed_query), + operation: req_event_subscription.operation, + }; + } + Err(e) => { + println!("Driver did not signed the subscription request"); + let reply = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Error: {:?}", e), + }; + println!("Sending Ack back to network: {:?}\n", reply); + return Ok(Response::new(reply)) + } + } + } + event_publication::PublicationTarget::AppUrl(app_url) => { + println!("Registering for Client using App URL: {}", app_url.to_string()); + event_subscription = req_event_subscription; + } + }, + None => { + println!("No Publication Target"); + let reply = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("No Publication Target provided"), + }; + println!("Sending Ack back to network: {:?}\n", reply); + return Ok(Response::new(reply)) + } + }; + + let event_sub_key = get_event_subscription_key(request_id.to_string()); + let message_insert = db.set(&event_sub_key.to_string(), &target_status); + // Kept this as a match as the error case returns an Ok. + match message_insert { + Ok(_) => println!( + "Successfully stored EventSubscriptionState in db with request_id: {}", + request_id.to_string() + ), + Err(e) => { + // Internal failure of sled. Send Error response + println!( + "Error storing EventSubscriptionState in db for request_id: {}", + request_id.to_string() + ); + let reply = Ok(Response::new(Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("{:?}", e), + })); + println!("Sending Ack back to network: {:?}\n", reply); + return reply; + } + } + let query = event_subscription.clone().query.expect(""); + let parsed_address = parse_address(query.address.to_string()); + match parsed_address { + Ok(address) => { + // TODO: verify that host and port are valid + // Spawns a child process to handle sending request + spawn_send_event_subscription_request( + conf, + event_subscription, + request_id.to_string(), + address.location.hostname.to_string(), + address.location.port.to_string(), + ); + // Send Ack back to network while request is happening in a thread + let reply = Ack { + status: ack::Status::Ok as i32, + request_id: request_id.to_string(), + message: "".to_string(), + }; + println!("Sending Ack back to network: {:?}\n", reply); + Ok(Response::new(reply)) + } + Err(e) => { + println!("Invalid Address"); + let reply = Ack { + status: ack::Status::Error as i32, + request_id: request_id.to_string(), + message: format!("Error: {:?}", e), + }; + println!("Sending Ack back to network: {:?}\n", reply); + Ok(Response::new(reply)) + } } } @@ -327,3 +630,103 @@ async fn data_transfer_call( let response = client.request_state(query_request).await?; Ok(response) } + + +// Sends a request to the remote relay +fn spawn_send_event_subscription_request( + conf: config::Config, + event_subscription: EventSubscription, + request_id: String, + relay_host: String, + relay_port: String, +) { + println!("Sending EventSubscription to remote relay: {:?}:{:?}", relay_host, relay_port); + + // Spawning new thread to make the subscribe_event_call to remote relay + tokio::spawn(async move { + let db_path = conf.get_str("db_path").unwrap(); + + // Iterate through the relay entries in the configuration to find a match + let relays_table = conf.get_table("relays").unwrap(); + let mut relay_tls = false; + let mut relay_tlsca_cert_path = "".to_string(); + for (_relay_name, relay_spec) in relays_table { + let relay_uri = relay_spec.clone().try_into::().unwrap(); + if relay_host == relay_uri.hostname && relay_port == relay_uri.port { + relay_tls = relay_uri.tls; + relay_tlsca_cert_path = relay_uri.tlsca_cert_path; + } + } + + let result = suscribe_event_call( + relay_host, + relay_port, + event_subscription, + relay_tls, + relay_tlsca_cert_path.to_string(), + ) + .await; + println!("Received Ack from remote relay: {:?}\n", result); + // Potentially clean up when more skilled at Rust. + // Updates the request in the DB depending on the response status from the remote relay + match result { + Ok(ack_response) => { + let ack_response_into_inner = ack_response.into_inner().clone(); + // This match first checks if the status is valid. + match ack::Status::from_i32(ack_response_into_inner.status) { + Some(status) => update_event_subscription_status( + request_id.to_string(), + status, + db_path.to_string(), + ack_response_into_inner.message.to_string(), + ), + None => update_event_subscription_status( + request_id.to_string(), + ack::Status::Error, + db_path.to_string(), + "Status is not supported or is invalid".to_string(), + ), + } + } + Err(result_error) => update_event_subscription_status( + request_id.to_string(), + ack::Status::Error, + db_path.to_string(), + format!("{:?}", result_error).to_string(), + ), + } + }); +} +// // Call to remote relay for the event subscription protocol. +async fn suscribe_event_call( + relay_host: String, + relay_port: String, + event_subscription: EventSubscription, + use_tls: bool, + tlsca_cert_path: String, +) -> Result, Box> { + let client_addr = format!("http://{}:{}", relay_host, relay_port); + let mut client; + if use_tls { + let pem = tokio::fs::read(tlsca_cert_path).await?; + let ca = Certificate::from_pem(pem); + + let tls = ClientTlsConfig::new() + .ca_certificate(ca) + .domain_name(relay_host); + + let channel = Channel::from_shared(client_addr)? + .tls_config(tls) + .connect() + .await?; + + client = EventSubscribeClient::new(channel); + } else { + client = EventSubscribeClient::connect(client_addr).await?; + } + + let event_subscription_request = tonic::Request::new(event_subscription); + println!("EventSubscription: {:?}", event_subscription_request); + let response = client.subscribe_event(event_subscription_request).await?; + Ok(response) +} diff --git a/core/relay/src/services/types.rs b/core/relay/src/services/types.rs new file mode 100644 index 000000000..c9b178021 --- /dev/null +++ b/core/relay/src/services/types.rs @@ -0,0 +1,14 @@ +use serde; + +#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] +pub struct Driver { + pub port: String, + pub hostname: String, + pub tls: bool, + pub tlsca_cert_path: String, +} + +#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] +pub struct Network { + pub network: String, +} \ No newline at end of file diff --git a/docs/docs/external/getting-started/test-network/setup-local-docker.md b/docs/docs/external/getting-started/test-network/setup-local-docker.md index 377ca5e7f..3e5a72695 100644 --- a/docs/docs/external/getting-started/test-network/setup-local-docker.md +++ b/docs/docs/external/getting-started/test-network/setup-local-docker.md @@ -26,8 +26,8 @@ Before starting, make sure you have the following software installed on your hos - Curl: _install using package manager, like `apt` on Debian/Ubuntu Linux_ - Git: [sample instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - Docker: [sample instructions](https://docs.docker.com/engine/install/) (Latest version) -- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or above) -- Golang: [sample instructions](https://golang.org/dl/) (Version 1.17 or below) +- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or higher) +- Golang: [sample instructions](https://golang.org/dl/) (Version 1.16 or higher) - Java (JDK and JRE): [sample instructions](https://openjdk.java.net/install/) (Version 8) - Node.js and NPM: [sample instructions](https://nodejs.org/en/download/package-manager/) (Version 11 to Version 14 Supported) - Yarn: [sample instructions](https://classic.yarnpkg.com/en/docs/install/) diff --git a/docs/docs/external/getting-started/test-network/setup-local.md b/docs/docs/external/getting-started/test-network/setup-local.md index cd2f7518f..1e4ba9c3e 100644 --- a/docs/docs/external/getting-started/test-network/setup-local.md +++ b/docs/docs/external/getting-started/test-network/setup-local.md @@ -26,8 +26,8 @@ Before starting, make sure you have the following software installed on your hos - Curl: _install using package manager, like `apt` on Debian/Ubuntu Linux_ - Git: [sample instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - Docker: [sample instructions](https://docs.docker.com/engine/install/) (Latest version) -- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or above) -- Golang: [sample instructions](https://golang.org/dl/) (Version 1.17 or below) +- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or higher) +- Golang: [sample instructions](https://golang.org/dl/) (Version 1.16 or higher) - Java (JDK and JRE): [sample instructions](https://openjdk.java.net/install/) (Version 8) - Node.js and NPM: [sample instructions](https://nodejs.org/en/download/package-manager/) (Version 11 to Version 14 Supported) - Yarn: [sample instructions](https://classic.yarnpkg.com/en/docs/install/) diff --git a/docs/docs/external/getting-started/test-network/setup-packages-docker.md b/docs/docs/external/getting-started/test-network/setup-packages-docker.md index 38a0b2f34..7bfb4dc0c 100644 --- a/docs/docs/external/getting-started/test-network/setup-packages-docker.md +++ b/docs/docs/external/getting-started/test-network/setup-packages-docker.md @@ -26,8 +26,8 @@ Before starting, make sure you have the following software installed on your hos - Curl: _install using package manager, like `apt` on Debian/Ubuntu Linux_ - Git: [sample instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - Docker: [sample instructions](https://docs.docker.com/engine/install/) (Latest version) -- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or above) -- Golang: [sample instructions](https://golang.org/dl/) (Version 1.17 or below) +- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or higher) +- Golang: [sample instructions](https://golang.org/dl/) (Version 1.16 or higher) - Java (JDK and JRE): [sample instructions](https://openjdk.java.net/install/) (Version 8) - Node.js and NPM: [sample instructions](https://nodejs.org/en/download/package-manager/) (Version 11 to Version 14 Supported) - Yarn: [sample instructions](https://classic.yarnpkg.com/en/docs/install/) diff --git a/docs/docs/external/getting-started/test-network/setup-packages.md b/docs/docs/external/getting-started/test-network/setup-packages.md index 1ca02c8e5..46b0e5c4a 100644 --- a/docs/docs/external/getting-started/test-network/setup-packages.md +++ b/docs/docs/external/getting-started/test-network/setup-packages.md @@ -26,8 +26,8 @@ Before starting, make sure you have the following software installed on your hos - Curl: _install using package manager, like `apt` on Debian/Ubuntu Linux_ - Git: [sample instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - Docker: [sample instructions](https://docs.docker.com/engine/install/) (Latest version) -- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or above) -- Golang: [sample instructions](https://golang.org/dl/) (Version 1.17 or below) +- Docker-Compose: [sample instructions](https://docs.docker.com/compose/install/) (Version 1.28.2 or higher) +- Golang: [sample instructions](https://golang.org/dl/) (Version 1.16 or higher) - Java (JDK and JRE): [sample instructions](https://openjdk.java.net/install/) (Version 8) - Node.js and NPM: [sample instructions](https://nodejs.org/en/download/package-manager/) (Version 11 to Version 14 supported) - Yarn: [sample instructions](https://classic.yarnpkg.com/en/docs/install/) diff --git a/docs/docs/external/user-stories/global-trade.md b/docs/docs/external/user-stories/global-trade.md index f7fa58384..2e2cb9d4d 100644 --- a/docs/docs/external/user-stories/global-trade.md +++ b/docs/docs/external/user-stories/global-trade.md @@ -103,5 +103,6 @@ The data-sharing interoperation steps are as follows: - _Step 11_: The trade logistics network fetches tracking information indicating delivery of goods to the warehouse before permitting a consignment to be created. - _Step 16_: The trade finance network fetches a B/L from the trade logistics network before permitting the seller's bank to register a payment request. - _Step 18_: This is a recurring step, in each instance of which the food tracking network fetches location and condition information for a given consignment from the trade logistics network, and does not permit the confirmation of consignment delivery and the integrity of the goods within until the shipment reaches its destination and its condition meets the required standard. +- _Step 19_: The trade finance network gets confirmation of payment (from buyer's account to seller's account) from the payments network. To summarize, internationally traded goods can be tracked from a farm in one country to a retailer in another, the goods can be exported and shipped with all regulations complied with, financial guarantees can be put in place to safeguard the trading parties, and cross-border payments can be processed seamlessly and in a trustworthy manner. But this requires a combination of private blockchain networks willing to share data with each other and also have the ability to verify the authenticity of received data. We hope this scenario makes the motivation for data-sharing interoperation mechanisms perfectly clear. diff --git a/rfcs/README.md b/rfcs/README.md index 79cf573a7..ba6ed0b52 100644 --- a/rfcs/README.md +++ b/rfcs/README.md @@ -26,59 +26,61 @@ The RFC numbering convention is: `:`. The list of types (``) is | 02 | Protocols and Mechanisms | | 03 | Data Structures and Formats | -| RFC # | Title | Category | Status | -|--------|----------------------------------|----------|-----------------------------------------------------------------| -| 01-001 | Views | Model | [Proposed](./models/ledger/views.md) | -| 01-002 | Cryptographic Proofs | Model | [Proposed](./models/ledger/cryptographic-proofs.md) | -| 01-003 | Verifiable Observation of State | Model | [Draft](./models/ledger/observation-of-state.md) | -| 01-004 | Events | Model | [Draft](./models/ledger/events.md) | -| 01-005 | Cross-Ledger Operations | Model | [Draft](./models/ledger/cross-ledger-operations.md) | -| 01-006 | Atomic Cross-Ledger Transactions | Model | [Proposed](./models/ledger/atomic-cross-ledger-transactions.md) | -| 01-007 | Security Domains | Model | [Proposed](./models/security/security-domains.md) | -| 01-008 | End-to-End Confidentiality | Model | [Proposed](./models/security/confidentiality.md) | -| 01-009 | Relays | Model | [Proposed](./models/infrastructure/relays.md) | -| 01-010 | Interoperation Modules | Model | [Proposed](./models/infrastructure/interoperation-modules.md) | -| 01-011 | Identity Management | Model | [Proposed](./models/identity/network-identity-management.md) | -| 01-012 | Identity Registry | Model | [Proposed](./models/identity/iin.md) | -| 01-013 | Identity Agent | Model | [Proposed](./models/identity/iin-agent.md) | -| 01-014 | Identity Trust Anchor Agent | Model | [Retired](./models/identity/iin-steward-agent.md) | -| 01-015 | Network Identity Updates | Model | [Proposed](./models/identity/identity-update-policy.md) | -| 02-001 | Data Sharing | Protocol | [Proposed](./protocols/data-sharing/generic.md) | -| 02-002 | Data Sharing in Fabric | Protocol | [Proposed](./protocols/data-sharing/fabric.md) | -| 02-003 | Data Sharing in Corda | Protocol | [Proposed](./protocols/data-sharing/corda.md) | -| 02-004 | Asset Exchange through HTLC | Protocol | [Proposed](./protocols/asset-exchange/generic-htlc.md) | -| 02-005 | Asset Exchange in Fabric | Protocol | [Proposed](./protocols/asset-exchange/fabric-htlc.md) | -| 02-006 | Asset Exchange in Corda | Protocol | [Proposed](./protocols/asset-exchange/corda-htlc.md) | -| 02-007 | Asset Exchange in Besu | Protocol | [Draft](./protocols/asset-exchange/besu-htlc.md) | -| 02-008 | Asset Transfer | Protocol | [Proposed](./protocols/asset-transfer/generic.md) | -| 02-009 | Asset Transfer in Fabric | Protocol | [Proposed](./protocols/asset-transfer/fabric.md) | -| 02-010 | Asset Transfer in Corda | Protocol | [Proposed](./protocols/asset-transfer/corda.md) | -| 02-011 | Identity and Config Sharing | Protocol | [Superseded](./protocols/identity/id-config-sharing.md) | -| 02-012 | Identity Syncing | Protocol | [Proposed](./protocols/identity/identity-syncing.md) | -| 02-013 | Discovery | Protocol | [Draft](./protocols/discovery/discovery.md) | -| 02-014 | Negotiation | Protocol | [Draft](./protocols/discovery/negotiation.md) | -| 02-015 | Transaction Invocation | Protocol | [Draft](./protocols/contract-invocation/invocation.md) | -| 02-016 | Event Bus | Protocol | [Draft](./protocols/events/event-bus.md) | -| 03-001 | View Address | Format | [Proposed](./formats/views/addressing.md) | -| 03-002 | Generic View | Format | [Proposed](./formats/views/definition.md) | -| 03-003 | Fabric View | Format | [Proposed](./formats/views/fabric.md) | -| 03-004 | Corda View | Format | [Proposed](./formats/views/corda.md) | -| 03-005 | Besu View | Format | [Draft](./formats/views/besu.md) | -| 03-006 | Ethereum View | Format | [Draft](./formats/views/ethereum.md) | -| 03-007 | View Request | Format | [Proposed](./formats/views/request.md) | -| 03-008 | Access Control Policy | Format | [Proposed](./formats/policies/access-control.md) | -| 03-009 | Proof Verification Policy | Format | [Proposed](./formats/policies/proof-verification.md) | -| 03-010 | Verification Policy DSL | Format | [Draft](./formats/policies/dsl.md) | -| 03-011 | Membership | Format | [Proposed](./formats/network/membership.md) | -| 03-012 | Network Identities | Format | [Proposed](./formats/network/identity.md) | -| 03-013 | Asset Exchange Units | Format | [Proposed](./formats/assets/exchange.md) | -| 03-014 | Asset Transfer Units | Format | [Proposed](./formats/assets/transfer.md) | -| 03-015 | Relay Messages | Format | [Proposed](./formats/communication/relay.md) | -| 03-016 | Fabric Interop Chaincode API | Format | [Proposed](./formats/network/fabric-interop-chaincode.md) | -| 03-017 | Interoperation CorDapp API | Format | [Proposed](./formats/network/interop-cordapp.md) | -| 03-018 | Besu Interop Contract API | Format | [Proposed](./formats/network/besu-interop-contract.md) | -| 03-019 | Application SDK | Format | [Proposed](./formats/network/application-sdk.md) | -| 03-020 | DID Method for DLT Networks | Format | [Proposed](./formats/network/iin_method.md) | +| RFC # | Title | Category | Status | +|--------|-------------------------------------|----------|-------------------------------------------------------------------------| +| 01-001 | Views | Model | [Proposed](./models/ledger/views.md) | +| 01-002 | Cryptographic Proofs | Model | [Proposed](./models/ledger/cryptographic-proofs.md) | +| 01-003 | Verifiable Observation of State | Model | [Draft](./models/ledger/observation-of-state.md) | +| 01-004 | Events | Model | [Draft](./models/ledger/events.md) | +| 01-005 | Cross-Ledger Operations | Model | [Draft](./models/ledger/cross-ledger-operations.md) | +| 01-006 | Atomic Cross-Ledger Transactions | Model | [Proposed](./models/ledger/atomic-cross-ledger-transactions.md) | +| 01-007 | Security Domains | Model | [Proposed](./models/security/security-domains.md) | +| 01-008 | End-to-End Confidentiality | Model | [Proposed](./models/security/confidentiality.md) | +| 01-009 | Relays | Model | [Proposed](./models/infrastructure/relays.md) | +| 01-010 | Interoperation Modules | Model | [Proposed](./models/infrastructure/interoperation-modules.md) | +| 01-011 | Identity Management | Model | [Proposed](./models/identity/network-identity-management.md) | +| 01-012 | Identity Registry | Model | [Proposed](./models/identity/iin.md) | +| 01-013 | Identity Agent | Model | [Proposed](./models/identity/iin-agent.md) | +| 01-014 | Identity Trust Anchor Agent | Model | [Retired](./models/identity/iin-steward-agent.md) | +| 01-015 | Network Identity Updates | Model | [Proposed](./models/identity/identity-update-policy.md) | +| 02-001 | Data Sharing | Protocol | [Proposed](./protocols/data-sharing/generic.md) | +| 02-002 | Data Sharing in Fabric | Protocol | [Proposed](./protocols/data-sharing/fabric.md) | +| 02-003 | Data Sharing in Corda | Protocol | [Proposed](./protocols/data-sharing/corda.md) | +| 02-004 | Asset Exchange through HTLC | Protocol | [Proposed](./protocols/asset-exchange/generic-htlc.md) | +| 02-005 | Asset Exchange in Fabric | Protocol | [Proposed](./protocols/asset-exchange/fabric-htlc.md) | +| 02-006 | Asset Exchange in Corda | Protocol | [Proposed](./protocols/asset-exchange/corda-htlc.md) | +| 02-007 | Asset Exchange in Besu | Protocol | [Draft](./protocols/asset-exchange/besu-htlc.md) | +| 02-008 | Asset Transfer | Protocol | [Proposed](./protocols/asset-transfer/generic.md) | +| 02-009 | Asset Transfer in Fabric | Protocol | [Proposed](./protocols/asset-transfer/fabric.md) | +| 02-010 | Asset Transfer in Corda | Protocol | [Proposed](./protocols/asset-transfer/corda.md) | +| 02-011 | Identity and Config Sharing | Protocol | [Superseded](./protocols/identity/id-config-sharing.md) | +| 02-012 | Cross-Domain Identity Management | Protocol | [Proposed](./protocols/identity/identity-syncing.md) | +| 02-013 | Security Domain Discovery | Protocol | [Draft](./protocols/discovery/discovery.md) | +| 02-014 | Cross-Domain Negotiation | Protocol | [Draft](./protocols/discovery/negotiation.md) | +| 02-015 | Transaction Invocation | Protocol | [Draft](./protocols/contract-invocation/invocation.md) | +| 02-016 | Event Bus | Protocol | [Draft](./protocols/events/event-bus.md) | +| 02-017 | Security Domain Identity Validation | Protocol | [Proposed](./protocols/identity/security-domain-identity-validation.md) | +| 02-018 | Cross-Domain Membership Syncing | Protocol | [Proposed](./protocols/identity/membership-syncing.md) | +| 03-001 | View Address | Format | [Proposed](./formats/views/addressing.md) | +| 03-002 | Generic View | Format | [Proposed](./formats/views/definition.md) | +| 03-003 | Fabric View | Format | [Proposed](./formats/views/fabric.md) | +| 03-004 | Corda View | Format | [Proposed](./formats/views/corda.md) | +| 03-005 | Besu View | Format | [Draft](./formats/views/besu.md) | +| 03-006 | Ethereum View | Format | [Draft](./formats/views/ethereum.md) | +| 03-007 | View Request | Format | [Proposed](./formats/views/request.md) | +| 03-008 | Access Control Policy | Format | [Proposed](./formats/policies/access-control.md) | +| 03-009 | Proof Verification Policy | Format | [Proposed](./formats/policies/proof-verification.md) | +| 03-010 | Verification Policy DSL | Format | [Draft](./formats/policies/dsl.md) | +| 03-011 | Membership | Format | [Proposed](./formats/network/membership.md) | +| 03-012 | Network Identities | Format | [Proposed](./formats/network/identity.md) | +| 03-013 | Asset Exchange Units | Format | [Proposed](./formats/assets/exchange.md) | +| 03-014 | Asset Transfer Units | Format | [Proposed](./formats/assets/transfer.md) | +| 03-015 | Relay Messages | Format | [Proposed](./formats/communication/relay.md) | +| 03-016 | Fabric Interop Chaincode API | Format | [Proposed](./formats/network/fabric-interop-chaincode.md) | +| 03-017 | Interoperation CorDapp API | Format | [Proposed](./formats/network/interop-cordapp.md) | +| 03-018 | Besu Interop Contract API | Format | [Proposed](./formats/network/besu-interop-contract.md) | +| 03-019 | Application SDK | Format | [Proposed](./formats/network/application-sdk.md) | +| 03-020 | DID Method for DLT Networks | Format | [Proposed](./formats/network/iin_method.md) | ## RFC Process diff --git a/rfcs/formats/network/identity.md b/rfcs/formats/network/identity.md index 08193970a..4d76cbda3 100644 --- a/rfcs/formats/network/identity.md +++ b/rfcs/formats/network/identity.md @@ -8,13 +8,13 @@ - RFC: 03-012 - Authors: Bishakh Chandra Ghosh, Venkatraman Ramakrishna, Krishnasuri Narayanam, Ermyas Abebe - Status: Proposed -- Since: 24-Sep-2021 +- Since: 25-Aug-2022 -## Participant Unit Identity +## Organizational Unit Identity -Each network participant (Fabric organizations / Corda node owners) has its identity on the identity plane as *Participant Unit Identity*, in the form of a **DID**. We also refer to it as *Participant Unit DID*. -The participant DID Document must specify one verification method with [authentication](https://w3c.github.io/did-core/#authentication) verification relationship. The *Participant Unit DID* must be registered in some IIN registry which is public and openly accessible for DID and VC validations. +Each network member (Fabric organizations, Corda node owners, etc.) has an *Organizational Unit DID* epresenting its identity in the identity plane. +This DID document must specify one verification method with [authentication](https://w3c.github.io/did-core/#authentication) verification relationship. The *Organizational Unit DID* must be registered in some IIN registry which is public and openly accessible for DID and VC validations. ### Example: @@ -33,61 +33,57 @@ The participant DID Document must specify one verification method with [authenti ``` -## Network Identity +## Security Domain Identity -The identity of a network as a single entity is represented by the *Network Identity* which is a DID called *Network DID*. +The identity of a network as a single entity is represented by the *Security Domain Identity* which is a DID called *Security Domain DID*. -A permissioned blockchain network is formed by mutual agreement among its participants. Participants, whether they be in a Fabric, Corda, or Ethereum network, typically control one or more peers and act as identity providers for those peers and associated clients. In Fabric, the notion of a participant is formalized in the role of an *organization*. The blockchain network as an entity is thus not controlled by any single member but together by its participant units. But inspite of having multiple controllers, the network as an entity must have its own unitary identity, through which it can be discovered. In this specification, each permissioned blockchain network which needs to exchange its identity for interoperation has a Network DID and a corresponding Network DID Document, that we describe in this section. +A permissioned blockchain network is formed by mutual agreement among its members. Whether it be a Fabric, Corda, or Ethereum network, members typically control one or more peers and act as identity providers for those peers and associated clients. In Fabric, the notion of a member is formalized in the role of an *organization*. The blockchain network as an entity is thus not controlled by any single member but rather collectively by several organizational units. But inspite of having multiple controllers, the network as an entity must have its own unitary identity, through which it can be discovered. In this specification, each permissioned blockchain network which needs to exchange its identity for interoperation has a Security Domain DID and a corresponding Security Domain DID Document, that we describe in this section. -A permissioned blockchain network has a Network DID that represents it. -The Network DID document conforms to the [did-core](https://www.w3.org/TR/did-core) specifications. +A permissioned blockchain/DLT network has a Security Domain DID that represents it. +This DID document conforms to the [did-core](https://www.w3.org/TR/did-core) specifications. **id** - This property is mandatory which is the DID URI for the network. This id (DID) can be used to resolve the DID Document of the network from the IIN DID registry. -**verificationMethod** - One verification method property must be present in the Network DID document, and it must be able to support [Group Control](https://www.w3.org/TR/did-core/#group-control), so that the network participant units can jointly control the Network DID Document. Additionally, the verification method must specify who can update the DID in case the network changes as participant units leave and new ones join. This group controlled `verificationMethod` also lets the network participants jointly validate the network's composition. We describe a multi-signature based `verificationMethod` type in the following sections. +**verificationMethod** - One verification method property must be present in the Security Domain DID document, and it must be able to support [Group Control](https://www.w3.org/TR/did-core/#group-control), so that the network members can jointly control the Security Domain DID Document. Additionally, the verification method must specify who can update the DID in case the network changes as members leave and new organizational units join. This group controlled `verificationMethod` also lets the network members jointly validate the network's composition. We describe a multi-signature based `verificationMethod` type in the following sections. -For interoperation in the data plane, network specific identity credentials such as certificates (X.509 certificates in Hyperledger Fabric networks) are required to be configured. For these data plane credentials, there can be optional `verificationMethods` in the Network DID document. For better privacy, without directly exposing the data plane credentials within the Network DID document, only their cryptographic hash may be included which will ensure no rogue network participant can produce tampered data plane credentials to deny/attack the interoperation. +For interoperation in the data plane, network specific identity credentials such as certificates (X.509 certificates in Hyperledger Fabric networks) are required to be configured. For these data plane credentials, there can be optional `verificationMethods` in the Security Domain DID document. For better privacy, without directly exposing the data plane credentials within the Security Domain DID document, only their cryptographic hash may be included which will ensure no rogue network member can produce tampered data plane credentials to deny/attack the interoperation. +**authentication** - The authentication verification relationship must point to the group controlled verification method of the Security Domain DID. -**authentication** - The authentication verification relationship must point to the group controlled verification method of the Network DID. - -**networkParticipants** - This is not a core property of the DID specification. This is a special property required for Network DIDs that specify the members in the network. It is a list of DIDs of the individual members. +**networkMembers** - This is not a core property of the DID specification. This is a special property required for Security Domain DIDs that specify the members in the network. It is a list of DIDs of the individual members. ### Multi-signature based verificationMethod -A network DID must be controlled jointly by the network's participant units for operations such as creation of the DID, and its updation with changing network structure, and for other operations such as rotating/refreshing keys, updating verification methods, etc. To enable this group control, we introduce a `verificationMethod` that uses multi-signatures and associated policies. +A network DID must be controlled jointly by the network's members for operations such as creation of the DID, and its updation with changing network structure, and for other operations such as rotating/refreshing keys, updating verification methods, etc. To enable this group control, we introduce a `verificationMethod` that uses multi-signatures and associated policies. The `verificationMethod` will have the following properties: -**id** - This will be the Network DID followed by a fragment forming a DID URI that points to this verification method. Eg: `did::#unique_verificationMethod_name` +**id** - This will be the Security Domain DID followed by a fragment forming a DID URI that points to this verification method. Eg: `did::#unique_verificationMethod_name` **type** - `BlockchainNetworkMultiSig` -**controller** - Controller of this DID must be the network itself, and thus its value should be same as the Network DID. +**controller** - Controller of this DID must be the network itself, and thus its value should be same as the Security Domain DID. **Verification Material for BlockchainNetworkMultiSig:** -**multisigKeys** - Map of participant DID to its verificationMethod. This contains one entry for each participant unit in `networkParticipants` list. The key is the participant unit's DID, and the value is a DID URI to the verification method of the participant DID. - - -Eg. If `network_participant_1` has a DID `did::`, then `multisigKeys` will contain one verification method of the DID Document like `"did::":"did::#verificationMethod1"` +**multisigKeys** - Map of organizational unit's DID to its verificationMethod. This contains one entry for each network member in the `networkMembers` list. The key is the DID of the organizational unit (corresponding to a network member), and the value is a DID URI to the verification method for that DID. -For creation of Network DID, the IIN registry must authenticate the DID creation request based on the `BlockchainNetworkMultiSig` verification method. This implies that the request must be authenticated based on each of the verificationMethods specified in `multisigKeys`. +Eg. If `network_member_1` has a DID `did::`, then `multisigKeys` will contain one verification method of the DID Document like `"did::":"did::#verificationMethod1"` -> NOTE on extensibility: The `networkParticipants` lets any DID to be specified, with a verification method in `BlockchainNetworkMultiSig.multisigKeys`. Thus another Network DID can also be represented as a participant unit of a network. This can be very useful in certain use cases where different blockchain networks may be stakeholders of a bigger network. +For creation of Security Domain DID, the IIN registry must authenticate the DID creation request based on the `BlockchainNetworkMultiSig` verification method. This implies that the request must be authenticated based on each of the verificationMethods specified in `multisigKeys`. - -**updatePolicy** - Defines a combination of participant units that must sign and authenticate a Network DID updation request. The `updatePolicy` is discussed in detail [here](./../models/identity-update-policy.md). +> NOTE on extensibility: Any kind of DID can be specified in the `networkMembers` list, with a corresponding verification method in `BlockchainNetworkMultiSig.multisigKeys`. Therefore, another Security Domain DID can also be represented as a network member. This can be very useful in use cases where different blockchain networks may be stakeholders of a bigger network, i.e., the networks are linked together in a hierarchy. +**updatePolicy** - Defines a combination of organizational units that must sign and authenticate a Security Domain DID updation request. The `updatePolicy` is discussed in detail [here](../../models/identity/identity-update-policy.md). ### verificationMethod for dataplane credentials -Blockchain interoperation in the data plane by means of verifiable data sharing rely on verification of some format of proofs that comes associated with the data from another network in response to a query ([cryptographic-proofs](https://github.com/hyperledger-labs/weaver-dlt-interoperability/blob/main/rfcs/models/cryptographic-proofs.md)). In proof by notarisation, and also most other proof formats, the foreign blockchain networks' members' cryptographic keys and certificates has to be known for validating the proofs. Therefore, to map these data plane cryptographic certificates to the identity plane, the Network DID may have a verifcation method that contains these directly, or provide pointers to them. +Blockchain interoperation in the data plane by means of verifiable data sharing rely on verification of some format of proofs that comes associated with the data from another network in response to a query ([cryptographic-proofs](https://github.com/hyperledger-labs/weaver-dlt-interoperability/blob/main/rfcs/models/cryptographic-proofs.md)). In proof by notarisation, and also most other proof formats, the foreign blockchain networks' members' cryptographic keys and certificates has to be known for validating the proofs. Therefore, to map these data plane cryptographic certificates to the identity plane, the Security Domain DID may have a verifcation method that contains these directly, or provide pointers to them. Depending on the blockchain platform being used by a network in the data plane, the type of the credentials may vary. This verification policy will have the parameters: @@ -96,43 +92,42 @@ This verification policy will have the parameters: **type** - `DataplaneCredentials` -**controller** - Network DID. +**controller** - Security Domain DID. -**[PLATFORM]Credentials** - Map of participant unit DID to Hash of dataplane platform specific credentials. +**[PLATFORM]Credentials** - Map of organizational unit DID to Hash of dataplane platform specific credentials. PLATFORM is the name of the dataplane platform such as Fabric/Corda/Burrow etc.. In this version we support X.509 certificates for Hyperledger Fabric's root and intermediate certificates. -In Fabric, each participant unit has a Membership Service Provider (MSP) that has a root certificate that can be used to validate proofs in the data plane. Publishing these root certificates in the Network DID directly may reveal the networks participants and thus a privacy concern. Instead, only including the cryptographic hash of the certificates in the Network DID ensures that no participant unit can provide its incorrect certificate towards denial of service attack , while still maintaining privacy. +In a Fabric network, each member has at least one Membership Service Provider (MSP) that has one or more root CA certificates (and optionally intermediate CA certificates) that can be used to validate proofs in the data plane. Publishing these certificates in the Security Domain DID directly may reveal private information about network members and thus raises privacy concerns. Instead, only including the cryptographic hash of the certificates in the Security Domain DID ensures that no organizational unit can provide fake certificates (or [membership info](../membership.md)) while still maintaining the network members' privacy. -Therefore for Fabric, `[PLATFORM]Credentials` will be `FabricCredentials`: Map of participant unit DID to Hash of fabric root certificates of the participant. +Therefore for Fabric, `[PLATFORM]Credentials` will be `FabricCredentials`: Map of organizational unit DID to Hash of the network member's membership info. ### relayEndpoints -This is a special property required for Network DIDs that specify addresses of the [relays](../models/relays.md) in the data plane that can be used for interoperation. It is a list of relayEndpoint objects containing `hostname` and `port` of the relay. - +This is a special property required for Security Domain DIDs that specify addresses of the [relays](../../models/infrastructure/relays.md) in the data plane that can be used for interoperation. It is a list of relayEndpoint objects containing `hostname` and `port` of the relay. -### Example of Network DID format: +### Example of Security Domain DID format: ```json { "id": "did::", - "networkParticipants": [ - "did::", - "did::", - "did::" + "networkMembers": [ + "did::", + "did::", + "did::" ], "verificationMethod": [{ "id": "did::#multisig", "type": "BlockchainNetworkMultiSig", "controller": "did::", "multisigKeys": [ - "did::#key1", - "did::#key3", - "did::#key1" + "did::#key1", + "did::#key3", + "did::#key1" ], "updatePolicy": { "id": "did::#updatepolicy", @@ -142,11 +137,11 @@ This is a special property required for Network DIDs that specify addresses of t "id": "did::#updatepolicy-1", "controller": "did::", "type": "VerifiableCondition2021", - "conditionOr": ["did::#key1", - "did::#key3" + "conditionOr": ["did::#key1", + "did::#key3" ] }, - "did::#key1" + "did::#key1" ] } }, @@ -156,9 +151,9 @@ This is a special property required for Network DIDs that specify addresses of t "type": "DataplaneCredentials", "controller": "did::", "FabricCredentials": { - "did::": "Certificate3_Hash", - "did::": "Certificate2_Hash", - "did::": "Certificate3_Hash" + "did::": "Certificate3_Hash", + "did::": "Certificate2_Hash", + "did::": "Certificate3_Hash" } } ], diff --git a/rfcs/formats/views/request.md b/rfcs/formats/views/request.md index 18bb7fed8..80cb0dc8a 100644 --- a/rfcs/formats/views/request.md +++ b/rfcs/formats/views/request.md @@ -59,8 +59,12 @@ message RequestState { PENDING_ACK = 0; // Received ACK, waiting for data to be sent from remote relay PENDING = 1; - ERROR = 2; - COMPLETED = 3; + ERROR = 2; // View is not there, received error from remote relay + COMPLETED = 3; // Data Sharing completed Successfully + EVENT_RECEIVED = 4; // View is there and event is received from remote relay + EVENT_WRITTEN = 5; // Driver Successfully wrote the view to ledger + EVENT_WRITE_ERROR = 6; // View is there but driver failed to write + DELETED = 7; // Once network fetches this request state, mark it delete for cleanup later on }; string request_id = 1; STATUS status = 2; diff --git a/rfcs/models/identity/identity-update-policy.md b/rfcs/models/identity/identity-update-policy.md index 87f8bb18d..d415edd02 100644 --- a/rfcs/models/identity/identity-update-policy.md +++ b/rfcs/models/identity/identity-update-policy.md @@ -3,20 +3,20 @@ SPDX-License-Identifier: CC-BY-4.0 --> -# Network Identity Update Policies +# Security Domain Identity Update Policies - RFC: 01-015 - Authors: Bishakh Chandra Ghosh, Venkatraman Ramakrishna, Krishnasuri Narayanam, Ermyas Abebe - Status: Proposed -- Since: 24-Sep-2021 +- Since: 25-Aug-2022 ## updatePolicy -The memberships in a blockchain network are not guaranteed to be static. Often existing participant members of a network leave while new participants join. As a result, the `verificationMethod` and `networkParticipants` of the *Network DID* must also be updated to capture the updated network structure. +The memberships in a blockchain network are not guaranteed to be static. Often existing members of a network leave while new organizational units join as members. As a result, the `verificationMethod` and `networkMembers` of the *Security Domain DID* must also be updated to capture the updated network structure. -Based on the different governance policies of different networks, they might want to enforce different policies that dictate which combination of existing participants of the network are allowed to introduce a new member or expel existing members (or acknowledge members who left the network). These policies can be encoded into the `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Network DID*. +Based on the different governance policies of different networks, they might want to enforce different policies that dictate which combination of existing members of the network are allowed to introduce a new member or expel existing members (or acknowledge members who left the network). These policies can be encoded into the `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Security Domain DID*. -`updatePolicy` defines a combination of participant units that can sign and authorize a Network DID updation request. This `updatePolicy` has the condition format as specified in [`verifiablecondition2021`](https://w3c.github.io/did-spec-registries/#verifiablecondition2021) verification method. It can be used to combine different verification methods together to create complex conditional expressions such as logical operations, thresholds, weighted thresholds, relationships and a delegation to external verification methods. +`updatePolicy` defines a combination of organizational units that can sign and authorize a Security Domain DID updation request. This `updatePolicy` has the condition format as specified in [`verifiablecondition2021`](https://w3c.github.io/did-spec-registries/#verifiablecondition2021) verification method. It can be used to combine different verification methods together to create complex conditional expressions such as logical operations, thresholds, weighted thresholds, relationships and a delegation to external verification methods. Example of `updatePolicy`. @@ -29,51 +29,51 @@ Example of `updatePolicy`. "id": "did::#updatepolicy-1", "controller": "did::", "type": "VerifiableCondition2021", - "conditionOr": ["did::#key1", - "did::#key3" + "conditionOr": ["did::#key1", + "did::#key3" ] }, - "did::#key1" + "did::#key1" ] } ``` -## Network DID updates +## Security Domain DID updates -Any request to update the *Network DID* must be authenticated based on different policies for the different scenarios of (i) participants leaving the network, (ii) new participants joining the network, and (iii) other updates to the Network DID. +Any request to update the *Security Domain DID* must be authenticated based on different policies for the different scenarios of (i) members leaving the network, (ii) new organizational units joining the network, and (iii) other updates to the Security Domain DID. -### Participants leaving the network +### Members leaving the network -There can be two scenarios when an existing participant unit of a network leaves: (a) The participant itself willingly leaves the network. (b) Other participants of the network decide to expel that participant. Based on these two scenarios, any *Network DID* update request removing one participant from the `networkParticipants` property is authenticated as per the following conditions: +There can be two scenarios when an existing member of a network leaves: (a) The member itself willingly leaves the network. (b) Other members of the network decide to expel that member. Based on these two scenarios, any *Security Domain DID* update request removing one member from the `networkMembers` property is authenticated as per the following conditions: -A. The *Network DID* update request is attested by the participant who is leaving the network, that is the participant whose DID is being excluded from the `networkParticipants` property. This indicates voluntary exit from the network. +A. The *Security Domain DID* update request is attested by the member who is leaving the network, that is the member whose DID is being excluded from the `networkMembers` property. This indicates voluntary exit from the network. -B. If condition A is not satisfied, then the DID update request must be attested satisfying the `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Network DID*. The update request may also contain a new `updatePolicy` which does not depend on the member that is being removed from the `networkParticipants`. +B. If condition A is not satisfied, then the DID update request must be attested satisfying the `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Security Domain DID*. The update request may also contain a new `updatePolicy` which does not depend on the member that is being removed from the `networkMembers`. -### Participants joining the network +### Organizational Units joining the network -For new network participants joining the network, the DID update request must be authenticated based on `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Network DID*. The DID update request must also be attested by the participant which is being added to the `networkParticipants`. +For new network organizational units joining the network, the DID update request must be authenticated based on `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod` in the *Security Domain DID*. The DID update request must also be attested by the organizational unit which is being added to the `networkMembers`. -### Other updates to the Network DID +### Other updates to the Security Domain DID -For *Network DID* update requests, where the `networkParticipants` property is not altered, indicating that the participant list is unchanged, the requests are authenticated based on attestations satisfying `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod`. +For *Security Domain DID* update requests, where the `networkMembers` property is not altered, indicating that the member list is unchanged, the requests are authenticated based on attestations satisfying `updatePolicy` property of the *BlockchainNetworkMultiSig* `verificationMethod`. - + # Choice of `updatePolicy` -The `updatePolicy` of a network is constructed through a consensus of different participants that need to attest any request to change the *Network DID* in future. The initial policy created for a Network DID creation requires unanimity, while subsequent policy updates are governed by existing policy. Situations might arrive due to a poor choice of `updatePolicy` which cannot be satisfied by network the participants, where the *Network DID* can no longer be controlled by the network. In those cases the members of the network have to form a separate *Network DID* (a new network in the identity plane), and advertise the new DID as the new network address for the same network. +The `updatePolicy` of a network is constructed through a consensus of different members that need to attest any request to change the *Security Domain DID* in future. The initial policy created for a Security Domain DID creation requires unanimity, while subsequent policy updates are governed by existing policy. Situations might arrive due to a poor choice of `updatePolicy` which cannot be satisfied by network members, where the *Security Domain DID* can no longer be controlled by the network. In those cases the members of the network have to form a separate *Security Domain DID* (a new network in the identity plane), and advertise the new DID as the new network address for the same network. -During the creation of a *Network DID*, if no `updatePolicy` is set in the Network DID Document, then a default `updatePolicy` may be set by the IIN as a threshold condition requiring the attestation of `> N/2` network participants. +During the creation of a *Security Domain DID*, if no `updatePolicy` is set in the Security Domain DID Document, then a default `updatePolicy` may be set by the IIN as a threshold condition requiring the attestation of `> N/2` network members. Example: @@ -84,18 +84,18 @@ Example: "type": "VerifiableCondition2021", "threshold": 4, "conditionThreshold": [ - "did::#key1", - "did::#key3", - "did::#key2", - "did::#key1", - "did::#key1", - "did::#key1", - "did::#key1" + "did::#key1", + "did::#key3", + "did::#key2", + "did::#key1", + "did::#key1", + "did::#key1", + "did::#key1" ] } ``` -If the network members explicitly want to create a "static" network where the network members are not supposed to be changed, then the threshold is set to a value more than the number of participants in the network. +If the network members explicitly want to keep the network's membership "static" (i.e., unchanging), the threshold is set to a value larger than the total number of network members. Example: @@ -106,13 +106,13 @@ Example: "type": "VerifiableCondition2021", "threshold": 8, "conditionThreshold": [ - "did::#key1", - "did::#key3", - "did::#key2", - "did::#key1", - "did::#key1", - "did::#key1", - "did::#key1" + "did::#key1", + "did::#key3", + "did::#key2", + "did::#key1", + "did::#key1", + "did::#key1", + "did::#key1" ] } ``` diff --git a/rfcs/models/identity/iin-agent.md b/rfcs/models/identity/iin-agent.md index 512e2cfdc..c04701407 100644 --- a/rfcs/models/identity/iin-agent.md +++ b/rfcs/models/identity/iin-agent.md @@ -8,7 +8,7 @@ - RFC: 01-013 - Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe - Status: Proposed -- Since: 24-Sep-2021 +- Since: 25-Aug-2022 # Summary @@ -19,63 +19,94 @@ This document specifies a component of a DLT network's participant unit that is In our view, a DLT network seeking to interoperate with another using any of our protocols is composed of units that are consituent members of that network, and are assumed to have identities independent of the network in the identity plane. Representing each unit in an IIN is an IIN Agent, managing the participant unit's DID. Furthermore, these IIN agents are used to discover, resolve, and verify other participant units' identities as well as network identities. We also assume that each nework unit is a root identity provider within the data plane of its DLT network. In Fabric: an MSP root CA server (typically, but not mandatorially, having a 1-1 relationship with an organization). In Corda: network root CA. -This view is illustrated in the figure below (Fig.1), which maps quite naturally to Fabric networks where each organization is a unit, but is general enough to encompass other permissioned DLTs like Corda and Besu too. +This view is illustrated in the figure below (Fig.1), which maps quite naturally to Fabric networks where each organization is a member, but is general enough to fit other permissioned DLTs like Corda and Besu too.

-
Fig.1 - IIN Agent.
+
Fig.1 - IIN Agents as Components of DLT Networks.

- # Data Plane Identity Artifacts The following artifacts in the data plane are relevant to identity plane protocols: * _Identity trust store_: this is a set of IINs and Trust anchors `,`. It implies that the network trusts a given trust anchor or all trust anchors in a given IIN to certify the identity/membership credentials of foreign network units. * The IIN definition can additionally contain peer connectivity information (to access the IIN ledger). This data will be looked up in the identity sharing protocol, while fetching membership information for a foreign network. It can also be used in proof verification (or view validation) in data plane protocols. -* _Foreign network identities and configurations_: these are [security domains](../security-domains.md), containing identities and certificates corresponding to a foreign network's units. (_Each security domain is augmented with a DID attribute denoting the identity owned by the IIN Agent associated with this network unit/security domain_). The IIN Agent of the network participants together update these configurations from the identity plane information. +* _Security Domain identities and configurations_: these are identities and certificates corresponding to foreign [security domains](../security/security-domains.md) and their members. See the [security domain identity](../../formats/network/identity.md#security-domain-identity) and [membership](../../formats/network/membership.md) for more details. (_Each security domain is also associated with an Organizational Unit Identity, or a DID record maintained in an IIN_). The IIN Agent of the network members collectively update these configurations using an [identity plane protocol](../../protocols/identity/id-config-sharing.md). + + +# IIN Agent Design and Interface + +An IIN Agent has two distinct roles: +1. As a client of one or more IINs and a DID-and-VC holder for a member of a DLT network member that represents a real world Organization Unit. +2. As a client of a member of a DLT network or security domain with special permissions to update security domain identities and configurations on the ledger via the network's [interoperation module](../infrastructure/interoperation-modules.md). + +This IIN Agent model and interface is represented in Fig. 2. An agent is built and deployed as a gRPC service that is reachable from other local or foreign security domains' agents. Simultaneously, it also offers gRPC client services to reach other agents, local or foreign. Each agent is capable of participating in DID and VC/VP protocols yb communicating with IINs and trust anchors too. + + +
+ +
+
Fig.2 - IIN Agent Model and Interface.
+
+
+ + +## IIN Agent as Organizational Representative and DID holder + +_This is work in progress_. + +## IIN Agent as a Security Domain Representative + +The agent is bootstrapped with a wallet identity with special permissions (in a Fabric network, we can represent this by embedding an `iin-agent` attribute in the identity certificate). + +The agent can serve in two modes as a security domain representative. In one mode, it serves a source network or security domain by serving up that domain's [membership information](../../formats/network/membership.md) with authentication as illustrated in Fig. 3. + + +
+ +
+
Fig.3 - IIN Agent in Security Domain Source Mode.
+
+
+ + +In another mode, it serves a destination (or identity syncing) network or security domain by requesting and validating another security domain's membership information from that domain's agents, collect attestations from all other local agents, and record this to the local ledger using the network's [interoperation module](../infrastructure/interoperation-modules.md). This is illustrated in Fig. 4. + + +
+ +
+
Fig.4 - IIN Agent in Security Domain Destination Mode.
+
+
-# Hyperledger Indy implementation of IIN Agent +Collectively, IIN Agents in source and destination modes can sync and register a foreign security domain's identity and membership info for use in data plane protocols. See the [description](../../protocols/identity/id-config-sharing.md) of the identity plane protocol that performs this sync for more details. The protocol relies on the DID infrastructure (IINs and trust anchors) as a root of trust but is otherwise bilateral (network-to-network). -An IIN Agent represents a network unit that is also a self-certified identity provider for some subset of the network, as stated earlier in the summary. It is simultaneously an IIN (Indy) client and a network (Fabric, Corda, etc.) client. Therefore, there are different ways in which it can be implemented, but its core feature is that it lies within the trust boundary of a root identity provider of a network. +### IIN Agent Functional API -Being an IIN client, the IIN Agent, like an [IIN Steward Agent](../iin-steward-agent.md), or some portion of it, must be built according to the canonical specification of an Indy Agent with the capability to create a wallet, interact with other agents (including stewards), and access an Indy ledger. These form the trust anchros in the IINs. Another portion of the IIN Agent must be built as a regular network client with the ability to exercise smart contracts for looking up and recording ledger data. +Here we specify API functions exposed to other foreign and local IIN agents. These all are RPC endpoints that can be implemented directly in a well-known protocol like gRPC. See the [membership](../../formats/network/membership.md) format specifications for more details. -The IIN Agent can be built and deployed in the following configurations: -* As an augmentation of a network root identity provider or CA: in Fabric, this would mean augmenting the Fabric CA Server to perform the functions of an IIN Agent -* As a separate service with a trusted communication channel (e.g., using gRPC) to a network root identity provider or CA -* As two separate services, one resembling an IIN Agent and another a network client (e.g., a Fabric Client SDK-based application). These two services will communicate with each other and with the network root identity provider or CA using a trusted communication channel -(As shown in the above diagram (Fig.1), there must be exactly one IIN Agent service, however configured, for every network unit) +#### API for Foreign Security Domains' IIN Agents -## Bootstrap/Initialize an IIN Agent -* Start a [Hyperleder Aries](https://www.hyperledger.org/use/aries) service, which consists of a <_controller_, _agent_> pair, with the agent built using [Aries Cloud Agent - Python](https://github.com/hyperledger/aries-cloudagent-python) as it supports persistent storage. This service has the capability to communicate with other agents using the peer-to-peer Aries protocol. It is recommended that this service be launched in a Docker container. Post-launch, the following actions must be carried out: - 1. Initialize a wallet to store DIDs, keys, and any other crypto material - 2. Obtain and load the service endpoints for an IIN and a Steward this network unit is associated with - 3. Register a verinym (DID record) through the standard Indy protocol (described [here](../../protocols/id-config-sharing-protocol/README.md)) - 4. Obtain and load the local network's ID - 5. Fetch membership list and endpoint info for other units of the local network from the steward (_Consider: this can be done without IIN involvement too_) - At this point, the IIN Agent has ownership of its DID that is recorded on its IIN's ledger. Its IIN Steward Agent now recognizes it as a member of its network and is ready to make a presentation of the member list of the network to any requestor. -* Start a network client service (if this is to be a standalone service) or initialize one according to the network's native procedure. Example: in Fabric, do the following: - 1. Initialize a Fabric wallet to store keys, certificates, and MSP configurations - 2. Initialize configuration information with the network's interoperation contract deployment ID: this is needed to record security domain info on the ledger - 3. Import a connection profile and connect to a network gateway +- **SyncExternalState(NetworkUnitIdentity): returns common.ack.Ack** + Endpoint for user/client/agent to request a syncing of membership info from a foreign network's member described using the `NetworkUnitIdentity` structure. -## Interact with Network Units' IIN Agents -The IIN Agent interacts with other IIN Agents in the following ways: -* With local network agents: to launch or participate in a flow that collects a multi-signature over a foreign network's unit's security domain -* With foreign network agents: to request/offer membership and security domain presentations, prove membership within its network, and prove ownership of a security domain +- **RequestIdentityConfiguration(NetworkUnitIdentity): returns common.ack.Ack** + Endpoint for foreign IIN Agent to request attested local security domain's membership information. -Details of these protocols can be found [here](../../protocols/identity/readme.md). +- **SendIdentityConfiguration(AttestedMembership): returns common.ack.Ack** + Endpoint for foreign IIN Agent to supply attested foreign security domain's membership information. -## IIN Agents for Trust Anchors -Trust anchors associated with IINs, or DID registries in general, and which issue identity and membership VCs to individual network participants (see [IIN model](./iin.md)), also must run an agent to interact with network members' IIN agents. The model for an IIN agent specified earlier in this document can be used for trust anchor agents with some salient differences: -* The trust anchor agent will need to be equipped with the capability to issue VCs, and return VPs when an IIN agent sends a valid request for one. -* The trust anchor agent will not need to understand a DLT protocol for the purpose of recording identities to a network's ledger. +#### API for Local Security Domain's IIN Agents -(_Note_: If the IIN is built on Hyperledger Indy, where trust anchors are referred to as _stewards_, the corresponding agent will register the verinym (DID) for its steward along with key-generation seed values (generated using a random number generator) in the Indy ledger. This registration occurs at genesis (or bootstrap) time.) +- **RequestAttestation(AttestedSecurityDomain): returns common.ack.Ack** + Endpoint for local IIN Agent to request attestation over a foreign security domain's membership info as part of a signature collection flow. +- **SendAttestation(AttestedSecurityDomain): returns common.ack.Ack** + Endpoint for local IIN Agent to supply attestation over a foreign security domain's membership info as part of a signature collection flow. diff --git a/rfcs/models/identity/iin.md b/rfcs/models/identity/iin.md index e8a8d0f0a..a2ee6ac31 100644 --- a/rfcs/models/identity/iin.md +++ b/rfcs/models/identity/iin.md @@ -8,7 +8,7 @@ - RFC: 01-012 - Authors: Venkatraman Ramakrishna, Bishakh Chandra Ghosh, Krishnasuri Narayanam, Ermyas Abebe - Status: Proposed -- Since: 24-Sep-2021 +- Since: 25-Aug-2022 # Summary @@ -30,7 +30,7 @@ The IIN can be built on existing DLT based DID registry technologies such as [H # IIN Ledger Artifacts An IIN must have be able to record the following artifacts perferably in a distributed ledger: -* _DID Documents_ where each document is associated with a single unique DID. The DID Document can be for a blockchain network as a whole - [*Network Identity*](../../formats/identity.md) or member participant units - [*Participant Unit Identity*](../../formats/identity.md). +* _DID Documents_ where each document is associated with a single unique DID. The DID Document can be for a blockchain network as a whole - [*Security Domain Identity*](../../formats/network/identity.md#security-domain-identity) or member participant units - [*Organizational Unit Identity*](../../formats/network/identity.md#organizational-unit-identity). * _Verifiable Credential Schemas_: data structure describing a verifiable credential. ([vc-data-model](https://www.w3.org/TR/vc-data-model/#dfn-verifiable-data-registries)) @@ -38,10 +38,10 @@ An IIN must have be able to record the following artifacts perferably in a distr * _Revocation Registry_: to allow VC issuers to revoke credentials. -## Participant Unit Identity and Network Identity +## Organizational Unit Identity and Security Domain Identity -The IIN ledger holds the DID documents of network participants as well as the network as a whole. -See specifications of *Network Identity* and *Participant Unit Identity* DID formats [here](../../formats/identity.md). +The IIN ledger holds the DID documents of individual network members as well as that of the network as a whole. +See [specifications of these DID formats](../../formats/network/identity.md) for details. ## Credential Schema, Verification Keys and Revocation Lists @@ -50,8 +50,7 @@ A DID Document is not inherently mapped to any entity's physical identity [did-c The IIN must support two kinds of claims to be issued by trust anchors to the DIDs: -1. Identity VCs - for associating real world identity to individuals/organizations which are participating units - *Participant Identity VC*, or to a network as a whole - *Network Identity VC*. (See [Network Identity Validation - protocol](../../protocols/identity/network-identity-validation.md) for details.) +1. Identity VCs - for associating real world identity to individuals/organizations which are members of networks - *Organizational Unit Identity VC*, or to a network as a whole - *security Domain Identity VC*. (See [Network Identity Validation protocol](../../protocols/identity/security-domain-identity-validation.md) for details.) 2. Membership VCs - to assert the membership of an individual/organization in a blockchain network. @@ -92,4 +91,4 @@ These trust anchors are entities that the participants trust and whose identity ## IIN Agents -DLT networks interact with the IINs through a components called IIN Agent. Each participant unit in a DLT network has have atleast one IIN Agent using which it exposes its identity as well as discovers and verifies foreign network identities. The IIN Agents are detailed [here](./iin-agent.md). +DLT networks interact with the IINs and with each other through components called IIN Agents. Each participant unit in a DLT network must have at least one IIN Agent using which it exposes its identity as well as discovers and verifies foreign network identities. The IIN Agents are detailed [here](./iin-agent.md). diff --git a/rfcs/models/identity/network-identity-management.md b/rfcs/models/identity/network-identity-management.md index 2598c4280..85870efa0 100644 --- a/rfcs/models/identity/network-identity-management.md +++ b/rfcs/models/identity/network-identity-management.md @@ -1,134 +1,131 @@ - -# Decentralized Network-Identity Discovery and Management for Interoperation - -- RFC: 01-011 -- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe -- Status: Proposed -- Since: 24-Sep-2021 - - -# Overview - -During interoperation through the [data sharing protocol](../../protocols/data-sharing/generic.md), the primary functions performed through consensus in the _endpoint_ peer networks, namely _request access control_ and _view proof validation_, depend on the availability of authentic information about the counterparty network's identity providers and their credentials. Snapshots of these _identity configurations_, changing at punctuated intervals, act as essential trust basis for access control checks and proof validations. As Fig.1 indicates, our protocol has two distinct planes of operation, an _identity plane_ that syncs identity information as necessary and a _data plane_ where requests and responses occur. (_Note_: data query is just one example of a protocol operating in the data plane, independent of the protocol operating in the identity plane yet dependent on the information obtained through the latter.) - -
- -
-
Fig.1 - Data plane and identity plane in cross network data sharing protocol.
-
-
- -In the data sharing protocol, the protocol in the identity plane is implemented through the simplistic means of each network exposing a single public (i.e., without any access control) REST API function, from one of its active web servers, that reveals portions of the latest network configuration: -* In Fabric, this is the channel configuration containing root CA and intermediate CA certificates and other possibly relevant metadata for every organization participating in the channel. -* In Corda, this is a set of certificate chains, typically network root --> doorman --> node for each network node. - -This solution, implemented as a stopgap measure, suffers from various drawbacks: -1. First, it is insecure, relying on a single designated spokesperson to expose identity information in a participating network, and further not enforcing access controls on the information being exposed. -2. Second, it relies on apriori configuration of information about the REST API endpoints of the foreign networks, such as their addresses. There is no mechanism of discovering the interoperating networks. -3. Third, it assumes a priori trust between the two networks, while in the real world, parties rely on common trusted authorities for the introductory step. -4. Fourth, it again relies on a single designated member (participant unit) of a network to configure the identity information of foreign networks. - - -To enable data and asset exchange protocols between permissioned networks on-demand, we need a more secure and systematized process for exposing, discovering, verifying, and configuring network identity information. Further, this process should be decentralized in a way that allows participating networks and their units to own, control, and expose their identity information as they see fit and not have to rely on centralized parties as mediums of exchange. The process should also ensure extensibility, and scalability to the extent possible, by enabling a network with units owning decentralized identities (DIDs) which can be verified by well-known and trusted identity providers to exchange data or assets with permissioned networks already part of the ecosystem. Finally, trust in identity providers should be based on blockchain (or distributed ledger) principles, mitigating the possibility of collusion between networks and identity providers. - -A slightly amended figure (Fig.2) illustrates our view of the solution below, where you can see that the identity plane protocol relies both on bilateral communication and a "cloud" of identity providers that provides the fundamental trust basis for interoperation. We will sketch out the details of this cloud and the identity information exchanges later. - -
- -
-
Fig.2 - Identity plane using some identity providers and verifiers as a trust basis.

-
-
- -Having established our mode of blockchain interoperation as a two-plane networking system, we can focus on the components and mechanisms in the identity plane. Other specifications in this repository cover the gamut of features implemented in the data plane. - - -# Design Approaches and Choices - -There is a range, or spectrum, of architectural choices available to build identity plane infrastructure and protocols, which are described at length [here](./design-choices.md). In this document and in the rest of the specification, we will select one of those choices: "DID Registry for Identity Exchange", and describe a reference architecture and set of protocols in detail. Before doing that, we will describe the landscape as we see it, list our assumptions, and provide some reasoning for our design choices. - -The concepts of _Decentralized Identity (DID)_ and _Verifiable Credential (VC)_ already exist and are in W3C draft status. There are several examples of DID registries where user identities can be stored and looked up from in controllable ways. Credential issuers have existed on the Web for many years, and we expect that most will soon provide VCs to DID holders as this is the most promising approach to ensuring decentralized, controllable, and privacy-preserving authentication. Entities that participate in blockchain networks may already possess DIDs in one or more of these registries, and if not, can easily get DIDs created. They can also obtain VCs from reputed certifiers if they do not already possess them for proving their identity and other claims. Therefore, our design relies on blockchain network participants possessing DIDs and VCs issued by entities outside those networks. - -What we cannot know beforehand is what configuration of DID registries or VC issuers will exist at any given time nor should we make any assumptions that will limit our choices in the future. We can also not know the complete trust calculus beforehand that tells us how to connect two interoperating networks via common DID registries and VC issuers. We can only rely on the existence of DID and VC standards that everyone will eventually converges to. But for the purpose of our design, we can (and will) select a particular configuration that shows how the basis of interoperation can be built using DIDs and VCs. Our mechanisms can be easily adapted for different configurations of DID registries and VC issuers than the one we will describe in detail in this RFC. - - -# Distributed Identity Management Architecture - -The below figure (Fig. 3) illustrates our identity plane architecture: -* A set of identity providers and verifiers to establish a trust basis for exchange of identity and any other network configuration information. We assume, without loss of generality, that such identity providers belong to networks which we term as _Interoperation Identity Networks (IINs)_. -* A set of agents, called *IIN Agents* that act on behalf of members (participant units) within a network that collectively supply and fetch membership, identity, and any other configuration information, of the counterparty network. - -
- -
-
Fig.3 - Identity plane architecture overview

-
-
- -_Some Notes on IINs (Pertaining to the Design Choices Described Earlier)_: - - - - -* _The term 'Interoperation Identity Network' is a placeholder to describe a unit of our proposed architecture, and is subject to change in the future. A term that may replace it is 'Distributed Identity Registry', which captures both the role and the nature of this entity, and which practitioners may already be familiar with_. -* _An IIN is not a new concept or system we are inventing for interoperation purposes but is rather an extrapolation of the concept of a DID registry, many varieties of which exist today, to a distributed system that may maintain DID records through consensus among a committee on a shared ledger rather than maintain them in a centralized repository_. -* _An IIN brings within its purview both a DID registry maintained as a shared ledger as well as well-known issuers of DIDs and verifiable credentials (VCs) who collectively maintain that ledger. In the real-world, registries as well as issuers already exist, though not necessarily part of a single network. The design and protocol we describe can accommodate existing DID registries and VC issuers, even though they be independent (and centralized) entities, but in our discussion we will assume, without loss of generality, that they belong to one or the other network (labeled as an IIN). Our mechanisms rely on the ability to negotiate with issuers and read/write to DID registries; neither function is constrained by the nature of the issuers or the registries_. - -The following figure (Fig. 4) illustrates a representative instance of the generalized architecture. We envision an ecosystem consisting of multiple independent DLT networks, each of which chooses to interoperate for data or asset exchanges with another network bilaterally on a need basis. In this ecosystem, there also exist one or more IINs, each of which consist of one or more reputable trust anchors. These trust anchors issue VCs to support claims of the networks and their participants, thus forming the trust basis for identity verification. - -
- -
-
Fig.4 - IINs in Identity plane architecture

-
-
- - -#### Condition for successful identity configuration: - -Suppose there are two networks N1 and N2, and there are two IINs, IIN1 and IIN2. There are also two trust anchors, T1 in IIN1 and T2 in IIN2. - -Prerequisites for interoperation between network N1 connected to trust anchor T1 on IIN1 and N2 connected to trust anchor T2 on IIN2: -* N1 must have access privileges to IIN2's ledger and N2 must have access privileges to IIN1's ledger. Here access means ability to read the ledger to resolve DID Documents from it. -* N1 must trust T2 as an identity provider and verifier, and N2 must trust T1 similarly - -> (_Note_: this calculus becomes simpler if IIN1 and IIN2 are the same network, and even simpler if T1 and T2 are the same. In the latter case, the scenario devolves into N1 and N2 having a common root of trust.) - - -## Reference Architecture and Functional Requirements - -From a functional perspective, the mechanism to exchange identity information and to keep it in sync across network boundaries is agnostic of the trust relationship between networks. The simplest way to implement our architecture would be using a single IIN with multiple trust anchors representing either individual network consortiums or authorities trusted by the networks' constituent members, as mentioned earlier in this document. Functionally, this will be identical to a multi-IIN setup and so we will use this as the canonical architecture to describe the exchange protocol. The specification for IINs and the network components will leave room for multiple IINs though. - -## Interoperation Identity Network - IIN - -Our canonical IIN is a distributed shared ledger based DID registry that supports [Group Control](https://www.w3.org/TR/did-core/#group-control) to allow the group of network members (participant units) to control a single DID for the network. Along with this DID registry the IIN also has trust anchors, that issue VCs to support claims by different units. - -See specification for IINs [here](./iin.md). - - -## Forms of Identity - -Our framework consists of both hierarchical and decentralized identities. Decentralized identities belong to constituent units of participating DLT networks, each of whom is assumed to be an independent actor with an identity that is may not owe its existence to the network in question. Yet, for interoperation purposes, that decentralized identity will be associated with the corresponding network's identity, as will the identities of all the other units of that network. Below are the different identities that will be maintained and used in identity plane protocols: -* _Participant Unit Identity_: In a participating DLT network, each participant entity (individual/organization) of that network will have its independent identity. This identity is also a decentralized identity in the form of a DID, registered in an IIN DID registry. -* _Network Identity_: The identity of a network in the form of a DID, registered in an IIN. This identity is controlled by the participants of the network. -* _Trust Anchors_: Trust anchors are well known identities of units that issue VCs to attest the real identity of both Participant Unit Identities and Network Identities. -* _Data Plane Participant Identity_: In the data plane, DLT network participants may use different identities according to the DLT platform in use. Such identities are not a requirement in the identity plane. But participant units use _Participant Unit Identity_ of the identity plane to self attest their _Data Plane Participant Identity_. - -The the data format specifications [here](../../formats/identity.md). - - - -## Network Identity Creation, Exchange and Validation - -The DLT networks and its participant units must create and configure their identities in the identity plane. During interoperation, two different networks have to exchange their identity information and validate them. These are carried out with through the protocols specified [here](../../protocols/identity/readme.md). - -## Network Identity Discovery - -To allow seamless interoperation across two different DLT networks, the identity of the counterparty networks have to be configured. But, even before that, some means of discovering the networks is required through which any identity protocol can start. Discovery of networks in the identity plane is facilitated by discovery of the Network Identities, which are represented as Network DIDs and registered in the IINs. Each Network thus has a unique Network DID which can be considered equivalent to a domain name in Internet parlance. Thus Network DID facilitates discovery of networks with the help of the IIN infrastructure. - -The network discovery protocols specifications are elaborated [here](../../protocols/discovery/readme.md). - + +# Decentralized Network-Identity Discovery and Management for Interoperation + +- RFC: 01-011 +- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe +- Status: Proposed +- Since: 25-Aug-2022 + + +# Overview + +During interoperation through the [data sharing protocol](../../protocols/data-sharing/generic.md), the primary functions performed through consensus in the _endpoint_ peer networks, namely _request access control_ and _view proof validation_, depend on the availability of authentic information about the counterparty network's identity providers and their credentials. Snapshots of these _identity configurations_, changing at punctuated intervals, act as essential trust basis for access control checks and proof validations. As Fig.1 indicates, our protocol has two distinct planes of operation, an _identity plane_ that syncs identity information as necessary and a _data plane_ where requests and responses occur. (_Note_: data query is just one example of a protocol operating in the data plane, independent of the protocol operating in the identity plane yet dependent on the information obtained through the latter.) + +
+ +
+
Fig.1 - Data plane and identity plane in cross network data sharing protocol.
+
+
+ +In the data sharing protocol, the protocol in the identity plane is implemented through the simplistic means of each network exposing a single public (i.e., without any access control) REST API function, from one of its active web servers, that reveals portions of the latest network configuration: +* In Fabric, this is the channel configuration containing root CA and intermediate CA certificates and other possibly relevant metadata for every organization participating in the channel. +* In Corda, this is a set of certificate chains, typically network root --> doorman --> node for each network node. + +This solution, implemented as a stopgap measure, suffers from various drawbacks: +1. First, it is insecure, relying on a single designated spokesperson to expose identity information in a participating network, and further not enforcing access controls on the information being exposed. +2. Second, it relies on apriori configuration of information about the REST API endpoints of the foreign networks, such as their addresses. There is no mechanism of discovering the interoperating networks. +3. Third, it assumes a priori trust between the two networks, while in the real world, parties rely on common trusted authorities for the introductory step. +4. Fourth, it again relies on a single designated member (participant unit) of a network to configure the identity information of foreign networks. + + +To enable data and asset exchange protocols between permissioned networks on-demand, we need a more secure and systematized process for exposing, discovering, verifying, and configuring network identity information. Further, this process should be decentralized in a way that allows participating networks and their units to own, control, and expose their identity information as they see fit and not have to rely on centralized parties as mediums of exchange. The process should also ensure extensibility, and scalability to the extent possible, by enabling a network with units owning decentralized identities (DIDs) which can be verified by well-known and trusted identity providers to exchange data or assets with permissioned networks already part of the ecosystem. Finally, trust in identity providers should be based on blockchain (or distributed ledger) principles, mitigating the possibility of collusion between networks and identity providers. + +A slightly amended figure (Fig.2) illustrates our view of the solution below, where you can see that the identity plane protocol relies both on bilateral communication and a "cloud" of identity providers that provides the fundamental trust basis for interoperation. We will sketch out the details of this cloud and the identity information exchanges later. + +
+ +
+
Fig.2 - Identity plane using some identity providers and verifiers as a trust basis.

+
+
+ +Having established our mode of blockchain interoperation as a two-plane networking system, we can focus on the components and mechanisms in the identity plane. Other specifications in this repository cover the gamut of features implemented in the data plane. + + +# Design Approaches and Choices + +There is a range, or spectrum, of architectural choices available to build identity plane infrastructure and protocols, which are described at length [here](./design-choices.md). In this document and in the rest of the specification, we will select one of those choices: "DID Registry for Identity Exchange", and describe a reference architecture and set of protocols in detail. Before doing that, we will describe the landscape as we see it, list our assumptions, and provide some reasoning for our design choices. + +The concepts of _Decentralized Identity (DID)_ and _Verifiable Credential (VC)_ already exist and are in W3C draft status. There are several examples of DID registries where user identities can be stored and looked up from in controllable ways. Credential issuers have existed on the Web for many years, and we expect that most will soon provide VCs to DID holders as this is the most promising approach to ensuring decentralized, controllable, and privacy-preserving authentication. Entities that participate in blockchain networks may already possess DIDs in one or more of these registries, and if not, can easily get DIDs created. They can also obtain VCs from reputed certifiers if they do not already possess them for proving their identity and other claims. Therefore, our design relies on blockchain network participants possessing DIDs and VCs issued by entities outside those networks. + +What we cannot know beforehand is what configuration of DID registries or VC issuers will exist at any given time nor should we make any assumptions that will limit our choices in the future. We can also not know the complete trust calculus beforehand that tells us how to connect two interoperating networks via common DID registries and VC issuers. We can only rely on the existence of DID and VC standards that everyone will eventually converges to. But for the purpose of our design, we can (and will) select a particular configuration that shows how the basis of interoperation can be built using DIDs and VCs. Our mechanisms can be easily adapted for different configurations of DID registries and VC issuers than the one we will describe in detail in this RFC. + + +# Distributed Identity Management Architecture + +The below figure (Fig. 3) illustrates our identity plane architecture: +* A set of identity providers and verifiers to establish a trust basis for exchange of identity and any other network configuration information. We assume, without loss of generality, that such identity providers belong to networks which we term as _Interoperation Identity Networks (IINs)_. +* A set of agents, called *IIN Agents* that act on behalf of members (participant units) within a network that collectively supply and fetch membership, identity, and any other configuration information, of the counterparty network. + +
+ +
+
Fig.3 - Identity plane architecture overview

+
+
+ +_Some Notes on IINs (Pertaining to the Design Choices Described Earlier)_: + +* _The term 'Interoperation Identity Network' is a placeholder to describe a unit of our proposed architecture, and is subject to change in the future. A term that may replace it is 'Distributed Identity Registry', which captures both the role and the nature of this entity, and which practitioners may already be familiar with_. +* _An IIN is not a new concept or system we are inventing for interoperation purposes but is rather an extrapolation of the concept of a DID registry, many varieties of which exist today, to a distributed system that may maintain DID records through consensus among a committee on a shared ledger rather than maintain them in a centralized repository_. +* _An IIN brings within its purview both a DID registry maintained as a shared ledger as well as well-known issuers of DIDs and verifiable credentials (VCs) who collectively maintain that ledger. In the real-world, registries as well as issuers already exist, though not necessarily part of a single network. The design and protocol we describe can accommodate existing DID registries and VC issuers, even though they be independent (and centralized) entities, but in our discussion we will assume, without loss of generality, that they belong to one or the other network (labeled as an IIN). Our mechanisms rely on the ability to negotiate with issuers and read/write to DID registries; neither function is constrained by the nature of the issuers or the registries_. + +The following figure (Fig. 4) illustrates a representative instance of the generalized architecture. We envision an ecosystem consisting of multiple independent DLT networks, each of which chooses to interoperate for data or asset exchanges with another network bilaterally on a need basis. In this ecosystem, there also exist one or more IINs, each of which consist of one or more reputable trust anchors. These trust anchors issue VCs to support claims of the networks and their participants, thus forming the trust basis for identity verification. + +
+ +
+
Fig.4 - IINs in Identity plane architecture

+
+
+ + +#### Condition for successful identity configuration: + +Suppose there are two networks N1 and N2, and there are two IINs, IIN1 and IIN2. There are also two trust anchors, T1 in IIN1 and T2 in IIN2. + +Prerequisites for interoperation between network N1 connected to trust anchor T1 on IIN1 and N2 connected to trust anchor T2 on IIN2: +* N1 must have access privileges to IIN2's ledger and N2 must have access privileges to IIN1's ledger. Here access means ability to read the ledger to resolve DID Documents from it. +* N1 must trust T2 as an identity provider and verifier, and N2 must trust T1 similarly + +> (_Note_: this calculus becomes simpler if IIN1 and IIN2 are the same network, and even simpler if T1 and T2 are the same. In the latter case, the scenario devolves into N1 and N2 having a common root of trust.) + + +## Reference Architecture and Functional Requirements + +From a functional perspective, the mechanism to exchange identity information and to keep it in sync across network boundaries is agnostic of the trust relationship between networks. The simplest way to implement our architecture would be using a single IIN with multiple trust anchors representing either individual network consortiums or authorities trusted by the networks' constituent members, as mentioned earlier in this document. Functionally, this will be identical to a multi-IIN setup and so we will use this as the canonical architecture to describe the exchange protocol. The specification for IINs and the network components will leave room for multiple IINs though. + +## Interoperation Identity Network - IIN + +Our canonical IIN is a distributed shared ledger based DID registry that supports [Group Control](https://www.w3.org/TR/did-core/#group-control) to allow the group of network members (participant units) to control a single DID for the network. Along with this DID registry the IIN also has trust anchors, that issue VCs to support claims by different units. + +See specification for IINs [here](./iin.md). + + +## Forms of Identity + +Our framework consists of both hierarchical and decentralized identities. Decentralized identities belong to constituent units of participating DLT networks, each of whom is assumed to be an independent actor with an identity that is may not owe its existence to the network in question. Yet, for interoperation purposes, that decentralized identity will be associated with the corresponding network's identity, as will the identities of all the other units of that network. Below are the different identities that will be maintained and used in identity plane protocols: +* _Organizational Unit Identity_: Each member (individual/organization) of a DLT network will have a real world identity independent of its affiliation with that network. This identity is also a decentralized identity (DID), registered in an IIN DID registry. +* _Security Domain Identity_: The identity of a network, which is also a [security domain](../security/security-domains.md), in the form of a DID, registered in an IIN. This identity is controlled collectively by the members of the network. +* _Trust Anchors_: Trust anchors are identities of well-known entities that issue VCs to attest the real world identities of both Organizational Units and Security Domains. +* _Security Domain Member Identity_: In the data plane, network members may use different identities scoped within their security domain as necessitated by the DLT platform on which the network is built. Such identities are not a requirement in the identity plane. But a member uses its _Organizational Unit Identity_ (in the identity plane) to self attest its _Security Domain Member Identity_. + +See the [data format specifications](../../network/identity.md) for more details. + + +## Security Domain Identity Creation, Exchange and Validation + +DLT networks and their members must create and configure their respective identities in the identity plane. See the protocols for [cross-network identity exchange and validation](../../protocols/identity/readme.md) for more details. + + +## Security Domain Identity Discovery + +For two different DLT networks to interoperate seamlessly, a network must fetch, validate, and record its counterparty network's members' identities on its ledger. But discovering the counterparty network and obtaining its security domain identity is a prerequisite for any identity plane protocol in which members' identities can be synced. IIN infrastructure facilitates such discovery by allowing networks to register and record their security domain identities in the forms of Network DIDs. We will assume that each network will have a unique Network DID, analogous to a domain name in the Internet. + +See the [network discovery protocols specifications](../../protocols/discovery/discovery.md) for more details. + diff --git a/rfcs/models/infrastructure/relays.md b/rfcs/models/infrastructure/relays.md index 4aac3b247..6b00f6b2b 100644 --- a/rfcs/models/infrastructure/relays.md +++ b/rfcs/models/infrastructure/relays.md @@ -73,7 +73,7 @@ Once a driver is designed for a given DLT, it can be reused in any network built ## Relay Functional API -Here we list API function specs exposed to [application clients](#api-for-application-client), [relay](#api-for-other-relays) and [drivers](#api-for-driver). These all are RPC endpoints that can be implemented directly in a well-known protocol like gRPC. Message formats will be described in [relay](../../formats/communication/relay.md) and [request](../../formats/views/request.md). +Here we list API function specs exposed to [application clients](#api-for-application-client), [relay](#api-for-other-relays) and [drivers](#api-for-driver). These all are RPC endpoints that can be implemented directly in a well-known protocol like gRPC. See the [relay](../../formats/communication/relay.md) and [view request](../../formats/views/request.md) format specifications for more details. ### API for Application Client @@ -99,7 +99,7 @@ Here we list API function specs exposed to [application clients](#api-for-applic ## Driver Functional API -Here we list API function specs exposed to relays by the drivers. These are RPC endpoints that can be implemented directly in a well-known protocol like gRPC. Message formats will be described in [request](../../formats/views/request.md). +Here we list API function specs exposed to relays by the drivers. These are RPC endpoints that can be implemented directly in a well-known protocol like gRPC. See the [view request](../../formats/views/request.md) format specifications for more details. - **RequestDriverState(common.query.Query): returns (common.ack.Ack)** The remote relay sends a request to the driver, identified by the [view address](../../formats/views/addressing), with a query defining the data it wants to receive. This is where driver unpacks the view address, makes a call to the requested contract using given arguments, and collects the response along with the proof, packages them into a DLT-specific view message, and then encapsulating it to a DLT-neutral view message. This final message is then sent back to remote relay using above relay's API (SendDriverState). It takes a message of type takes [Query](../../formats/views/request.md#query) as argument, and returns [Ack](../../formats/views/request.md#ack). diff --git a/rfcs/protocols/discovery/discovery.md b/rfcs/protocols/discovery/discovery.md index 125028cea..b5ffb08b7 100644 --- a/rfcs/protocols/discovery/discovery.md +++ b/rfcs/protocols/discovery/discovery.md @@ -3,19 +3,16 @@ SPDX-License-Identifier: CC-BY-4.0 --> -# Discovery Protocol +# Discovering Foreign Security Domains - RFC: 02-013 - Authors: Bishakh Chandra Ghosh, Venkatraman Ramakrishna, Krishnasuri Narayanam, Ermyas Abebe - Status: Draft -- Since: 25-Jul-2021 +- Since: 27-Aug-2022 ## Summary -When a network ("local network" from here on) tries to configure the identity of another network ("foreign network" from here on) for interoperation, the broad steps involved are (i) Network Discovery (ii) Network Identity Validation. Both these steps are carried out by the IIN agent of the participants of the local network. +This document covers the process by which a network (or security domain) discovers the identity of another as a prelude to [validation](../identity/security-domain-identity-validation.md) and [syncing of membership information](../identity/membership-syncing.md). -Whether each participant needs to carry out the discovery and validation, or a subset of participants will do it depends entirely on the trust basis of the network. This is covered in Network Identity Configuration step. - - -> Note: It is the IIN's responsibility to authenticate a Network DID creation or updation. Therefore, local network must trust the IIN to trust the fact that the resolved Network DID is created by proper attestations from its controller participants. Given a DLT based IIN which allows anyone to monitor the ledger, any IIN agent can validate the authenticity of a Network DID by validating the Network DID creation/updation requests from the ledger. +At its simplest, this can be a trivial exercise of hitting a well-known website that serves DID records for the security domains one is interesting in interoperating with. But more complex situations are possible, involving multiple IINs and name resolution services. diff --git a/rfcs/protocols/discovery/negotiation.md b/rfcs/protocols/discovery/negotiation.md index 9b27deec7..9c9f9d57f 100644 --- a/rfcs/protocols/discovery/negotiation.md +++ b/rfcs/protocols/discovery/negotiation.md @@ -3,12 +3,12 @@ SPDX-License-Identifier: CC-BY-4.0 --> -# Negotiation Protocol for End-to-End Connection Setup +# Cross-Security Domain Negotiation for Data Plane Connection Setup - RFC: 02-014 - Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Sandeep Nishad, Dhinakaran Vinayagamurthy - Status: Draft -- Since: 02-Apr-2022 +- Since: 27-Aug-2022 ## Summary diff --git a/rfcs/protocols/identity/data-plane-identity-configuration.md b/rfcs/protocols/identity/data-plane-identity-configuration.md deleted file mode 100644 index 201a21de1..000000000 --- a/rfcs/protocols/identity/data-plane-identity-configuration.md +++ /dev/null @@ -1,33 +0,0 @@ - -# Data Plane Identity Configuration - -- RFC: 02-012-appendix-b -- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe -- Status: Proposed -- Since: 24-Sep-2021 - -## Overview - -For interoperation in the data plane, the identities in terms of data plane certificates/credentials of the foreign network units have to be configured. Along with that, the relay endopint information has to be configured. - -The Network DID of a foreign network contains `relayEndpoints` and `DataplaneCredentials` verification method which are used to configure the realys and the data plane certidicates required for interoperation respectively. - -## Protocol - -Considering two networks `NETWORK 1` and `NETWORK 2`, we specify a protocol where the IIN Agent of a participant unit, say `Org2` in `NETWORK 1` is configuring the identity and relay for `NETWORK 2`. - -* IIN Agent of a network unit that intends to update the foreign network identity information in the data plane initiates a flow to collect signatures over the identity (Security Domain info) of the network units of `NETWORK 2`. These are obtained from `relayEndpoints` and `DataplaneCredentials` verification method of the Network DID, after the Network DID is validated (see [protocol](./network-identity-validation.md)). -* IIN Agent of a network unit starts a flow to collect signatures over the identity (Security Domain info) and relay endpoint of `NETWORK 2`. - -The steps of this application level flow for updating data plane identity information are as follows: -1. `IIN Agent Org2` constructs a _signature collection procedure_ request message consisting of the following: `{, [],[ -> ]},` (here, `` is generated over the preceding structure. -2. `IIN Agent Org2` triggers a _signature collection procedure_ by sending the request to every other IIN Agent in `NETWORK 1`. For example, on if `Org1` is another unit of `NETWORK 1`, it is sent to `IIN Agent Org1`. The requestees return signatures over the structure generated above to `IIN Agent Org2`. - * This can be orchestrated completely by the triggering agent, which sends requests and receives responses from every other IIN Agent. - * Alternatively, this could be a flow, where the trigger agent is simply the first node to generate a signature after which the request is handed off to another node. Eventually, when enough signatures are collected, a ledger update can be triggered (see Step 6 further below) -3. (_Optional_) Requestee's IIN Agent (`IIN Agent Org1`) confirms the presence and validity of the Network DID of `NETWORK 2` on the IIN ledger and fetches the network DID document. This replicates what `IIN Agent Org2` did in Network Identity Validation [protocol](./network-identity-validation.md). This step is optional since the identity validation might already be done by the requestee and hence the validation information might be cached and used for providing the attestation. -4. The requestee (`IIN Agent Org1`) validates the Security Domain info for `NETWORK 2` units, as well as the relay endpoints. -5. When the requester unit - `IIN Agent Org2` obtains signatures from all IIN Agents in `NETWORK 1`, it updates the Security Domain info on the network ledger by submitting a transaction to the Interoperation module (a chaincode in the Fabric implementation, a Cordapp in the Corda implementation). The transaction payload consists of: `{, [],[ -> ]},[,]}`. The signatures are validated by multiple peers and committed to the ledger after passing through a consensus protocol. diff --git a/rfcs/protocols/identity/identity-change-updates.md b/rfcs/protocols/identity/identity-change-updates.md deleted file mode 100644 index 3dbd3fca4..000000000 --- a/rfcs/protocols/identity/identity-change-updates.md +++ /dev/null @@ -1,27 +0,0 @@ - -# Credentials update with changes in identity plane - -- RFC: 02-012-appendix-c -- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe -- Status: Proposed -- Since: 24-Sep-2021 - - -# Overview - -As mentioned in the [identity exchange protocol](./identity-syncing.md), there are three phases in the process between a network making itself known via an IIN to the point when its identity and certificates are accepted and recorded by a foreign network with which an interoperation (in the data plane) may occur in the future. These phases are separate protocol instances in themselves, though they must follow a particular chronological order. The full process is illustrated in the figure below: - - - -First, each network unit of a network (above, without loss of generality, `NETWORK 1`) must register its network identity with an IIN. So Step 1 in the above figure must be carried out the network units before a network is ready to interoperate with another. - -Second, any of the network units of a network (above, without loss of generality, `NETWORK 2`) can fetch the latest identity and certificate information for a foreign network (again, without loss of generality, `NETWORK 1`) based on a trigger, which can be any of the following: -* Manual trigger applied by a network administrator -* Timeout after a poll interval: the network unit in `NETWORK 1` polls for updates to `NETWORK 2` -* Event notification: a network unit in `NETWORK 1` receives an event notifying it about a change in `NETWORK 2` - -Third, any of the network units of a network that have obtained updated information about another network can run a process leading up the recording of this information as a set of security domains to its local ledger using the interoperation module (in Fabric, the interoperation chaincode; in Corda, the interoperation Cordapp). This process involves a flow among the various network units to collect a multi-signature, as is described in the [data plane identity configuration protocol](./data-plane-identity-configuration.md). diff --git a/rfcs/protocols/identity/identity-syncing.md b/rfcs/protocols/identity/identity-syncing.md index 66c96141f..f6cc44850 100644 --- a/rfcs/protocols/identity/identity-syncing.md +++ b/rfcs/protocols/identity/identity-syncing.md @@ -3,69 +3,66 @@ SPDX-License-Identifier: CC-BY-4.0 --> -# Protocols for Decentralized Network-Identity Configuration, Exchannge and Validation, for Interoperation +# Cross-Domain Identity and Membership Syncing - RFC: 02-012 - Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe - Status: Proposed - Supersedes: 02-011 -- Since: 24-Sep-2021 +- Since: 25-Aug-2022 ## Summary -This is an identity plane protocol to exchange identity information between two interoperating blockchain networks. This establishes a basis (or trust anchor) for proof-based data sharing. For background and component information, start [here](../../models/identity/network-identity-management.md). +This is set of identity plane protocols to enable two interoperating blockchain networks, i.e., two independent security domains, to discover, offer, and validate each other's identities and memberships. This establishes a trust basis for proof-based [data sharing](../data-sharing/generic.md) and [asset transfer](../asset-transfer/generic.md) data plane protocols. For background information and an overview of the architectural assumptions, start with the [identity management specs](../../models/identity/network-identity-management.md). -The entire Network Identity Discovery and Management protocol involves the following protocols for different steps: +We can list the protocols that comprise an end-to-end process from network creation to setting the basis for data plane interoperation in sequence as follows: -1. Particpant Unit Identity Creation -2. Network Identity Creation as Network DID -3. Netwrok Discovery -4. Network Identity Validation -5. Data Plane Identity Configuration -6. Updating Network DID with changing Network Structure +1. Organizational Unit Identity Creation +2. Creation of a Security Domain DID for a Network +3. Security Domain Discovery +4. Security Domain Identity Validation +5. Security Domain Membership Syncing +6. Syncing Identity and Membership upon Network Structure Change ## Roles There are different units in the identity plane with different roles as follows: -**participant** - A blockchain network's participant unit such as an organization or individual. +**member** - An organizationa unit that is also a blockchain/DLT network's member. -**network** - A blockchain network that is formed of participants. +**security domain** - A blockchain/DLT network or subgroup of a blockchain/DLT network that is self-sovereign for identity issuance and governance purposes. -**IIN** - The Interoperation Identity Network consisting of the `IIN registry`, `IIN nodes`, and `trust anchors`. +**IIN** - The Interoperation Identity Network consisting of an `IIN registry`, `IIN nodes`, and `trust anchors`. See the [IIN spec](../../models/identity/iin.md) for more details. +**IIN registry** - Verifiable data registry maintaining DID records. -**IIN registry** - DID registry and verifiable data registry provided by the IIN. +**IIN nodes** - IIN nodes that maintain a shared DLT-based registry and act as validators/miners of transactions. -**IIN nodes** - Nodes that maintain the IIN DLT based registry acting as validators/miners of transactions. +**trust anchor** - A well-known entity (individual/organization) that issues VCs to assert claims about an organizational unit or security domain. These claims include, but are not limited to, identity and network membership. Different networks/domains and the organization units that constitute their memberships may trust different trust anchors. -**trust anchor** - An entity (individual/organization) that issues VCs to assert claims about identity or membership or others to participant as well as networks. Different networks and participants can trust different trust anchors. +**IIN Agents** - Each security domain member controls at least one IIN Agent, which interfaces with at least one IIN and one trust anchor and with other members' (local or foreign) IIN Agents. -**IIN Agents** - Each `participant` has one or more IIN Agent, which is the identity plane component of the participant that interacts with the IIN and other participant's IIN Agents. -## Particpant Unit Identity Creation - -Each network participant unit such as individuals or organizations participating in any blockchain network must have their DID registered in some IIN. To create a DID in an IIN registry, the following steps are performed. +## Network Member (Organizational Unit) Identity Creation +The organizational unit corresponding to each network member must have its DID record registered in some IIN. The following steps must be performed to create a DID record in an IIN registry. +**Step 1. member chooses a unique DID** -**Step 1. participant chooses a unique DID** - -The DID is a globally unique [identifier](https://w3c.github.io/did-core/#identifier) (`did::`) which is constructed using a `method-name` and a `method-specific-id` that is unique wthin the method. Each IIN registry will have its unique `method-name` and specify how to generate the `method-specific-id` component of a DID. - +The DID is a globally unique [identifier](https://w3c.github.io/did-core/#identifier) (`did::`) which is constructed using a `method-name` and a `method-specific-id` that is unique wthin the method. Each IIN registry will have its unique `method-name` and specify how to generate the `method-specific-id` component of a DID. Example: -If `method-name` of an IIN registry is `exampleiin`, and the participant chooses a `method-specific-id` as `org1`, then `org1` must be unique within `exampleiin`, and `did:exampleiin:org1` must be unique globally. +If `method-name` of an IIN registry is `exampleiin`, and the organizational unit chooses a `method-specific-id` as `org1`, then `org1` must be unique within `exampleiin`, and `did:exampleiin:org1` must be unique globally. -> Note: An IIN registry may enforce participant DIDs to have a fixed prefix in the `method-specific-id` to determine that it is a participant DID and not a network DID. Eg: if the fixed prefix is `participant:`, then a valid participant did will be `did:exampleiin:participant:org1`. Similarly a network DID can be `did:exampleiin:network:tradelens`. +> Note: An IIN registry may mandate organizational unit DIDs to have a fixed prefix in the `method-specific-id` to signal that it is a network member's DID and not a network's (or security domain's) DID. Eg: if the fixed prefix is `member:`, then a valid organizational unit DID will be `did:exampleiin:member:org1`. Similarly a security domain DID can be `did:exampleiin:security-domain:tradelens`. -**Step 2. participant creates a DID Document** +**Step 2. member creates a DID Document** -The participant DID Document must specify one verification method with [authentication](https://w3c.github.io/did-core/#authentication) verification relationship. An example of participant DID document: +The member DID Document must specify one verification method (`verificationMethod`) with its [authentication](https://w3c.github.io/did-core/#authentication) [verification relationship](https://w3c.github.io/did-core/#dfn-verification-relationship). An example of such a member DID document is as follows: ```json { @@ -81,9 +78,9 @@ The participant DID Document must specify one verification method with [authenti } ``` -**Step 3. participant send a DID registration request to the IIN (IIN registry).** +**Step 3. member send a DID registration request to the IIN (IIN registry)** -The DID registration (create method) request must contain the DID document, as well as a signature that can be verified against the `authentication` verification method specified in the DID document. This request is sent by the `IIN Agent` of the participant. The underlying protocol dictating how the DID registration request will be sent to the IIN depends on the create method of the IIN registry. +The DID registration (`create` method) request must contain the DID document as well as a signature that can be verified against the verification method associated with the `authentication` field specified in the DID document. This request is sent by the member's IIN Agent using the appropriate DID registration protocol (i.e., `create` method) for the IIN registry. Example DID registration request: ```json @@ -102,67 +99,68 @@ Example DID registration request: "signature": "..." } ``` -Here signature is done on the DIDDocument. +Here, the `signature` is generated over the `DIDDocument`. **Step 4. IIN validates a DID registration request and creates the DID** -A DID registration request, that is the DID create method of the IIN registry, must authenticate the request. This authentication is to be done by validating the signature in the request with the help of the authentication method present in the DID Document of the request. +When an IIN registry receives a DID registration request, i.e., the DID `create` method, it must first authenticate the request by validating the `signature` in the request with reference to the authentication method present in the DID Document of the request. -**Step 5. Trust anchors issue identity VC to participant DID.** +**Step 5. Trust anchors issue identity VC to member DID** -A DID and a DID document do not inherently carry any personal data such as physical identity / real worl identity ([binding did to physical identity](https://w3c.github.io/did-core/#binding-to-physical-identity)). Therefore, to map a participant's did to its physical identity, some trust anchor must issue VCs attesting the real world physical identity of the participant , to the participant's DID. The participant itself becomes the holder of those identity VCs and can present it to others to prove its physical identity. +A DID document does not contain any personal information about its holder, like physical identity or real world identity (see [binding DID to physical identity](https://w3c.github.io/did-core/#binding-to-physical-identity) for reference). Therefore, to map an organization unit's DID to its physical identity, some trust anchor must issue VCs attesting real world identities of the member to its DID. The member can hold these VCs in a wallet and present them to others to prove various identities or affiliations as required in particular scenarios. -> Step 5 has flexibility in terms of how many trust anchors and which trust anchors issue identity VC to a particular participant. These identity VCs might be used for validating network identity by other network participants. See *Network Identity Validation* step. +> Any nummber of trust anchors may issue identity VCs to a member in Step 5. These identity VCs may be used for validating its security domain's identity by other members of that domain. See the *Security Domain Identity Validation* section for more details. -## Network Identity Creation as Network DID +## Security Domain Identity Creation as Security Domain DID -A network formed of participants creates its own Network DID in an IIN registry. The Network DID is controlled jointly by its participants ([group controller](https://w3c.github.io/did-core/#group-control)). This Network DID can be used as an address to the network, to discover and configure its identity during interoperation. +A security domain creates its own DID record in an IIN registry. The Security Domain DID is controlled jointly by its members according to the [group controller specification](https://w3c.github.io/did-core/#group-control). This DID can then be used as a way of addressing the network/domain, to discover and configure its identity and membership for interoperation. -Creation of a Network DID involves the following steps: +Creation of a Security Domain DID involves the following steps: -**Step 1. Creating Network DID Document** +**Step 1. Creating Securtiy Domain DID Document** -In addition to the usual fields of a DID Document, a Network DID document must contain a `verificationMethod` of type `BlockchainNetworkMultiSig`, and `networkParticipants` property listing the DIDs of the participants. -The `BlockchainNetworkMultiSig` verificationMethod defines the group controller of the Network DID. +In addition to the typical fields found in a DID Document, a Security Domain DID document must contain a `verificationMethod` of type `BlockchainNetworkMultiSig`, and `networkMembers` property listing the DIDs of the network's members. This method defines the group controller of the Security Domain DID. -Each participant in `networkParticipants` must already have a registered DID in some IIN registry. +Each member in `networkMembers` must already have a registered DID in some IIN registry. -The DID, that is the `id` property in the Network DID document can be chosen by the network. +The unique identity in the DID document, i.e., the `id` property, can be chosen by the network. -See [Network DID Identity format](../../formats/identity.md) for details about Network DID format. +See the [Security Domain DID Identity format specs](../../formats/identity.md) for more details. -**Step 2. Preparing Network DID creation request** +**Step 2. Preparing Security Domain DID creation request** -Creating a Network DID is only possible by the DID's controller. Therefore to create a Network DID for the first time, the request has to be authenticated by verifying attestations of all participants of the network. This is done while forming the Network DID creation request. +A Security Group DID can only be created by its group controller. Therefore, to create such a DID for the first time, the `create` request must be authenticated by verifying attestations of all members of the network, which are included in the DID creation request. -A Network DID creation request has a `NetworkDIDDocument` and `signatures`. `NetworkDIDDocument` contains the Network DID Document with the `networkParticipants` and a `BlockchainNetworkMultiSig` verificationMethod. The `signatures` is a set of signatures from all participants. +The Security Domain DID creation request must have the following fields: +* `SecurityDomainDIDDocument`: the security domain's DID Document with a `networkMembers` field and a `verificationMethod` of type `BlockchainNetworkMultiSig`. +* `signatures`: a set of signatures from all network members. -> Note: During NetworkDID creation, the `updatePolicy` of the `BlockchainNetworkMultiSig` verificationMethod is not used. Instead. the request has to be authenticated against all the participants in `networkParticipants` list. +> Note: During the DID creation, the `updatePolicy` field in the `verificationMethod` is not used. Instead. the request must be authorized by all the members listed in the `networkMembers` field using their signatures. -Example NetworkDID creation request: +Example Security Domain DID creation request: ```json { - "NetworkDIDDocument": { + "SecurityDomainDIDDocument": { "id": "did::", - "networkParticipants": [ - "did::", - "did::", - "did::" + "networkMembers": [ + "did::", + "did::", + "did::" ], "verificationMethod": [{ "id": "did::#multisig", "type": "BlockchainNetworkMultiSig", "controller": "did::", "multisigKeys": [ - "did::#key1", - "did::#key3", - "did::#key1" + "did::#key1", + "did::#key3", + "did::#key1" ], "updatePolicy": { "id": "did::#updatepolicy", @@ -172,11 +170,11 @@ Example NetworkDID creation request: "id": "did::#updatepolicy-1", "controller": "did::", "type": "VerifiableCondition2021", - "conditionOr": ["did::#key1", - "did::#key3" + "conditionOr": ["did::#key1", + "did::#key3" ] }, - "did::#key1" + "did::#key1" ] } }, @@ -186,9 +184,9 @@ Example NetworkDID creation request: "type": "DataplaneCredentials", "controller": "did::", "FabricCredentials": { - "did::": "Certificate3_Hash", - "did::": "Certificate2_Hash", - "did::": "Certificate3_Hash" + "did::": "Certificate3_Hash", + "did::": "Certificate2_Hash", + "did::": "Certificate3_Hash" } } ], @@ -207,42 +205,43 @@ Example NetworkDID creation request: ] }, "signatures": { - "did::": "...", - "did::": "...", - "did::": "..." + "did::": "...", + "did::": "...", + "did::": "..." } } ``` -How this request is created is out of the scopt of this specification. However, generally it is recommended that the signatures of the request are collected through a smart contract in the network blockchain itself. +A protocol among network members to collectively create uch a request is out of scope for this specification. However, we recommended that request be collecteded using a multisig smart contract deployed in the IIN, where the smart contract state machine waits for a set of signatures before automatically composing and recording the DID document for a security domain. -**Step 3. Network sends the Network DID creation request to IIN** -The Network DID creation request containing signatures from all the participants can then be sent to an IIN. This can be done by any entity's IIN agent, for example by the IIN agent of a participant of the network. How the participant is selected can vary from implementation to implementation. +**Step 3. Security Domain sends the Security Domain DID creation request to IIN** +The Security Domain DID creation request containing signatures from all the participants can be sent to an IIN by the IIN agent of any of the network members. The member selection criteria can vary across implementations. Multiple IIN agents may submit identical creation requests without causing any harm as these requests will be idempotent. -**Step 4. IIN validates a Network DID creation request** -The DID create method of the IIN registry must authenticate the a Network DID creation request differently from other DIDs. For a Network DID, the IIN first validates if the DID Document has the requisite properties: `networkParticipants`, and a verificationMethod of type `BlockchainNetworkMultiSig`. Additionally, the request must contain the signatures from all participants of the network authenticating it. +**Step 4. IIN validates a Security Domain DID creation request** -The authentication process is carried out by validating signature from each participant in the `networkParticipants` as follows: +An IIN registry must authenticate a Security Domain DID creation request differently from creation requests for other DID types. First, the IIN checks that the DID Document has the requisite properties: `networkMembers`, and a `verificationMethod` of type `BlockchainNetworkMultiSig`. Additionally, the request must contain the signatures from all members of the network as listed in the request structure. -1. The participant DID is obtained from `networkParticipants`. - - Example: `did::` -2. From the `BlockchainNetworkMultiSig` verification, which verification method for the participant will be used is determined. - - Example: `did::#key1` indicates that key1 will be used which is specified by the fragment at the end of the URI. -3. The DID Document of the participant is obtained by resolving the DID, and the required verification method is obtained. +The authentication process is carried out by validating signature from each member listed in `networkMembers` as follows: + +1. The member's organizational unit DID is obtained from `networkMembers`. + - Example: `did::` +2. The appropriate verification method for this member is looked up from the `BlockchainNetworkMultiSig` specification. + - Example: `did::#key1` indicates that key1 will be used which is specified by the fragment at the end of the URI. +3. The DID Document of the member is obtained by resolving the DID, and its verification method is looked up. - Example: ```json {​ -   "id": "did::",​ +   "id": "did::",​   ...​   "verificationMethod": [ { - "id": "did::#key1", + "id": "did::#key1", "type": "Bls12381G2Key2020", - "controller": "did::", + "controller": "did::", "publicKeyBase58": "25ETdUZDVnME6yYuAMjFRCnCPcDmYQcoZDcZuXAfeMhXPvjZg35QmZ7uctBcovA69YDM3Jf7s5BHo4u1y89nY6mHiji8yphZ4AMm4iNCRh35edSg76Dkasu3MY2VS9LnuaVQ", }] @@ -251,59 +250,66 @@ The authentication process is carried out by validating signature from each part }​ ``` -4. From `singatures` in Network DID creation request, the participant is validated with the help of the verificationMethod obtained in the previous step. +4. From the `signatures` field of the Security Domain DID creation request, the member's authenticity is verified using the `verificationMethod` obtained in the previous step. -Once each participant's signature is validated, the Network DID is registered in the IIN registry. +Once each member's signature is validated, the Security Domain DID is recorded in the IIN registry. -Since the IIN registry is a decentralized registry, the validation of a Network DID creation request is carried out by multiple peers so that consensus is reached, and the DID is committed in the registry. +Since the IIN registry is typically built on a decentralized ledger, the Security Domain DID creation request validation occurs through a consensus protocol among the IIN nodes before the DID record is committed in the registry. ## Network Discovery -The first step towards interoperation between two blockchain networks is discovery. Any network with a registered Network DID in an IIN can be discovered using the DID only. +The first step towards interoperation between two blockchain networks is discovery. Any network with a registered Security Domain DID in an IIN can be discovered using the DID only. + +Given the DID of a foreign network in the format `did::` (example `did:iinindy:tradelens`), the foreign network can be discovered by standard DID resolution. The IIN agent of a participant of a local network contacts the DID registry (example: `iinindy`) and resolves the DID to download the Security Domain DID document. -Given the DID of a foreign network in the format `did::` (example `did:iinindy:tradelens`), the foreign network can be discovered by standard DID resolution. The IIN agent of a participant of a local network contacts the DID registry (example: `iinindy`) and resolves the DID to download the Network DID document. +See the [network discovery protocol specifications](../discovery/discovery.md) for more details. -Find the network discovery protocol specifications [here](../discovery/readme.md). +## Security Domain Identity Validation -## Network Identity Validation +After a network has been discovered, and its Security Domain DID document has been fetched, the authenticity of that DID must be verified. See the [Security Domain Identity Validation protocol](./security-domain-identity-validation.md) for details of how the network's identity is validated. -After discovery of the network and fetching the Network DID document, the authenticity of it has to be verified by validating the identity of the network. This is carried out through the Network Identity Validation protocol described [here](./network-identity-validation.md). -## Data Plane Identity Configuration +## Security Domain Membership Fetching and Recording -After foreign network identities are validated, it has to be configured in the data plane for interoperation. A single participant unit cannot update identity information in the network's ledger. This needs agreement among all the participanting units. This agreement is ensured through collection of signatures through an application level flow as discussed in detail [here](./data-plane-identity-configuration.md). +After a foreign network's (or security domain's) identity is validated, its membership information must be configured in the network's ledger for interoperation protocols to work in the data plane. A single organizational unit (or network member) cannot unilaterally update this membership information; instead, members must agree on that information before it is deemed acceptable for recording on the ledger. See the [Membership Syncing protocol specifications](./membership-syncing.md) for details on how this is achieved by the IIN Agents representing the members self-orchestrating a flow to collect attestations. -## Updating Network DID with changing Network Structure -Permissioned blockchain networks might change with time with existing participants leaving and new participants joining the network. As a result, the Network DID also needs to be updated with the new list of participants forming the group controller. Updating the Network DID involves the following steps: +## Updating Security Domain DID upon a Change in Security Domain Identity or Structure +Permissioned blockchain networks might morph over time, with existing members leaving and new organizational units joining. The Security Domain DID must be updated whenever the members' list comprising the group controller changes. This is done through the following steps: -**Step 1. Creating updated Network DID Document** +**Step 1. Creating updated Security Domain DID Document** -While updating a Network DID for changing network structure, primarily two properties need to be updated: `BlockchainNetworkMultiSig` verification method, and `networkParticipants`. +The `BlockchainNetworkMultiSig` verification method, and `networkMembers` list must be updated to reflect the new network membership. +* `networkMembers` is updated with the list of DIDs of the new network members. +* A new update policy is associated with the `BlockchainNetworkMultiSig` verification method. -The `networkParticipants` is updated with the new list of DIDs of the network participants. +**Step 2. Security Domain DID updation request** -`BlockchainNetworkMultiSig` verification method is updated with the changed updation policy. +A Security Domain DID update request must be validated against the `updatePolicy` associated with the current DID document's `BlockchainNetworkMultiSig` verification method. -**Step 2. Network DID updation request** +Similar to the creation request, the update request has the following fields: +* `SecurityDomainDIDDocument`: updated security domain's DID Document with a `networkMembers` field and a `verificationMethod` of type `BlockchainNetworkMultiSig`. +* `signatures`: a set of signatures satisfying the `updatePolicy` in the `BlockchainNetworkMultiSig` verification method of the existing DID document. -Updating a Network DID requires the request to be authenticated against the `BlockchainNetworkMultiSig` verification method's `updatePolicy`. +The update request can be made by the IIN agent of any existing (i.e., before the change) member of the network. -Similar to the Network DID creation request, the updation request has a NetworkDIDDocument and signatures. NetworkDIDDocument contains the updated Network DID document and signatures is a set of signatures satisfying the `updatePolicy` in the `BlockchainNetworkMultiSig` verification method of the existing DID document, as well as the `networkParticipants`. +**Step 3. IIN validates a Security Domain DID updation request** -The updation request can be made by IIN agent of any participant of the network. +The IIN registry authenticates a Security Domain DID update request the same way it validates a creation request except for one change: the signature set must be validated against the existing `updatePolicy` rather than against tne entire list of `networkMembers. -**Step 3. IIN validates a Network DID updation request** -The IIN registry authenticates a Network DID updation request based on two conditions: -(1) The signatures must satisfy the `updatePolicy` in the `BlockchainNetworkMultiSig` verification method of the existing Network DID document. +## Syncing Security Domain Membership Changes +The security domain validation and membership syncing protocols must be re-run every time there is a change in a security domain's identity (DID document) or in its membership configuration. The flow diagram below illustrates the complete process from the time a change occurs in one network up to the point where its updated identity and membership info is reflected in another network's ledger as a prerequisite for data plane interoperation. Each step in this diagram represents a separate protocol: (1) is described in this document above, (2) is described in the [security domain identity validation specification](./security-domain-identity-validation.md), and (3) in the [membership syncing specification](./membership-syncing.md). -## Dataplane credentials update with changes in identity plane + -The identity exchange and validation has to be done whenever there is a change in the identity of any network. Thus, the identity exchange protocol steps explained in this document must be triggered within a network whenever the identities of the participant units of any network it wishes to interoperate with change. This is further explained [here](./identity-change-updates.md). +The trigger for Step 2 can be any of the following: +* Manual trigger applied by a network administrator +* Timeout after a poll interval: the network unit in `SECURITY DOMAIN 1` polls for updates to `SECURITY DOMAIN 2` +* Event notification: a network unit in `SECURITY DOMAIN 1` receives an event notifying it about a change in `SECURITY DOMAIN 2` diff --git a/rfcs/protocols/identity/membership-syncing.md b/rfcs/protocols/identity/membership-syncing.md new file mode 100644 index 000000000..5d57e0fc3 --- /dev/null +++ b/rfcs/protocols/identity/membership-syncing.md @@ -0,0 +1,35 @@ + +# Security Domain Membership Syncing + +- RFC: 02-018 +- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe +- Status: Proposed +- Since: 27-Aug-2022 + +## Overview + +Data plane interoperation requires the syncing and configuration of a foreign security domain's [membership information](../../formats/network/membership.md) as well as the relay endpoints for that security domain (or network). + +The Security Domain DID of a foreign security domain contains `relayEndpoints` and `DataplaneCredentials` verification methods, used to configure relay endpoints and certificates (part of membership info) respectively. + +## Sync Protocol + +Consider two security domains governing ledgers `Ledger A` and `Ledger B` respectively. The first has two IIN Agents `A1` and `A2` representing two organizational units that are members of its security domain. The second has agents `B1` and `B2`. The security domain governing `Ledger A` is trying to sync the latest identity and membership info of the security domain governing `Ledger B`. Without loss of generality, we can pick `A2` as the initiator of the cross-network identity plane protocol that results in `Ledger B`'s security domain membership and relay endpoints info getting recorded in `Ledger A`. The protocol is illustrated in the figure below. (_Note_: this represents the "happy path". We will add more diagrams subsequently illustrating failures and race conditions.) + + + +The first phase in the above diagram, involving [registration](./identity-syncing.md), [discovery](../discovery/discovery.md), and [validation](./security-domain-identity-validation.md) are covered in other specifications. In this draft, we only specify the bilateral protocol occurring between sets of IIN Agents representing two independent security domains' members. + +The communication among IIN Agents of the security domain governing `Ledger A` to collect attestations can occur in one of two ways: + * It can be orchestrated completely by the triggering agent (in this case `A2`), which sends requests and receives responses from every other local IIN Agent. + * Alternatively, it could be a flow, where the trigger agent is simply the first node to produce an attestation after which the request is passed to another agent. This proces concludes when enough attestations are collected. + +(We recommend the first approach in Weaver for simplicity of implementation.) + +The validation procedures marked in the figure above may include an agent confirming the presence and validity of its security domain's DID record in an IIN. But in case two networks are attempting to interoperate without relying on DID infrastructure (IINs and trust anchors), these checks can be skipped. Even if DID infrastructure is present and relied upon, these checks need not be done as part of the protocol; the result of a past check can be cached and retrieved as needed (assuming freshness of cached records is ascertained). + +Finally, a foreign security domain's membership info is recorded via the [interoperation module](../../models/infrastructure/interoperation-modules.md) deployed in the network (a chaincode in Fabric, a CorDapp in Corda, etc.). The logic in this module must validate and authenticate the various signatures in the transaction payload before committing to the ledger via the network's native consensus protocol. diff --git a/rfcs/protocols/identity/network-identity-validation.md b/rfcs/protocols/identity/network-identity-validation.md deleted file mode 100644 index e9e0f7a27..000000000 --- a/rfcs/protocols/identity/network-identity-validation.md +++ /dev/null @@ -1,105 +0,0 @@ - -# Network Identity Validation - -- RFC: 02-012-appendix-a -- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe -- Status: Proposed -- Since: 24-Sep-2021 - -## Summary -When a network ("local network" from here on) tries to configure the idetntity of another network ("foreign network" from here on) for interoperation, the broad steps involved are (i) Network Discovery (ii) Network Identity Validation. Both these steps are carried out by the IIN agent of the participants of the local network. - -Whether each participant needs to carry out the discovery and validation, or a subset of participants will do it depends entirely on the trust basis of the network. This is explained in [*Data Plane Identity Configuration*](./identity-syncing.md). - -Merely fetching the Network DID Document in the [discovery step](../discovery/readme.md) does not prove the identity of the network or the genuinity of the Network DID Document. -Resolving a Network DID from the IIN only ensures that the the DID controllers in `networkParticipants` property of the DID document attested the network DID. However, these attestor's physical identity are not known up front to the local network participants. This is because, DIDs are not implicitely tied to any physical identity. Therefore, to validate the authenticty of the network, a local network participant must use some trust basis. This specification provides three network identity validation protocol levels, from which one or more can be carried out depending on the availability of different trust basis, and the level of decentralization desired. - -The three network identity validation protocols, each using a different type trust basis are as follows: - -> Note: The common assumption across all the protocols is the IIN DID registry is not malicious. Given a DLT based IIN which allows anyone to monitor the ledger, any IIN agent can validate the authenticity of a Network DID by validating the Network DID creation/updation requests from the ledger. - -## A. Well Known Network DID - -A Network DID registered in an IIN DID registry (IIN ledger) is controlled by the group controller specified by the `networkParticipants` and `BlockchainNetworkMultiSig` verification method. Thus, provided that the IIN registry is not compromised, the Network DID document will remain under the control of its creators. Even if the network structure changes with members joining and leaving, the `updatePolicy` ensures that the stakeholders of the network remain in control of the Network DID. Therefore, given that the local network knows the Network DID of the foreign network it wants to interoperate with, there is no need for explicit validation of the Network DID document. - -### Protocol: - -Step 1. Local network participants obtain the foreign network's Network DID from some trusted source. The trusted source of the Network DID may be offline physical interaction directly with the foreign network, or some well known webpage for the network, or something else. - -Step 2. Through the [discovery protocol](../discovery/readme.md), the local network participant's IIN agent obtains the Network DID document. - -### Assumptions: - - - The source from which the Network DID URI is obtained is trusted. This source is the trust basis. - -### Possible Attacks: -- Since the IIN is open to accepting DID registrations from anyone, a Network DID can be created by with similar URIs by attackers. Therefore, through phishing attacks and compromising the DID URI sources such as websites, the original Network DID might be replaced with a malicious one. Without further validations, the local network starts interoperation with the attacker's network. - -### Limitations: - -- The source of the Network DID itself can be considered as a trust basis only for well known networks. Moreover, the security of the source such as a webpage is also a factor in the security of this protocol. For smaller networks whose webpage or some other well known source of obtaining the Network DID is not available, relying to this level of validation only is enough. - - - - -## B. Network Identity VC - -The Network DID document is implicitely not tied to any physical identity. Thus after discovery, the obtained Network DID document has to be validated based on some trust basis. For this validation the local network participants may rely on some [trust anchors](../../models/identity/iin.md). These trust anchors attest the physical identity of a Network DID by issuing VC. For example, for the DID `did:iin_indy:tradelensnetwork`, a trust anchor would attest that the DID is the Network DID for the network named "TradeLens", and optionally provide additional information like the name and address of the organizations involving the network. - -### Protocol: - -Step 1. Trust anchor issues a verifiable credential to the Network DID. This VC attests the identity of the network as a whole, called `Network Identity VC`. - -Step 2. From the Network DID document, local network participant obtains the service endpoint for requesting VCs ([DIDcomm](https://w3c.github.io/did-spec-registries/#didcommmessaging)). - -Step 3. Local netowrk participant requests `Network Identity VC` - -Step 4. The verifiable presentation obtained in response from the network service endoint is validated. - -### Assumptions: - -Atleast one trust anchor exists that issues the `Network Identity VC` to the foreign network DID, which is also trusted by the local network participants. - -The trust anchor is not malicious. - -### Possible Attacks: - -If the DID URI is incorrect as well as the trust anchor (s) used to validate `Network Identity VC` are malicous then the local network might configure a malicious network instead of the network it intended to interoperate with. - -### Limitations: - -For issuing a VC for a DID, as well as requisting VPs for a credential, service endpoints are required. Since the Network DID represents a blockchain network with a group controller of its participants, having a single service endpoint can lead to centralization in control of the credentials. - -In order to attest identity of a network, the trust anchor must validate the structure of the network as well as the identity of each of its participants. As a result, the availability of such trust anchors might be limited since such validation will often require physical verification of the agreements between the participants forming the network. - -## C. Participant Identity VC - -Without relying on the DID URI, in the unavailability of any trust basis attesting the identity of a foreign network directly, the identity of the individual network participants can be used to validate the Network DID. - -A Network DID must have attestations from all participants during creation, and each update must satisfy the update policy (see Network DID creation protocol). Therefore, a Network DID implies the agreement on network formation by the participants, and validating the participant identities is enough to validate the identity of the network as a whole. - -### Protocol: - -- Trust anchors issue `Identity VC` to the individual network participants. - -- For each foreign network participant specified in `networkParticipants` of the Network DID, validate its identity thorugh `Identity VC` issued to them by trust anchor through the following steps: - - - Resolve the participant DID document from the DID. - - Get address of the participant's IIN agent from service endpoints in the DID document. ([DIDcomm](https://w3c.github.io/did-spec-registries/#didcommmessaging) service endpoint) - - [Optional] negotiate a trust anchor. - - Request `Identity VC`. - - Validate `Identity VC` - - -### Limitations: - -The protocol can only complete successfully if there are trust anchors available to validate the identity of the foreign network participants. Even after that, this protocol only ensures the validation of network formation by these participants. Therefore, an attack is possible by the subset of network participants of a larger network. - - -### Possible Attacks: - -Consider a hypothetical foreign network named "Supernet", with `N` participants. The Network DID of Supernet is `did:iin_indy:supernet`. A subset of `f < N` participants of Supernet are maliscious, and they create a Network DID with URI almost similar to "Supernet": `did:iin_indy:supernetwork`. Then, if the local network wanting to interoperate with Supernet somehow gets the wrong Network DID (for example through phishing), then the discovered Network DID document would be of the maliscious network. Here, validation through the identity validaiton of the particpants will also succeed. If none of `N-f` the non-maliscious participants of Supernet are known to the local network validators then the attack would be successful. diff --git a/rfcs/protocols/identity/security-domain-identity-validation.md b/rfcs/protocols/identity/security-domain-identity-validation.md new file mode 100644 index 000000000..fa3ceae50 --- /dev/null +++ b/rfcs/protocols/identity/security-domain-identity-validation.md @@ -0,0 +1,99 @@ + +# Security Domain Identity Validation + +- RFC: 02-017 +- Authors: Venkatraman Ramakrishna, Krishnasuri Narayanam, Bishakh Chandra Ghosh, Ermyas Abebe +- Status: Proposed +- Since: 27-Aug-2022 + +## Summary +When a security domain ("local security domain" from here on) tries to sync the identity and membership of another security domain ("foreign security domain" from here on) for interoperation, its members' IIN Agents must carry out the following steps: (i) Security Domain Discovery (ii) Security Domain Identity Validation. + +Merely fetching the Security Domain DID Document in the [discovery step](../discovery/discovery.md) does not prove that the associated security domain is a genuine collective of organizational units. +Resolving a Security Domain DID maintained in an IIN registry only ensures that the entities specified as the group DID controllers in the `networkMembers` property of the DID document have attested it. However, these attestors' real worls identities are not known a priori to the local security domain's members. This is because DIDs are not (implicitly or explicitly) tied to any real world identity. Therefore, to validate the authenticity of the foreign security domain, a local security domain's member must rely on some trust basis. This specification provides three alternative security domain identity validation protocols. Which one is selected by a given security domain in a given scenario depends on pre-existing trust relationships between the networks as well as the desired level of decentralization. + +The three security domain identity validation protocols, each built on a different kind of trust basis, are as follows: + +> Note: The common assumption in all these protocols is that the IIN DID registry is not malicious. Given a DLT-based IIN which allows anyone to monitor the ledger, any IIN agent can validate the authenticity of a Security Domain DID by auditing DID create/updtate transactions recorded on the ledger. + +## A. Well Known Security Domain DID + +A Security Domain DID registered in an IIN DID registry (IIN ledger) is maintained by a group controller, with the members of the groups and their authentication methods specified in the `networkMembers` and `BlockchainNetworkMultiSig` verification method attributes respectively. Thus, provided that the IIN registry is not compromised, the Security Domain DID document will remain under the control of its creators. Even if the network structure of the domain changes with members joining and leaving, the `updatePolicy` ensures that the network's members remain in control of the Security Domain DID. To interoperate with another security domain, all that domain needs to have is a reference to this Security Domain DID with embedded validation logic. No other external validation need be done on that DID document. + +### Protocol: + +Step 1. Local security domain members obtain the foreign security domain's DID from a well-known or trusted source (e.g., a secure website or web service or database maintained by a public authority). + +Step 2. Through the [discovery protocol](../discovery/doscovery.md), any of the local security domain's members' IIN agents obtains the Security Domain DID document. + +### Assumptions: + +- The source from which the Security Domain DID URI is obtained is well-known or trusted. Therefore, that source, or its reputation, is the trust basis. + +### Possible Attacks: +- Since the IIN is open to accepting DID registrations from anyone, a genuine-looking Security Domain DID (i.e., a URI) can be created by attackers (masquerading as genuine network members). Therefore, using phishing attacks and compromising DID URI sources (like websites), the discovery process might lead to a fake Security Domain DID. In the absence of other validation of this DID, the local security domain will start to interoperate with the attacker's network. + +### Limitations: + +- For well-known networks, the reputation of the DID source itself is a sufficient trust basis. The discovery process should take the possibility of the source being attacked/compromised into account using standard network security mechanisms. +- For smaller or lesser-known networks, the IDD source may or may not require additional validation. We do not mandate this; it is left to the interoperating network to decide. As with a more well-known DID source, attack/compromise should be take into account. + +## B. Security Domain Identity Verifiable Credential (VC) + +The Security Domain DID document is not explicitly tied to any real world identity (nor implicitly in many DID registries, though Hyperledger Indy enables such an association when desired by the DID owners). Thus, after discovery, the obtained Security Domain DID document has to be validated using some trust basis. For this validation, the local security domain's members may rely on [trust anchors](../../models/identity/iin.md). These trust anchors attest the association of a Security Domain DID with a real world identity by issuing a VC to that DID. For example, for the DID `did:iin_indy:tradelensnetwork`, a trust anchor would attest to it belonging to the network named "TradeLens", and optionally provide additional information about the [TradeLens network](https://www.tradelens.com), like the names and addresses of the organizations that are its members. + +### Protocol: + +Step 1. Trust anchor issues a verifiable credential to the Security Domain DID. This VC attests the identity of the security domain as a whole, called `Security Domain Identity VC`. + +Step 2. After a local security domain's member has discovered and fetched a foreign security domain's DID, it looks up a service endpoint from that DID document from which VCs can be requested (see the [DIDcomm](https://w3c.github.io/did-spec-registries/#didcommmessaging) mechanism for details). + +Step 3. Local security domain member requests `Security Domain Identity VC` + +Step 4. The verifiable presentation (VP) obtained in response from the security domain's network's service endoint is validated. This concludes the attestation and validation of a security domain (i.e., group of members). + +### Assumptions: + +At least one trust anchor exists that both: +1. Issues a `Security Domain Identity VC` to a foreign security domain's DID, and +2. Is trusted by the local security domain's members. + +The trust anchor does not behave maliciously. + +### Possible Attacks: + +If the DID URI is incorrect (or fake) AND the trust anchor(s) used to request a `Security Domain Identity VC` from are malicouis, the local security domain will end up syncing the membership of a different (possibly fake) network instead of the network it intended to interoperate with. + +### Limitations: + +Every DID owner needs service endpoints to issue a VC against its DID and to serve VP requests for a given credential. Since the Security Domain DID represents a blockchain/DLT network with a group controller collectively maintained by its members, having a single service endpoint can lead to centralized control of credentials. + +To attest the identity of a security domain, the trust anchor must do its due diligence by validating the structure of the domain's network as well as the identity of each of its members. Because this may involve physical and document verification (of the existence of a network's members and their agreement), few trust anchors of this kind may exist in the real world and the ones that exist may serve a limited clientele or offer limited availabiity. + +## C. Security Domain Member Identity VC + +A more decentralized way of attestation and validation of a security domain's DID and membership is possible by leveraging the identities of the domain's members. Here we do not rely on the knowledge of a DID URI nor a trust anchor who can issue a VC to a security domain as a whole. + +For this method to work, a Security Domain DID must contain attestations from all the members of the domain during its creation, and every subsequent update must satisfy the update policy (see [Security Domain DID creation protocol](./identity-syncing.md#security-domain-identity-creation-as-security-domain-did)). Therefore, the existence of a Security Domain DID is proof that a network was formed through mutual agreement among its members; validating the members' identities is enough to validate the identity of the network (security domain) as a whole. + +### Protocol: + +- Trust anchors issue `Identity VC`s to the individual security domain members. +- A member of a local security domain validates the identity of each member of a foreign security domain specified in the `networkMembers` property of the latter's Security Domain DID, represented by an `Identity VC`. Thhe validation comprises of the following steps: + * Resolve the foreign security domain's member's DID document from its DID URI. + * Get address of the member's IIN agent by looking up the agent's service endpoint from the DID document. (See [DIDcomm](https://w3c.github.io/did-spec-registries/#didcommmessaging) mechanism for details.) + * [Optional] determine a common trust anchor using some form of negotiation (this is beyond the scope of this spec). + * Request member's `Identity VC`. + * Validate member's `Identity VC` using standard mechanisms listed in the W3C DID recommendation. + +### Limitations: + +The protocol can only complete successfully if there are trust anchors available to validate the identity of the foreign security domain's members. Even after that, this protocol only confirms the validity of network formation by these members. A subset of members of a larger network may successfully mount an attack by masquerading as the sole members' list of that network. + +### Possible Attacks: + +Consider a hypothetical foreign security domain named "Supernet", with `N` members. The Security Domain DID of Supernet is `did:iin_indy:supernet`. A subset of members (of size `f < N`) of Supernet are malicious, and they create a fake Security Domain DID with URI almost similar to "Supernet": `did:iin_indy:supernetwork`. Then, if the local security domain that wishes to interoperate with Supernet somehow gets the fake Security Domain DID (e.g. using a phishing attack), then the discovered Security Domain DID document would belong to the fake network formed by the `f` malicious members. Individually, each member's Identity will be successfully validated (using their Identity VCs), so that procedure does not detect or prevent this attack. If none of `N-f` non-malicious members of Supernet are known to the local security domain's members, such an attack is likely to succeed. diff --git a/rfcs/resources/images/identity-sync.png b/rfcs/resources/images/identity-sync.png new file mode 100755 index 000000000..a0a8e8380 Binary files /dev/null and b/rfcs/resources/images/identity-sync.png differ diff --git a/rfcs/resources/images/iin-agent-interface.png b/rfcs/resources/images/iin-agent-interface.png new file mode 100755 index 000000000..d0d270e6f Binary files /dev/null and b/rfcs/resources/images/iin-agent-interface.png differ diff --git a/rfcs/resources/images/iin-agent-model-dlt-destination.png b/rfcs/resources/images/iin-agent-model-dlt-destination.png new file mode 100755 index 000000000..73e0c5449 Binary files /dev/null and b/rfcs/resources/images/iin-agent-model-dlt-destination.png differ diff --git a/rfcs/resources/images/iin-agent-model-dlt-source.png b/rfcs/resources/images/iin-agent-model-dlt-source.png new file mode 100755 index 000000000..acebe6033 Binary files /dev/null and b/rfcs/resources/images/iin-agent-model-dlt-source.png differ diff --git a/rfcs/resources/images/iin-augmented-network.jpg b/rfcs/resources/images/iin-augmented-network.jpg index 51c166353..8a1e9144d 100755 Binary files a/rfcs/resources/images/iin-augmented-network.jpg and b/rfcs/resources/images/iin-augmented-network.jpg differ diff --git a/rfcs/resources/images/interop-module.png b/rfcs/resources/images/interop-module.png index dcd73fbd0..15b77460b 100755 Binary files a/rfcs/resources/images/interop-module.png and b/rfcs/resources/images/interop-module.png differ diff --git a/rfcs/resources/images/network_did_creation.jpg b/rfcs/resources/images/network_did_creation.jpg index e460f7171..66f07e97a 100644 Binary files a/rfcs/resources/images/network_did_creation.jpg and b/rfcs/resources/images/network_did_creation.jpg differ diff --git a/rfcs/resources/images/participant_identity_configuration.jpg b/rfcs/resources/images/participant_identity_configuration.jpg index 375ce6cfd..0b1d90925 100644 Binary files a/rfcs/resources/images/participant_identity_configuration.jpg and b/rfcs/resources/images/participant_identity_configuration.jpg differ diff --git a/rfcs/resources/images/protocol-identity-overview.jpg b/rfcs/resources/images/protocol-identity-overview.jpg index 24c6f878a..e886fce03 100755 Binary files a/rfcs/resources/images/protocol-identity-overview.jpg and b/rfcs/resources/images/protocol-identity-overview.jpg differ diff --git a/rfcs/resources/images/security-domain.png b/rfcs/resources/images/security-domain.png index b5025c84e..0187941c1 100755 Binary files a/rfcs/resources/images/security-domain.png and b/rfcs/resources/images/security-domain.png differ diff --git a/samples/besu/besu-cli/config.template.json b/samples/besu/besu-cli/config.template.json index b4fe1ad1d..47e96ae87 100644 --- a/samples/besu/besu-cli/config.template.json +++ b/samples/besu/besu-cli/config.template.json @@ -3,7 +3,7 @@ "networkHost": "localhost", "networkPort": 8545, "tokenContract": "../simpleasset/build/contracts/AliceERC20.json", - "interopContract": "../simpleasset/build/contracts/InteroperationBaseClassERC20.json", + "interopContract": "../simpleasset/build/contracts/AssetExchangeContract.json", "senderAccountIndex": 1, "recipientAccountIndex": 2 }, @@ -11,7 +11,7 @@ "networkHost": "localhost", "networkPort": 9544, "tokenContract": "../simpleasset/build/contracts/BobERC20.json", - "interopContract": "../simpleasset/build/contracts/InteroperationBaseClassERC20.json", + "interopContract": "../simpleasset/build/contracts/AssetExchangeContract.json", "senderAccountIndex": 2, "recipientAccountIndex": 1 } diff --git a/samples/besu/besu-cli/src/commands/asset/claim.ts b/samples/besu/besu-cli/src/commands/asset/claim.ts index 0179f83de..8b3bf8c98 100644 --- a/samples/besu/besu-cli/src/commands/asset/claim.ts +++ b/samples/besu/besu-cli/src/commands/asset/claim.ts @@ -1,7 +1,19 @@ import { GluegunCommand } from 'gluegun' import { getNetworkConfig, commandHelp } from '../../helper/helper' import { getContractInstance } from '../../helper/besu-functions' -const Web3 = require ("web3") +const Web3 = require("web3") + +async function getBalances(tokenContract, address, token_id = 0) { + try { + var balance = await tokenContract.balanceOf(address, token_id) + } catch { + var balance = null; + } + if (!balance) + return await tokenContract.balanceOf(address) + else + return balance; +} const command: GluegunCommand = { name: 'claim', @@ -40,47 +52,47 @@ const command: GluegunCommand = { 'The preimage of hash with which the asset was locked with.' }, { - name: '--recipient_account_address', - description: - 'The address of the recipient account. We can set this parameter if we want to use account address instead of account index ' - }, - { - name: '--network_host', - description: - 'The network host. Default value is taken from config.json' - }, - { - name: '--network_port', - description: - 'The network port. Default value is taken from config.json' - } + name: '--recipient_account_address', + description: + 'The address of the recipient account. We can set this parameter if we want to use account address instead of account index ' + }, + { + name: '--network_host', + description: + 'The network host. Default value is taken from config.json' + }, + { + name: '--network_port', + description: + 'The network port. Default value is taken from config.json' + } ], command, ['asset', 'claim'] ) return } - print.info('Claim assets (fungible assets for now)') + print.info('Claim assets') // Retrieving networkConfig - if(!options.network){ + if (!options.network) { print.error('Network ID not provided.') return } const networkConfig = getNetworkConfig(options.network) - var networkPort = networkConfig.networkPort - if (options.network_port){ - networkPort = options.network_port - console.log('Use network port : ', networkPort) - } - var networkHost = networkConfig.networkHost - if(options.network_host){ - networkHost = options.network_host - console.log('Use network host : ', networkHost) - } + var networkPort = networkConfig.networkPort + if (options.network_port) { + networkPort = options.network_port + console.log('Use network port : ', networkPort) + } + var networkHost = networkConfig.networkHost + if (options.network_host) { + networkHost = options.network_host + console.log('Use network host : ', networkHost) + } - const provider = new Web3.providers.HttpProvider('http://'+networkHost+':'+networkPort) + const provider = new Web3.providers.HttpProvider('http://' + networkHost + ':' + networkPort) const web3N = new Web3(provider) @@ -94,22 +106,22 @@ const command: GluegunCommand = { // Receiving the input parameters var recipient - if(options.recipient_account){ + if (options.recipient_account) { recipient = accounts[options.recipient_account] } - else if(options.recipient_account_address){ - recipient = '0x'+ options.recipient_account_address + else if (options.recipient_account_address) { + recipient = '0x' + options.recipient_account_address } - else{ + else { print.info('Recipient account index not provided. Taking from networkConfig..') recipient = accounts[networkConfig.recipientAccountIndex] } - if(!options.lock_contract_id){ + if (!options.lock_contract_id) { print.error('Lock contract ID not provided.') return } const lockContractId = '0x' + options.lock_contract_id - if(!options.preimage){ + if (!options.preimage) { print.error('Preimage not provided.') return } @@ -124,17 +136,17 @@ const command: GluegunCommand = { console.log('Preimage bytes32:', preimage_bytes32) // Balance of the recipient before claiming - var recipientBalance = await tokenContract.balanceOf(recipient) + var recipientBalance = await getBalances(tokenContract, recipient) console.log(`Account balance of the recipient in Network ${options.network} before claiming: ${recipientBalance.toString()}`) - await interopContract.claimFungibleAsset(lockContractId, options.preimage, { + await interopContract.claimAsset(lockContractId, preimage_bytes32, { from: recipient, }).catch((error) => { - console.log("claimFungibleAsset threw an error:", error); + console.log("claimAsset threw an error:", error); }) // Balance of the recipient after claiming - var recipientBalance = await tokenContract.balanceOf(recipient) + var recipientBalance = await getBalances(tokenContract, recipient) console.log(`Account balance of the recipient in Network ${options.network} after claiming: ${recipientBalance.toString()}`) } } diff --git a/samples/besu/besu-cli/src/commands/asset/exchange.ts b/samples/besu/besu-cli/src/commands/asset/exchange.ts index 2962abae0..925d8bdb5 100644 --- a/samples/besu/besu-cli/src/commands/asset/exchange.ts +++ b/samples/besu/besu-cli/src/commands/asset/exchange.ts @@ -141,7 +141,7 @@ const command: GluegunCommand = { return }) - const lockTx1 = await interopContract1.lockFungibleAsset( + const lockTx1 = await interopContract1.lockAsset( recipient1, tokenContract1.address, amount, @@ -151,7 +151,7 @@ const command: GluegunCommand = { from: sender1 } ).catch(function () { - console.log("lockFungibleAsset threw an error in Network 1"); + console.log("lockAsset threw an error in Network 1"); return }) const lockContractId1 = lockTx1.logs[0].args.lockContractId @@ -169,15 +169,15 @@ const command: GluegunCommand = { // Locking the asset (works only for ERC20 at this point) await tokenContract2.approve(interopContract2.address, amount, {from: sender2}).catch(async function () { console.log("Token2 approval failed!!!"); - await interopContract1.unlockFungibleAsset(lockContractId1, { + await interopContract1.unlockAsset(lockContractId1, { from: sender1 }).catch(function () { - console.log("unlockFungibleAsset threw an error in Network 1"); + console.log("unlockAsset threw an error in Network 1"); }) return }) - const lockTx2 = await interopContract2.lockFungibleAsset( + const lockTx2 = await interopContract2.lockAsset( recipient2, tokenContract2.address, amount, @@ -187,11 +187,11 @@ const command: GluegunCommand = { from: sender2 } ).catch(async function () { - console.log("lockFungibleAsset threw an error in Network 2"); - await interopContract1.unlockFungibleAsset(lockContractId1, { + console.log("lockAsset threw an error in Network 2"); + await interopContract1.unlockAsset(lockContractId1, { from: sender1 }).catch(function () { - console.log("unlockFungibleAsset threw an error in Network 1"); + console.log("unlockAsset threw an error in Network 1"); }) return }) @@ -203,17 +203,17 @@ const command: GluegunCommand = { await getBalances(tokenContract2, sender2, recipient2) // ------------ Withdrawal in Network 1 ------------- - await interopContract1.claimFungibleAsset(lockContractId1, preimage, {from: recipient1}).catch(async function () { - console.log("claimFungibleAsset threw an error in Network 1"); - await interopContract1.unlockFungibleAsset(lockContractId1, { + await interopContract1.claimAsset(lockContractId1, preimage, {from: recipient1}).catch(async function () { + console.log("claimAsset threw an error in Network 1"); + await interopContract1.unlockAsset(lockContractId1, { from: sender1 }).catch(function () { - console.log("unlockFungibleAsset threw an error in Network 1"); + console.log("unlockAsset threw an error in Network 1"); }) - await interopContract2.unlockFungibleAsset(lockContractId2, { + await interopContract2.unlockAsset(lockContractId2, { from: sender2 }).catch(function () { - console.log("unlockFungibleAsset threw an error in Network 2"); + console.log("unlockAsset threw an error in Network 2"); }) return }) @@ -221,8 +221,8 @@ const command: GluegunCommand = { await getBalances(tokenContract1, sender1, recipient1) // ------------ Withdrawal in Network 2 ------------- - await interopContract2.claimFungibleAsset(lockContractId2, preimage, {from: recipient2}).catch(function () { - console.log("claimFungibleAsset threw an error in Network 2"); + await interopContract2.claimAsset(lockContractId2, preimage, {from: recipient2}).catch(function () { + console.log("claimAsset threw an error in Network 2"); return }) console.log(`Account balances after withdrawal in Network 2`) diff --git a/samples/besu/besu-cli/src/commands/asset/get-balance.ts b/samples/besu/besu-cli/src/commands/asset/get-balance.ts index 3d04c2a26..48724f9eb 100644 --- a/samples/besu/besu-cli/src/commands/asset/get-balance.ts +++ b/samples/besu/besu-cli/src/commands/asset/get-balance.ts @@ -68,6 +68,7 @@ const command: GluegunCommand = { const web3N = new Web3(provider) const accounts = await web3N.eth.getAccounts() + console.log(networkConfig.tokenContract) const tokenContract = await getContractInstance(provider, networkConfig.tokenContract).catch(function () { console.log("Failed getting tokenContract!"); }) diff --git a/samples/besu/besu-cli/src/commands/asset/is-locked.ts b/samples/besu/besu-cli/src/commands/asset/is-locked.ts index 1aafea010..d1a103d55 100644 --- a/samples/besu/besu-cli/src/commands/asset/is-locked.ts +++ b/samples/besu/besu-cli/src/commands/asset/is-locked.ts @@ -74,10 +74,10 @@ const command: GluegunCommand = { const accounts = await web3N.eth.getAccounts() var sender = accounts[networkConfig.senderAccountIndex] - var isLocked = await interopContract.isFungibleAssetLocked(lockContractId, { + var isLocked = await interopContract.isAssetLocked(lockContractId, { from: sender }).catch(function () { - console.log("isFungibleAssetLocked threw an error"); + console.log("isAssetLocked threw an error"); }) console.log(`Is there an asset locked in ${lockContractId} in Network ${options.network}: ${isLocked}`) //Todo: Debug. isLocked is not printing correctly. } diff --git a/samples/besu/besu-cli/src/commands/asset/issue.ts b/samples/besu/besu-cli/src/commands/asset/issue.ts index 292565732..48f1044a4 100644 --- a/samples/besu/besu-cli/src/commands/asset/issue.ts +++ b/samples/besu/besu-cli/src/commands/asset/issue.ts @@ -1,14 +1,14 @@ import { GluegunCommand } from 'gluegun' import { getNetworkConfig, commandHelp } from '../../helper/helper' import { getContractInstance } from '../../helper/besu-functions' -const Web3 = require ("web3") +const Web3 = require("web3") const command: GluegunCommand = { name: 'issue', description: 'Issuance of tokens', run: async toolbox => { const { - print, + print, parameters: { options } } = toolbox if (options.help || options.h) { @@ -16,7 +16,7 @@ const command: GluegunCommand = { print, toolbox, `besu-cli asset issue --network=network1 --account=1 --amount=10`, - 'besu-cli asset issue --network= --account= --account_address= --contract_owner_address= --amount= --network_port= --network_host= ' , + 'besu-cli asset issue --network= --account= --account_address= --contract_owner_address= --amount= --network_port= --network_host= ', [ { name: '--network', @@ -32,7 +32,7 @@ const command: GluegunCommand = { name: '--account_address', description: 'The address of the account. We can set this parameter if we want to use account address instead of account index ' - }, { + }, { name: '--contract_owner_address', description: 'The address of the contract owner. The default value is accounts[0] ' @@ -51,7 +51,23 @@ const command: GluegunCommand = { name: '--network_port', description: 'The network port. Default value is taken from config.json' + }, + { + name: '--asset_type', + description: + 'Asset type for issuing tokens. Default value is ERC20, other options are ERC721, ERC1155' + }, + { + name: '--token_id', + description: + 'token ID for issuing tokens. Only applicable for ERC721, ERC1155' + }, + { + name: '--token_data', + description: + 'token data for issuing tokens. Only applicable for ERC1155' } + ], command, ['asset', 'issue'] @@ -59,26 +75,26 @@ const command: GluegunCommand = { return } print.info('Issuance of tokens') - if(!options.network){ + if (!options.network) { print.error('Network ID not provided.') return } const networkConfig = getNetworkConfig(options.network) console.log('networkConfig', networkConfig) - var networkPort = networkConfig.networkPort - if(options.network_port){ - networkPort = options.network_port - console.log('Use network port : ', networkPort) - } - var networkHost = networkConfig.networkHost - if(options.network_host){ - networkHost = options.network_host - console.log('Use network host : ', networkHost) - } + var networkPort = networkConfig.networkPort + if (options.network_port) { + networkPort = options.network_port + console.log('Use network port : ', networkPort) + } + var networkHost = networkConfig.networkHost + if (options.network_host) { + networkHost = options.network_host + console.log('Use network host : ', networkHost) + } - const provider = new Web3.providers.HttpProvider('http://'+networkHost+':'+networkPort) + const provider = new Web3.providers.HttpProvider('http://' + networkHost + ':' + networkPort) const web3N = new Web3(provider) const tokenContract = await getContractInstance(provider, networkConfig.tokenContract).catch(function () { console.log("Failed getting tokenContract!"); @@ -87,33 +103,58 @@ const command: GluegunCommand = { var contractOwner = accounts[0] - if(options.contract_owner_address){ - contractOwner = '0x'+ options.contract_owner_address - } + if (options.contract_owner_address) { + contractOwner = '0x' + options.contract_owner_address + } var account - if(options.account){ + if (options.account) { account = accounts[options.account] } - else if(options.account_address){ - account = '0x'+ options.account_address - }else{ + else if (options.account_address) { + account = '0x' + options.account_address + } else { account = accounts[networkConfig.senderAccountIndex] } - if(!options.amount){ + if (!options.amount) { print.error('Amount not provided') return } - console.log(`Contract owner address is ${contractOwner} `) - console.log(`Receiver address is ${account} `) - // Transfer from the contract owner to the account specified - await tokenContract.transfer(account, options.amount, {from: contractOwner}).catch(function () { - console.log("tokenContract transfer threw an error; Probably the token supply is used up!"); - }) + if(!options.asset_type) { + options.asset_type = "ERC20" + } - var balance = await tokenContract.balanceOf(account) + if(!options.token_id) { + options.token_id = 0 + } + + if(!options.token_data) { + options.token_data = 0 + } + + console.log(`Contract owner address is ${contractOwner} `) + console.log(`Receiver address is ${account} `) + console.log(`Token contract is ${tokenContract.address} `) + // Transfer from the contract owner to the account specified + if (options.asset_type == 'ERC20') { + await tokenContract.transfer(account, options.amount, { from: contractOwner }).catch(function () { + console.log("tokenContract transfer threw an error; Probably the token supply is used up!"); + }) + } else if (options.asset_type == 'ERC721') { + await tokenContract.mint(account, { from: contractOwner }).catch(function () { + console.log("tokenContract transfer threw an error; Probably the token supply is used up!"); + }) + } else if (options.asset_type == 'ERC1155'){ + await tokenContract.mint(account, options.token_id, options.amount, Web3.utils.utf8ToHex(options.token_data), { from: contractOwner }).catch(function () { + console.log("tokenContract transfer threw an error; Probably the token supply is used up!"); + }) + } + if(options.asset_type == 'ERC1155'){ + var balance = await tokenContract.balanceOf(account, options.token_id)} + else + var balance = await tokenContract.balanceOf(account); console.log(`Account balance of ${account} in Network ${options.network}: ${balance.toString()}`) } } diff --git a/samples/besu/besu-cli/src/commands/asset/lock.ts b/samples/besu/besu-cli/src/commands/asset/lock.ts index 85d93688a..cda26c833 100644 --- a/samples/besu/besu-cli/src/commands/asset/lock.ts +++ b/samples/besu/besu-cli/src/commands/asset/lock.ts @@ -1,12 +1,18 @@ import { GluegunCommand } from 'gluegun' import { getNetworkConfig, commandHelp } from '../../helper/helper' import { getContractInstance } from '../../helper/besu-functions' -const Web3 = require ("web3") +const Web3 = require("web3") const crypto = require('crypto') +async function getBalances(tokenContract, address, token_id=0, asset_type="ERC20"){ + if (asset_type=="ERC1155") + return tokenContract.balanceOf(address, token_id) + return tokenContract.balanceOf(address) +} + const command: GluegunCommand = { name: 'lock', - description: 'Lock assets (fungible assets for now)', + description: 'Lock assets', run: async toolbox => { const { @@ -69,6 +75,21 @@ const command: GluegunCommand = { name: '--network_port', description: 'The network port. Default value is taken from config.json' + }, + { + name: '--token_id', + description: + 'Specify the token id for which the asset is to be locked. This is an optional parameter only for ERC721 & ERC1155.' + }, + { + name: '--data', + description: + 'Specify the data for ERC1155 token. This is an optional parameter only for ERC1155.' + }, + { + name: '--asset_type', + description: + 'Specify the asset type. This is an optional parameter only for ERC721 & ERC1155.' } ], command, @@ -76,27 +97,31 @@ const command: GluegunCommand = { ) return } - print.info('Lock assets (fungible assets for now)') + print.info('Lock assets') // Retrieving networkConfig - if(!options.network){ + if (!options.network) { print.error('Network ID not provided.') return } const networkConfig = getNetworkConfig(options.network) - var networkPort = networkConfig.networkPort - if(options.network_port){ - networkPort = options.network_port - console.log('Use network port : ', networkPort) - } - var networkHost = networkConfig.networkHost - if(options.network_host){ - networkHost = options.network_host - console.log('Use network host : ', networkHost) - } + var networkPort = networkConfig.networkPort + if (options.network_port) { + networkPort = options.network_port + console.log('Use network port : ', networkPort) + } + var networkHost = networkConfig.networkHost + if (options.network_host) { + networkHost = options.network_host + console.log('Use network host : ', networkHost) + } + + if (!options.asset_type) { + options.asset_type = "ERC20"; + } - const provider = new Web3.providers.HttpProvider('http://'+networkHost+':'+networkPort) + const provider = new Web3.providers.HttpProvider('http://' + networkHost + ':' + networkPort) const web3N = new Web3(provider) const interopContract = await getContractInstance(provider, networkConfig.interopContract).catch(function () { console.log("Failed getting interopContract!"); @@ -107,47 +132,53 @@ const command: GluegunCommand = { const accounts = await web3N.eth.getAccounts() // Receving the input parameters - if(!options.amount){ + if (!options.amount) { print.error('Amount not provided.') return } const amount = options.amount var sender - if(options.sender_account){ + if (options.sender_account) { sender = accounts[options.sender_account] } - else if(options.sender_account_address){ - sender = '0x'+ options.sender_account_address + else if (options.sender_account_address) { + sender = '0x' + options.sender_account_address } - else{ + else { print.info('Sender account index not provided. Taking from networkConfig..') sender = accounts[networkConfig.senderAccountIndex] } var recipient - if(options.recipient_account){ + if (options.recipient_account) { recipient = accounts[options.recipient_account] } - else if(options.recipient_account_address){ - recipient = '0x'+ options.recipient_account_address + else if (options.recipient_account_address) { + recipient = '0x' + options.recipient_account_address } - else{ + else { print.info('Recipient account index not provided. Taking from networkConfig..') recipient = accounts[networkConfig.recipientAccountIndex] } - if(!options.timeout){ + if (!options.timeout) { print.error('Timeout not provided.') return } + if (!options.token_id) { + options.token_id = 0 + } + if (!options.data) { + options.data = "" + } const timeLock = Math.floor(Date.now() / 1000) + options.timeout // The hash input has to be dealt with care. The smart contracts take in bytes as input. But the cli takes in strings as input. So to handle that, we take in the hash in its base64 version as input and then obtain the byte array from this. If a hash is not provided, we generate a base 64 encoding and then generate its corresponding byte array from it. This byte array will be input to generate the hash. var hash var preimage var hash_base64 var preimage_bytes - if(options.hash_base64){ + if (options.hash_base64) { hash_base64 = options.hash_base64 } - else{ + else { // Generate a hash pair if not provided as an input parameter preimage = crypto.randomBytes(22).toString('base64') hash_base64 = crypto.createHash('sha256').update(preimage).digest('base64') @@ -155,7 +186,7 @@ const command: GluegunCommand = { console.log('Length of preimage byte array', preimage_bytes.length) } hash = Buffer.from(hash_base64, 'base64') - + console.log('Parameters:') console.log('networkConfig', networkConfig) console.log('Sender', sender) @@ -164,38 +195,53 @@ const command: GluegunCommand = { console.log('Timeout', timeLock) console.log('Hash (base64): ', hash_base64) console.log('Preimage: ', preimage) - + // Balances of sender and receiver before locking console.log(`Account balances before locking`) - var senderBalance = await tokenContract.balanceOf(sender) + var senderBalance = await getBalances(tokenContract, sender, options.token_id, options.asset_type) console.log(`Account balance of the sender in Network ${options.network}: ${senderBalance.toString()}`) - var recipientBalance = await tokenContract.balanceOf(recipient) + var recipientBalance = await getBalances(tokenContract, recipient, options.token_id, options.asset_type) console.log(`Account balance of the recipient in Network ${options.network}: ${recipientBalance.toString()}`) // Locking the asset (works only for ERC20 at this point) - await tokenContract.approve(interopContract.address, amount, {from: sender}).catch(function () { - console.log("Token approval failed!!!"); - }) - const lockTx = await interopContract.lockFungibleAsset( + if (options.asset_type == "ERC721") { + await tokenContract.approve(tokenContract.address, options.token_id, { from: sender }).catch(function () { + console.log("ERC 721 Token approval failed!!!"); + return false; + }) + } else if (options.asset_type == "ERC1155") { + await tokenContract.setApprovalForAll(tokenContract.address, true, { from: sender }).catch(function () { + console.log("Token approval failed!!!"); + }) + }else{ + await tokenContract.approve(tokenContract.address, amount, { from: sender }).catch(function () { + console.log("Token approval failed!!!"); + }) + } + + const lockTx = await interopContract.lockAsset( recipient, tokenContract.address, amount, hash, timeLock, + options.token_id, + Web3.utils.utf8ToHex(options.data), { from: sender } - ).catch(function () { - console.log("lockFungibleAsset threw an error"); + ).catch(function (e) { + console.log(e) + console.log("lockAsset threw an error"); }) const lockContractId = lockTx.logs[0].args.lockContractId console.log(`Lock contract ID: ${lockContractId.toString().substring(2)}`) // Balances of sender and receiver after locking console.log(`Account balances after locking`) - var senderBalance = await tokenContract.balanceOf(sender) + var senderBalance = await getBalances(tokenContract, sender, options.token_id, options.asset_type) console.log(`Account balance of the sender in Network ${options.network}: ${senderBalance.toString()}`) - var recipientBalance = await tokenContract.balanceOf(recipient) + var recipientBalance = await getBalances(tokenContract, recipient, options.token_id, options.asset_type) console.log(`Account balance of the recipient in Network ${options.network}: ${recipientBalance.toString()}`) } } diff --git a/samples/besu/besu-cli/src/commands/asset/unlock.ts b/samples/besu/besu-cli/src/commands/asset/unlock.ts index 7880b9338..ce39d3bae 100644 --- a/samples/besu/besu-cli/src/commands/asset/unlock.ts +++ b/samples/besu/besu-cli/src/commands/asset/unlock.ts @@ -1,8 +1,19 @@ import { GluegunCommand } from 'gluegun' import { getNetworkConfig, commandHelp } from '../../helper/helper' import { getContractInstance } from '../../helper/besu-functions' +// import { send } from 'process' const Web3 = require ("web3") - +async function getBalances(tokenContract, address, token_id=0, asset_type="ERC20"){ + try{ + var balance = await tokenContract.balanceOf(address, token_id) + }catch{ + var balance = null; + } + if (!balance) + return await tokenContract.balanceOf(address) + else + return balance; +} const command: GluegunCommand = { name: 'unlock', description: 'Unlock and reclaim assets after timeout (fungible assets for now)', @@ -48,7 +59,12 @@ const command: GluegunCommand = { name: '--network_port', description: 'The network port. Default value is taken from config.json' - } + }, + { + name: '--token_id', + description: + 'token ID for issuing tokens. Only applicable for ERC1155' + }, ], command, ['asset', 'unlock'] @@ -109,17 +125,18 @@ const command: GluegunCommand = { console.log('Lock Contract ID', lockContractId) // Balance of the recipient before claiming - var senderBalance = await tokenContract.balanceOf(sender) + var senderBalance = await getBalances(tokenContract, sender, options.token_id) console.log(`Account balance of the sender in Network ${options.network} before unlocking: ${senderBalance.toString()}`) - await interopContract.unlockFungibleAsset(lockContractId, { + await interopContract.unlockAsset(lockContractId, { from: sender - }).catch(function () { - console.log("unlockFungibleAsset threw an error"); + }).catch(function (e) { + console.log(e) + console.log("unlockAsset threw an error"); }) // Balance of the recipient after claiming - var senderBalance = await tokenContract.balanceOf(sender) + var senderBalance = await getBalances(tokenContract, sender, options.token_id) console.log(`Account balance of the sender in Network ${options.network} after unlocking: ${senderBalance.toString()}`) } } diff --git a/samples/besu/simpleasset/.gitignore b/samples/besu/simpleasset/.gitignore index 96c15fb2a..35702d932 100644 --- a/samples/besu/simpleasset/.gitignore +++ b/samples/besu/simpleasset/.gitignore @@ -1,4 +1,5 @@ build node_modules -contracts/manageAsset.sol -package-lock.json +contracts/manageAssetAny.sol +contracts/transferInterface.sol +package-lock.json \ No newline at end of file diff --git a/samples/besu/simpleasset/app/AssetExchangeERC1155_20.js b/samples/besu/simpleasset/app/AssetExchangeERC1155_20.js new file mode 100644 index 000000000..a2a97360c --- /dev/null +++ b/samples/besu/simpleasset/app/AssetExchangeERC1155_20.js @@ -0,0 +1,268 @@ +const promisify = require('util').promisify +const sleep = promisify(require('timers').setTimeout) +const fs = require('fs') +const path = require('path') +const contract = require("@truffle/contract"); +const Web3 = require ("web3") +const crypto = require('crypto') + +const networkHost1 = "localhost" +const networkPort1 = "8545" +const networkHost2 = "localhost" +const networkPort2 = "9544" + + +const AliceERC1155TokenContract = require('../build/contracts/AliceERC1155.json') +const BobERC20TokenContract = require('../build/contracts/BobERC20.json') + +let interopContract1 +let interopContract2 +let AliceERC1155 +let BobERC20 + + +// Function to obtain an instance of a smart contract when provided +// as input the path to its JSON file output by 'truffle compile'. +// (Assuming that the current folder is a sibling folder to build, +// the path to json would be ../build/contracts/ContractName.json) +async function getContractInstance(provider, pathToJson){ + const jsonFile = path.resolve(__dirname, pathToJson) + var jsonFileContents = fs.readFileSync(jsonFile) + var contractName = contract(JSON.parse(jsonFileContents)) + contractName.setProvider(provider) + var instance = await contractName.deployed().catch(function () { + console.log("Failed getting the contractName!"); + }) + return instance +} + + +// Initialization of the parameters +async function init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) { + interopContract1 = await getContractInstance(provider1,'../build/contracts/AssetExchangeContract.json').catch(function () { + console.log("Failed getting interopContract1!"); + }) + interopContract2 = await getContractInstance(provider2,'../build/contracts/AssetExchangeContract.json').catch(function () { + console.log("Failed getting interopContract2!"); + }) + + AliceERC1155 = await getContractInstance(provider1, '../build/contracts/AliceERC1155.json').catch(function () { + console.log("Failed getting AliceERC1155 token contract!"); + }) + BobERC20 = await getContractInstance(provider2, '../build/contracts/BobERC20.json').catch(function () { + console.log("Failed getting BobERC20 token contract!"); + }) + + // Issue AliceERC1155 tokens to Alice in Network 1 and BobERC20 tokens + // to Bob in Network 2. A minimal number of tokens equal to the + // number of token being exchanged is issued to Alice and Bob to + // ensure that the exchange in this test application does not fail + // due to insufficient funds. + await AliceERC1155.safeTransferFrom(contractOwner1, Alice1, 1, 1, Web3.utils.utf8ToHex(""), {from: contractOwner1}).catch(function (e) { + console.log(e); + console.log("AliceERC1155 transfer threw an error; Probably the token supply is used up!"); + }) + await BobERC20.transfer(Bob2, senderInitialBalance, {from: contractOwner2}).catch(function () { + console.log("BobERC20 transfer threw an error; Probably the token supply is used up!"); + }) + +} + + +// Claim function of a fungible asset/token of type tokenContractId +// and amount tokenAmount locked using contractId for a receiver. +// preimage is the secret to unlock the asset corresponding to the commitment +// used when locking it +async function claimToken(interopContract, lockContractId, recipient, preimage) { + console.log("\n Claiming %s using preimage: %o", lockContractId, preimage) + // console.log(JSON.parse(JSON.stringify(preimage)).data.toString('utf8')) + var claimStatus = await interopContract.claimAsset(lockContractId, preimage, { + from: recipient + }).catch(function (err) { + console.log(err) + console.log("claimAsset threw an error"); + claimStatus = false + }) + + return claimStatus +} + + +// Unlock function of a locked fungible asset/token +async function unlockToken(interopContract, lockContractId, sender) { + var unlockStatus = await interopContract.unlockAsset(lockContractId, { + from: sender + }).catch(function () { + console.log("unlockAsset threw an error"); + unlockStatus = false + }) + + return unlockStatus +} + + +// Function to create a new smart contract for locking asset +// 'sender' locks 'tokenAmount' number of tokens of type 'tokenContract' +// for 'recipient' using the contract constructs of 'interopContract' +// with hashLock and timeLock providing the conditions for claiming/unlocking +async function lockToken(sender, recipient, tokenContract, tokenAmount, interopContract, hashLock, timeLock, type, tokenID, data) { + // initiator of the swap has to first designate the swap contract as a spender of his/her money + // with allowance matching the swap amount + if(type == "ERC1155"){ + await tokenContract.setApprovalForAll(tokenContract.address, true, {from: sender}).catch(function () { + console.log("Token approval failed!!!"); + return false + }) + }else{ + await tokenContract.approve(tokenContract.address, tokenAmount, {from: sender}).catch(function () { + console.log("Token approval failed!!!"); + return false + })} + var lockStatus = interopContract.lockAsset( + recipient, + tokenContract.address, + tokenAmount, + hashLock, + timeLock, + tokenID, + Web3.utils.utf8ToHex(data), + { + from: sender + } + ).catch(function (e) { + console.log(e) + console.log("lockAsset threw an error"); + lockStatus = false + }) + + return lockStatus +} + + +// A function to obtain and print the account balances of a pair +// of accounts in the two participating networks. +// Designed for printing the account balances of the sender and +// recipient at various stages of the exchange. +async function getBalances(Alice1, Bob1, Alice2, Bob2) { + var AliceAliceERC1155Balance = await AliceERC1155.balanceOf(Alice1,1) + console.log("Alice balance of AliceERC1155 in Network 1", AliceAliceERC1155Balance.toString()) + + var BobAliceERC1155Balance = await AliceERC1155.balanceOf(Bob1,1) + console.log("Bob balance of AliceERC1155 in Network 1", await BobAliceERC1155Balance.toString()) + + var AliceBobERC20Balance = await BobERC20.balanceOf(Alice2) + console.log("Alice balance of BobERC20 in Network 2", AliceBobERC20Balance.toString()) + + var BobBobERC20Balance = await BobERC20.balanceOf(Bob2) + console.log("Bob balance of BobERC20 in Network 2", await BobBobERC20Balance.toString()) +} + + +// Main entry point to the app +async function main() { + // Network 1 + const provider1 = new Web3.providers.HttpProvider('http://'+networkHost1+':'+networkPort1) + const web3N1 = new Web3(provider1) + const accounts1 = await web3N1.eth.getAccounts() + + const Alice1 = accounts1[1] // owner of AliceERC1155 and wants swap for BobERC20 + const Bob1 = accounts1[2] // owner of BobERC20 and wants to swap for AliceERC1155 + console.log("Alice address in Network 1", Alice1) + console.log("Bob address in Network 1", Bob1) + + const contractOwner1 = accounts1[0] // owner of all the minted tokens when the contract was created, given how truffleconfig.js is composed + + // Network 2 + const provider2 = new Web3.providers.HttpProvider('http://'+networkHost2+':'+networkPort2) + const web3N2 = new Web3(provider2) + const accounts2 = await web3N2.eth.getAccounts() + + const Alice2 = accounts2[1] // owner of AliceERC1155 and wants swap for BobERC20 + const Bob2 = accounts2[2] // owner of BobERC20 and wants to swap for AliceERC1155 + console.log("Alice address in Network 2", Alice2) + console.log("Bob address in Network 2", Bob2) + + const contractOwner2 = accounts2[0] // owner of all the minted tokens when the contract was created, given how truffleconfig.js is composed + + // Initialization + const tokenSupply = 1000 + const tokenAmount = 10 // Number of tokens to be exchanged + const tokenId = 1; + const senderInitialBalance = tokenAmount + + await init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) + + console.log("\n Balances after init():") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + preimage = crypto.randomBytes(32) // to sample a preimage for the hash + hash = crypto.createHash('sha256').update(preimage).digest() + console.log("Hash: ", hash) + + let timeOut = 15 + let timeLockSeconds = Math.floor(Date.now() / 1000) + 2*timeOut + + // Creating a HTLC contract for Alice locking her AliceERC1155 tokens for Bob + let lockTx1 = await lockToken(Alice1, Bob1, AliceERC1155, 1, interopContract1, hash, timeLockSeconds, "ERC1155", 1, "") + if (!lockTx1) { + console.log("\n !!! Locking of Alice's tokens failed in Netowrk 1. Aborting here !!!") + return + } + let lockContractId1 = lockTx1.logs[0].args.lockContractId + console.log("lockContractID1: ", lockContractId1) + + console.log("\n Balances after Alice locks her tokens in Network 1:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // After he observes this lockContract created in Network 1, + // Bob creates a similar contract in Network 2 using the same + // hash to transfer the agreed upon amount of BobERC20 to Alice. + // Bob sets the timeLock such that he will have enough time to + // claim Alice's tokens in Network 1 after she claims Bob's + // tokens in Network 2. + timeLockSeconds = Math.floor(Date.now() / 1000) + timeOut + let lockTx2 = await lockToken(Bob2, Alice2, BobERC20, tokenAmount, interopContract2, hash, timeLockSeconds, "ERC20", 1, "") + if (!lockTx2) { + console.log("\n !!! Locking of Bob's tokens failed in Netowrk 2. Aborting here !!!") + return + } + let lockContractId2 = lockTx2.logs[0].args.lockContractId + console.log("lockContractID2: ", lockContractId2) + + console.log("\n Balances after creating Bob locks his tokens in Network 2:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // Alice withdrawing Bob's BobERC20 token from lockContractId2 + let claimSuccess2 = await claimToken(interopContract2, lockContractId2, Alice2, preimage) + + console.log("\n Balances after Alice's attempt to claim in Network 2:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // If Alice's claim is not successfull, then Alice and Bob unlock their locked tokens + if(!claimSuccess2){ + sleep(2*timeOut*1000) + console.log("\n !!! Claim by Alice not successfull !!! \n Unlocking and refunding tokens to Alice and Bob") + + let unlockSuccess2 = await unlockToken(interopContract2, lockContractId2, Bob2) + let unlockSuccess1 = await unlockToken(interopContract1, lockContractId1, Alice1) + + if(!unlockSuccess2) + console.log("\n !!! Unlocking Bob's tokens not successfull !!!") + if(!unlockSuccess1) + console.log("\n !!! Unlocking Alice's tokens not successfull !!!") + } + else{ + // If Alice's withdrawal is successful, Bob goes ahead and claims Alice's + // AliceERC1155 tokens locked in the lockContractId1 + let claimSuccess1 = await claimToken(interopContract1, lockContractId1, Bob1, preimage) // we assume Bob's claim to be successful if Alice's claim is successful + + if(!claimSuccess1){ + console.log("\n !!! Claim by Bob not successfull !!! \n We had assumed Bob's claim will be successful if Alice's claim is successful") + } + } + + console.log("\n Balances after Bob's attempt to claim in Network 1:") + await getBalances(Alice1, Bob1, Alice2, Bob2) +} + +main() diff --git a/samples/besu/simpleasset/app/AssetExchangeERC20.js b/samples/besu/simpleasset/app/AssetExchangeERC20.js index 917333fa5..4eda407d8 100644 --- a/samples/besu/simpleasset/app/AssetExchangeERC20.js +++ b/samples/besu/simpleasset/app/AssetExchangeERC20.js @@ -12,9 +12,6 @@ const networkHost2 = "localhost" const networkPort2 = "9544" -const AliceERC20TokenContract = require('../build/contracts/AliceERC20.json') -const BobERC20TokenContract = require('../build/contracts/BobERC20.json') - let interopContract1 let interopContract2 let AliceERC20 @@ -33,20 +30,19 @@ async function getContractInstance(provider, pathToJson){ var instance = await contractName.deployed().catch(function () { console.log("Failed getting the contractName!"); }) - return instance } // Initialization of the parameters async function init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) { - interopContract1 = await getContractInstance(provider1,'../build/contracts/InteroperationBaseClassERC20.json').catch(function () { + interopContract1 = await getContractInstance(provider1,'../build/contracts/AssetExchangeContract.json').catch(function () { console.log("Failed getting interopContract1!"); }) - interopContract2 = await getContractInstance(provider2,'../build/contracts/InteroperationBaseClassERC20.json').catch(function () { + interopContract2 = await getContractInstance(provider2,'../build/contracts/AssetExchangeContract.json').catch(function () { console.log("Failed getting interopContract2!"); }) - + AliceERC20 = await getContractInstance(provider1, '../build/contracts/AliceERC20.json').catch(function () { console.log("Failed getting AliceERC20 token contract!"); }) @@ -59,7 +55,7 @@ async function init(provider1, provider2, contractOwner1, contractOwner2, Alice1 // number of token being exchanged is issued to Alice and Bob to // ensure that the exchange in this test application does not fail // due to insufficient funds. - await AliceERC20.transfer(Alice1, senderInitialBalance, {from: contractOwner1}).catch(function () { + await AliceERC20.transferFrom(contractOwner1, Alice1, 1, {from: contractOwner1}).catch(function (e) { console.log("AliceERC20 transfer threw an error; Probably the token supply is used up!"); }) await BobERC20.transfer(Bob2, senderInitialBalance, {from: contractOwner2}).catch(function () { @@ -74,10 +70,12 @@ async function init(provider1, provider2, contractOwner1, contractOwner2, Alice1 // used when locking it async function claimToken(interopContract, lockContractId, recipient, preimage) { console.log("\n Claiming %s using preimage: %o", lockContractId, preimage) - var claimStatus = await interopContract.claimFungibleAsset(lockContractId, preimage, { + // console.log(JSON.parse(JSON.stringify(preimage)).data.toString('utf8')) + var claimStatus = await interopContract.claimAsset(lockContractId, preimage, { from: recipient - }).catch(function () { - console.log("claimFungibleAsset threw an error"); + }).catch(function (err) { + console.log(err) + console.log("claimAsset threw an error"); claimStatus = false }) @@ -87,10 +85,10 @@ async function claimToken(interopContract, lockContractId, recipient, preimage) // Unlock function of a locked fungible asset/token async function unlockToken(interopContract, lockContractId, sender) { - var unlockStatus = await interopContract.unlockFungibleAsset(lockContractId, { + var unlockStatus = await interopContract.unlockAsset(lockContractId, { from: sender }).catch(function () { - console.log("unlockFungibleAsset threw an error"); + console.log("unlockAsset threw an error"); unlockStatus = false }) @@ -102,25 +100,26 @@ async function unlockToken(interopContract, lockContractId, sender) { // 'sender' locks 'tokenAmount' number of tokens of type 'tokenContract' // for 'recipient' using the contract constructs of 'interopContract' // with hashLock and timeLock providing the conditions for claiming/unlocking -async function lockToken(sender, recipient, tokenContract, tokenAmount, interopContract, hashLock, timeLock) { +async function lockToken(sender, recipient, tokenContract, tokenAmount, interopContract, hashLock, timeLock, tokenId=0, data="") { // initiator of the swap has to first designate the swap contract as a spender of his/her money // with allowance matching the swap amount - await tokenContract.approve(interopContract.address, tokenAmount, {from: sender}).catch(function () { + await tokenContract.approve(tokenContract.address, tokenAmount, {from: sender}).catch(function () { console.log("Token approval failed!!!"); return false }) - - var lockStatus = interopContract.lockFungibleAsset( + var lockStatus = interopContract.lockAsset( recipient, tokenContract.address, tokenAmount, hashLock, timeLock, + tokenId, + Web3.utils.utf8ToHex(data), { from: sender } ).catch(function () { - console.log("lockFungibleAsset threw an error"); + console.log("lockAsset threw an error"); lockStatus = false }) @@ -176,6 +175,7 @@ async function main() { // Initialization const tokenSupply = 1000 const tokenAmount = 10 // Number of tokens to be exchanged + const tokenId = 1; const senderInitialBalance = tokenAmount await init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) @@ -191,13 +191,12 @@ async function main() { let timeLockSeconds = Math.floor(Date.now() / 1000) + 2*timeOut // Creating a HTLC contract for Alice locking her AliceERC20 tokens for Bob - let lockTx1 = await lockToken(Alice1, Bob1, AliceERC20, tokenAmount, interopContract1, hash, timeLockSeconds) + let lockTx1 = await lockToken(Alice1, Bob1, AliceERC20, 1, interopContract1, hash, timeLockSeconds, tokenId) if (!lockTx1) { console.log("\n !!! Locking of Alice's tokens failed in Netowrk 1. Aborting here !!!") return } let lockContractId1 = lockTx1.logs[0].args.lockContractId - console.log("lockContractID1: ", lockContractId1) console.log("\n Balances after Alice locks her tokens in Network 1:") await getBalances(Alice1, Bob1, Alice2, Bob2) @@ -209,13 +208,12 @@ async function main() { // claim Alice's tokens in Network 1 after she claims Bob's // tokens in Network 2. timeLockSeconds = Math.floor(Date.now() / 1000) + timeOut - let lockTx2 = await lockToken(Bob2, Alice2, BobERC20, tokenAmount, interopContract2, hash, timeLockSeconds) + let lockTx2 = await lockToken(Bob2, Alice2, BobERC20, tokenAmount, interopContract2, hash, timeLockSeconds, tokenId) if (!lockTx2) { console.log("\n !!! Locking of Bob's tokens failed in Netowrk 2. Aborting here !!!") return } let lockContractId2 = lockTx2.logs[0].args.lockContractId - console.log("lockContractID2: ", lockContractId2) console.log("\n Balances after creating Bob locks his tokens in Network 2:") await getBalances(Alice1, Bob1, Alice2, Bob2) diff --git a/samples/besu/simpleasset/app/AssetExchangeERC721_20.js b/samples/besu/simpleasset/app/AssetExchangeERC721_20.js new file mode 100644 index 000000000..7a84d27ac --- /dev/null +++ b/samples/besu/simpleasset/app/AssetExchangeERC721_20.js @@ -0,0 +1,253 @@ +const promisify = require('util').promisify +const sleep = promisify(require('timers').setTimeout) +const fs = require('fs') +const path = require('path') +const contract = require("@truffle/contract"); +const Web3 = require("web3") +const crypto = require('crypto') + +const networkHost1 = "localhost" +const networkPort1 = "8545" +const networkHost2 = "localhost" +const networkPort2 = "9544" + +let interopContract1 +let interopContract2 +let AliceERC721 +let BobERC20 + + +// Function to obtain an instance of a smart contract when provided +// as input the path to its JSON file output by 'truffle compile'. +// (Assuming that the current folder is a sibling folder to build, +// the path to json would be ../build/contracts/ContractName.json) +async function getContractInstance(provider, pathToJson) { + const jsonFile = path.resolve(__dirname, pathToJson) + var jsonFileContents = fs.readFileSync(jsonFile) + var contractName = contract(JSON.parse(jsonFileContents)) + contractName.setProvider(provider) + var instance = await contractName.deployed().catch(function () { + console.log("Failed getting the contractName!"); + }) + return instance +} + + +// Initialization of the parameters +async function init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) { + interopContract1 = await getContractInstance(provider1, '../build/contracts/AssetExchangeContract.json').catch(function () { + console.log("Failed getting interopContract1!"); + }) + interopContract2 = await getContractInstance(provider2, '../build/contracts/AssetExchangeContract.json').catch(function () { + console.log("Failed getting interopContract2!"); + }) + + AliceERC721 = await getContractInstance(provider1, '../build/contracts/AliceERC721.json').catch(function () { + console.log("Failed getting AliceERC721 token contract!"); + }) + BobERC20 = await getContractInstance(provider2, '../build/contracts/BobERC20.json').catch(function () { + console.log("Failed getting BobERC20 token contract!"); + }) + + // Issue AliceERC721 tokens to Alice in Network 1 and BobERC20 tokens + // to Bob in Network 2. A minimal number of tokens equal to the + // number of token being exchanged is issued to Alice and Bob to + // ensure that the exchange in this test application does not fail + // due to insufficient funds. + await AliceERC721.transferFrom(contractOwner1, Alice1, 1, { from: contractOwner1 }).catch(function (e) { + console.log("AliceERC721 transfer threw an error; Probably the token supply is used up!"); + }) + await BobERC20.transfer(Bob2, senderInitialBalance, { from: contractOwner2 }).catch(function () { + console.log("BobERC20 transfer threw an error; Probably the token supply is used up!"); + }) +} + + +// Claim function of a fungible asset/token of type tokenContractId +// and amount tokenAmount locked using contractId for a receiver. +// preimage is the secret to unlock the asset corresponding to the commitment +// used when locking it +async function claimToken(interopContract, lockContractId, recipient, preimage) { + console.log("\n Claiming %s using preimage: %o", lockContractId, preimage) + // console.log(JSON.parse(JSON.stringify(preimage)).data.toString('utf8')) + var claimStatus = await interopContract.claimAsset(lockContractId, preimage, { + from: recipient + }).catch(function (err) { + console.log(err) + console.log("claimAsset threw an error"); + claimStatus = false + }) + + return claimStatus +} + + +// Unlock function of a locked fungible asset/token +async function unlockToken(interopContract, lockContractId, sender) { + var unlockStatus = await interopContract.unlockAsset(lockContractId, { + from: sender + }).catch(function () { + console.log("unlockAsset threw an error"); + unlockStatus = false + }) + + return unlockStatus +} + + +// Function to create a new smart contract for locking asset +// 'sender' locks 'tokenAmount' number of tokens of type 'tokenContract' +// for 'recipient' using the contract constructs of 'interopContract' +// with hashLock and timeLock providing the conditions for claiming/unlocking +async function lockToken(sender, recipient, tokenContract, tokenAmount, interopContract, hashLock, timeLock, tokenId = 0, data = "") { + // initiator of the swap has to first designate the swap contract as a spender of his/her money + // with allowance matching the swap amount + await tokenContract.approve(tokenContract.address, tokenAmount, { from: sender }).catch(function () { + console.log("Token approval failed!!!"); + return false + }) + var lockStatus = interopContract.lockAsset( + recipient, + tokenContract.address, + tokenAmount, + hashLock, + timeLock, + tokenId, + Web3.utils.utf8ToHex(data), + { + from: sender + } + ).catch(function () { + console.log("lockAsset threw an error"); + lockStatus = false + }) + + return lockStatus +} + + +// A function to obtain and print the account balances of a pair +// of accounts in the two participating networks. +// Designed for printing the account balances of the sender and +// recipient at various stages of the exchange. +async function getBalances(Alice1, Bob1, Alice2, Bob2) { + var AliceAliceERC721Balance = await AliceERC721.balanceOf(Alice1) + console.log("Alice balance of AliceERC721 in Network 1", AliceAliceERC721Balance.toString()) + + var BobAliceERC721Balance = await AliceERC721.balanceOf(Bob1) + console.log("Bob balance of AliceERC721 in Network 1", await BobAliceERC721Balance.toString()) + + var AliceBobERC20Balance = await BobERC20.balanceOf(Alice2) + console.log("Alice balance of BobERC20 in Network 2", AliceBobERC20Balance.toString()) + + var BobBobERC20Balance = await BobERC20.balanceOf(Bob2) + console.log("Bob balance of BobERC20 in Network 2", await BobBobERC20Balance.toString()) +} + + +// Main entry point to the app +async function main() { + // Network 1 + const provider1 = new Web3.providers.HttpProvider('http://' + networkHost1 + ':' + networkPort1) + const web3N1 = new Web3(provider1) + const accounts1 = await web3N1.eth.getAccounts() + + const Alice1 = accounts1[1] // owner of AliceERC721 and wants swap for BobERC20 + const Bob1 = accounts1[2] // owner of BobERC20 and wants to swap for AliceERC721 + console.log("Alice address in Network 1", Alice1) + console.log("Bob address in Network 1", Bob1) + + const contractOwner1 = accounts1[0] // owner of all the minted tokens when the contract was created, given how truffleconfig.js is composed + + // Network 2 + const provider2 = new Web3.providers.HttpProvider('http://' + networkHost2 + ':' + networkPort2) + const web3N2 = new Web3(provider2) + const accounts2 = await web3N2.eth.getAccounts() + + const Alice2 = accounts2[1] // owner of AliceERC721 and wants swap for BobERC20 + const Bob2 = accounts2[2] // owner of BobERC20 and wants to swap for AliceERC721 + console.log("Alice address in Network 2", Alice2) + console.log("Bob address in Network 2", Bob2) + + const contractOwner2 = accounts2[0] // owner of all the minted tokens when the contract was created, given how truffleconfig.js is composed + + // Initialization + const tokenSupply = 1000 + const tokenAmount = 10 // Number of tokens to be exchanged + const tokenId = 1; + const senderInitialBalance = tokenAmount + + await init(provider1, provider2, contractOwner1, contractOwner2, Alice1, Bob2, tokenSupply, senderInitialBalance) + + console.log("\n Balances after init():") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + preimage = crypto.randomBytes(32) // to sample a preimage for the hash + hash = crypto.createHash('sha256').update(preimage).digest() + console.log("Hash: ", hash) + + let timeOut = 15 + let timeLockSeconds = Math.floor(Date.now() / 1000) + 2 * timeOut + + // Creating a HTLC contract for Alice locking her AliceERC721 tokens for Bob + let lockTx1 = await lockToken(Alice1, Bob1, AliceERC721, 1, interopContract1, hash, timeLockSeconds, tokenId) + if (!lockTx1) { + console.log("\n !!! Locking of Alice's tokens failed in Netowrk 1. Aborting here !!!") + return + } + let lockContractId1 = lockTx1.logs[0].args.lockContractId + + console.log("\n Balances after Alice locks her tokens in Network 1:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // After he observes this lockContract created in Network 1, + // Bob creates a similar contract in Network 2 using the same + // hash to transfer the agreed upon amount of BobERC20 to Alice. + // Bob sets the timeLock such that he will have enough time to + // claim Alice's tokens in Network 1 after she claims Bob's + // tokens in Network 2. + timeLockSeconds = Math.floor(Date.now() / 1000) + timeOut + let lockTx2 = await lockToken(Bob2, Alice2, BobERC20, tokenAmount, interopContract2, hash, timeLockSeconds, tokenId) + if (!lockTx2) { + console.log("\n !!! Locking of Bob's tokens failed in Netowrk 2. Aborting here !!!") + return + } + let lockContractId2 = lockTx2.logs[0].args.lockContractId + + console.log("\n Balances after creating Bob locks his tokens in Network 2:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // Alice withdrawing Bob's BobERC20 token from lockContractId2 + let claimSuccess2 = await claimToken(interopContract2, lockContractId2, Alice2, preimage) + + console.log("\n Balances after Alice's attempt to claim in Network 2:") + await getBalances(Alice1, Bob1, Alice2, Bob2) + + // If Alice's claim is not successfull, then Alice and Bob unlock their locked tokens + if (!claimSuccess2) { + sleep(2 * timeOut * 1000) + console.log("\n !!! Claim by Alice not successfull !!! \n Unlocking and refunding tokens to Alice and Bob") + + let unlockSuccess2 = await unlockToken(interopContract2, lockContractId2, Bob2) + let unlockSuccess1 = await unlockToken(interopContract1, lockContractId1, Alice1) + + if (!unlockSuccess2) + console.log("\n !!! Unlocking Bob's tokens not successfull !!!") + if (!unlockSuccess1) + console.log("\n !!! Unlocking Alice's tokens not successfull !!!") + } + else { + // If Alice's withdrawal is successful, Bob goes ahead and claims Alice's + // AliceERC721 tokens locked in the lockContractId1 + let claimSuccess1 = await claimToken(interopContract1, lockContractId1, Bob1, preimage) // we assume Bob's claim to be successful if Alice's claim is successful + + if (!claimSuccess1) { + console.log("\n !!! Claim by Bob not successfull !!! \n We had assumed Bob's claim will be successful if Alice's claim is successful") + } + } + + console.log("\n Balances after Bob's attempt to claim in Network 1:") + await getBalances(Alice1, Bob1, Alice2, Bob2) +} + +main() diff --git a/samples/besu/simpleasset/contracts/AliceERC20.sol b/samples/besu/simpleasset/contracts/AliceERC20.sol index b199ede9d..0e7edf897 100644 --- a/samples/besu/simpleasset/contracts/AliceERC20.sol +++ b/samples/besu/simpleasset/contracts/AliceERC20.sol @@ -3,12 +3,31 @@ pragma solidity ^0.8.8; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "./transferInterface.sol"; /** * A basic token for testing the HashedTimelockERC20. */ -contract AliceERC20 is ERC20 { - constructor(uint256 initialSupply) ERC20("Alice Token", "AliceToken") { - _mint(msg.sender, initialSupply); - } +contract AliceERC20 is ERC20, transferInterface { + constructor(uint256 initialSupply) ERC20("Alice Token", "AliceToken") { + _mint(msg.sender, initialSupply); + } + + function transferInterop(transferStruct.Info memory info) + public + override + returns (bool success) + { + this.transferFrom(info.sender, info.receiver, info.amount); + return true; + } + + function allowanceInterop(transferStruct.Info memory info) + public + view + override + returns (bool success) + { + return this.allowance(info.sender, address(this)) >= info.amount; + } } diff --git a/samples/besu/simpleasset/contracts/AliceERC721.sol b/samples/besu/simpleasset/contracts/AliceERC721.sol new file mode 100644 index 000000000..c0e276cfc --- /dev/null +++ b/samples/besu/simpleasset/contracts/AliceERC721.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.8; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/utils/Counters.sol"; +import "./transferInterface.sol"; + +/** + * A basic token for testing the HashedTimelockERC721. + */ +contract AliceERC721 is ERC721, transferInterface { + using Counters for Counters.Counter; + Counters.Counter public _tokenIds; + address owner; + + constructor() ERC721("Alice NFT", "AliceNFT") { + // for (uint256 i = 0; i < 5; i++) { + // _tokenIds.increment(); + // uint256 newItemId = _tokenIds.current(); + // _safeMint(msg.sender, newItemId); + // } + owner = msg.sender; + } + + function mint(address to) public { + require(msg.sender == owner); + uint256 newItemId = _tokenIds.current(); + _safeMint(to, newItemId); + _tokenIds.increment(); + } + + function transferInterop(transferStruct.Info memory info) + public + override + returns (bool success) + { + this.transferFrom(info.sender, info.receiver, info.tokenId); + return true; + } + + function allowanceInterop(transferStruct.Info memory info) + public + view + override + returns (bool success) + { + return this.getApproved(info.tokenId) == address(this); + } +} diff --git a/samples/besu/simpleasset/contracts/AlliceERC1155.sol b/samples/besu/simpleasset/contracts/AlliceERC1155.sol new file mode 100644 index 000000000..3dd6ff2fe --- /dev/null +++ b/samples/besu/simpleasset/contracts/AlliceERC1155.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.8; + +/** + * A basic token for testing the HashedTimelockERC20. + */ +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import "./transferInterface.sol"; + +contract AliceERC1155 is ERC1155, transferInterface { + uint256 public constant AliceToken = 0; + uint256 public constant AliceNFT = 1; + address owner; + + constructor() ERC1155("") { + _mint(msg.sender, AliceToken, 10**18, ""); + _mint(msg.sender, AliceNFT, 1, ""); + owner = msg.sender; + } + + function transferInterop(transferStruct.Info memory info) + public + override + returns (bool success) + { + this.safeTransferFrom( + info.sender, + info.receiver, + info.tokenId, + info.amount, + info.data + ); + return true; + } + + function allowanceInterop(transferStruct.Info memory info) + public + view + override + returns (bool success) + { + return this.isApprovedForAll(info.sender, address(this)); + } + + function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) public { + require(msg.sender == owner); + _mint(to, tokenId, amount, data); + } +} diff --git a/samples/besu/simpleasset/contracts/BobERC20.sol b/samples/besu/simpleasset/contracts/BobERC20.sol index d8ae3dc47..f2fe1c3ff 100644 --- a/samples/besu/simpleasset/contracts/BobERC20.sol +++ b/samples/besu/simpleasset/contracts/BobERC20.sol @@ -3,12 +3,31 @@ pragma solidity ^0.8.8; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "./transferInterface.sol"; /** * A basic token for testing the HashedTimelockERC20. */ -contract BobERC20 is ERC20 { - constructor(uint256 initialSupply) ERC20("Bob Token", "BobToken") { - _mint(msg.sender, initialSupply); - } +contract BobERC20 is ERC20, transferInterface { + constructor(uint256 initialSupply) ERC20("Bob Token", "BobToken") { + _mint(msg.sender, initialSupply); + } + + function transferInterop(transferStruct.Info memory info) + public + override + returns (bool success) + { + this.transferFrom(info.sender, info.receiver, info.amount); + return true; + } + + function allowanceInterop(transferStruct.Info memory info) + public + view + override + returns (bool success) + { + return this.allowance(info.sender, address(this)) >= info.amount; + } } diff --git a/samples/besu/simpleasset/migrations/2_deploy_contracts.js b/samples/besu/simpleasset/migrations/2_deploy_contracts.js index d776919d5..916d5a0e0 100644 --- a/samples/besu/simpleasset/migrations/2_deploy_contracts.js +++ b/samples/besu/simpleasset/migrations/2_deploy_contracts.js @@ -1,9 +1,14 @@ -const InteroperationBaseClassERC20 = artifacts.require('InteroperationBaseClassERC20') const AliceERC20 = artifacts.require('./AliceERC20.sol') const BobERC20 = artifacts.require('./BobERC20.sol') +const AliceERC721 = artifacts.require('./AliceERC721.sol') +const AssetExchangeContract = artifacts.require('AssetExchangeContract') +const AliceERC1155 = artifacts.require('./AliceERC1155.sol') + module.exports = function (deployer) { - deployer.deploy(InteroperationBaseClassERC20) deployer.deploy(AliceERC20, 1000) // Change intialSupply from 1000 as required deployer.deploy(BobERC20, 1000) // Change intialSupply from 1000 as required + deployer.deploy(AliceERC721) + deployer.deploy(AssetExchangeContract) + deployer.deploy(AliceERC1155) } diff --git a/samples/besu/simpleasset/package.json b/samples/besu/simpleasset/package.json index c1e47c171..afb6065b8 100644 --- a/samples/besu/simpleasset/package.json +++ b/samples/besu/simpleasset/package.json @@ -12,7 +12,7 @@ "test": "test" }, "scripts": { - "copy-interop-contracts": "cp ../../../core/network/besu/contracts/interop/manageAsset.sol contracts/", + "copy-interop-contracts": "cp ../../../core/network/besu/contracts/interop/manageAssetAny.sol contracts/ && cp ../../../core/network/besu/interface/asset-exchange/transferInterface.sol contracts/", "update-truffle-config": "node get-network-details.js", "deploy-contract": "npm run copy-interop-contracts && npm install && npm run update-truffle-config && truffle compile && truffle migrate", "clean-run": "rm -rf package-lock.json build", diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/access-control.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/access-control.json index fe24a8181..d28f0d6d2 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/access-control.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/access-control.json @@ -2,13 +2,13 @@ "securityDomain": "network1", "rules": [ { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRjCCAe2gAwIBAgIUBMI+vcDI6Z/4bMZN2Cjp6vAXDtgwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTQwMFoXDTIyMDkwNzA5MTkwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFoZaE1MsLtrLRYFzJRyj5uelfL/Fa5pLN2kiO+M5tnxf0+wAotEeC8z\nLCS1KHVIQ7UJD/AOL1OFkbJCHKSdFJGjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPzrPjhbfwF/wxP8iFKy4NspQw0uMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0cAMEQCIDP8WLlE4btz\niw6tI/EFdLY/CSOW1P8bOFquaz5YwjYhAiBxEKH6+udDehvHU+wmRaC/Kp1VJNJZ\ndbjNTs65n8zfbQ==\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true }, { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRjCCAe2gAwIBAgIUBMI+vcDI6Z/4bMZN2Cjp6vAXDtgwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTQwMFoXDTIyMDkwNzA5MTkwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFoZaE1MsLtrLRYFzJRyj5uelfL/Fa5pLN2kiO+M5tnxf0+wAotEeC8z\nLCS1KHVIQ7UJD/AOL1OFkbJCHKSdFJGjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPzrPjhbfwF/wxP8iFKy4NspQw0uMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0cAMEQCIDP8WLlE4btz\niw6tI/EFdLY/CSOW1P8bOFquaz5YwjYhAiBxEKH6+udDehvHU+wmRaC/Kp1VJNJZ\ndbjNTs65n8zfbQ==\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "localhost:30006#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/membership.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/membership.json index 485cb4895..1c1fd61b6 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/membership.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network1/membership.json @@ -1,10 +1 @@ -{ - "securityDomain": "network1", - "members": { - "Org1MSP": { - "type": "ca", - "value": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n", - "chain": [] - } - } -} +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/access-control.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/access-control.json index 9e6790d6b..6d6ca3f03 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/access-control.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/access-control.json @@ -2,13 +2,13 @@ "securityDomain": "network2", "rules": [ { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "localhost:10006#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true }, { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "localhost:30006#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/membership.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/membership.json index 8a6953069..12f3d4d0d 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/membership.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials/network2/membership.json @@ -1,10 +1 @@ -{ - "securityDomain": "network2", - "members": { - "Org1MSP": { - "type": "ca", - "value": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n", - "chain": [] - } - } -} +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/access-control.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/access-control.json index e2c08ff7a..55af6a9fd 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/access-control.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/access-control.json @@ -2,13 +2,13 @@ "securityDomain": "network1", "rules": [ { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRjCCAe2gAwIBAgIUBMI+vcDI6Z/4bMZN2Cjp6vAXDtgwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTQwMFoXDTIyMDkwNzA5MTkwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFoZaE1MsLtrLRYFzJRyj5uelfL/Fa5pLN2kiO+M5tnxf0+wAotEeC8z\nLCS1KHVIQ7UJD/AOL1OFkbJCHKSdFJGjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPzrPjhbfwF/wxP8iFKy4NspQw0uMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0cAMEQCIDP8WLlE4btz\niw6tI/EFdLY/CSOW1P8bOFquaz5YwjYhAiBxEKH6+udDehvHU+wmRaC/Kp1VJNJZ\ndbjNTs65n8zfbQ==\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "corda_partya_1:10003#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true }, { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRjCCAe2gAwIBAgIUBMI+vcDI6Z/4bMZN2Cjp6vAXDtgwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTQwMFoXDTIyMDkwNzA5MTkwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFoZaE1MsLtrLRYFzJRyj5uelfL/Fa5pLN2kiO+M5tnxf0+wAotEeC8z\nLCS1KHVIQ7UJD/AOL1OFkbJCHKSdFJGjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPzrPjhbfwF/wxP8iFKy4NspQw0uMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0cAMEQCIDP8WLlE4btz\niw6tI/EFdLY/CSOW1P8bOFquaz5YwjYhAiBxEKH6+udDehvHU+wmRaC/Kp1VJNJZ\ndbjNTs65n8zfbQ==\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "corda_network2_partya_1:10003#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/membership.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/membership.json index 485cb4895..1c1fd61b6 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/membership.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network1/membership.json @@ -1,10 +1 @@ -{ - "securityDomain": "network1", - "members": { - "Org1MSP": { - "type": "ca", - "value": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n", - "chain": [] - } - } -} +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/access-control.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/access-control.json index 7e3a89511..7b0290676 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/access-control.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/access-control.json @@ -2,13 +2,13 @@ "securityDomain": "network2", "rules": [ { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "corda_partya_1:10003#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true }, { - "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n", + "principal": "-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n", "principalType": "ca", "resource": "corda_network2_partya_1:10003#com.cordaSimpleApplication.flow.GetStateByKey:*", "read": true diff --git a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/membership.json b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/membership.json index 8a6953069..12f3d4d0d 100644 --- a/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/membership.json +++ b/samples/corda/corda-simple-application/clients/src/main/resources/config/credentials_docker/network2/membership.json @@ -1,10 +1 @@ -{ - "securityDomain": "network2", - "members": { - "Org1MSP": { - "type": "ca", - "value": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n", - "chain": [] - } - } -} +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file diff --git a/samples/corda/corda-simple-application/constants.properties b/samples/corda/corda-simple-application/constants.properties index 026fb3954..0b23f87e3 100644 --- a/samples/corda/corda-simple-application/constants.properties +++ b/samples/corda/corda-simple-application/constants.properties @@ -9,5 +9,5 @@ log4jVersion =2.16.0 platformVersion=10 slf4jVersion=1.7.25 nettyVersion=4.1.22.Final -weaverProtosVersion=1.3.1 +weaverProtosVersion=1.4.2 weaverCordaVersion=1.2.9 diff --git a/samples/fabric/fabric-cli/.gitignore b/samples/fabric/fabric-cli/.gitignore index de9b193dc..797eaadb3 100644 --- a/samples/fabric/fabric-cli/.gitignore +++ b/samples/fabric/fabric-cli/.gitignore @@ -18,3 +18,7 @@ src/wallet-network1 src/wallet-network2 chaincode.json remote-network-config.json +admin.id +networkadmin.id +iinagent.id +*.proto.serialized diff --git a/samples/fabric/fabric-cli/Dockerfile b/samples/fabric/fabric-cli/Dockerfile index 16b246c29..dde3be0f4 100644 --- a/samples/fabric/fabric-cli/Dockerfile +++ b/samples/fabric/fabric-cli/Dockerfile @@ -13,4 +13,4 @@ COPY .npmrc /root # RUN yarn RUN npm install RUN yarn link - +RUN rm /root/.npmrc diff --git a/samples/fabric/fabric-cli/package-local.json b/samples/fabric/fabric-cli/package-local.json index 6d9b5087e..36de88fe7 100644 --- a/samples/fabric/fabric-cli/package-local.json +++ b/samples/fabric/fabric-cli/package-local.json @@ -40,6 +40,8 @@ "elliptic": "^6.5.4", "fabric-ca-client": "^2.2.8", "fabric-network": "^2.2.8", + "express": "^4.18.1", + "body-parser": "^1.20.0", "gluegun": "latest", "grpc-tools": "1.9.1", "ini": "^1.3.6", @@ -51,6 +53,7 @@ "devDependencies": { "@grpc/grpc-js": "^1.1.1", "@grpc/proto-loader": "^0.5.4", + "@types/express": "^4.17.13", "@types/jest": "^24.0.18", "@types/node": "^12.12.54", "@typescript-eslint/eslint-plugin": "^3.5.0", diff --git a/samples/fabric/fabric-cli/package.json b/samples/fabric/fabric-cli/package.json index 108176b75..0f84e085f 100644 --- a/samples/fabric/fabric-cli/package.json +++ b/samples/fabric/fabric-cli/package.json @@ -32,12 +32,14 @@ ], "license": "MIT", "dependencies": { - "@hyperledger-labs/weaver-protos-js": "latest", - "@hyperledger-labs/weaver-fabric-interop-sdk": "latest", "@fidm/x509": "^1.2.1", + "@hyperledger-labs/weaver-fabric-interop-sdk": "latest", + "@hyperledger-labs/weaver-protos-js": "latest", + "body-parser": "^1.20.0", "crypto": "^1.0.1", "dotenv": "^8.2.0", "elliptic": "^6.5.4", + "express": "^4.18.1", "fabric-ca-client": "^2.2.8", "fabric-network": "^2.2.8", "gluegun": "latest", @@ -51,6 +53,7 @@ "devDependencies": { "@grpc/grpc-js": "^1.1.1", "@grpc/proto-loader": "^0.5.4", + "@types/express": "^4.17.13", "@types/jest": "^24.0.18", "@types/node": "^12.12.54", "@typescript-eslint/eslint-plugin": "^3.5.0", diff --git a/samples/fabric/fabric-cli/readme.md b/samples/fabric/fabric-cli/readme.md index 28cba822d..d515a812d 100644 --- a/samples/fabric/fabric-cli/readme.md +++ b/samples/fabric/fabric-cli/readme.md @@ -86,19 +86,19 @@ Then run `docker-compose up -d` to start fabric-cli container. Then run `docker exec -it fabric-cli bash`, to open interactive shell for fabric-cli, where regular fabric-cli calls can be made. Setting env is not required inside docker, as env variables are already declared, so next steps would be: -* `fabric-cli config set-file $CONFG_PATH` -* `fabric-cli configure all network1 network2`. +* `./bin/fabric-cli config set-file $CONFG_PATH` +* `./bin/fabric-cli configure all network1 network2`. ## Example Invoke To record a key `test` with the value `teststate` via the `simplestate` contract deployed on the `mychannel` channel in `network1`, run: ``` -$ fabric-cli chaincode invoke mychannel simplestate create '["test", "teststate"]'` --local-network=network1 +$ ./bin/fabric-cli chaincode invoke mychannel simplestate create '["test", "teststate"]' --local-network=network1 ``` To now query the value of the the `test` key, run: ``` -$ fabric-cli chaincode query mychannel simplestate read '["test"]' --local-network=network1 +$ ./bin/fabric-cli chaincode query mychannel simplestate read '["test"]' --local-network=network1 ``` NOTE: Use the `--help` flag with any command to view examples and usage. @@ -385,6 +385,32 @@ Below are the steps to exercise asset transfers from `network1` to `network2` us ./scripts/getTokenBalance.sh network2 bob ``` +## Events + +* To subscribe for one or more events, generate a JSON file like: [Sample Event Sub JSON](./src/data/event_sub_sample.json), which contains an array of event subscription specifications. The samples provided here assume that the driver of `network1` is subscribing to an event of `network2`. Then run the following command (and note the request id which will be used to unsubscribe or get status): + ``` + ./bin/fabric-cli event subscribe --network=network1 src/data/event_sub_sample.json + ``` +* To unsuscribe for one or more events, use the same JSON file as in subscription like: [Sample Event Sub JSON](./src/data/event_sub_sample.json). Then run the following command: + ``` + ./bin/fabric-cli event unsubscribe --network=network1 --request-ids= src/data/event_sub_sample.json + ``` +* To get the status of an event subscription, run the following command: + ``` + ./bin/fabric-cli event get-subscription-status --network=network1 --request-id= + ``` +* To start the HTTP server to listen to the published events by the destination/importing relay (fetched from the source/exporting network), run the following command: + ``` + ./bin/fabric-cli event receive + ``` + By default, it will start the below endpoint: + ``` + http://localhost:8080/simple-event-callback + ``` +* To fetch the statuses of all the events received, run the following command: + ``` + ./bin/fabric-cli event get-all --network=network1 --request-id= + ``` ## NOTE diff --git a/samples/fabric/fabric-cli/scripts/getAssetStatus.sh b/samples/fabric/fabric-cli/scripts/getAssetStatus.sh index 66f10000c..4ef5adc42 100755 --- a/samples/fabric/fabric-cli/scripts/getAssetStatus.sh +++ b/samples/fabric/fabric-cli/scripts/getAssetStatus.sh @@ -1,9 +1,11 @@ -echo -e "\n\n############## Fabric network1 ################\n" -./bin/fabric-cli chaincode invoke --local-network=network1 --user=alice mychannel simpleasset GetMyAssets '[]' -./bin/fabric-cli chaincode invoke --local-network=network1 --user=bob mychannel simpleasset GetMyAssets '[]' +CC=$(cat config.json | jq -r .network1.chaincode) +echo -e "\n\n############## Fabric network1: $CC ################\n" +./bin/fabric-cli chaincode query --local-network=network1 --user=alice mychannel $CC GetMyAssets '[]' +./bin/fabric-cli chaincode query --local-network=network1 --user=bob mychannel $CC GetMyAssets '[]' if [ "$1" = "2" ]; then - echo -e "\n\n############## Fabric network2 ################\n" - ./bin/fabric-cli chaincode invoke --local-network=network2 --user=alice mychannel simpleasset GetMyWallet '[]' - ./bin/fabric-cli chaincode invoke --local-network=network2 --user=bob mychannel simpleasset GetMyWallet '[]' -fi \ No newline at end of file + CC=$(cat config.json | jq -r .network2.chaincode) + echo -e "\n\n############## Fabric network2: $CC ################\n" + ./bin/fabric-cli chaincode query --local-network=network2 --user=alice mychannel $CC GetMyWallet '[]' + ./bin/fabric-cli chaincode query --local-network=network2 --user=bob mychannel $CC GetMyWallet '[]' +fi diff --git a/samples/fabric/fabric-cli/src/commands/chaincode/query.ts b/samples/fabric/fabric-cli/src/commands/chaincode/query.ts index 356c95b69..d3dbee3c2 100644 --- a/samples/fabric/fabric-cli/src/commands/chaincode/query.ts +++ b/samples/fabric/fabric-cli/src/commands/chaincode/query.ts @@ -83,7 +83,12 @@ const command: GluegunCommand = { userid, true ) - logger.info(`Result from network query: ${result}`) + try { // If the result is a JSON + const resultJSON = JSON.stringify(JSON.parse(result), null, 4) + logger.info(`Result from network query: ${resultJSON}`) + } catch(err) { // If the result is not a JSON + logger.info(`Result from network query: ${result}`) + } } catch (err) { logger.error(`Error during fabric query: ${JSON.stringify(err)}`) } diff --git a/samples/fabric/fabric-cli/src/commands/configure/all.ts b/samples/fabric/fabric-cli/src/commands/configure/all.ts index 65fe891d1..b5754eee5 100644 --- a/samples/fabric/fabric-cli/src/commands/configure/all.ts +++ b/samples/fabric/fabric-cli/src/commands/configure/all.ts @@ -7,6 +7,7 @@ import { GluegunCommand } from 'gluegun' import * as path from 'path' import { commandHelp, addData, getNetworkConfig } from '../../helpers/helpers' +import { enrollAndRecordWalletIdentity } from '../../helpers/fabric-functions' import { generateMembership, generateAccessControl, @@ -52,8 +53,19 @@ const command: GluegunCommand = { logger.level = 'debug' logger.debug('Debugging is enabled') } + // for each network, generate network admin identity and IIN Agent identity (there's only one org per network) + const networkAdminUser = 'networkadmin' + const iinAgentUser = 'iinagent' + for (const network of array) { + // Create a network admin + print.info(`Creating network admin wallet identity for network: ${network}`) + await enrollAndRecordWalletIdentity(networkAdminUser, null, network, true, false) + // Create an IIN Agent + print.info(`Creating IIN Agent wallet identity for network: ${network}`) + await enrollAndRecordWalletIdentity(iinAgentUser, null, network, false, true) + } // for each network it - // 1. Generate network configs (membership, access control and verification policy) + // 1. Generate network configs (membership, access control, and verification policy) // 2. Add default data // 3. Loads configs from other networks in the credentials folder for (const network of array) { @@ -67,9 +79,10 @@ const command: GluegunCommand = { ) return } + const username = currusername || `user1` print.info(`Generating membership for network: ${network}`) - // 1. Generate network configs (membership, access control and verification policy) + // 1. Generate network configs (membership, access control, and verification policy) await generateMembership( process.env.DEFAULT_CHANNEL ? process.env.DEFAULT_CHANNEL : 'mychannel', process.env.DEFAULT_CHAINCODE diff --git a/samples/fabric/fabric-cli/src/commands/configure/create/all.ts b/samples/fabric/fabric-cli/src/commands/configure/create/all.ts index 53fb2b41e..e02b3562e 100644 --- a/samples/fabric/fabric-cli/src/commands/configure/create/all.ts +++ b/samples/fabric/fabric-cli/src/commands/configure/create/all.ts @@ -6,9 +6,11 @@ import { GluegunCommand } from 'gluegun' import { commandHelp, getNetworkConfig } from '../../../helpers/helpers' +import { getCredentialPath, enrollAndRecordWalletIdentity } from '../../../helpers/fabric-functions' import logger from '../../../helpers/logger' import * as path from 'path' import * as dotenv from 'dotenv' +import * as fs from 'fs' dotenv.config({ path: path.resolve(__dirname, '../../.env') }) import { @@ -65,6 +67,20 @@ const command: GluegunCommand = { return } + // Create wallet credentials + const credentialFolderPath = getCredentialPath() + const networkNames = fs + .readdirSync(credentialFolderPath, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .filter(item => item.name.startsWith('network')) // HACK until we add IIN Agents for Corda networks + .map(item => item.name) + for (const networkName of networkNames) { + print.info(`Creating network admin wallet identity for network: ${networkName}`) + await enrollAndRecordWalletIdentity('networkadmin', null, networkName, true, false) // Create a network admin + print.info(`Creating IIN Agent wallet identity for network ${networkName}`) + await enrollAndRecordWalletIdentity('iinagent', null, networkName, false, true) // Create an IIN Agent + } + // Membership logger.info(`Generating membership for ${options['local-network']}`) await generateMembership( diff --git a/samples/fabric/fabric-cli/src/commands/configure/network.ts b/samples/fabric/fabric-cli/src/commands/configure/network.ts index d31a79aca..c560d5640 100644 --- a/samples/fabric/fabric-cli/src/commands/configure/network.ts +++ b/samples/fabric/fabric-cli/src/commands/configure/network.ts @@ -6,10 +6,12 @@ import { GluegunCommand } from 'gluegun' import { commandHelp } from '../../helpers/helpers' +import { getCredentialPath, enrollAndRecordWalletIdentity } from '../../helpers/fabric-functions' import { configureNetwork } from '../../helpers/interop-setup/configure-network' import logger from '../../helpers/logger' import * as path from 'path' import * as dotenv from 'dotenv' +import * as fs from 'fs' dotenv.config({ path: path.resolve(__dirname, '../../.env') }) const command: GluegunCommand = { @@ -47,6 +49,21 @@ const command: GluegunCommand = { logger.level = 'debug' logger.debug('Debugging is enabled') } + + // Create wallet credentials + const credentialFolderPath = getCredentialPath() + const networkNames = fs + .readdirSync(credentialFolderPath, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .filter(item => item.name.startsWith('network')) // HACK until we add IIN Agents for Corda networks + .map(item => item.name) + for (const networkName of networkNames) { + print.info(`Creating network admin wallet identity for network: ${networkName}`) + await enrollAndRecordWalletIdentity('networkadmin', null, networkName, true, false) // Create a network admin + print.info(`Creating IIN Agent wallet identity for network ${networkName}`) + await enrollAndRecordWalletIdentity('iinagent', null, networkName, false, true) // Create an IIN Agent + } + await configureNetwork(options['local-network'], logger) process.exit() } diff --git a/samples/fabric/fabric-cli/src/commands/event-helper.ts b/samples/fabric/fabric-cli/src/commands/event-helper.ts new file mode 100644 index 000000000..15f2d095d --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event-helper.ts @@ -0,0 +1,24 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { commandHelp } from '../helpers/helpers' + +const command: GluegunCommand = { + name: 'event', + alias: ['e'], + description: 'Event Subscription and receive', + run: async toolbox => { + const { print } = toolbox + print.info('Command does nothing by itself') + commandHelp(print, toolbox, 'fabric-cli event', '', [], command, [ + 'event' + ]) + return + } +} + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/event/get-all.ts b/samples/fabric/fabric-cli/src/commands/event/get-all.ts new file mode 100644 index 000000000..7a6fb5924 --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event/get-all.ts @@ -0,0 +1,91 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { fabricHelper, getKeyAndCertForRemoteRequestbyUserName } from '../../helpers/fabric-functions' +import logger from '../../helpers/logger' +import { Utils, ICryptoKey } from 'fabric-common' +import { commandHelp, getNetworkConfig, handlePromise } from '../../helpers/helpers' +import { EventsManager } from '@hyperledger-labs/weaver-fabric-interop-sdk' +import { EventSubscriptionState, EventType } from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import * as fs from 'fs' +import * as path from 'path' + +const command: GluegunCommand = { + name: 'get-all', + alias: ['-gall'], + description: 'Get all received event states', + run: async toolbox => { + const { + print, + parameters: { options, array } + } = toolbox + if (options.help || options.h) { + commandHelp( + print, + toolbox, + `fabric-cli event get-all --network= --request-id="abc123"`, + 'fabric-cli event get-all --network= --request-id=', + [ + { + name: '--network', + description: + 'Local network for command. ' + }, + { + name: '--request-id', + description: + 'Request ID received during subscription.' + }, + { + name: '--debug', + description: + 'Shows debug logs when running. Disabled by default. To enable --debug=true' + } + ], + command, + ['event', 'get-all'] + ) + return + } + console.log("Get All Received Event States") + if (options.debug === 'true') { + logger.level = 'debug' + logger.debug('Debugging is enabled') + } + if (!options['network']) + { + print.error('--network needs to be specified') + return + } + if (!options['request-id']) + { + print.error('--request-id needs to be specified') + return + } + const networkName = options['network'] + const requestId = options['request-id'] + + const netConfig = getNetworkConfig(networkName) + if (!netConfig.connProfilePath || !netConfig.channelName || !netConfig.chaincode) { + throw new Error(`No valid config entry found for ${networkName}`) + } + try { + const response = await EventsManager.getAllReceivedEvents( + requestId, + netConfig.relayEndpoint + ) + console.log("Event States:", JSON.stringify(response, null, 4)) + } catch(e) { + console.log("Error: ", e.toString()) + } + + process.exit() + } +} + + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/event/get-subscription-status.ts b/samples/fabric/fabric-cli/src/commands/event/get-subscription-status.ts new file mode 100644 index 000000000..cebbe91c2 --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event/get-subscription-status.ts @@ -0,0 +1,91 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { fabricHelper, getKeyAndCertForRemoteRequestbyUserName } from '../../helpers/fabric-functions' +import logger from '../../helpers/logger' +import { Utils, ICryptoKey } from 'fabric-common' +import { commandHelp, getNetworkConfig, handlePromise } from '../../helpers/helpers' +import { EventsManager } from '@hyperledger-labs/weaver-fabric-interop-sdk' +import { EventSubscriptionState, EventType } from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import * as fs from 'fs' +import * as path from 'path' + +const command: GluegunCommand = { + name: 'get-subscription-status', + alias: ['-g'], + description: 'Get event subscription status', + run: async toolbox => { + const { + print, + parameters: { options, array } + } = toolbox + if (options.help || options.h) { + commandHelp( + print, + toolbox, + `fabric-cli event unsubscribe --network= --request-id="abc123"`, + 'fabric-cli event unsubscribe --network= --request-id=', + [ + { + name: '--network', + description: + 'Local network for command. ' + }, + { + name: '--request-id', + description: + 'Request ID received during subscription.' + }, + { + name: '--debug', + description: + 'Shows debug logs when running. Disabled by default. To enable --debug=true' + } + ], + command, + ['event', 'get-subscription-status'] + ) + return + } + console.log("Get Event Subscription Status") + if (options.debug === 'true') { + logger.level = 'debug' + logger.debug('Debugging is enabled') + } + if (!options['network']) + { + print.error('--network needs to be specified') + return + } + if (!options['request-id']) + { + print.error('--request-id needs to be specified') + return + } + const networkName = options['network'] + const requestId = options['request-id'] + + const netConfig = getNetworkConfig(networkName) + if (!netConfig.connProfilePath || !netConfig.channelName || !netConfig.chaincode) { + throw new Error(`No valid config entry found for ${networkName}`) + } + try { + const response = await EventsManager.getSubscriptionStatus( + requestId, + netConfig.relayEndpoint + ) + console.log("Event subscription status:", JSON.stringify(response)) + } catch(e) { + console.log("Error: ", e.toString()) + } + + process.exit() + } +} + + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/event/receive.ts b/samples/fabric/fabric-cli/src/commands/event/receive.ts new file mode 100644 index 000000000..cecb65d4b --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event/receive.ts @@ -0,0 +1,89 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { fabricHelper, getKeyAndCertForRemoteRequestbyUserName } from '../../helpers/fabric-functions' +import logger from '../../helpers/logger' +import { Utils, ICryptoKey } from 'fabric-common' +import { commandHelp, getNetworkConfig, handlePromise } from '../../helpers/helpers' +import { EventsManager } from '@hyperledger-labs/weaver-fabric-interop-sdk' +import { EventSubscriptionState, EventType } from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import * as fs from 'fs' +import * as path from 'path' +import * as express from 'express'; +import * as bodyParser from 'body-parser'; + +const command: GluegunCommand = { + name: 'receive', + alias: ['-r'], + description: 'Start simple http server to receive event', + run: async toolbox => { + const { + print, + parameters: { options, array } + } = toolbox + if (options.help || options.h) { + commandHelp( + print, + toolbox, + `fabric-cli event receive --port=8080"`, + 'fabric-cli event receive --port=', + [ + { + name: '--network', + description: + 'Local network for command. ' + }, + { + name: '--port', + description: + 'Port at which to start http server (Optional). Default: 8080' + }, + { + name: '--debug', + description: + 'Shows debug logs when running. Disabled by default. To enable --debug=true' + } + ], + command, + ['event', 'receive'] + ) + return + } + console.log("Start HTTP Server for handling events from remote network") + if (options.debug === 'true') { + logger.level = 'debug' + logger.debug('Debugging is enabled') + } + var port = 8080 + if (options.port) { + port = options.port + } + + const app = express(); + app.use(bodyParser.json()); + app.use(bodyParser.urlencoded({ + extended: false + })); + + app.post('/simple-event-callback', (req, res) => { + console.log("Received Event State: ", req.body.state) + if (req.body.state) { + const data = Buffer.from(req.body.state.View.data).toString('utf8'); + console.log("Received Event Data:", data); + } else { + console.log("Received Error Event:", req.body.error); + } + res.status(200).send('Ok'); + }); + console.log(`Server is running at https://localhost:${port}`); + console.log(`Use endpoint '/simple-event-callback' for event publishing`); + await app.listen(port); + } +} + + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/event/subscribe.ts b/samples/fabric/fabric-cli/src/commands/event/subscribe.ts new file mode 100644 index 000000000..a219fa3ef --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event/subscribe.ts @@ -0,0 +1,132 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { fabricHelper, getKeyAndCertForRemoteRequestbyUserName } from '../../helpers/fabric-functions' +import logger from '../../helpers/logger' +import { Utils, ICryptoKey } from 'fabric-common' +import { commandHelp, getNetworkConfig, handlePromise } from '../../helpers/helpers' +import { EventsManager } from '@hyperledger-labs/weaver-fabric-interop-sdk' +import { EventSubscriptionState, EventType } from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import * as fs from 'fs' +import * as path from 'path' + +const command: GluegunCommand = { + name: 'subscribe', + alias: ['-s'], + description: 'Initiate event subscribe', + run: async toolbox => { + const { + print, + parameters: { options, array } + } = toolbox + if (options.help || options.h) { + commandHelp( + print, + toolbox, + `fabric-cli event subscribe --network= --user=user1 src/data/event_sub_sample.json`, + 'fabric-cli event subscribe --network= --user= ', + [ + { + name: '--network', + description: + 'Local network for command. ' + }, + { + name: '--user', + description: + 'User for subscription. Default: user1' + }, + { + name: '--debug', + description: + 'Shows debug logs when running. Disabled by default. To enable --debug=true' + } + ], + command, + ['event', 'subscribe'] + ) + return + } + console.log("Event Subscription") + if (options.debug === 'true') { + logger.level = 'debug' + logger.debug('Debugging is enabled') + } + if (array.length != 1) { + print.error('Not enough arguments supplied') + return + } + if (!options['network']) + { + print.error('--network needs to be specified') + return + } + if (!options['user']) { + options['user'] = `user1` //Default user + } + + const networkName = options['network'] + const user = options['user'] + + const filepath = path.resolve(array[0]) + + const netConfig = getNetworkConfig(networkName) + if (!netConfig.connProfilePath || !netConfig.channelName || !netConfig.chaincode) { + throw new Error(`No valid config entry found for ${networkName}`) + } + + const { gateway, wallet, contract } = await fabricHelper({ + channel: netConfig.channelName, + contractName: process.env.DEFAULT_CHAINCODE ? process.env.DEFAULT_CHAINCODE : 'interop', + connProfilePath: netConfig.connProfilePath, + networkName, + mspId: netConfig.mspId, + logger, + discoveryEnabled: true, + userString: user + }) + + const [keyCert, keyCertError] = await handlePromise( + getKeyAndCertForRemoteRequestbyUserName(wallet, user) + ) + if (keyCertError) { + throw new Error(`Error getting key and cert ${keyCertError}`) + } + + const data = JSON.parse(fs.readFileSync(filepath).toString()) + for (let i = 0 ; i < data.length ; i++) { + const eventMatcher = EventsManager.createEventMatcher(data[i].event_matcher) + const eventPublicationSpec = EventsManager.createEventPublicationSpec(data[i].event_publication_spec) + + try { + const response = await EventsManager.subscribeRemoteEvent( + contract, + eventMatcher, + eventPublicationSpec, + networkName, + netConfig.mspId, + netConfig.relayEndpoint, + { address: data[i].view_address, Sign: true }, + keyCert + ) + + if (response.getStatus() == EventSubscriptionState.STATUS.SUBSCRIBED) { + console.log("Event Subscription Status Success with requestId:", response.getRequestId(), 'and event matcher:', JSON.stringify(eventMatcher.toObject())) + } else { + console.log("Unknown error") + } + } catch(e) { + console.log("Error: ", e.toString()) + } + } + + process.exit() + } +} + + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/event/unsubscribe.ts b/samples/fabric/fabric-cli/src/commands/event/unsubscribe.ts new file mode 100644 index 000000000..770725160 --- /dev/null +++ b/samples/fabric/fabric-cli/src/commands/event/unsubscribe.ts @@ -0,0 +1,154 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { GluegunCommand } from 'gluegun' +import { fabricHelper, getKeyAndCertForRemoteRequestbyUserName } from '../../helpers/fabric-functions' +import logger from '../../helpers/logger' +import { Utils, ICryptoKey } from 'fabric-common' +import { commandHelp, getNetworkConfig, handlePromise } from '../../helpers/helpers' +import { EventsManager } from '@hyperledger-labs/weaver-fabric-interop-sdk' +import { EventSubscriptionState, EventType } from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import * as fs from 'fs' +import * as path from 'path' + +const command: GluegunCommand = { + name: 'unsubscribe', + alias: ['-u'], + description: 'Initiate event unsubscribe', + run: async toolbox => { + const { + print, + parameters: { options, array } + } = toolbox + if (options.help || options.h) { + commandHelp( + print, + toolbox, + `fabric-cli event unsubscribe --network= --user=user1 --request-ids="abc123:efg456" src/data/event_sub_sample.json`, + 'fabric-cli event unsubscribe --network= --user= --request-ids= ', + [ + { + name: '--network', + description: + 'Local network for command. ' + }, + { + name: '--user', + description: + 'User for subscription. Default: user1' + }, + { + name: '--request-ids', + description: + 'Colon-separated list of request IDs received during subscriptions. A request ID can be left blank, indicating that the corresponding JSON (i.e., at the same index) in the file should not be unsubscribed' + }, + { + name: '--debug', + description: + 'Shows debug logs when running. Disabled by default. To enable --debug=true' + } + ], + command, + ['event', 'unsubscribe'] + ) + return + } + console.log("Event Unsubscription") + if (options.debug === 'true') { + logger.level = 'debug' + logger.debug('Debugging is enabled') + } + if (array.length != 1) { + print.error('Not enough arguments supplied') + return + } + if (!options['network']) + { + print.error('--network needs to be specified') + return + } + if (!options['request-ids']) + { + print.error('--request-ids needs to be specified') + return + } + if (!options['user']) { + options['user'] = `user1` //Default user + } + + const networkName = options['network'] + const user = options['user'] + const requestIds = options['request-ids'] + + const filepath = path.resolve(array[0]) + + const netConfig = getNetworkConfig(networkName) + if (!netConfig.connProfilePath || !netConfig.channelName || !netConfig.chaincode) { + throw new Error(`No valid config entry found for ${networkName}`) + } + + const { gateway, wallet, contract } = await fabricHelper({ + channel: netConfig.channelName, + contractName: process.env.DEFAULT_CHAINCODE ? process.env.DEFAULT_CHAINCODE : 'interop', + connProfilePath: netConfig.connProfilePath, + networkName, + mspId: netConfig.mspId, + logger, + discoveryEnabled: true, + userString: user + }) + + const [keyCert, keyCertError] = await handlePromise( + getKeyAndCertForRemoteRequestbyUserName(wallet, user) + ) + if (keyCertError) { + throw new Error(`Error getting key and cert ${keyCertError}`) + } + + const requestIdList = requestIds.split(':') + const data = JSON.parse(fs.readFileSync(filepath).toString()) + if (requestIdList.length !== data.length) { + throw new Error(`Mismatching request ID list and subscription JSON counts. #Request IDs = ${requestIdList.length}, #JSON items = ${data.length}.`) + } + for (let i = 0 ; i < data.length ; i++) { + if (requestIdList[i] === '') { + // Don't unsubscribe + continue; + } + + // Unsubscribe + const eventMatcher = EventsManager.createEventMatcher(data[i].event_matcher) + const eventPublicationSpec = EventsManager.createEventPublicationSpec(data[i].event_publication_spec) + + try { + const response = await EventsManager.unsubscribeRemoteEvent( + contract, + eventMatcher, + eventPublicationSpec, + requestIdList[i], + networkName, + netConfig.mspId, + netConfig.relayEndpoint, + { address: data[i].view_address, Sign: true }, + keyCert + ) + + if (response.getStatus() == EventSubscriptionState.STATUS.UNSUBSCRIBED) { + console.log("Event Unsubscription Success for requestId:", response.getRequestId(), 'and event matcher:', JSON.stringify(eventMatcher.toObject())) + } else { + console.log("Unknown error") + } + } catch(e) { + console.log("Error: ", e.toString()) + } + } + + process.exit() + } +} + + +module.exports = command diff --git a/samples/fabric/fabric-cli/src/commands/user/add.ts b/samples/fabric/fabric-cli/src/commands/user/add.ts index 727800c1f..2c4329c08 100644 --- a/samples/fabric/fabric-cli/src/commands/user/add.ts +++ b/samples/fabric/fabric-cli/src/commands/user/add.ts @@ -5,10 +5,10 @@ */ import { GluegunCommand } from 'gluegun' -import { commandHelp, getNetworkConfig, saveUserCertToFile } from '../../helpers/helpers' +import { commandHelp } from '../../helpers/helpers' import * as fs from 'fs' import * as path from 'path' -import { walletSetup } from '../../helpers/fabric-functions' +import { enrollAndRecordWalletIdentity } from '../../helpers/fabric-functions' const command: GluegunCommand = { name: 'add', @@ -23,7 +23,7 @@ const command: GluegunCommand = { print, toolbox, `fabric-cli user add --target-network=network1 --id=user --secret=userpw`, - `fabric-cli user add --target-network= --id= --secret=`, + `fabric-cli user add --target-network= --id= --secret= [--network-admin] [--iin-agent]`, [ { name: '--target-network', @@ -39,6 +39,16 @@ const command: GluegunCommand = { name: '--secret', description: 'password for the username being added (Optional: random password is used)' + }, + { + name: '--network-admin', + description: + 'Flag to indicate whether this user should have a network admin attribute.' + }, + { + name: '--iin-agent', + description: + 'Flag to indicate whether this user should have an IIN agent attribute.' } ], command, @@ -53,23 +63,7 @@ const command: GluegunCommand = { print.error('--id is required arguement, please specify the username here') } - const userName = options['id'] - const userPwd = options['secret'] - const net = getNetworkConfig(options['target-network']) - - const ccpPath = path.resolve(__dirname, net.connProfilePath) - const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8')) - console.log(net) - - let wallet = await walletSetup(options['target-network'], - ccp, - net.mspId, - userName, - userPwd, - true - ) - - saveUserCertToFile(userName, options['target-network']) + await enrollAndRecordWalletIdentity(options['id'], options['secret'], options['target-network'], options['network-admin'], options['iin-agent']) process.exit() } } diff --git a/samples/fabric/fabric-cli/src/data/assets.json b/samples/fabric/fabric-cli/src/data/assets.json index bf80ddcd2..c00893177 100644 --- a/samples/fabric/fabric-cli/src/data/assets.json +++ b/samples/fabric/fabric-cli/src/data/assets.json @@ -14,5 +14,69 @@ "issuer": "treasury", "facevalue": "700", "maturitydate": "01 Jul 45 00:00 MST" + }, + "a05": { + "assetType": "bond01", + "id": "a05", + "owner": "alice", + "issuer": "treasury", + "facevalue": "300", + "maturitydate": "05 May 47 00:00 MST" + }, + "a06": { + "assetType": "bond01", + "id": "a06", + "owner": "bob", + "issuer": "treasury", + "facevalue": "300", + "maturitydate": "05 Mar 47 00:00 MST" + }, + "a07": { + "assetType": "bond02", + "id": "a07", + "owner": "alice", + "issuer": "treasury", + "facevalue": "900", + "maturitydate": "24 Nov 42 00:00 MST" + }, + "a08": { + "assetType": "bond02", + "id": "a08", + "owner": "bob", + "issuer": "treasury", + "facevalue": "100", + "maturitydate": "24 Dec 42 00:00 MST" + }, + "a09": { + "assetType": "bond02", + "id": "a09", + "owner": "alice", + "issuer": "treasury", + "facevalue": "500", + "maturitydate": "06 Apr 44 00:00 MST" + }, + "a10": { + "assetType": "bond02", + "id": "a10", + "owner": "bob", + "issuer": "treasury", + "facevalue": "800", + "maturitydate": "06 Aug 44 00:00 MST" + }, + "a11": { + "assetType": "bond03", + "id": "a11", + "owner": "alice", + "issuer": "treasury", + "facevalue": "200", + "maturitydate": "15 Jul 50 00:00 MST" + }, + "a12": { + "assetType": "bond03", + "id": "a12", + "owner": "bob", + "issuer": "treasury", + "facevalue": "700", + "maturitydate": "15 Jun 50 00:00 MST" } } diff --git a/samples/fabric/fabric-cli/src/data/credentials/network1/access-control.json b/samples/fabric/fabric-cli/src/data/credentials/network1/access-control.json index 9146b7417..42d5e2c55 100644 --- a/samples/fabric/fabric-cli/src/data/credentials/network1/access-control.json +++ b/samples/fabric/fabric-cli/src/data/credentials/network1/access-control.json @@ -1 +1 @@ -{"securityDomain":"network1","rules":[{"principal":"Org1MSP","principalType":"ca","resource":"mychannel:simplestate:Read:*","read":true}]} +{"securityDomain":"network1","rules":[{"principal":"Org1MSP","principalType":"ca","resource":"mychannel:simplestate:Read:*","read":true}]} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials/network1/membership.json b/samples/fabric/fabric-cli/src/data/credentials/network1/membership.json index 8fe5f465f..1c1fd61b6 100644 --- a/samples/fabric/fabric-cli/src/data/credentials/network1/membership.json +++ b/samples/fabric/fabric-cli/src/data/credentials/network1/membership.json @@ -1 +1 @@ -{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials/network1/verification-policy.json b/samples/fabric/fabric-cli/src/data/credentials/network1/verification-policy.json index 1e8556e3b..8f6aaa053 100644 --- a/samples/fabric/fabric-cli/src/data/credentials/network1/verification-policy.json +++ b/samples/fabric/fabric-cli/src/data/credentials/network1/verification-policy.json @@ -1 +1 @@ -{"securityDomain":"network1","identifiers":[{"pattern":"mychannel:simplestate:Read:*","policy":{"type":"Signature","criteria":["Org1MSP"]}}]} +{"securityDomain":"network1","identifiers":[{"pattern":"mychannel:simplestate:Read:*","policy":{"type":"Signature","criteria":["Org1MSP"]}}]} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials/network2/access-control.json b/samples/fabric/fabric-cli/src/data/credentials/network2/access-control.json index d2711ab18..c5fd1f434 100644 --- a/samples/fabric/fabric-cli/src/data/credentials/network2/access-control.json +++ b/samples/fabric/fabric-cli/src/data/credentials/network2/access-control.json @@ -1 +1 @@ -{"securityDomain":"network2","rules":[{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestate:Read:*","read":true}]} \ No newline at end of file +{"securityDomain":"network2","rules":[{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestate:Read:*","read":true}]} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials/network2/membership.json b/samples/fabric/fabric-cli/src/data/credentials/network2/membership.json index fd7d03ede..12f3d4d0d 100644 --- a/samples/fabric/fabric-cli/src/data/credentials/network2/membership.json +++ b/samples/fabric/fabric-cli/src/data/credentials/network2/membership.json @@ -1 +1 @@ -{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials_docker/network1/membership.json b/samples/fabric/fabric-cli/src/data/credentials_docker/network1/membership.json index 8fe5f465f..1c1fd61b6 100644 --- a/samples/fabric/fabric-cli/src/data/credentials_docker/network1/membership.json +++ b/samples/fabric/fabric-cli/src/data/credentials_docker/network1/membership.json @@ -1 +1 @@ -{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/credentials_docker/network2/access-control.json b/samples/fabric/fabric-cli/src/data/credentials_docker/network2/access-control.json index bc28c761e..8b69549c8 100644 --- a/samples/fabric/fabric-cli/src/data/credentials_docker/network2/access-control.json +++ b/samples/fabric/fabric-cli/src/data/credentials_docker/network2/access-control.json @@ -1 +1 @@ -{"securityDomain":"network2","rules":[{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestate:Read:*","read":true},{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestatewithacl:Read:*","read":true}]} \ No newline at end of file +{"securityDomain":"network2","rules":[{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestate:Read:*","read":true},{"principal":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n","principalType":"certificate","resource":"mychannel:simplestatewithacl:Read:*","read":true}]} diff --git a/samples/fabric/fabric-cli/src/data/credentials_docker/network2/membership.json b/samples/fabric/fabric-cli/src/data/credentials_docker/network2/membership.json index fd7d03ede..12f3d4d0d 100644 --- a/samples/fabric/fabric-cli/src/data/credentials_docker/network2/membership.json +++ b/samples/fabric/fabric-cli/src/data/credentials_docker/network2/membership.json @@ -1 +1 @@ -{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/data/event_sub_sample.json b/samples/fabric/fabric-cli/src/data/event_sub_sample.json new file mode 100644 index 000000000..36dc79306 --- /dev/null +++ b/samples/fabric/fabric-cli/src/data/event_sub_sample.json @@ -0,0 +1,92 @@ +[ + { + "event_matcher": { + "eventType": 1, + "eventClassId": "", + "transactionLedgerId": "mychannel", + "transactionContractId": "simplestate", + "transactionFunc": "create" + }, + "event_publication_spec": { + "ccArgs": ["keyType", ""], + "chaincodeId": "simplestate", + "driverId": "network1", + "ccFunc": "Create", + "channelId": "mychannel", + "replaceArgIndex": 1 + }, + "view_address": "localhost:9083/network2/mychannel:simplestate:Read:a", + "confidential": false + }, + { + "event_matcher": { + "eventType": 1, + "eventClassId": "", + "transactionLedgerId": "mychannel", + "transactionContractId": "simplestate", + "transactionFunc": "createandreturnkey" + }, + "event_publication_spec": { + "ccArgs": ["keyTypeDynamic", ""], + "chaincodeId": "simplestate", + "driverId": "network1", + "ccFunc": "Create", + "channelId": "mychannel", + "replaceArgIndex": 1 + }, + "view_address": "localhost:9083/network2/mychannel:simplestate:Read:?", + "confidential": false + }, + { + "event_matcher": { + "eventType": 1, + "eventClassId": "CreateSimpleState", + "transactionLedgerId": "mychannel", + "transactionContractId": "simplestate", + "transactionFunc": "create" + }, + "event_publication_spec": { + "ccArgs": ["keyClass", ""], + "chaincodeId": "simplestate", + "driverId": "network1", + "ccFunc": "Create", + "channelId": "mychannel", + "replaceArgIndex": 1 + }, + "view_address": "localhost:9083/network2/mychannel:simplestate:Read:a", + "confidential": false + }, + { + "event_matcher": { + "eventType": 1, + "eventClassId": "CreateSimpleState", + "transactionLedgerId": "mychannel", + "transactionContractId": "simplestate", + "transactionFunc": "create" + }, + "event_publication_spec": { + "ccArgs": ["keyClassDynamic", ""], + "chaincodeId": "simplestate", + "driverId": "network1", + "ccFunc": "Create", + "channelId": "mychannel", + "replaceArgIndex": 1 + }, + "view_address": "localhost:9083/network2/mychannel:simplestate:Read:?", + "confidential": false + }, + { + "event_matcher": { + "eventType": 1, + "eventClassId": "CreateSimpleState", + "transactionLedgerId": "mychannel", + "transactionContractId": "simplestate", + "transactionFunc": "create" + }, + "event_publication_spec": { + "appUrl": "http://localhost:8080/simple-event-callback" + }, + "view_address": "localhost:9083/network2/mychannel:simplestate:Read:a", + "confidential": false + } +] diff --git a/samples/fabric/fabric-cli/src/helpers/fabric-functions.ts b/samples/fabric/fabric-cli/src/helpers/fabric-functions.ts index 7cf68917f..76b1c3580 100644 --- a/samples/fabric/fabric-cli/src/helpers/fabric-functions.ts +++ b/samples/fabric/fabric-cli/src/helpers/fabric-functions.ts @@ -5,10 +5,13 @@ */ import { Gateway, Wallets, Contract, X509Identity } from 'fabric-network' -import { handlePromise } from './helpers' +import { commandHelp, getNetworkConfig, saveUserCertToFile, handlePromise } from './helpers' import * as FabricCAServices from 'fabric-ca-client' import { Certificate } from '@fidm/x509' import { Utils, ICryptoKey } from 'fabric-common' +import * as membership_pb from "@hyperledger-labs/weaver-protos-js/common/membership_pb" +import * as iin_agent_pb from "@hyperledger-labs/weaver-protos-js/identity/agent_pb" +import { InteroperableHelper } from '@hyperledger-labs/weaver-fabric-interop-sdk' import * as path from 'path' import * as dotenv from 'dotenv' dotenv.config({ path: path.resolve(__dirname, '../../.env') }) @@ -25,10 +28,7 @@ const getUserCertBase64 = async ( networkName: string, username: string ) => { - const walletPath = process.env.WALLET_PATH - ? process.env.WALLET_PATH - : path.join(__dirname, '../', `wallet-${networkName}`) - const wallet = await Wallets.newFileSystemWallet(walletPath) + const wallet = await getWalletForNetwork(networkName) const userId = await wallet.get(username) if (!userId) { throw new Error(`User ${username} not present in wallet of ${networkName}.`) @@ -42,10 +42,11 @@ const walletSetup = async ( mspId: string, userName: string, userPwd: string = '', + isNetworkAdmin: boolean = false, + isIINAgent: boolean = false, register: boolean = false, logger: any = console ) => { - // Create a new CA client for interacting with the CA. // Create a new CA client for interacting with the CA. const org = ccp.client['organization'] const caName = ccp.organizations[org]['certificateAuthorities'][0] @@ -53,14 +54,10 @@ const walletSetup = async ( const ca = new FabricCAServices(caURL) const ident = ca.newIdentityService() - const walletPath = process.env.WALLET_PATH - ? process.env.WALLET_PATH - : path.join(__dirname, '../', `wallet-${networkName}`) - const wallet = await Wallets.newFileSystemWallet(walletPath) - - logger.info(`Wallet Setup: wallet path: ${walletPath}`) + const wallet = await getWalletForNetwork(networkName) - // build a user object for authenticating with the CA // Check to see if we've already enrolled the admin user. + // build a user object for authenticating with the CA + // Check to see if we've already enrolled the admin user. let adminIdentity = await wallet.get('admin') if (adminIdentity) { @@ -87,15 +84,22 @@ const walletSetup = async ( const provider = wallet.getProviderRegistry().getProvider(adminIdentity.type) const adminUser = await provider.getUserContext(adminIdentity, 'admin') const identity = await wallet.get(userName) - logger.info(`user ${userName}`) + logger.debug(`user ${userName}`) if (!identity) { // Register the user, enroll the user, and import the new identity into the wallet. if (!register) { logger.error(`Identity ${userName} does not exist. Please add user in the network.\n`) return } - var secret, enrollment; + var secret, enrollment var enrollmentDone = false + var attributes = [] + if (isNetworkAdmin) { + attributes.push({ "name": "network-admin", "value": "true", "ecert": true }) + } + if (isIINAgent) { + attributes.push({ "name": "iin-agent", "value": "true", "ecert": true }) + } try { if (!userPwd) { secret = await ca.register( @@ -103,7 +107,8 @@ const walletSetup = async ( affiliation: 'org1.department1', enrollmentID: userName, maxEnrollments: -1, - role: 'client' + role: 'client', + attrs: attributes }, adminUser ) @@ -115,7 +120,8 @@ const walletSetup = async ( enrollmentID: userName, enrollmentSecret: userPwd, maxEnrollments: -1, - role: 'client' + role: 'client', + attrs: attributes }, adminUser ) @@ -156,23 +162,45 @@ const walletSetup = async ( await wallet.put(userName, x509Identity) } else { - logger.info(`Identity ${userName} already exists.\n`) + logger.debug(`Identity ${userName} already exists.\n`) } return wallet } + +const enrollAndRecordWalletIdentity = async ( + userName: string, + userPwd: string, + networkName: string, + isNetworkAdmin: boolean = false, + isIINAgent: boolean = false, + logger: any = console +) => { + const net = getNetworkConfig(networkName) + const ccpPath = path.resolve(__dirname, net.connProfilePath) + const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8')) + logger.info(net) + + const wallet = await walletSetup(networkName, ccp, net.mspId, userName, userPwd, isNetworkAdmin, isIINAgent, true) + saveUserCertToFile(userName, networkName) + + return wallet +} + const getCurrentNetworkCredentialPath = (networkName: string): string => { const credentialsPath = process.env.MEMBER_CREDENTIAL_FOLDER ? path.resolve(__dirname, process.env.MEMBER_CREDENTIAL_FOLDER, networkName) : path.join(__dirname, '../data', 'credentials', networkName) return credentialsPath } + const getCredentialPath = (): string => { const credentialsPath = process.env.MEMBER_CREDENTIAL_FOLDER ? path.resolve(__dirname, process.env.MEMBER_CREDENTIAL_FOLDER) : path.join(__dirname, '../data', 'credentials') return credentialsPath } + const generateAccessControl = async ( channel: string, contractName: string, @@ -269,6 +297,7 @@ const generateVerificationPolicy = async ( JSON.stringify(verificationPolicy) ) } + const generateMembership = async ( channel: string, contractName: string, @@ -289,7 +318,8 @@ const generateMembership = async ( const network = await gateway.getNetwork(channel) const mspConfig = await getMspConfig(network, logger) const membershipJSON = formatMSP(mspConfig, networkName) - logger.debug(`membershipJSON: ${JSON.stringify(membershipJSON)}`) + const membershipJSONStr = JSON.stringify(membershipJSON) + logger.debug(`membershipJSON: ${membershipJSONStr}`) const credentialsPath = getCurrentNetworkCredentialPath(networkName) logger.debug(`Credentials Path: ${credentialsPath}`) @@ -300,9 +330,84 @@ const generateMembership = async ( fs.writeFileSync( path.join(credentialsPath, `membership.json`), - JSON.stringify(membershipJSON) + membershipJSONStr ) - return mspConfig + + // Generate protobufs and attestations for all other networks that have IIN Agents + const credentialFolderPath = getCredentialPath() + const otherNetworkNames = fs + .readdirSync(credentialFolderPath, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .filter(item => item.name.startsWith('network')) // HACK until we add IIN Agents for Corda networks + .map(item => item.name) + // Reorder the array so that the local network is the first element + // We need to record local membership before recording other networks' memberships + otherNetworkNames.splice(otherNetworkNames.indexOf(networkName), 1) + + if (otherNetworkNames.length > 0) { + // Convert membership object to protobuf + let membershipProto = new membership_pb.Membership() + membershipProto.setSecuritydomain(membershipJSON.securityDomain) + Object.keys(membershipJSON.members).forEach( (memberName, index) => { + const certInfo = membershipJSON.members[memberName] + let memberProto = new membership_pb.Member() + memberProto.setType(certInfo.type) + memberProto.setValue(certInfo.value) + membershipProto.getMembersMap().set(memberName, memberProto) + }) + + // For every other network, generate a counter attested membership set + const serializedMembership = membershipProto.serializeBinary() + const serializedMembershipBase64 = Buffer.from(serializedMembership).toString('base64') + const nonce = 'j849j94j40f440fkfjkld0e043' // Some random string + const membershipBase64WithNonce = serializedMembershipBase64 + nonce + // Get wallet key and cert for this network's IIN Agent + const localWallet = await getWalletForNetwork(networkName) + const localKeyCert = await getKeyAndCertForRemoteRequestbyUserName(localWallet, 'iinagent') + // Sign using wallet identity + let securityDomainMember = new iin_agent_pb.SecurityDomainMemberIdentity() + securityDomainMember.setSecurityDomain(membershipJSON.securityDomain) + securityDomainMember.setMemberId(Object.keys(membershipJSON.members)[0]) + let localAttestation = new iin_agent_pb.Attestation() + localAttestation.setUnitIdentity(securityDomainMember) + localAttestation.setCertificate(localKeyCert.cert) + const localSig = InteroperableHelper.signMessage(membershipBase64WithNonce, localKeyCert.key.toBytes()).toString("base64") + localAttestation.setSignature(localSig) + localAttestation.setNonce(nonce) + let attestedMembershipSet = new iin_agent_pb.CounterAttestedMembership.AttestedMembershipSet() + attestedMembershipSet.setMembership(serializedMembershipBase64) + attestedMembershipSet.setAttestationsList( [ localAttestation ] ) + const serializedAttestedMembershipSet = attestedMembershipSet.serializeBinary() + const serializedttestedMembershipSetBase64 = Buffer.from(serializedAttestedMembershipSet).toString('base64') + const serializedttestedMembershipSetBase64WithNonce = serializedttestedMembershipSetBase64 + nonce + for (const otherNetworkName of otherNetworkNames) { + // Get wallet key and cert for other network's IIN Agent + const otherWallet = await getWalletForNetwork(otherNetworkName) + const otherKeyCert = await getKeyAndCertForRemoteRequestbyUserName(otherWallet, 'iinagent') + // Sign using wallet identity + let otherSecurityDomainMember = new iin_agent_pb.SecurityDomainMemberIdentity() + otherSecurityDomainMember.setSecurityDomain(otherNetworkName) + otherSecurityDomainMember.setMemberId(getNetworkConfig(otherNetworkName).mspId) + let otherAttestation = new iin_agent_pb.Attestation() + otherAttestation.setUnitIdentity(otherSecurityDomainMember) + otherAttestation.setCertificate(otherKeyCert.cert) + const otherSig = InteroperableHelper.signMessage(serializedttestedMembershipSetBase64WithNonce, otherKeyCert.key.toBytes()).toString("base64") + otherAttestation.setSignature(otherSig) + otherAttestation.setNonce(nonce) + + // Generate chaincode argument and save it in a file + let counterAttestedMembership = new iin_agent_pb.CounterAttestedMembership() + counterAttestedMembership.setAttestedMembershipSet(serializedttestedMembershipSetBase64) + counterAttestedMembership.setAttestationsList( [ otherAttestation ] ) + + fs.writeFileSync( + path.join(credentialsPath, `attested-membership-${otherNetworkName}.proto.serialized`), + Buffer.from(counterAttestedMembership.serializeBinary()).toString('base64') + ) + } + } + + return membershipJSON } const formatMSP = (mspConfig: MspConfig, networkId: string) => { @@ -448,7 +553,7 @@ async function fabricHelper({ userPwd = `user1pw` } - const wallet = await walletSetup(networkName, ccp, mspId, userString, userPwd, registerUser, logger) + const wallet = await walletSetup(networkName, ccp, mspId, userString, userPwd, false, false, registerUser, logger) // Check to see if we've already enrolled the user. const identity = await wallet.get(userString) if (!identity) { @@ -514,6 +619,7 @@ async function query( throw new Error(error) } } + async function invoke( query: Query, connProfilePath: string, @@ -554,6 +660,7 @@ async function invoke( throw new Error(error) } } + const getKeyAndCertForRemoteRequestbyUserName = async ( wallet: any, username: string @@ -577,12 +684,24 @@ const getKeyAndCertForRemoteRequestbyUserName = async ( return { key: privKey, cert: identity.credentials.certificate } } +const getWalletForNetwork = async ( + networkName: string, +) => { + const walletPath = process.env.WALLET_PATH + ? process.env.WALLET_PATH + : path.join(__dirname, '../', `wallet-${networkName}`) + + const wallet = await Wallets.newFileSystemWallet(walletPath) + return wallet +} + export { getUserCertBase64, walletSetup, invoke, query, + enrollAndRecordWalletIdentity, fabricHelper, generateMembership, generateAccessControl, diff --git a/samples/fabric/fabric-cli/src/helpers/helpers.ts b/samples/fabric/fabric-cli/src/helpers/helpers.ts index 4131e35f8..4acba481b 100644 --- a/samples/fabric/fabric-cli/src/helpers/helpers.ts +++ b/samples/fabric/fabric-cli/src/helpers/helpers.ts @@ -830,6 +830,7 @@ const interopHelper = async ( Sign: true }], keyCert, + [], false, options['relay-tls'] === 'true', relayTlsCAFiles, @@ -840,10 +841,14 @@ const interopHelper = async ( interopFlowResponse.views[0].toObject() )}. Interop Flow result: ${interopFlowResponse.result || 'successful'}` ) + logger.debug(`ViewB64: ${Buffer.from(interopFlowResponse.views[0].serializeBinary()).toString('base64')}`) const remoteValue = (options['e2e-confidentiality'] === 'true' ? InteroperableHelper.getResponseDataFromView(interopFlowResponse.views[0], keyCert.key.toBytes()) : InteroperableHelper.getResponseDataFromView(interopFlowResponse.views[0]) ) + if (remoteValue.contents) { + logger.debug(`ViewB64Contents: ${Buffer.from(remoteValue.contents).toString('base64')}`) + } spinner.succeed( `Called Function ${applicationFunction}. With Args: ${invokeObject.ccArgs} ${remoteValue.data}` ) diff --git a/samples/fabric/fabric-cli/src/helpers/interop-setup/configure-network.ts b/samples/fabric/fabric-cli/src/helpers/interop-setup/configure-network.ts index c56b701cd..2a627a7ae 100644 --- a/samples/fabric/fabric-cli/src/helpers/interop-setup/configure-network.ts +++ b/samples/fabric/fabric-cli/src/helpers/interop-setup/configure-network.ts @@ -13,7 +13,7 @@ import { } from '../fabric-functions' import { handlePromise, getNetworkConfig } from '../helpers' -const helperInvoke = async (ccFunc, ccArg, ...args) => { +const helperInvoke = async (userId, ccFunc, ccArg, ...args) => { const [contractName, channelName, connProfilePath, networkName, logger] = args const [invokeResponse, invokeError] = await handlePromise( invoke( @@ -26,17 +26,20 @@ const helperInvoke = async (ccFunc, ccArg, ...args) => { connProfilePath, networkName, global.__DEFAULT_MSPID__, - logger + logger, + userId, + (userId === '') ) ) logger.debug(`${ccFunc} Invoke ${JSON.stringify(invokeResponse)}`) if (invokeError) { - logger.error(`${ccFunc} Invoke Error: ${ccArg}`) + logger.error(`${ccFunc} Invoke Error: ${ccFunc}: ${ccArg}`) throw new Error(`${ccFunc} Invoke Error ${invokeError}`) } else { logger.info(`Successfully invoked ${ccFunc}`) } } + const configureNetwork = async (mainNetwork: string, logger: any = console) => { const networkEnv = getNetworkConfig(mainNetwork) logger.debug(`NetworkEnv: ${JSON.stringify(networkEnv)}`) @@ -52,15 +55,44 @@ const configureNetwork = async (mainNetwork: string, logger: any = console) => { .readdirSync(credentialFolderPath, { withFileTypes: true }) .filter(dirent => dirent.isDirectory()) .map(item => item.name) + // Reorder the array so that the local network is the first element + // We need to record local membership before recording other networks' memberships + networkFolders.splice(networkFolders.indexOf(mainNetwork), 1) + networkFolders.splice(0, 0, mainNetwork) + for (const index in networkFolders) { const network = networkFolders[index] + if (network === mainNetwork) { + // A network needs to load/record only other networks' credentials + const localMembershipPath = path.join( + getCurrentNetworkCredentialPath(network), + 'membership.json' + ) + if ( + !fs.existsSync(localMembershipPath) + ) { + logger.error(`Missing credential file for network: ${network}`) + } else { + await loadLocalHelper( + networkEnv.connProfilePath, + mainNetwork, + process.env.DEFAULT_CHANNEL ? process.env.DEFAULT_CHANNEL : 'mychannel', + process.env.DEFAULT_CHAINCODE + ? process.env.DEFAULT_CHAINCODE + : 'interop', + localMembershipPath, + logger + ) + } + continue; + } const accessControlPath = path.join( getCurrentNetworkCredentialPath(network), 'access-control.json' ) const membershipPath = path.join( getCurrentNetworkCredentialPath(network), - 'membership.json' + (network.startsWith('network') ? 'attested-membership-' + mainNetwork + '.proto.serialized' : 'membership.json') ) const verificationPolicyPath = path.join( getCurrentNetworkCredentialPath(network), @@ -80,6 +112,7 @@ const configureNetwork = async (mainNetwork: string, logger: any = console) => { process.env.DEFAULT_CHAINCODE ? process.env.DEFAULT_CHAINCODE : 'interop', + network, accessControlPath, membershipPath, verificationPolicyPath, @@ -88,11 +121,37 @@ const configureNetwork = async (mainNetwork: string, logger: any = console) => { } } } + +const loadLocalHelper = async ( + connProfilePath: string, + networkName: string, + channelName: string, + contractName: string, + localMembershipPath: string, + logger: any = console +): Promise => { + const localMembership = Buffer.from(fs.readFileSync(localMembershipPath)).toString() + const helperInvokeArgs = [ + contractName, + channelName, + connProfilePath, + networkName, + logger + ] + try { + await helperInvoke('networkadmin', 'CreateLocalMembership', localMembership, ...helperInvokeArgs) + } catch (e) { + logger.info('CreateLocalMembership attempting Update') + await helperInvoke('networkadmin', 'UpdateLocalMembership', localMembership, ...helperInvokeArgs) + } +} + const configureNetworkHelper = async ( connProfilePath: string, networkName: string, channelName: string, contractName: string, + targetNetwork: string, accessControlPath: string, membershipPath: string, verificationPolicyPath: string, @@ -106,7 +165,7 @@ const configureNetworkHelper = async ( fs.readFileSync(verificationPolicyPath) ).toString() - const membership = Buffer.from(fs.readFileSync(membershipPath)).toString() + const attestedMembership = Buffer.from(fs.readFileSync(membershipPath)).toString() const helperInvokeArgs = [ contractName, channelName, @@ -116,6 +175,7 @@ const configureNetworkHelper = async ( ] try { await helperInvoke( + '', 'CreateAccessControlPolicy', accessControl, ...helperInvokeArgs @@ -123,6 +183,7 @@ const configureNetworkHelper = async ( } catch (e) { logger.info('CreateAccessControlPolicy attempting Update') await helperInvoke( + '', 'UpdateAccessControlPolicy', accessControl, ...helperInvokeArgs @@ -130,6 +191,7 @@ const configureNetworkHelper = async ( } try { await helperInvoke( + '', 'CreateVerificationPolicy', verificationPolicy, ...helperInvokeArgs @@ -137,16 +199,18 @@ const configureNetworkHelper = async ( } catch (e) { logger.info('CreateVerificationPolicy attempting Update') await helperInvoke( + '', 'UpdateVerificationPolicy', verificationPolicy, ...helperInvokeArgs ) } + const memberRecordingUser = (targetNetwork.startsWith('network') ? 'iinagent': 'networkadmin') // HACK until we add IIN Agents for Corda networks try { - await helperInvoke('CreateMembership', membership, ...helperInvokeArgs) + await helperInvoke(memberRecordingUser, 'CreateMembership', attestedMembership, ...helperInvokeArgs) } catch (e) { logger.info('CreateMembership attempting Update') - await helperInvoke('UpdateMembership', membership, ...helperInvokeArgs) + await helperInvoke(memberRecordingUser, 'UpdateMembership', attestedMembership, ...helperInvokeArgs) } } diff --git a/samples/fabric/fabric-cli/src/wallet-network1/user1.id b/samples/fabric/fabric-cli/src/wallet-network1/user1.id index 6107739f7..6e9517319 100644 --- a/samples/fabric/fabric-cli/src/wallet-network1/user1.id +++ b/samples/fabric/fabric-cli/src/wallet-network1/user1.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRjCCAe2gAwIBAgIUBMI+vcDI6Z/4bMZN2Cjp6vAXDtgwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTQwMFoXDTIyMDkwNzA5MTkwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFoZaE1MsLtrLRYFzJRyj5uelfL/Fa5pLN2kiO+M5tnxf0+wAotEeC8z\nLCS1KHVIQ7UJD/AOL1OFkbJCHKSdFJGjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPzrPjhbfwF/wxP8iFKy4NspQw0uMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0cAMEQCIDP8WLlE4btz\niw6tI/EFdLY/CSOW1P8bOFquaz5YwjYhAiBxEKH6+udDehvHU+wmRaC/Kp1VJNJZ\ndbjNTs65n8zfbQ==\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdSo5uIgF2yX79LXZ\r\nmP1USII6QeIYwfNCUQvo0rtKkZyhRANCAARaGWhNTLC7ay0WBcyUco+bnpXy/xWu\r\naSzdpIjvjObZ8X9PsAKLRHgvMywktSh1SEO1CQ/wDi9ThZGyQhyknRSR\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2uMP8qtgRmGFz1hg\r\nM/uqEoKd6QFbPO41toS9q1i4Kg6hRANCAATaC8j8dAxjHOIpWZQrUMPr7tq9WXhy\r\nbpGmhJOlOe4DF5aYuplPNBNMYu2yI0EA1XYR//88hURI6f0eUMgkVuup\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/samples/fabric/fabric-cli/src/wallet-network2/user1.id b/samples/fabric/fabric-cli/src/wallet-network2/user1.id index 618cde0c8..4b2a8fdd3 100644 --- a/samples/fabric/fabric-cli/src/wallet-network2/user1.id +++ b/samples/fabric/fabric-cli/src/wallet-network2/user1.id @@ -1 +1 @@ -{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUGvDSMG39o7baaCZKihlM/Udlx5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA5MTcwMFoXDTIyMDkwNzA5MjIwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABFZDosCNi+A6D4b4dDrt5aGw0PB7fRT0p4hgTnqk1UWf52U8jOIXgk+t\nWFzICJ0Ltc6iZWEKdeIu6UzK/Q2etE6jgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC2PFn4siCLGXl//tdAGTIJeUeJ1MB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCDa9yllzfE\nGko3C/H8ZxSJwe1e6IgWLnsUIN9Ecx3+pQIgPIu/E0vlwcjguL5xjb6iAJFsqe1V\nR99IpF9SoUQ5CjM=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgr8a9bNfLU9/NK3fN\r\npXmjyqQeLr6S7sdEX/wLpski4P6hRANCAARWQ6LAjYvgOg+G+HQ67eWhsNDwe30U\r\n9KeIYE56pNVFn+dlPIziF4JPrVhcyAidC7XOomVhCnXiLulMyv0NnrRO\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJ3VTKbfrMI3dm+iI\r\nTGcMCwgmi+8JhUVYZIZfjl9okWChRANCAARDlDA8Dzji47NlBryIVojC7sAvhqAz\r\nVdp8+rLfRs7mtodNTPKPeSIqOps3ZZ/S+KWZv9h8zJwaMjyq642EZnIm\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/samples/fabric/go-cli/data/credentials/network1/access-control.json b/samples/fabric/go-cli/data/credentials/network1/access-control.json index a67541517..e23c305bb 100644 --- a/samples/fabric/go-cli/data/credentials/network1/access-control.json +++ b/samples/fabric/go-cli/data/credentials/network1/access-control.json @@ -4,7 +4,7 @@ { "principal": "Org1MSP", "principalType": "ca", - "resource": "mychannel:simpleasset:Read:*", + "resource": "mychannel:simplestate:Read:*", "read": true } ] diff --git a/samples/fabric/go-cli/data/credentials/network1/membership.json b/samples/fabric/go-cli/data/credentials/network1/membership.json index 5b3966c67..2bfc66886 100644 --- a/samples/fabric/go-cli/data/credentials/network1/membership.json +++ b/samples/fabric/go-cli/data/credentials/network1/membership.json @@ -1 +1 @@ -{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n"}},"securityDomain":"network1"} diff --git a/samples/fabric/go-cli/data/credentials/network2/access-control.json b/samples/fabric/go-cli/data/credentials/network2/access-control.json new file mode 100644 index 000000000..0ca6baabe --- /dev/null +++ b/samples/fabric/go-cli/data/credentials/network2/access-control.json @@ -0,0 +1,11 @@ +{ + "securityDomain": "network2", + "rules": [ + { + "principal": "Org1MSP", + "principalType": "ca", + "resource": "mychannel:simplestate:Read:*", + "read": true + } + ] +} diff --git a/samples/fabric/go-cli/data/credentials/network2/membership.json b/samples/fabric/go-cli/data/credentials/network2/membership.json new file mode 100644 index 000000000..e12052a74 --- /dev/null +++ b/samples/fabric/go-cli/data/credentials/network2/membership.json @@ -0,0 +1 @@ +{"members":{"Org1MSP":{"type":"ca","value":"-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n"}},"securityDomain":"network2"} diff --git a/samples/fabric/go-cli/data/credentials/network2/verification-policy.json b/samples/fabric/go-cli/data/credentials/network2/verification-policy.json new file mode 100644 index 000000000..d3de6d665 --- /dev/null +++ b/samples/fabric/go-cli/data/credentials/network2/verification-policy.json @@ -0,0 +1 @@ +{"securityDomain":"network2","identifiers":[{"pattern":"mychannel:simplestate:Read:*","policy":{"type":"Signature","criteria":["Org1MSP"]}}]} diff --git a/samples/fabric/go-cli/exerciseSDK.go b/samples/fabric/go-cli/exerciseSDK.go index 059351ecb..51b8c6b55 100644 --- a/samples/fabric/go-cli/exerciseSDK.go +++ b/samples/fabric/go-cli/exerciseSDK.go @@ -877,7 +877,7 @@ func interop(key string, localNetwork string, requestingOrg string, address stri signkeyPEM: []byte(keyUser), } - interopFlowResponse, _, err := interoperablehelper.InteropFlow(contract, networkName, invokeObject, requestingOrg, relayEnv.RelayEndPoint, interopArgIndices, interopJSONs, signer, certUser, false) + interopFlowResponse, _, err := interoperablehelper.InteropFlow(contract, networkName, invokeObject, requestingOrg, relayEnv.RelayEndPoint, interopArgIndices, interopJSONs, signer, certUser, false, false) if err != nil { log.Fatalf("failed interoperablehelper.InteropFlow with error: %s", err.Error()) } @@ -891,7 +891,9 @@ func interop(key string, localNetwork string, requestingOrg string, address stri func main() { + // need the chaincodes simplestate and interop to exercise the below interop calls //interop("a", "network1", "Org1MSP", "localhost:9080/network1/mychannel:simplestate:Read:a") + //interop("a", "network1", "Org1MSP", "localhost:9083/network2/mychannel:simplestate:Read:Arcturus") //configureNetwork("network1") //fetchAccessControlPolicy("network1") diff --git a/samples/fabric/go-cli/wallets/network1/user1.id b/samples/fabric/go-cli/wallets/network1/user1.id index b23fd07dd..6e9517319 100644 --- a/samples/fabric/go-cli/wallets/network1/user1.id +++ b/samples/fabric/go-cli/wallets/network1/user1.id @@ -1 +1 @@ -{"version":1,"mspId":"Org1MSP","type":"X.509","credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICZjCCAg2gAwIBAgIUa9XejI7rCs6lT+z9xaDa1v3khXkwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA3NTYwMFoXDTIyMDkwNzA4MDEwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABPrNkU/R+C7+sciksTBFPw7lRsdJj7wupR9rT1WJ9YapjoRfYXL8jGZT\nZPsBWO6+LYXQTo75daCCk954m/PUZqujgdswgdgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJAWeJdCDTTontmzGGN3I3EibBBqMB8GA1Ud\nIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MB4GA1UdEQQXMBWCE2tuYXJheWFu\nLVZpcnR1YWxCb3gwWAYIKgMEBQYHCAEETHsiYXR0cnMiOnsiaGYuQWZmaWxpYXRp\nb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJ1c2VyMSIsImhmLlR5cGUiOiJjbGll\nbnQifX0wCgYIKoZIzj0EAwIDRwAwRAIgcJvGxokVsJz0aNIQ0AJcFIVfel7UIGfI\nEhGMdNnSlcoCIGyS4hw2RdblOfnMhI1JFC6aXIouQOPjNx/bfSsPgKsX\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\nMHcCAQEEIItkSuKip24gxx1z3yoZtAKua4U5HfyVCzFlBGX4ec6ioAoGCCqGSM49\nAwEHoUQDQgAE+s2RT9H4Lv6xyKSxMEU/DuVGx0mPvC6lH2tPVYn1hqmOhF9hcvyM\nZlNk+wFY7r4thdBOjvl1oIKT3nib89Rmqw==\n-----END PRIVATE KEY-----\n"}} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUf+IGiJyyyaGWwjRnjpnO0D7uzngwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABNoLyPx0DGMc4ilZlCtQw+vu2r1ZeHJukaaEk6U57gMXlpi6mU80E0xi\n7bIjQQDVdhH//zyFREjp/R5QyCRW66mjgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwA6h6ex1yPFlxuw5MP5UFdy0SkMB8GA1Ud\nIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDhDvnTZ0/+\n623lX153M/EESY5wCeSIu8V6BUfAn/VC6gIgJLkdVHwWNfqtI7+9pHD4uTE86QoP\nTyegatE7P10qwNc=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2uMP8qtgRmGFz1hg\r\nM/uqEoKd6QFbPO41toS9q1i4Kg6hRANCAATaC8j8dAxjHOIpWZQrUMPr7tq9WXhy\r\nbpGmhJOlOe4DF5aYuplPNBNMYu2yI0EA1XYR//88hURI6f0eUMgkVuup\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/samples/fabric/go-cli/wallets/network2/user1.id b/samples/fabric/go-cli/wallets/network2/user1.id index 6c1020ac8..4b2a8fdd3 100644 --- a/samples/fabric/go-cli/wallets/network2/user1.id +++ b/samples/fabric/go-cli/wallets/network2/user1.id @@ -1 +1 @@ -{"version":1,"mspId":"Org1MSP","type":"X.509","credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICZzCCAg2gAwIBAgIUF7vsVKxc1Mb37NgQE6S7eX/QgLcwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDkwNzA3NTEwMFoXDTIyMDkwNzA3NTYwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABJmkBl667bb9xK+sXnFh+dHiHRve2u4RpFjEhQhTEx+7ny8p9IWmYtWB\nWQHkSxgs60UZk/CyuxqOZYmkpznjzE+jgdswgdgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFGQmPQPOSI5/bbJDqqcK+wGc8IxvMB8GA1Ud\nIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMB4GA1UdEQQXMBWCE2tuYXJheWFu\nLVZpcnR1YWxCb3gwWAYIKgMEBQYHCAEETHsiYXR0cnMiOnsiaGYuQWZmaWxpYXRp\nb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJ1c2VyMSIsImhmLlR5cGUiOiJjbGll\nbnQifX0wCgYIKoZIzj0EAwIDSAAwRQIhAJ1e8r16W244LM7Pm098tM4LRfwUp3Ia\nOUt4BLbOUoOTAiBL9ndmCgyT4HrRzghkHBLjUypNpsneT5tOsVJr+x7PbA==\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\nMHcCAQEEINxvSt11T8eMkKLHRy/2bajMip4/xRRVeJF65uZ1pjM6oAoGCCqGSM49\nAwEHoUQDQgAEmaQGXrrttv3Er6xecWH50eIdG97a7hGkWMSFCFMTH7ufLyn0haZi\n1YFZAeRLGCzrRRmT8LK7Go5liaSnOePMTw==\n-----END PRIVATE KEY-----\n"}} \ No newline at end of file +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICRzCCAe2gAwIBAgIUJjZQPlP6RXYv+XfLI66gBJ4dxmIwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjgwMFoXDTMyMDgwNDA2MzMwMFowITEPMA0G\nA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABEOUMDwPOOLjs2UGvIhWiMLuwC+GoDNV2nz6st9Gzua2h01M8o95Iio6\nmzdln9L4pZm/2HzMnBoyPKrrjYRmciajgbswgbgwDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCCYZMhh/FIOW6zkBBBINwBobdpDMB8GA1Ud\nIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMFgGCCoDBAUGBwgBBEx7ImF0dHJz\nIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEi\nLCJoZi5UeXBlIjoiY2xpZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDyUvNXt6nM\nl0/7G/oJjeBywsQeL4IU2QDBSmi7Zk1oOQIgIkQtsg+duHOWCX60zUEThXeZsg9U\ndQHFXVncLBWQhLk=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJ3VTKbfrMI3dm+iI\r\nTGcMCwgmi+8JhUVYZIZfjl9okWChRANCAARDlDA8Dzji47NlBryIVojC7sAvhqAz\r\nVdp8+rLfRs7mtodNTPKPeSIqOps3ZZ/S+KWZv9h8zJwaMjyq642EZnIm\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/samples/fabric/simpleassettransfer/bondasset.go b/samples/fabric/simpleassettransfer/bondasset.go index a76eac384..e85d6cc08 100644 --- a/samples/fabric/simpleassettransfer/bondasset.go +++ b/samples/fabric/simpleassettransfer/bondasset.go @@ -571,7 +571,7 @@ func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface var asset BondAsset err = json.Unmarshal(queryResponse.Value, &asset) if err != nil { - return nil, err + continue } assets = append(assets, &asset) } diff --git a/samples/fabric/simplestate/simplestate.go b/samples/fabric/simplestate/simplestate.go index d744654f6..f032c01d3 100755 --- a/samples/fabric/simplestate/simplestate.go +++ b/samples/fabric/simplestate/simplestate.go @@ -32,12 +32,33 @@ type SmartContract struct { contractapi.Contract } +// CreateAndReturnKey adds a new entry with the specified key and value, and returns the key +func (s *SmartContract) CreateAndReturnKey(ctx contractapi.TransactionContextInterface, key string, value string) (string, error) { + bytes := []byte(value) + fmt.Printf("CreateAndReturnKey called. Key: %s Value: %s\n", key, value) + + err := ctx.GetStub().PutState(key, bytes) + if err != nil { + return "", err + } + return key, nil +} + // Create adds a new entry with the specified key and value func (s *SmartContract) Create(ctx contractapi.TransactionContextInterface, key string, value string) error { bytes := []byte(value) fmt.Printf("Create called. Key: %s Value: %s\n", key, value) - return ctx.GetStub().PutState(key, bytes) + err := ctx.GetStub().PutState(key, bytes) + if err != nil { + return err + } else { + err = ctx.GetStub().SetEvent("CreateSimpleState", []byte(key)) + if err != nil { + fmt.Printf("Unable to set 'CreateSimpleState' event: %+v\n", err) + } + } + return nil } // Read returns the value of the entry with the specified key diff --git a/sdks/corda/build.gradle b/sdks/corda/build.gradle index e0d506854..3f9af553d 100644 --- a/sdks/corda/build.gradle +++ b/sdks/corda/build.gradle @@ -7,13 +7,13 @@ buildscript { ext.grpc_kotlin_version = "0.1.3" // CURRENT_GRPC_KOTLIN_VERSION ext.corda_release_group = "net.corda" ext.corda_core_release_group = "net.corda" - ext.corda_version = "4.8.4" - ext.corda_core_version = "4.8.4" + ext.corda_version = "4.8" + ext.corda_core_version = "4.8" ext.arrow_version = "0.10.4" ext.corda_gradle_plugins_version = "5.0.12" ext.log4j_version = "2.16.0" ext.slf4j_version = "1.7.25" - ext.weaver_protos_version = "1.3.1" + ext.weaver_protos_version = "1.4.2" ext.weaver_corda_version = "1.2.9" dependencies { diff --git a/sdks/fabric/go-sdk/VERSION b/sdks/fabric/go-sdk/VERSION new file mode 100644 index 000000000..e8ea05db8 --- /dev/null +++ b/sdks/fabric/go-sdk/VERSION @@ -0,0 +1 @@ +1.2.4 diff --git a/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go b/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go index 3c2c81cad..0174d658c 100644 --- a/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go +++ b/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go @@ -41,7 +41,7 @@ func logThenErrorf(format string, args ...interface{}) error { } func InteropFlow(interopContract GatewayContract, networkId string, invokeObject types.Query, org, localRelayEndpoint string, - interopArgIndices []int, interopJSONs []types.InteropJSON, signer Signer, certUser string, returnWithoutLocalInvocation bool) ([]*common.View, []byte, error) { + interopArgIndices []int, interopJSONs []types.InteropJSON, signer Signer, certUser string, returnWithoutLocalInvocation bool, confidential bool) ([]*common.View, []byte, error) { if len(interopArgIndices) != len(interopJSONs) { logThenErrorf("number of argument indices %d does not match number of view addresses %d", len(interopArgIndices), len(interopJSONs)) } @@ -50,6 +50,7 @@ func InteropFlow(interopContract GatewayContract, networkId string, invokeObject var views []*common.View var viewsSerializedBase64 []string var computedAddresses []string + var viewContentsBase64 []string for i := 0; i < len(interopJSONs); i++ { requestResponseView, requestResponseAddress, err := getRemoteView(interopContract, networkId, org, localRelayEndpoint, interopJSONs[i], signer, certUser) @@ -66,11 +67,18 @@ func InteropFlow(interopContract GatewayContract, networkId string, invokeObject computedAddresses = append(computedAddresses, requestResponseAddress) viewsSerializedBase64 = append(viewsSerializedBase64, base64.StdEncoding.EncodeToString(viewBytes)) + if confidential { + // TODO + respDataContents, _ := GetResponseDataFromView(requestResponseView) + viewContentsBase64 = append(viewContentsBase64, base64.StdEncoding.EncodeToString(respDataContents)) + } else { + viewContentsBase64 = append(viewContentsBase64, "") + } } // Return here if caller just wants the views and doesn't want to invoke a local chaincode if returnWithoutLocalInvocation { - ccArgs, err := getCCArgsForProofVerification(invokeObject, interopArgIndices, computedAddresses, viewsSerializedBase64) + ccArgs, err := getCCArgsForProofVerification(invokeObject, interopArgIndices, computedAddresses, viewsSerializedBase64, viewContentsBase64) if err != nil { return views, nil, logThenErrorf("InteropFlow getCCArgsForProofVerification error: %s", err.Error()) } @@ -82,7 +90,7 @@ func InteropFlow(interopContract GatewayContract, networkId string, invokeObject } // Step 2 - result, err := submitTransactionWithRemoteViews(interopContract, invokeObject, interopArgIndices, computedAddresses, viewsSerializedBase64) + result, err := submitTransactionWithRemoteViews(interopContract, invokeObject, interopArgIndices, computedAddresses, viewsSerializedBase64, viewContentsBase64) if err != nil { return views, nil, logThenErrorf("InteropFlow submit transaction with remote view error: %s", err.Error()) } @@ -95,8 +103,8 @@ func InteropFlow(interopContract GatewayContract, networkId string, invokeObject * - Prepare arguments and call WriteExternalState. **/ func submitTransactionWithRemoteViews(interopContract GatewayContract, invokeObject types.Query, - interopArgIndices []int, viewAddresses []string, viewsSerializedBase64 []string) ([]byte, error) { - ccArgs, err := getCCArgsForProofVerification(invokeObject, interopArgIndices, viewAddresses, viewsSerializedBase64) + interopArgIndices []int, viewAddresses []string, viewsSerializedBase64 []string, viewContentsBase64 []string) ([]byte, error) { + ccArgs, err := getCCArgsForProofVerification(invokeObject, interopArgIndices, viewAddresses, viewsSerializedBase64, viewContentsBase64) if err != nil { return nil, logThenErrorf("failed calling getCCArgsForProofVerification with error: %s", err.Error()) } @@ -104,6 +112,7 @@ func submitTransactionWithRemoteViews(interopContract GatewayContract, invokeObj if err != nil { return result, logThenErrorf("submitTransaction Error: %s", err.Error()) } + return result, nil } @@ -250,7 +259,7 @@ func verifyView(contract GatewayContract, b64ViewProto string, address string) e * Prepare arguments for WriteExternalState chaincode transaction to verify a view and write data to ledger. **/ func getCCArgsForProofVerification(invokeObject types.Query, interopArgIndices []int, viewAddresses []string, - viewsSerializedBase64 []string) ([]string, error) { + viewsSerializedBase64 []string, viewContentsBase64 []string) ([]string, error) { invokeObjectCcArgsBytes, err := json.Marshal(invokeObject.CcArgs) if err != nil { @@ -272,6 +281,11 @@ func getCCArgsForProofVerification(invokeObject types.Query, interopArgIndices [ return nil, logThenErrorf("failed to Marshal viewsSerializedBase64: %s", viewsSerializedBase64) } + viewContentsBase64Bytes, err := json.Marshal(viewContentsBase64) + if err != nil { + return nil, logThenErrorf("failed to Marshal viewContentsBase64: %s", viewContentsBase64) + } + ccArgs := []string{ invokeObject.ContractName, invokeObject.Channel, @@ -279,7 +293,8 @@ func getCCArgsForProofVerification(invokeObject types.Query, interopArgIndices [ string(invokeObjectCcArgsBytes), string(interopArgIndicesBytes), string(viewAddressesBytes), - string(viewsSerializedBase64Bytes)} + string(viewsSerializedBase64Bytes), + string(viewContentsBase64Bytes)} return ccArgs, nil } diff --git a/sdks/fabric/go-sdk/readme.md b/sdks/fabric/go-sdk/readme.md index 2de9409e8..fba18d715 100644 --- a/sdks/fabric/go-sdk/readme.md +++ b/sdks/fabric/go-sdk/readme.md @@ -3,15 +3,21 @@ SPDX-License-Identifier: CC-BY-4.0 --> - # Integration tests for `asset-exchange` using go-sdk + +## Integration tests for `asset-exchange` using go-sdk A sample of integration tests for asset-exchange can be exercised by running the file `exerciseSDK.go`. Before executing `go run exerciseSDK.go`, please ensure that the below `keys` are populated appropriately in the network connection profile (e.g., in the network1 connection profile available at `../../../tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.json`). -## keys in the connection profile `json` file: channels, orderers, certificateAuthorities +### keys in the connection profile `json` file: channels, orderers, certificateAuthorities Sample content for the values of these keys can be found in the file `helpers/testdata/example/peerOrganizations/org1.example.com/connection-tls.json` (please note that the value of the key "certificateAuthorities"."ca.org1.example.com"."tlsCACerts"."pem" in this file is an array). Also note that similar checks need to be carried out for the connection profile `yaml` file if you want to use the yaml file instead of json. Sample content for the values of these keys can be found in the file `helpers/testdata/example/peerOrganizations/org1.example.com/connection-tls.yaml`. +## Configurations - +- Set the output of the below command as the value of the key `"members"."Org1MSP"."value"` in the file `data/credentials/network1/membership.json` (similarly for `network2`). + ```bash + awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' ../../../tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem + ``` +- Set the chaincode value (e.g., `simplestate`) appropriately in the file `data/credentials/network1/access-control.json` (similarly for `network2`). diff --git a/sdks/fabric/interoperation-node-sdk/index.js b/sdks/fabric/interoperation-node-sdk/index.js index 717d184ee..d6a3a08b6 100644 --- a/sdks/fabric/interoperation-node-sdk/index.js +++ b/sdks/fabric/interoperation-node-sdk/index.js @@ -26,3 +26,4 @@ module.exports.RelayHelper = require("./src/Relay.js"); module.exports.InteroperableHelper = require("./src/InteroperableHelper.js"); module.exports.AssetManager = require("./src/AssetManager.js"); module.exports.HashFunctions = require("./src/HashFunctions.js"); +module.exports.EventsManager = require("./src/EventsManager.js"); diff --git a/sdks/fabric/interoperation-node-sdk/makefile b/sdks/fabric/interoperation-node-sdk/makefile index ea214c6a0..a7b635e82 100644 --- a/sdks/fabric/interoperation-node-sdk/makefile +++ b/sdks/fabric/interoperation-node-sdk/makefile @@ -14,6 +14,7 @@ build-local: cp -r ../../../common/protos-js/networks ./protos-js/ && \ cp -r ../../../common/protos-js/peer ./protos-js/ && \ cp -r ../../../common/protos-js/relay ./protos-js/ && \ + cp -r ../../../common/protos-js/identity ./protos-js/ && \ cp -r ../../../common/protos-js/package.json ./protos-js/ (cp package.json package-remote.json && \ cp package-local.json package.json && \ diff --git a/sdks/fabric/interoperation-node-sdk/package-local.json b/sdks/fabric/interoperation-node-sdk/package-local.json index a21b4bb97..b521559e7 100644 --- a/sdks/fabric/interoperation-node-sdk/package-local.json +++ b/sdks/fabric/interoperation-node-sdk/package-local.json @@ -6,7 +6,7 @@ "blockchain", "interoperability" ], - "version": "1.3.1", + "version": "1.4.4", "author": "V. Ramakrishna", "tag": "latest", "main": "build/index.js", diff --git a/sdks/fabric/interoperation-node-sdk/package.json b/sdks/fabric/interoperation-node-sdk/package.json index 6595ee5f3..ccba4d3ee 100644 --- a/sdks/fabric/interoperation-node-sdk/package.json +++ b/sdks/fabric/interoperation-node-sdk/package.json @@ -6,7 +6,7 @@ "blockchain", "interoperability" ], - "version": "1.3.1", + "version": "1.4.4", "author": "V. Ramakrishna", "tag": "latest", "main": "build/index.js", @@ -29,7 +29,7 @@ "dependencies": { "@grpc/grpc-js": "^1.1.3", "@grpc/proto-loader": "^0.6.13", - "@hyperledger-labs/weaver-protos-js": "^1.3.1", + "@hyperledger-labs/weaver-protos-js": "^1.4.0", "elliptic": "^6.2.3", "fabric-common": "^2.2.8", "fabric-network": "^2.2.8", diff --git a/sdks/fabric/interoperation-node-sdk/src/EventsManager.ts b/sdks/fabric/interoperation-node-sdk/src/EventsManager.ts new file mode 100644 index 000000000..ec36e47f9 --- /dev/null +++ b/sdks/fabric/interoperation-node-sdk/src/EventsManager.ts @@ -0,0 +1,305 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * This file provides helper functions for interoperability operations. + **/ +/** End file docs */ + +import log4js from "log4js"; +import { v4 as uuidv4 } from "uuid"; +import { ICryptoKey } from "fabric-common"; +import { Contract } from "fabric-network"; +import eventsPb from "@hyperledger-labs/weaver-protos-js/common/events_pb"; +import { Relay } from "./Relay"; +import { InteropJSON } from "./types"; +import { getPolicyCriteriaForAddress, createAddress, signMessage } from "./InteroperableHelper"; +import * as helpers from "./helpers"; + +const logger = log4js.getLogger("EventsManager"); + +function createEventMatcher ({ + eventType, + eventClassId, + transactionLedgerId, + transactionContractId, + transactionFunc +}: { + eventType: eventsPb.EventType, + eventClassId: string, + transactionLedgerId: string, + transactionContractId: string, + transactionFunc: string +}): eventsPb.EventMatcher { + const eventMatcher = new eventsPb.EventMatcher() + eventMatcher.setEventType(eventType) + eventMatcher.setEventClassId(eventClassId) + eventMatcher.setTransactionLedgerId(transactionLedgerId) + eventMatcher.setTransactionContractId(transactionContractId) + eventMatcher.setTransactionFunc(transactionFunc) + return eventMatcher +} + + +function createEventPublicationSpec ({ + appUrl, + driverId, + channelId, + chaincodeId, + ccFunc, + ccArgs, + replaceArgIndex, + members +}: { + appUrl?: string, + driverId?: string, + channelId?: string, + chaincodeId?: string, + ccFunc?: string, + ccArgs?: string[], + replaceArgIndex?: number, + members?: string[] +}): eventsPb.EventPublication { + const eventPublicationSpec = new eventsPb.EventPublication() + if (appUrl) { + eventPublicationSpec.setAppUrl(appUrl) + } else { + + let ccArgsBytes = []; + for (const ccArg of ccArgs) { + ccArgsBytes.push(Buffer.from(ccArg)); + } + console.log(`ccArgs: ${ccArgs} ccArgsBytes: ${ccArgsBytes}`) + + const ctx = new eventsPb.ContractTransaction() + ctx.setDriverId(driverId) + ctx.setLedgerId(channelId) + ctx.setContractId(chaincodeId) + ctx.setFunc(ccFunc) + ctx.setArgsList(ccArgsBytes) + ctx.setReplaceArgIndex(replaceArgIndex) + if (members) { + ctx.setMembersList(members) + } + eventPublicationSpec.setCtx(ctx) + } + return eventPublicationSpec +} + +const subscribeRemoteEvent = async ( + interopContract: Contract, + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + networkID: string, + org: string, + localRelayEndpoint: string, + interopJSON: InteropJSON, + keyCert: { key: ICryptoKey; cert: any }, + useTls: boolean = false, + tlsRootCACertPaths?: Array, + confidential: boolean = false, +): Promise => { + logger.debug("Remote Event Subscription") + const { + address, + ChaincodeFunc, + ChaincodeID, + ChannelID, + RemoteEndpoint, + NetworkID: RemoteNetworkID, + Sign, + ccArgs: args, + } = interopJSON; + // Step 1 + const computedAddress = + address || + createAddress( + { ccFunc: ChaincodeFunc, contractName: ChaincodeID, channel: ChannelID, ccArgs: args }, + RemoteNetworkID, + RemoteEndpoint, + ); + + const [policyCriteria, policyCriteriaError] = await helpers.handlePromise( + getPolicyCriteriaForAddress(interopContract, computedAddress), + ); + if (policyCriteriaError) { + throw new Error(`InteropFlow failed to get policy criteria: ${policyCriteriaError}`); + } + + const relay = useTls ? new Relay(localRelayEndpoint, Relay.defaultTimeout, true, tlsRootCACertPaths) : new Relay(localRelayEndpoint); + const uuidValue = uuidv4(); + + logger.debug("Making event subscription call to relay for \ + event: ${eventMatcher} and publication spec: ${eventPublicationSpec}") + + const [relayResponse, relayResponseError] = await helpers.handlePromise( + relay.ProcessSubscribeEventRequest( + eventMatcher, + eventPublicationSpec, + computedAddress, + policyCriteria, + networkID, + keyCert.cert, + Sign ? signMessage(computedAddress + uuidValue, keyCert.key.toBytes()).toString("base64") : "", + uuidValue, + // Org is empty as the name is in the certs for + org, + confidential, + ), + ); + if (relayResponseError) { + throw new Error(`Event Subscription relay response error: ${relayResponseError}`); + } + + logger.debug(`Event Subscription Successfull: ${JSON.stringify(relayResponse)}`) + + return relayResponse +} + + +const unsubscribeRemoteEvent = async ( + interopContract: Contract, + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + requestID: string, + networkID: string, + org: string, + localRelayEndpoint: string, + interopJSON: InteropJSON, + keyCert: { key: ICryptoKey; cert: any }, + useTls: boolean = false, + tlsRootCACertPaths?: Array, + confidential: boolean = false, +): Promise => { + logger.debug("Remote Event Unsubscription") + const { + address, + ChaincodeFunc, + ChaincodeID, + ChannelID, + RemoteEndpoint, + NetworkID: RemoteNetworkID, + Sign, + ccArgs: args, + } = interopJSON; + // Step 1 + const computedAddress = + address || + createAddress( + { ccFunc: ChaincodeFunc, contractName: ChaincodeID, channel: ChannelID, ccArgs: args }, + RemoteNetworkID, + RemoteEndpoint, + ); + + const [policyCriteria, policyCriteriaError] = await helpers.handlePromise( + getPolicyCriteriaForAddress(interopContract, computedAddress), + ); + if (policyCriteriaError) { + throw new Error(`InteropFlow failed to get policy criteria: ${policyCriteriaError}`); + } + + const relay = useTls ? new Relay(localRelayEndpoint, Relay.defaultTimeout, true, tlsRootCACertPaths) : new Relay(localRelayEndpoint); + const uuidValue = uuidv4(); + + logger.debug("Making event unsubscription call to relay for \ + event: ${eventMatcher} and publication spec: ${eventPublicationSpec}") + + const [relayResponse, relayResponseError] = await helpers.handlePromise( + relay.ProcessUnsubscribeEventRequest( + eventMatcher, + eventPublicationSpec, + requestID, + computedAddress, + policyCriteria, + networkID, + keyCert.cert, + Sign ? signMessage(computedAddress + uuidValue, keyCert.key.toBytes()).toString("base64") : "", + uuidValue, + // Org is empty as the name is in the certs for + org, + confidential, + ), + ); + if (relayResponseError) { + throw new Error(`Event Unsubscription relay response error: ${relayResponseError}`); + } + + logger.debug(`Event Unsubscription Successfull: ${JSON.stringify(relayResponse)}`) + + return relayResponse +} + +const getSubscriptionStatus = async ( + requestID: string, + localRelayEndpoint: string, + asJson: boolean = true, + useTls: boolean = false, + tlsRootCACertPaths?: Array, +): Promise => { + logger.debug("Get Event Subscription Status") + + const relay = useTls ? new Relay(localRelayEndpoint, Relay.defaultTimeout, true, tlsRootCACertPaths) : new Relay(localRelayEndpoint); + + const [relayResponse, relayResponseError] = await helpers.handlePromise( + relay.GetEventSubscriptionState( + requestID, + false + ), + ); + if (relayResponseError) { + throw new Error(`Get event subscription relay response error: ${relayResponseError}`); + } + + let eventSubscriptionState: eventsPb.EventSubscriptionState = relayResponse; + let ccArgsBytes = eventSubscriptionState.getEventPublicationSpec().getCtx().getArgsList(); + let ccArgsStr = []; + for (const ccArgBytes of ccArgsBytes) { + ccArgsStr.push(Buffer.from(ccArgBytes).toString('utf8')); + } + + eventSubscriptionState.getEventPublicationSpec().getCtx().setArgsList(ccArgsStr); + + logger.debug(`Get event subscription status response: ${JSON.stringify(relayResponse)}`) + + return asJson? eventSubscriptionState.toObject() : relayResponse; +} + +const getAllReceivedEvents = async ( + requestID: string, + localRelayEndpoint: string, + asJson: boolean = true, + useTls: boolean = false, + tlsRootCACertPaths?: Array, +): Promise => { + logger.debug("Get all received event states") + + const relay = useTls ? new Relay(localRelayEndpoint, Relay.defaultTimeout, true, tlsRootCACertPaths) : new Relay(localRelayEndpoint); + + const [relayResponse, relayResponseError] = await helpers.handlePromise( + relay.GetEventStates( + requestID, + asJson + ), + ); + if (relayResponseError) { + throw new Error(`Get event states relay response error: ${relayResponseError}`); + } + + logger.debug(`Get event states response: ${JSON.stringify(relayResponse)}`) + + return relayResponse +} + + +export { + createEventMatcher, + createEventPublicationSpec, + subscribeRemoteEvent, + unsubscribeRemoteEvent, + getSubscriptionStatus, + getAllReceivedEvents, +} + diff --git a/sdks/fabric/interoperation-node-sdk/src/InteroperableHelper.ts b/sdks/fabric/interoperation-node-sdk/src/InteroperableHelper.ts index b2a24ada5..48ff74f4a 100644 --- a/sdks/fabric/interoperation-node-sdk/src/InteroperableHelper.ts +++ b/sdks/fabric/interoperation-node-sdk/src/InteroperableHelper.ts @@ -174,14 +174,14 @@ const getResponseDataFromView = (view, privKeyPEM = null) => { const confidentialPayload = interopPayloadPb.ConfidentialPayload.deserializeBinary(Uint8Array.from(Buffer.from(interopPayload.getPayload()))); const decryptedPayload = decryptData(Buffer.from(confidentialPayload.getEncryptedPayload()), privKeyPEM); const decryptedPayloadContents = interopPayloadPb.ConfidentialPayloadContents.deserializeBinary(Uint8Array.from(Buffer.from(decryptedPayload))); - return { data: Buffer.from(decryptedPayloadContents.getPayload()).toString(), contents: decryptedPayload }; + return { interopPayload: interopPayload, data: Buffer.from(decryptedPayloadContents.getPayload()).toString(), contents: decryptedPayload }; } else { - return { data: Buffer.from(interopPayload.getPayload()).toString() }; + return { interopPayload: interopPayload, data: Buffer.from(interopPayload.getPayload()).toString() }; } } else if (view.getMeta().getProtocol() == statePb.Meta.Protocol.CORDA) { const cordaView = cordaViewPb.ViewData.deserializeBinary(view.getData()); const interopPayload = interopPayloadPb.InteropPayload.deserializeBinary(Uint8Array.from(Buffer.from(cordaView.getPayload()))); - return { data: Buffer.from(interopPayload.getPayload()).toString() }; + return { interopPayload: interopPayload, data: Buffer.from(interopPayload.getPayload()).toString() }; } else { const protocolType = view.getMeta().getProtocol(); throw new Error(`Unsupported DLT type: ${protocolType}`); @@ -364,6 +364,18 @@ const verifyView = async (contract: Contract, base64ViewProto: string, address: } }; +/** + * Verifies a view's contents and extracts confidential payload by using chaincode function in interop chaincode. Verification is based on verification policy of the network, proof type and protocol type. + **/ +const parseAndValidateView = async (contract: Contract, address: string, base64ViewProto: string, b64ViewContent: string): Promise => { + try { + const viewPayload = await contract.evaluateTransaction("ParseAndValidateView", address, base64ViewProto, b64ViewContent); + return viewPayload; + } catch (e) { + throw new Error(`Unable to parse and validate view: ${e}`); + } +}; + /** * Creates an address string based on a query object, networkid and remote url. **/ @@ -397,6 +409,7 @@ const interopFlow = async ( interopArgIndices: Array, interopJSONs: Array, keyCert: { key: ICryptoKey; cert: any }, + endorsingOrgs: Array = [], returnWithoutLocalInvocation: boolean = false, useTls: boolean = false, tlsRootCACertPaths?: Array, @@ -453,6 +466,7 @@ const interopFlow = async ( computedAddresses, viewsSerializedBase64, viewContentsBase64, + endorsingOrgs ); return { views, result }; }; @@ -497,6 +511,7 @@ const submitTransactionWithRemoteViews = async ( viewAddresses: Array, viewsSerializedBase64: Array, viewContentsBase64: Array, + endorsingOrgs: Array ): Promise => { const ccArgs = getCCArgsForProofVerification( invokeObject, @@ -505,8 +520,13 @@ const submitTransactionWithRemoteViews = async ( viewsSerializedBase64, viewContentsBase64, ); + + const tx = interopContract.createTransaction("WriteExternalState") + if (endorsingOrgs.length > 0) { + tx.setEndorsingOrganizations(...endorsingOrgs) + } const [result, submitError] = await helpers.handlePromise( - interopContract.submitTransaction("WriteExternalState", ...ccArgs), + tx.submit(...ccArgs) ); if (submitError) { throw new Error(`submitTransaction Error: ${submitError}`); @@ -652,6 +672,7 @@ export { getKeyAndCertForRemoteRequestbyUserName, getPolicyCriteriaForAddress, verifyView, + parseAndValidateView, decryptRemoteChaincodeOutput, decryptRemoteProposalResponse, verifyRemoteProposalResponse, @@ -669,4 +690,6 @@ export { submitTransactionWithRemoteViews, getRemoteView, createFlowAddress, + createAddress, + decryptData }; diff --git a/sdks/fabric/interoperation-node-sdk/src/Relay.ts b/sdks/fabric/interoperation-node-sdk/src/Relay.ts index b2760dbbc..2c5842176 100644 --- a/sdks/fabric/interoperation-node-sdk/src/Relay.ts +++ b/sdks/fabric/interoperation-node-sdk/src/Relay.ts @@ -13,6 +13,7 @@ import * as grpcJs from "@grpc/grpc-js"; import networksGrpcPb from "@hyperledger-labs/weaver-protos-js/networks/networks_grpc_pb"; import networksPb from "@hyperledger-labs/weaver-protos-js/networks/networks_pb"; import common_ack_pb from "@hyperledger-labs/weaver-protos-js/common/ack_pb"; +import eventsPb from "@hyperledger-labs/weaver-protos-js/common/events_pb"; import statePb from "@hyperledger-labs/weaver-protos-js/common/state_pb"; import * as helpers from "./helpers"; /** @@ -203,6 +204,294 @@ class Relay { return asJson ? state.toObject() : state; } + + /** + * SendEventSubscribeRequest to send a request to a remote network using gRPC and the relay. + * @returns {string} The ID of the request + */ + async SendEventSubscribeRequest( + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + address: string, + policy, + requestingNetwork: string, + certificate: string, + signature: string, + nonce: string, + org: string, + confidential: boolean, + ): Promise { + try { + const networkClient = new networksGrpcPb.NetworkClient( + this.getEndpoint(), + this._useTls ? + (this._tlsRootCACerts.length == 0 ? grpcJs.credentials.createSsl() : grpcJs.credentials.createSsl(Buffer.from(this._tlsRootCACerts))) : + grpcJs.credentials.createInsecure() + ); + const { + subscribeEvent, + }: { + subscribeEvent: (eventSubscription: networksPb.NetworkEventSubscription) => Promise; + } = helpers.promisifyAll(networkClient); + + const query = new networksPb.NetworkQuery(); + query.setPolicyList(policy); + query.setAddress(address); + query.setCertificate(certificate); + query.setNonce(nonce); + query.setRequestorSignature(signature); + query.setRequestingRelay(""); + query.setRequestingNetwork(requestingNetwork); + query.setRequestingOrg(org || ""); + query.setConfidential(confidential || false); + + const eventSubscription = new networksPb.NetworkEventSubscription(); + eventSubscription.setEventMatcher(eventMatcher); + eventSubscription.setQuery(query); + eventSubscription.setEventPublicationSpec(eventPublicationSpec); + + if (typeof subscribeEvent === "function") { + const [resp, error] = await helpers.handlePromise(subscribeEvent(eventSubscription)); + if (error) { + throw new Error(`Event Subscription error: ${error}`); + } + if (resp.getStatus() === common_ack_pb.Ack.STATUS.ERROR) { + throw new Error(`Event Subscription request received negative Ack error: ${resp.getMessage()}`); + } + return resp.getRequestId(); + } + throw new Error("Error with event subscription in NetworkClient"); + } catch (e) { + throw new Error(`Error with Network Client: ${e}`); + } + } + /** + * GetSubscriptionStatus is used to get the request from the local network + * @returns {object} The request object from the relay + */ + async GetEventSubscriptionState(requestId: string, asJson = true): Promise { + const networkClient = new networksGrpcPb.NetworkClient( + this.getEndpoint(), + this._useTls ? + (this._tlsRootCACerts.length == 0 ? grpcJs.credentials.createSsl() : grpcJs.credentials.createSsl(Buffer.from(this._tlsRootCACerts))) : + grpcJs.credentials.createInsecure() + ); + const { + getEventSubscriptionState, + }: { getEventSubscriptionState: (message: networksPb.GetStateMessage) => Promise } = helpers.promisifyAll( + networkClient, + ); + const getStateMessage = new networksPb.GetStateMessage(); + getStateMessage.setRequestId(requestId); + const [state, error] = await helpers.handlePromise(getEventSubscriptionState(getStateMessage)); + if (error) { + throw new Error(`Error: ${error}`); + } + + return asJson ? state.toObject() : state; + } + + async recursiveEventSubscriptionState(requestID: string, dateObj: Date): Promise { + const [state, error] = await helpers.handlePromise(this.GetEventSubscriptionState(requestID, false)); + if (error) { + throw new Error(`Get event subscription state error: ${error}`); + } + if ( + state.getStatus() === eventsPb.EventSubscriptionState.STATUS.SUBSCRIBE_PENDING || + state.getStatus() === eventsPb.EventSubscriptionState.STATUS.SUBSCRIBE_PENDING_ACK || + state.getStatus() === eventsPb.EventSubscriptionState.STATUS.UNSUBSCRIBE_PENDING || + state.getStatus() === eventsPb.EventSubscriptionState.STATUS.UNSUBSCRIBE_PENDING_ACK + ) { + if (dateObj.getTime() < Date.now()) { + throw new Error("Timeout: State is still pending."); + } else { + return await this.recursiveEventSubscriptionState(requestID, dateObj); + } + } else { + return state; + } + } + /** + * ProcessEventSubscriptionRequest sends a event subscription request to a remote network using gRPC and the relay and polls for a response on the local network + * Uses the timeout provided by the class. + * @returns {string} The state returned by the remote request + */ + async ProcessSubscribeEventRequest( + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + address: string, + policy, + requestingNetwork: string, + certificate: string, + signature: string, + nonce: string, + org: string, + confidential: boolean, + ): Promise { + try { + const [requestID, error] = await helpers.handlePromise( + this.SendEventSubscribeRequest(eventMatcher, eventPublicationSpec, address, policy, requestingNetwork, certificate, signature, nonce, org, confidential), + ); + if (error) { + throw new Error(`Event subscription error: ${error}`); + } + // Adds timout time to current time. + const dateObj = new Date(); + dateObj.setMilliseconds(dateObj.getMilliseconds() + this.timeoutTime); + //TODO: SLOW DOWN + const [finalState, stateError] = await helpers.handlePromise(this.recursiveEventSubscriptionState(requestID, dateObj)); + if (stateError) { + throw new Error(`Event Subscription error: ${stateError}`); + } + if (finalState.getStatus() === eventsPb.EventSubscriptionState.STATUS.ERROR) { + if (finalState.getMessage()) { + throw new Error(`Error during event subscription : ${finalState.getMessage()}`); + } + else { + throw new Error(`Error during event subscription : UNKNOWN REASON}`); + } + } + return finalState; + } catch (e) { + throw new Error(e); + } + } + /** + * SendEventUnsubscribeRequest to send a request to a remote network using gRPC and the relay. + * @returns {string} The ID of the request + */ + async SendEventUnsubscribeRequest( + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + requestId: string, + address: string, + policy, + requestingNetwork: string, + certificate: string, + signature: string, + nonce: string, + org: string, + confidential: boolean, + ): Promise { + try { + const networkClient = new networksGrpcPb.NetworkClient( + this.getEndpoint(), + this._useTls ? + (this._tlsRootCACerts.length == 0 ? grpcJs.credentials.createSsl() : grpcJs.credentials.createSsl(Buffer.from(this._tlsRootCACerts))) : + grpcJs.credentials.createInsecure() + ); + const { + unsubscribeEvent, + }: { + unsubscribeEvent: (eventUnsubscription: networksPb.NetworkEventUnsubscription) => Promise; + } = helpers.promisifyAll(networkClient); + + const query = new networksPb.NetworkQuery(); + query.setPolicyList(policy); + query.setAddress(address); + query.setCertificate(certificate); + query.setNonce(nonce); + query.setRequestorSignature(signature); + query.setRequestingRelay(""); + query.setRequestingNetwork(requestingNetwork); + query.setRequestingOrg(org || ""); + query.setConfidential(confidential || false); + + const eventSubscription = new networksPb.NetworkEventSubscription(); + eventSubscription.setEventMatcher(eventMatcher); + eventSubscription.setQuery(query); + eventSubscription.setEventPublicationSpec(eventPublicationSpec); + + const eventUnsubscription = new networksPb.NetworkEventUnsubscription(); + eventUnsubscription.setRequest(eventSubscription); + eventUnsubscription.setRequestId(requestId); + + if (typeof unsubscribeEvent === "function") { + const [resp, error] = await helpers.handlePromise(unsubscribeEvent(eventUnsubscription)); + if (error) { + throw new Error(`Event Unsubscription error: ${error}`); + } + if (resp.getStatus() === common_ack_pb.Ack.STATUS.ERROR) { + throw new Error(`Event Unsubscription request received negative Ack error: ${resp.getMessage()}`); + } + return resp.getRequestId(); + } + throw new Error("Error with event unsubscription in NetworkClient"); + } catch (e) { + throw new Error(`Error with Network Client: ${e}`); + } + } + /** + * ProcessEventUnsubscriptionRequest sends a event unsubscription request to a remote network using gRPC and the relay and polls for a response on the local network + * Uses the timeout provided by the class. + * @returns {string} The state returned by the remote request + */ + async ProcessUnsubscribeEventRequest( + eventMatcher: eventsPb.EventMatcher, + eventPublicationSpec: eventsPb.EventPublication, + requestId: string, + address: string, + policy, + requestingNetwork: string, + certificate: string, + signature: string, + nonce: string, + org: string, + confidential: boolean, + ): Promise { + try { + const [requestID, error] = await helpers.handlePromise( + this.SendEventUnsubscribeRequest(eventMatcher, eventPublicationSpec, requestId, address, policy, requestingNetwork, certificate, signature, nonce, org, confidential), + ); + if (error) { + throw new Error(`Event unsubscription error: ${error}`); + } + // Adds timout time to current time. + const dateObj = new Date(); + dateObj.setMilliseconds(dateObj.getMilliseconds() + this.timeoutTime); + //TODO: SLOW DOWN + const [finalState, stateError] = await helpers.handlePromise(this.recursiveEventSubscriptionState(requestID, dateObj)); + if (stateError) { + throw new Error(`Event unsubscription error: ${stateError}`); + } + if (finalState.getStatus() === eventsPb.EventSubscriptionState.STATUS.ERROR) { + if (finalState.getMessage()) { + throw new Error(`Error during event unsubscription : ${finalState.getMessage()}`); + } + else { + throw new Error(`Error during event unsubscription : UNKNOWN REASON}`); + } + } + return finalState; + } catch (e) { + throw new Error(e); + } + } + /** + * GetSubscriptionStatus is used to get the request from the local network + * @returns {object} The request object from the relay + */ + async GetEventStates(requestId: string, asJson = true): Promise { + const networkClient = new networksGrpcPb.NetworkClient( + this.getEndpoint(), + this._useTls ? + (this._tlsRootCACerts.length == 0 ? grpcJs.credentials.createSsl() : grpcJs.credentials.createSsl(Buffer.from(this._tlsRootCACerts))) : + grpcJs.credentials.createInsecure() + ); + const { + getEventStates, + }: { getEventStates: (message: networksPb.GetStateMessage) => Promise } = helpers.promisifyAll( + networkClient, + ); + const getStateMessage = new networksPb.GetStateMessage(); + getStateMessage.setRequestId(requestId); + const [state, error] = await helpers.handlePromise(getEventStates(getStateMessage)); + if (error) { + throw new Error(`Error: ${error}`); + } + + return asJson ? state.toObject() : state; + } } diff --git a/sdks/fabric/interoperation-node-sdk/test/InteroperableHelper.js b/sdks/fabric/interoperation-node-sdk/test/InteroperableHelper.js index abb076303..36407ad64 100644 --- a/sdks/fabric/interoperation-node-sdk/test/InteroperableHelper.js +++ b/sdks/fabric/interoperation-node-sdk/test/InteroperableHelper.js @@ -19,6 +19,7 @@ chai.should(); const { Wallets } = require("fabric-network"); const { ContractImpl } = require("fabric-network/lib/contract"); const { NetworkImpl } = require("fabric-network/lib/network"); +const { Transaction } = require("fabric-network/lib/transaction"); const ecies = require("../src/eciesCrypto"); const { decryptRemoteProposalResponse, @@ -46,6 +47,8 @@ describe("InteroperableHelper", () => { let wallet; let interopcc; + let interopccStub; + let writeExternalStateTransaction; // Initialize wallet with a single user identity async function initializeWallet() { const privKeyFile = `${__dirname}/data/privKey.pem`; @@ -65,6 +68,8 @@ describe("InteroperableHelper", () => { await initializeWallet(); const network = sinon.createStubInstance(NetworkImpl); interopcc = new ContractImpl(network, "interopcc", "InteroperableHelper"); + writeExternalStateTransaction = sinon.createStubInstance(Transaction) + interopccStub = sinon.stub(interopcc, "createTransaction").withArgs('WriteExternalState').returns(writeExternalStateTransaction); }); afterEach(() => { @@ -367,11 +372,9 @@ describe("InteroperableHelper", () => { ], viewPatterns: [], }; - const interopccStub = sinon.stub(interopcc, "submitTransaction").resolves(false); - // interopccStub.withArgs("Write", "w", "value").resolves(true); - interopccStub + writeExternalStateTransaction.submit.resolves(false); + writeExternalStateTransaction.submit .withArgs( - "WriteExternalState", appId, channel, appFn, diff --git a/sdks/fabric/interoperation-node-sdk/types/index.d.ts b/sdks/fabric/interoperation-node-sdk/types/index.d.ts index 5823ae3e4..742de52ec 100644 --- a/sdks/fabric/interoperation-node-sdk/types/index.d.ts +++ b/sdks/fabric/interoperation-node-sdk/types/index.d.ts @@ -16,3 +16,5 @@ import * as AssetManager from "../src/AssetManager"; export { AssetManager }; import * as HashFunctions from "../src/HashFunctions"; export { HashFunctions }; +import * as EventsManager from "../src/EventsManager"; +export { EventsManager }; diff --git a/tests/network-setups/.gitignore b/tests/network-setups/.gitignore index e636cb0a9..3fa3a9936 100644 --- a/tests/network-setups/.gitignore +++ b/tests/network-setups/.gitignore @@ -14,3 +14,11 @@ shared/charts/username *.tar.gz *.env fabric/dev/log.txt + +fabric/shared/*/ordererOrganizations +fabric/shared/*/peerOrganizations +fabric/shared/*/wallet/* +fabric/shared/*/system-genesis-block/* +fabric/shared/*/channel-artifacts +fabric/shared/*/fabric-ca/ordererOrg/* +fabric/shared/*/fabric-ca/org1/* \ No newline at end of file diff --git a/tests/network-setups/corda/dev/Corda_Network/constants.properties b/tests/network-setups/corda/dev/Corda_Network/constants.properties index bf03d320c..e0cbc6acc 100644 --- a/tests/network-setups/corda/dev/Corda_Network/constants.properties +++ b/tests/network-setups/corda/dev/Corda_Network/constants.properties @@ -1,7 +1,7 @@ cordaReleaseGroup=net.corda cordaCoreReleaseGroup=net.corda -cordaVersion=4.8.4 -cordaCoreVersion=4.8.4 +cordaVersion=4.8 +cordaCoreVersion=4.8 gradlePluginsVersion=5.0.12 kotlinVersion=1.3.72 junitVersion=4.12 @@ -17,4 +17,4 @@ partyAAdminRpcAddress=localhost:10046 partyBRpcAddress=localhost:10009 partyBAdminRpcAddress=localhost:10049 partyCRpcAddress=localhost:10012 -partyCAdminRpcAddress=localhost:10052 \ No newline at end of file +partyCAdminRpcAddress=localhost:10052 diff --git a/tests/network-setups/corda/dev/Corda_Network/docker-compose.yml b/tests/network-setups/corda/dev/Corda_Network/docker-compose.yml index 74821bc9c..767bb606d 100644 --- a/tests/network-setups/corda/dev/Corda_Network/docker-compose.yml +++ b/tests/network-setups/corda/dev/Corda_Network/docker-compose.yml @@ -22,7 +22,8 @@ services: ports: - 10003:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_notary_1 partya: profiles: ["1-node", "2-nodes", "3-nodes"] volumes: @@ -40,7 +41,8 @@ services: ports: - 10006:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_partya_1 partyb: profiles: ["2-nodes", "3-nodes"] volumes: @@ -58,7 +60,8 @@ services: ports: - 10009:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_partyb_1 partyc: profiles: ["3-nodes"] volumes: @@ -76,4 +79,5 @@ services: ports: - 10012:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_partyc_1 diff --git a/tests/network-setups/corda/dev/Corda_Network2/constants.properties b/tests/network-setups/corda/dev/Corda_Network2/constants.properties index 4aade9130..aa3b4e514 100644 --- a/tests/network-setups/corda/dev/Corda_Network2/constants.properties +++ b/tests/network-setups/corda/dev/Corda_Network2/constants.properties @@ -1,7 +1,7 @@ cordaReleaseGroup=net.corda cordaCoreReleaseGroup=net.corda -cordaVersion=4.8.4 -cordaCoreVersion=4.8.4 +cordaVersion=4.8 +cordaCoreVersion=4.8 gradlePluginsVersion=5.0.12 kotlinVersion=1.3.72 junitVersion=4.12 diff --git a/tests/network-setups/corda/dev/Corda_Network2/docker-compose.yml b/tests/network-setups/corda/dev/Corda_Network2/docker-compose.yml index e9166ffef..f735b7e67 100644 --- a/tests/network-setups/corda/dev/Corda_Network2/docker-compose.yml +++ b/tests/network-setups/corda/dev/Corda_Network2/docker-compose.yml @@ -22,7 +22,8 @@ services: ports: - 30003:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_network2_notary_1 partya: profiles: ["1-node", "2-nodes", "3-nodes"] volumes: @@ -40,7 +41,8 @@ services: ports: - 30006:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_network2_partya_1 partyb: profiles: ["2-nodes", "3-nodes"] volumes: @@ -58,7 +60,8 @@ services: ports: - 30009:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_network2_partyb_1 partyc: profiles: ["3-nodes"] volumes: @@ -76,4 +79,5 @@ services: ports: - 30012:10003 - 22022 - image: corda/corda-zulu-java1.8-4.8.4 + image: corda/corda-zulu-java1.8-4.8 + container_name: corda_network2_partyc_1 diff --git a/tests/network-setups/corda/scripts/get-cordapps.sh b/tests/network-setups/corda/scripts/get-cordapps.sh index e257c09fe..274c2fe0a 100755 --- a/tests/network-setups/corda/scripts/get-cordapps.sh +++ b/tests/network-setups/corda/scripts/get-cordapps.sh @@ -4,7 +4,7 @@ directory=$(dirname $0) app=${1:-simple} local=$2 weaverCordaVersion="1.2.9" -weaverProtosVersion="1.3.1" +weaverProtosVersion="1.4.2" if [ "simple" = "$app" ]; then cordappPath=$directory/../../../../samples/corda/corda-simple-application diff --git a/tests/network-setups/corda/scripts/start-nodes.sh b/tests/network-setups/corda/scripts/start-nodes.sh index b69b172e2..776f4b5aa 100755 --- a/tests/network-setups/corda/scripts/start-nodes.sh +++ b/tests/network-setups/corda/scripts/start-nodes.sh @@ -10,11 +10,11 @@ houseTokenAppVersion="1.0" tokenVersion="1.2" weaverCordaVersion="1.2.9" -weaverProtosVersion="1.3.1" +weaverProtosVersion="1.4.2" parties="Notary PartyA PartyB PartyC" -echo "Starting Netowrk: ${nw}, profile: ${profile}, with App: ${app} Cordapp..." +echo "Starting Network: ${nw}, profile: ${profile}, with App: ${app} Cordapp..." for party in ${parties}; do if [ "simple" = "$app" ]; then diff --git a/tests/network-setups/fabric/dev/Makefile b/tests/network-setups/fabric/dev/Makefile index 41c84272f..058f8524a 100644 --- a/tests/network-setups/fabric/dev/Makefile +++ b/tests/network-setups/fabric/dev/Makefile @@ -7,9 +7,17 @@ E2E_CONFIDENTIALITY?=false .PHONY: all all: start + +.PHONY: artifacts-network1 +artifacts-network1: + cp -r ../network-artifacts/network1/* ../shared/network1/ + +.PHONY: artifacts-network2 +artifacts-network2: + cp -r ../network-artifacts/network2/* ../shared/network2/ .PHONY: start -start: start-network1 start-network2 +start: start-network1 start-network2 .PHONY: start-interop start-interop: start-interop-network1 start-interop-network2 @@ -18,22 +26,22 @@ start-interop: start-interop-network1 start-interop-network2 start-interop-local: start-interop-network1-local start-interop-network2-local .PHONY: start-network1 -start-network1: .fabric-setup setup-cc +start-network1: .fabric-setup artifacts-network1 setup-cc ./network.sh up createChannel -ca -nw network1 ./network.sh deployCC -ch $(CHAINCODE_NAME) -nw network1 .PHONY: start-network1-local -start-network1-local: .fabric-setup setup-cc-local +start-network1-local: .fabric-setup artifacts-network1 setup-cc-local ./network.sh up createChannel -ca -nw network1 ./network.sh deployCC -ch $(CHAINCODE_NAME) -nw network1 .PHONY: start-network2 -start-network2: .fabric-setup setup-cc +start-network2: .fabric-setup artifacts-network2 setup-cc ./network.sh up createChannel -ca -nw network2 ./network.sh deployCC -ch $(CHAINCODE_NAME) -nw network2 .PHONY: start-network2-local -start-network2-local: .fabric-setup setup-cc-local +start-network2-local: .fabric-setup artifacts-network2 setup-cc-local ./network.sh up createChannel -ca -nw network2 ./network.sh deployCC -ch $(CHAINCODE_NAME) -nw network2 @@ -111,15 +119,62 @@ remove: remove-network1 remove-network2 .PHONY: remove-network1 remove-network1: ./network.sh clean -nw network1 + rm -rf ../shared/network1/wallet/*.id .PHONY: remove-network2 remove-network2: ./network.sh clean -nw network2 + rm -rf ../shared/network2/wallet/*.id .PHONY: clean -clean: stop +clean: remove + +docker system prune -f || true +rm -rf bin || true +rm -rf config || true +rm .fabric-setup || true +chmod -R 755 ../shared/chaincode/interop +rm -rf ../shared/chaincode/* + +chmod-artifacts: + sudo chmod 644 ../shared/network1/fabric-ca/ordererOrg/msp/keystore/* + sudo chmod 644 ../shared/network1/fabric-ca/org1/msp/keystore/* + sudo chmod 644 ../shared/network2/fabric-ca/ordererOrg/msp/keystore/* + sudo chmod 644 ../shared/network2/fabric-ca/org1/msp/keystore/* + +docker-ccp: + (cd ../shared/network1/peerOrganizations/org1.network1.com && \ + cp connection-org1.json connection-org1.docker.json && \ + sed -i'.bkp' -e 27' s/localhost/peer0.org1.network1.com/' connection-org1.docker.json && \ + sed -i'.bkp' -e 39' s/localhost/ca.org1.network1.com/' connection-org1.docker.json && \ + rm -rf connection-org1.docker.json.bkp) + (cd ../shared/network2/peerOrganizations/org1.network2.com && \ + cp connection-org1.json connection-org1.docker.json && \ + sed -i'.bkp' -e 27' s/localhost/peer0.org1.network2.com/' connection-org1.docker.json && \ + sed -i'.bkp' -e 39' s/localhost/ca.org1.network2.com/' connection-org1.docker.json && \ + rm -rf connection-org1.docker.json.bkp) + + +backup-network1: + cp -r ../shared/network1/ordererOrganizations ../network-artifacts/network1/ + cp -r ../shared/network1/peerOrganizations ../network-artifacts/network1/ + cp ../shared/network1/system-genesis-block/genesis.block ../network-artifacts/network1/system-genesis-block/ + cp -r ../shared/network1/channel-artifacts ../network-artifacts/network1/ + cp -r ../shared/network1/fabric-ca/ordererOrg ../network-artifacts/network1/fabric-ca + cp -r ../shared/network1/fabric-ca/org1 ../network-artifacts/network1/fabric-ca + rm ../network-artifacts/network1/fabric-ca/ordererOrg/fabric-ca-server-config.yaml ../network-artifacts/network1/fabric-ca/org1/fabric-ca-server-config.yaml + +backup-network2: + cp -r ../shared/network2/ordererOrganizations ../network-artifacts/network2/ + cp -r ../shared/network2/peerOrganizations ../network-artifacts/network2/ + cp ../shared/network2/system-genesis-block/genesis.block ../network-artifacts/network2/system-genesis-block/ + cp -r ../shared/network2/channel-artifacts ../network-artifacts/network2/ + cp -r ../shared/network2/fabric-ca/ordererOrg ../network-artifacts/network2/fabric-ca + cp -r ../shared/network2/fabric-ca/org1 ../network-artifacts/network2/fabric-ca + rm ../network-artifacts/network2/fabric-ca/ordererOrg/fabric-ca-server-config.yaml ../network-artifacts/network2/fabric-ca/org1/fabric-ca-server-config.yaml + +backup: backup-network1 backup-network2 + +delete-artifacts: + (cd ../network-artifacts/network1 && rm -rf ordererOrganizations peerOrganizations system-genesis-block/* channel-artifacts fabric-ca/ordererOrg fabric-ca/org1) + (cd ../network-artifacts/network2 && rm -rf ordererOrganizations peerOrganizations system-genesis-block/* channel-artifacts fabric-ca/ordererOrg fabric-ca/org1) + diff --git a/tests/network-setups/fabric/dev/scripts/setupCC.sh b/tests/network-setups/fabric/dev/scripts/setupCC.sh index e71f78c12..a2ad92423 100755 --- a/tests/network-setups/fabric/dev/scripts/setupCC.sh +++ b/tests/network-setups/fabric/dev/scripts/setupCC.sh @@ -13,7 +13,7 @@ OLD_GOPATH=$GOPATH export GOPATH=$TMP_PATH # Download interopcc and copy it into correct folder -go get -d "${INTEROPCC_MOD}" +go install "${INTEROPCC_MOD}@latest" cp -r $TMP_PATH/pkg/mod/github.com/hyperledger-labs/weaver-dlt-interoperability/core/network/fabric-interop-cc/contracts/interop* $CHAINCODE_PATH/interop chmod -R +w $CHAINCODE_PATH/interop diff --git a/tests/network-setups/fabric/shared/network1/channel-artifacts/Org1MSPanchors.tx b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/Org1MSPanchors.tx similarity index 79% rename from tests/network-setups/fabric/shared/network1/channel-artifacts/Org1MSPanchors.tx rename to tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/Org1MSPanchors.tx index b8f16d23f..eb998981f 100644 Binary files a/tests/network-setups/fabric/shared/network1/channel-artifacts/Org1MSPanchors.tx and b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/Org1MSPanchors.tx differ diff --git a/tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.block b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.block similarity index 51% rename from tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.block rename to tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.block index ca59ff501..425d4b7e0 100644 Binary files a/tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.block and b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.block differ diff --git a/tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.tx b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.tx similarity index 81% rename from tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.tx rename to tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.tx index 1fa916280..5516cacd5 100644 Binary files a/tests/network-setups/fabric/shared/network1/channel-artifacts/mychannel.tx and b/tests/network-setups/fabric/network-artifacts/network1/channel-artifacts/mychannel.tx differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerPublicKey new file mode 100644 index 000000000..b5f24d411 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey new file mode 100644 index 000000000..0446428da --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEd39gnT70tFBHKV7uqQD+YHZ3XLF/2OjS +zMwotj+tL3Cp5FKl9ZyA4Gfx3aBUyY/1htC5R8C3LfhEW/sn1KxVfzRO87+e/nts +7hW2/pSe2BoUfafI094kjoBxXwtti08X +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/ca-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/ca-cert.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/ca-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server.db b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/fabric-ca-server.db similarity index 88% rename from tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server.db rename to tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/fabric-ca-server.db index 5bfdebf20..6217b4024 100644 Binary files a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server.db and b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/fabric-ca-server.db differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/3ac44c3fc37d9844f62a7025a6f69ac46a1a5cfea98922d30ad7fb901eab1869_sk b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/3ac44c3fc37d9844f62a7025a6f69ac46a1a5cfea98922d30ad7fb901eab1869_sk new file mode 100644 index 000000000..2e68ecd36 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/3ac44c3fc37d9844f62a7025a6f69ac46a1a5cfea98922d30ad7fb901eab1869_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgg8m8nzB/Y1knOlZF +MVmg3x09uPqUrgYSBw1rzRK1BhehRANCAAR0kFHHwJhuiJgVOXlHRdCrXj4Th6TM +J/oQcbZKuqHy7iggUP5B7JH7jDBIlsl/09ZLeeCue6gVgbDM6nQ/i2tR +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/44602e251c95b69ca3833d9ec3a075518b1646a76c1675abf0acafcc06e158c1_sk b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/44602e251c95b69ca3833d9ec3a075518b1646a76c1675abf0acafcc06e158c1_sk new file mode 100644 index 000000000..9d8b1caf9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/44602e251c95b69ca3833d9ec3a075518b1646a76c1675abf0acafcc06e158c1_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguI4rpRZzLESJOJLi +HrdLz+FB2C7fb/8Bjctv4FLtuLihRANCAARONuBAcV+Xvk33I7IVKNp7HRNq+o+V +T4p9uxzb73LTnDYd+uwXbj8OlQTMI3QVU3fugOFpgnSkktFX7L+fTrjK +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey new file mode 100644 index 000000000..fc556a0ab --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGkAgEBBDC7d2qOOqKSgqJJm2xn6YKZxUBfZWjN4+wJ+8MDwka3BcBk0cdsc81w +O7KLilzNmv2gBwYFK4EEACKhZANiAAR3f2CdPvS0UEcpXu6pAP5gdndcsX/Y6NLM +zCi2P60vcKnkUqX1nIDgZ/HdoFTJj/WG0LlHwLct+ERb+yfUrFV/NE7zv57+e2zu +Fbb+lJ7YGhR9p8jT3iSOgHFfC22LTxc= +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey new file mode 100644 index 000000000..6c197d4ea --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey @@ -0,0 +1 @@ +,`®SeV|kE"t9 \ No newline at end of file diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/tls-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/tls-cert.pem new file mode 100644 index 000000000..95fbef426 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/ordererOrg/tls-cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICcjCCAhmgAwIBAgIUWOfZqTEECgiThYpX7zwxPPOvcNUwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjIwMFowZDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEwxiMjAwOWViNjQ3MWIw +WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARONuBAcV+Xvk33I7IVKNp7HRNq+o+V +T4p9uxzb73LTnDYd+uwXbj8OlQTMI3QVU3fugOFpgnSkktFX7L+fTrjKo4GkMIGh +MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw +DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU+wk2tcKkYPdHGqtZVZJKJKuJh5EwHwYD +VR0jBBgwFoAU/B76Va+h9zTp0bshBDfa0h24AeQwIgYDVR0RBBswGYIMZjU4NmY3 +YmNiYTU0gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAwRAIgDmI9LS3bYm/n3moL +w8jf1c1PCcaEbZnjsaJK1JRHQgsCIBN+A43LqmObRtI00X7rZXC9zFi/SlYquEy0 +aWNis3MT +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/ca-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/ca-cert.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/ca-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server.db b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/fabric-ca-server.db similarity index 81% rename from tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server.db rename to tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/fabric-ca-server.db index 1663a1734..998026117 100644 Binary files a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server.db and b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/fabric-ca-server.db differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/6f6237ceb26ff0976337f15602e879866997c87c1cca786a9263be68d6f021d6_sk b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/6f6237ceb26ff0976337f15602e879866997c87c1cca786a9263be68d6f021d6_sk new file mode 100644 index 000000000..29367e3dd --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/6f6237ceb26ff0976337f15602e879866997c87c1cca786a9263be68d6f021d6_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgDMyi/44bXyu1kZS6 +vXkjdwIe6DoLFTl52gOCD5OJfxmhRANCAATvq5tkf9UcmzOxgsdUppTAoFFRm/w/ +4mro6nk94F/TYlQo8zXkNIX2fnpEmr7uasz3MHM+8GxTJIV36uv8Guxb +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/91f44bfbbf9a6b8ae2055fa311dbfd38547df4a3b43a764321ed14beb191f382_sk b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/91f44bfbbf9a6b8ae2055fa311dbfd38547df4a3b43a764321ed14beb191f382_sk new file mode 100644 index 000000000..f674b3a68 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/91f44bfbbf9a6b8ae2055fa311dbfd38547df4a3b43a764321ed14beb191f382_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4UBuTNqnibNkX9K2 +vJ7WCt1LvDLOMvDVSSWRO8p3Dq2hRANCAARi/49Za+kHWHwM0CZAGN2SqCvoTRQZ +4558ABC0X0zOW8H4f5F9hy4bJqmyvw3IIff1g/zrZ0gJKwG5Tqq0IMW2 +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey new file mode 100644 index 000000000..276c460c5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGkAgEBBDCSbLLMy9HX0BEvepcr4PFgyZw7+e/nL6p3DaFzk7QiSpZQWZfnhTBH +6qrLuA653MKgBwYFK4EEACKhZANiAATe6U5HL7V94O6HjWFDo+RcCIu98PTfNWsS +71w1Ns1PsWd72LICDVHfbPowqafK4+FmTyk81xiy7yQowJEdB8opiU+GM7j4Pnyi +RlCdWEh1SASk0lkJuscHZCdPZ1yHSaU= +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey new file mode 100644 index 000000000..e02cca080 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey @@ -0,0 +1,2 @@ +\!8X*jt9y +˱R D \ No newline at end of file diff --git a/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/tls-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/tls-cert.pem new file mode 100644 index 000000000..85bf6f288 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/fabric-ca/org1/tls-cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICczCCAhmgAwIBAgIUYLuArOIRKq7WUs6dSE577nZyHYIwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjIwMFowZDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEww4NTAyYzA1YWM0OGYw +WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARi/49Za+kHWHwM0CZAGN2SqCvoTRQZ +4558ABC0X0zOW8H4f5F9hy4bJqmyvw3IIff1g/zrZ0gJKwG5Tqq0IMW2o4GkMIGh +MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw +DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUG9snwjivUgjDLL3IjB/IkD6JXkIwHwYD +VR0jBBgwFoAUzscMx6GIeXxv3ZBIw3hDUUHslT8wIgYDVR0RBBswGYIMNmJiZDg5 +NDMwMTY2gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhANS2OL8/6u+onCx2 +HKJHuoZbmvMWRPBAf9hDmZxLxWv0AiANxoAEN5VQIND0MsObabfpt/walvjxQvao +3JA54Yj5pg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/fabric-ca-client-config.yaml b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/fabric-ca-client-config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/fabric-ca-client-config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/fabric-ca-client-config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..b5f24d411 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..0446428da --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEd39gnT70tFBHKV7uqQD+YHZ3XLF/2OjS +zMwotj+tL3Cp5FKl9ZyA4Gfx3aBUyY/1htC5R8C3LfhEW/sn1KxVfzRO87+e/nts +7hW2/pSe2BoUfafI094kjoBxXwtti08X +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/keystore/58dca995909dfa76173499b1046793178da020db97c77840c7f7cf91fa0fdcef_sk b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/keystore/58dca995909dfa76173499b1046793178da020db97c77840c7f7cf91fa0fdcef_sk new file mode 100644 index 000000000..2be231c57 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/keystore/58dca995909dfa76173499b1046793178da020db97c77840c7f7cf91fa0fdcef_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0tGanPJdJJojJklV +7Lcpr4LtX5+z55xrYzagByDScVmhRANCAARcw9r4mfm/p7VnriQzGJ1onrdOYaqK +NmzQ15Jn2D4xFGj+2xu0BU3Sq/D3dePU5GEjiMiVxrCZ0Vs/95IJXUgh +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..b0e041937 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICPDCCAeKgAwIBAgIUEZQYTbxUDnTSAiMZtONa2bhx3aAwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABFzD2viZ+b+ntWeuJDMYnWiet05hqoo2bNDXkmfY +PjEUaP7bG7QFTdKr8Pd149TkYSOIyJXGsJnRWz/3kgldSCGjdTBzMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSlgNmAXk6+uaAI5jPMd+ZI +MeGBKDAfBgNVHSMEGDAWgBT8HvpVr6H3NOnRuyEEN9rSHbgB5DATBgNVHREEDDAK +gghzYW5uaXNoMTAKBggqhkjOPQQDAgNIADBFAiEA4r0W5vVYanq2ptg2ioT2Yrey +wdypYA7+m5ZlDdUsh4wCIC2T2KuVIl/L+mbSGDmPItT3IuwX/jQYeYydigxZUmEH +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..b5f24d411 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..0446428da --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEd39gnT70tFBHKV7uqQD+YHZ3XLF/2OjS +zMwotj+tL3Cp5FKl9ZyA4Gfx3aBUyY/1htC5R8C3LfhEW/sn1KxVfzRO87+e/nts +7hW2/pSe2BoUfafI094kjoBxXwtti08X +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/b693c9143aa4020e1865f5e6232db70a58e01fec07cb84204b6a69176b73ed5e_sk b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/b693c9143aa4020e1865f5e6232db70a58e01fec07cb84204b6a69176b73ed5e_sk new file mode 100644 index 000000000..12b427c79 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/b693c9143aa4020e1865f5e6232db70a58e01fec07cb84204b6a69176b73ed5e_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgv27/23sMY7TqBWIu +jYvUzS+xHHvMD1g7cdGQXBhtf/ShRANCAAQW6SRaERdVSbaV9mse6WR2xxIICEuv +VNIjyOrSlS3YQ54cReOQw3SDnnjyOWoND+5xL3p90nrDFUKMnJQIpTzE +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem similarity index 51% rename from tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem rename to tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem index 9bc948e7c..c766e4ef6 100644 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/signcerts/cert.pem @@ -1,17 +1,17 @@ -----BEGIN CERTIFICATE----- -MIICtDCCAlugAwIBAgIUTB+NUu/uarOcF3YIpgcxaRj8974wCgYIKoZIzj0EAwIw +MIICtDCCAlugAwIBAgIUDqp7YaO3em9Mq5sptpC8jlYp3i4wCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowYDELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjMwMFoXDTMyMDgwNDA2MjgwMFowYDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABMWo2nk1eGVJX4rDFz8GNaWfztPqtvPpTNIX -EnI/3x+Wx7+Q+MZGB+4oUcJWJ9ul6dWikHAO5OO2NFR3F4UfXA+jgeowgecwDgYD -VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKsy/SyaOgce851T -ORtCe7fzZKDDMB8GA1UdIwQYMBaAFD6tYQP/qhHd7hPK0db/ZnRDP4Y0MCoGA1Ud +ByqGSM49AgEGCCqGSM49AwEHA0IABBbpJFoRF1VJtpX2ax7pZHbHEggIS69U0iPI +6tKVLdhDnhxF45DDdIOeePI5ag0P7nEven3SesMVQoyclAilPMSjgeowgecwDgYD +VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFFHMJfL+IJNmS7q4 +55l3ON+BzxZ5MB8GA1UdIwQYMBaAFPwe+lWvofc06dG7IQQ32tIduAHkMCoGA1Ud EQQjMCGCFG9yZGVyZXIubmV0d29yazEuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYH CAEET3siYXR0cnMiOnsiaGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50 SUQiOiJvcmRlcmVyIiwiaGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwID -RwAwRAIge2m09M3veb+jez0HYcUcqdis8OlAhfF0mYIe9xOXvksCIDUQ+9Wh8H54 -2XtKXcf3Vzoz7pr98l2TC8P2XJcjx2da +RwAwRAIgTBN59cdC/ZDvGJOlnsZqA+GRWlBnJoCSFUJHUl09xDQCIEVGQVIfxLn7 +v/93ifVMjITI9j+Ae7vptjzzFI3a6L+o -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey new file mode 100644 index 000000000..b5f24d411 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey new file mode 100644 index 000000000..0446428da --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEd39gnT70tFBHKV7uqQD+YHZ3XLF/2OjS +zMwotj+tL3Cp5FKl9ZyA4Gfx3aBUyY/1htC5R8C3LfhEW/sn1KxVfzRO87+e/nts +7hW2/pSe2BoUfafI094kjoBxXwtti08X +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/426c3a6d0556e0020c276da919026d8e11a5a776e83cd39609407f402517a38c_sk b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/426c3a6d0556e0020c276da919026d8e11a5a776e83cd39609407f402517a38c_sk new file mode 100644 index 000000000..7f81fa8e7 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/426c3a6d0556e0020c276da919026d8e11a5a776e83cd39609407f402517a38c_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgV6AZrtJ74dNEmrV0 +8ST6RLcbTTHBC87yCmu2BqaHr2uhRANCAAScOU8CMx4TC69oAxLL6+8oAG6ACopn +6NKxPQ6WoKmivglaJFSC5R1W5kK6DifBfuLPWqVxoTt4kgXCchXpr3eo +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt new file mode 100644 index 000000000..a4004f141 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC1jCCAnygAwIBAgIUMQgnjBA3ZvQj6vAIJ1IMsVmupgowCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjMwMFoXDTMyMDgwNDA2MjgwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABJw5TwIzHhMLr2gDEsvr7ygAboAKimfo0rE9 +DpagqaK+CVokVILlHVbmQroOJ8F+4s9apXGhO3iSBcJyFemvd6ijggEKMIIBBjAO +BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFCaJQnyaCBBf9OH7tRm5zD4GwYw9MB8GA1Ud +IwQYMBaAFPwe+lWvofc06dG7IQQ32tIduAHkMCoGA1UdEQQjMCGCFG9yZGVyZXIu +bmV0d29yazEuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi +aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi +aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAM5OXPDym1il +E/zJlyOEyl1kx5sKzodppv7SyIYzZ/uEAiBKlI7PZhj4grqR0chbvJt0JI8OuDpw +mz+8SJNMjiUwPw== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key new file mode 100644 index 000000000..7f81fa8e7 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgV6AZrtJ74dNEmrV0 +8ST6RLcbTTHBC87yCmu2BqaHr2uhRANCAAScOU8CMx4TC69oAxLL6+8oAG6ACopn +6NKxPQ6WoKmivglaJFSC5R1W5kK6DifBfuLPWqVxoTt4kgXCchXpr3eo +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem new file mode 100644 index 000000000..a4004f141 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC1jCCAnygAwIBAgIUMQgnjBA3ZvQj6vAIJ1IMsVmupgowCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjMwMFoXDTMyMDgwNDA2MjgwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABJw5TwIzHhMLr2gDEsvr7ygAboAKimfo0rE9 +DpagqaK+CVokVILlHVbmQroOJ8F+4s9apXGhO3iSBcJyFemvd6ijggEKMIIBBjAO +BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFCaJQnyaCBBf9OH7tRm5zD4GwYw9MB8GA1Ud +IwQYMBaAFPwe+lWvofc06dG7IQQ32tIduAHkMCoGA1UdEQQjMCGCFG9yZGVyZXIu +bmV0d29yazEuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi +aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi +aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAM5OXPDym1il +E/zJlyOEyl1kx5sKzodppv7SyIYzZ/uEAiBKlI7PZhj4grqR0chbvJt0JI8OuDpw +mz+8SJNMjiUwPw== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..b5f24d411 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..0446428da --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEd39gnT70tFBHKV7uqQD+YHZ3XLF/2OjS +zMwotj+tL3Cp5FKl9ZyA4Gfx3aBUyY/1htC5R8C3LfhEW/sn1KxVfzRO87+e/nts +7hW2/pSe2BoUfafI094kjoBxXwtti08X +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem new file mode 100644 index 000000000..2ab432eef --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ +E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl +yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb +FQNkBAC+kBjBjQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/0f8b9ac723af2ec1426c2407e6360b0c2a170273c894946f30d3662ad3429fe3_sk b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/0f8b9ac723af2ec1426c2407e6360b0c2a170273c894946f30d3662ad3429fe3_sk new file mode 100644 index 000000000..8a5b66800 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/0f8b9ac723af2ec1426c2407e6360b0c2a170273c894946f30d3662ad3429fe3_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6im84O3yj4FrfbTu +v9Q8UBt17KsIfwRGhFhw1oLbzoihRANCAAT1aix7Vlh0W/4/TmU9/qWXVT7zzDk6 +avbbxbROz14hbP4J0nFCg121XkUOHBFcMDWHgyQR8zGNomPW4Rxlh3cO +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..bb95ed32a --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkqgAwIBAgIUce98OV7kP9dKmv/NATtR83/TOa8wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjMwMFoXDTMyMDgwNDA2MjgwMFowYzELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xFTATBgNVBAMTDG9yZGVyZXJBZG1pbjBZ +MBMGByqGSM49AgEGCCqGSM49AwEHA0IABPVqLHtWWHRb/j9OZT3+pZdVPvPMOTpq +9tvFtE7PXiFs/gnScUKDXbVeRQ4cEVwwNYeDJBHzMY2iY9bhHGWHdw6jgdYwgdMw +DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJWi6/LF3OOp +/HQPjjuxGYvUMHg4MB8GA1UdIwQYMBaAFPwe+lWvofc06dG7IQQ32tIduAHkMBMG +A1UdEQQMMAqCCHNhbm5pc2gxMF4GCCoDBAUGBwgBBFJ7ImF0dHJzIjp7ImhmLkFm +ZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JkZXJlckFkbWluIiwi +aGYuVHlwZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0cAMEQCIEKAs43gBjPaTJd+ +g//Hhj6nv2FcpvHX+ISlqmIEWv4ZAiBRmdC7/x90NhQ85qmOFIvgIKl5sB6IdRBf +DbbnXDua0Q== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json similarity index 68% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json index 40755b227..34ef0938b 100644 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.docker.json @@ -26,7 +26,7 @@ "peer0.org1.network1.com": { "url": "grpcs://peer0.org1.network1.com:7051", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.network1.com", @@ -39,7 +39,7 @@ "url": "https://ca.org1.network1.com:7054", "caName": "ca-org1", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n" }, "httpOptions": { "verify": false diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.json b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.json similarity index 68% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.json rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.json index 79d8b56be..13611b542 100644 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.json +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.json @@ -26,7 +26,7 @@ "peer0.org1.network1.com": { "url": "grpcs://localhost:7051", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.network1.com", @@ -39,7 +39,7 @@ "url": "https://localhost:7054", "caName": "ca-org1", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+\ndTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC\na++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq\nGzi+/j4j7fu/wQ==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR\nUZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP\n7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb\nU5aIsTpdz3N2tg==\n-----END CERTIFICATE-----\n" }, "httpOptions": { "verify": false diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.yaml b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.yaml similarity index 52% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.yaml rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.yaml index a36744eac..5dcdec480 100644 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/connection-org1.yaml +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/connection-org1.yaml @@ -31,25 +31,25 @@ channels: chaincodeQuery: true ledgerQuery: true eventSource: true - + orderers: orderer.network1.com: url: grpcs://localhost:7050 tlsCACerts: pem: | -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw + MIICFjCCAb2gAwIBAgIUM6cOj4I4iM/mzV1zDRWHdggGlW0wCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ - dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdJBRx8CYboiYFTl5R0XQq14+ + E4ekzCf6EHG2Srqh8u4oIFD+QeyR+4wwSJbJf9PWS3ngrnuoFYGwzOp0P4trUaNF MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC - a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq - Gzi+/j4j7fu/wQ== + FPwe+lWvofc06dG7IQQ32tIduAHkMAoGCCqGSM49BAMCA0cAMEQCIBykgEh65XUl + yNUvDx2rMKwiyPL1A6rr7hoiFJX7KRN4AiBQpctKYeXqe/qDWFB+KaiC1YHalCrb + FQNkBAC+kBjBjQ== -----END CERTIFICATE----- grpcOptions: ssl-target-name-override: orderer.network1.com @@ -59,20 +59,20 @@ peers: url: grpcs://localhost:7051 tlsCACerts: pem: | - -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw - aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK - EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG - A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl - cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ - dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF - MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC - a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq - Gzi+/j4j7fu/wQ== - -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw + aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK + EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG + A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl + cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR + UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF + MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE + FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP + 7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb + U5aIsTpdz3N2tg== + -----END CERTIFICATE----- grpcOptions: ssl-target-name-override: peer0.org1.network1.com @@ -80,26 +80,23 @@ peers: certificateAuthorities: ca.org1.network1.com: url: https://localhost:7054 - caName: ca.org1.network1.com - registrar: - enrollId: admin - enrollSecret: adminpw + caName: ca-org1 tlsCACerts: pem: - | -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw + MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ - dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR + UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC - a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq - Gzi+/j4j7fu/wQ== + FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP + 7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb + U5aIsTpdz3N2tg== -----END CERTIFICATE----- httpOptions: diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/fabric-ca-client-config.yaml b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/fabric-ca-client-config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/fabric-ca-client-config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/fabric-ca-client-config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/keystore/c1c4b353508ec6783a48de0b559984e1ef4340b087ceee17078dc76daecba926_sk b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/keystore/c1c4b353508ec6783a48de0b559984e1ef4340b087ceee17078dc76daecba926_sk new file mode 100644 index 000000000..40b53c595 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/keystore/c1c4b353508ec6783a48de0b559984e1ef4340b087ceee17078dc76daecba926_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgfL7LdYR8DgU+04cF +4fqawMFq0c1d7ih/QN5sMWVjX92hRANCAAR83AdSz12H3MfK7HVRRKTbAI/QoB7K +dm6ov+cNtkHbG46Sgd1exeWkC7ijFVvKKCQU7586Sn8bt6AVsXL5heQ0 +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..035326dcc --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOzCCAeKgAwIBAgIUMPUvMBS1Xm4sNk5w99U0sNdbs0QwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABHzcB1LPXYfcx8rsdVFEpNsAj9CgHsp2bqi/5w22 +QdsbjpKB3V7F5aQLuKMVW8ooJBTvnzpKfxu3oBWxcvmF5DSjdTBzMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQwMDmMrReE7XnlIRruDqii +/xmS5jAfBgNVHSMEGDAWgBTOxwzHoYh5fG/dkEjDeENRQeyVPzATBgNVHREEDDAK +gghzYW5uaXNoMTAKBggqhkjOPQQDAgNHADBEAiAa2TEy0j854IFcQ39HPxfO+pB5 +jCPsdlMC1qbkJe2zqgIgMNwmiORGvfxtyI/vP20YL1Mv0OH7jnLC3/D/L3uQAnQ= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/eeafea5d436bd8876f9f74206634d639ab4af83d576149caaaf04d84c41c3032_sk b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/eeafea5d436bd8876f9f74206634d639ab4af83d576149caaaf04d84c41c3032_sk new file mode 100644 index 000000000..f2fa985d3 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/eeafea5d436bd8876f9f74206634d639ab4af83d576149caaaf04d84c41c3032_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9A2eMCkhDDcIkoch ++4fj7l7pOId36VXoUcXBJcdF0MihRANCAARiNW4axUQl8Y/561haU7xY3Q96934B +H02p28OQdS4kkRgNoRp1b+KGz0cIIvgDTNhCIrk0LQznaXfHYi1++MGd +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..5b5715b71 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkmgAwIBAgIUECd3JsgXpUE2wMg55P1v/DZzoiwwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowWzELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO +PQIBBggqhkjOPQMBBwNCAARiNW4axUQl8Y/561haU7xY3Q96934BH02p28OQdS4k +kRgNoRp1b+KGz0cIIvgDTNhCIrk0LQznaXfHYi1++MGdo4HdMIHaMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRdChJFxDTqRTnSNmmjbVno +RpdqTzAfBgNVHSMEGDAWgBTOxwzHoYh5fG/dkEjDeENRQeyVPzAiBgNVHREEGzAZ +ghdwZWVyMC5vcmcxLm5ldHdvcmsxLmNvbTBWBggqAwQFBgcIAQRKeyJhdHRycyI6 +eyJoZi5BZmZpbGlhdGlvbiI6IiIsImhmLkVucm9sbG1lbnRJRCI6InBlZXIwIiwi +aGYuVHlwZSI6InBlZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAOkkKT0Zhboh16N5 +Nr1iShXkO9FFkFawSuB/06qFsIxKAiBgwtahpM9b62jlR+nqlhx6y2CBu+S1XFJn +L0O6hUULCw== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/64e6843f927cfde4f395cdc29c632f1aff7534f91cdc5f0e1cd6ad2cc65512aa_sk b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/64e6843f927cfde4f395cdc29c632f1aff7534f91cdc5f0e1cd6ad2cc65512aa_sk new file mode 100644 index 000000000..4f4a6a947 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/64e6843f927cfde4f395cdc29c632f1aff7534f91cdc5f0e1cd6ad2cc65512aa_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0TIsUIXpPG2y7fl/ +ubhxf9+wVPwM+cA5cSHfdju3A8ehRANCAASYjuNa6IXu+u2uoVPwbV+M9Pm4fz2n +OVvKt1I6CcYG5Rvx59DgOfbrs1luV51t30fKTw3N6rJ8a7gYPMMJGqDv +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt similarity index 50% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt index 69e8de007..7befb91c7 100644 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzjCCAnWgAwIBAgIUb5it42SbEl1OK6uZ6752qdVsSBcwCgYIKoZIzj0EAwIw +MIICzzCCAnWgAwIBAgIUItE2ZB3cm84HaS8ax61RGVzKkEEwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowWzELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowWzELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAAQ49ZM9Y1fVHlzYp8LZTdbW4JROYNfIrUdRZH/Usltl -PN4S2eOeTB2nPKPt64r66TEzMYyNIx/n2bix105qq4Jvo4IBCDCCAQQwDgYDVR0P +PQIBBggqhkjOPQMBBwNCAASYjuNa6IXu+u2uoVPwbV+M9Pm4fz2nOVvKt1I6CcYG +5Rvx59DgOfbrs1luV51t30fKTw3N6rJ8a7gYPMMJGqDvo4IBCDCCAQQwDgYDVR0P AQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBQlEZldu7ZOFwpXlcbwCzuLxQRigzAfBgNVHSMEGDAW -gBRyhvWC+jgvOsuRSF6arXu2zl0g/DAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l +Af8EAjAAMB0GA1UdDgQWBBQy0PHaG0PbmR1W/HOPy0Jb3NV+JjAfBgNVHSMEGDAW +gBTOxwzHoYh5fG/dkEjDeENRQeyVPzAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l dHdvcmsxLmNvbYIJbG9jYWxob3N0MFYGCCoDBAUGBwgBBEp7ImF0dHJzIjp7Imhm LkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoicGVlcjAiLCJoZi5U -eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNHADBEAiB+vYGMBqkXA+jSaYemxr6v -YSH4dGl87tAPxpLMd4CwvwIgYdzixsbScvcY7BkzhsoJCO3J2VKejybIL/4TSEIN -yWo= +eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNIADBFAiEAnbzIbPu0SHK+Jq1OSs7a +YhG9+hUIHG+Pr2QC8EGlQkQCIFNnaTmapBrHD9lDaUiXqvx0jQG4Keyir59NZSGZ +XSiw -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key new file mode 100644 index 000000000..4f4a6a947 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0TIsUIXpPG2y7fl/ +ubhxf9+wVPwM+cA5cSHfdju3A8ehRANCAASYjuNa6IXu+u2uoVPwbV+M9Pm4fz2n +OVvKt1I6CcYG5Rvx59DgOfbrs1luV51t30fKTw3N6rJ8a7gYPMMJGqDv +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem similarity index 50% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem index 69e8de007..7befb91c7 100644 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/signcerts/cert.pem @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzjCCAnWgAwIBAgIUb5it42SbEl1OK6uZ6752qdVsSBcwCgYIKoZIzj0EAwIw +MIICzzCCAnWgAwIBAgIUItE2ZB3cm84HaS8ax61RGVzKkEEwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowWzELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowWzELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAAQ49ZM9Y1fVHlzYp8LZTdbW4JROYNfIrUdRZH/Usltl -PN4S2eOeTB2nPKPt64r66TEzMYyNIx/n2bix105qq4Jvo4IBCDCCAQQwDgYDVR0P +PQIBBggqhkjOPQMBBwNCAASYjuNa6IXu+u2uoVPwbV+M9Pm4fz2nOVvKt1I6CcYG +5Rvx59DgOfbrs1luV51t30fKTw3N6rJ8a7gYPMMJGqDvo4IBCDCCAQQwDgYDVR0P AQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBQlEZldu7ZOFwpXlcbwCzuLxQRigzAfBgNVHSMEGDAW -gBRyhvWC+jgvOsuRSF6arXu2zl0g/DAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l +Af8EAjAAMB0GA1UdDgQWBBQy0PHaG0PbmR1W/HOPy0Jb3NV+JjAfBgNVHSMEGDAW +gBTOxwzHoYh5fG/dkEjDeENRQeyVPzAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l dHdvcmsxLmNvbYIJbG9jYWxob3N0MFYGCCoDBAUGBwgBBEp7ImF0dHJzIjp7Imhm LkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoicGVlcjAiLCJoZi5U -eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNHADBEAiB+vYGMBqkXA+jSaYemxr6v -YSH4dGl87tAPxpLMd4CwvwIgYdzixsbScvcY7BkzhsoJCO3J2VKejybIL/4TSEIN -yWo= +eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNIADBFAiEAnbzIbPu0SHK+Jq1OSs7a +YhG9+hUIHG+Pr2QC8EGlQkQCIFNnaTmapBrHD9lDaUiXqvx0jQG4Keyir59NZSGZ +XSiw -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/f61df36f24b9dcdb70044843dc99c104873c5b33613fbad99e0e167e0a4b3f27_sk b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/f61df36f24b9dcdb70044843dc99c104873c5b33613fbad99e0e167e0a4b3f27_sk new file mode 100644 index 000000000..e81c51a5c --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/f61df36f24b9dcdb70044843dc99c104873c5b33613fbad99e0e167e0a4b3f27_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgj1vjXksTC+QyENWS +ui+wYos2RBpYbvzBLGhkZwMg6zqhRANCAARSLz+i/y49KPz1Hv7vgyKKQtb6mY2N +KdzWpL197uvu9bZ817ZcVYNjNAlQZ5jmmG0N2tnM+QhS9V4oPP7MByQV +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..dea4f3e1b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICnjCCAkSgAwIBAgIUL9UVXNvA5bMYLVNmWbSWxkvR5rkwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xEjAQBgNVBAMTCW9yZzFhZG1pbjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABFIvP6L/Lj0o/PUe/u+DIopC1vqZjY0p3Nak +vX3u6+71tnzXtlxVg2M0CVBnmOaYbQ3a2cz5CFL1Xig8/swHJBWjgdMwgdAwDgYD +VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPQlK3dONB+82HpW +2vrLsiFC12cxMB8GA1UdIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MBMGA1Ud +EQQMMAqCCHNhbm5pc2gxMFsGCCoDBAUGBwgBBE97ImF0dHJzIjp7ImhmLkFmZmls +aWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JnMWFkbWluIiwiaGYuVHlw +ZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0gAMEUCIQDc7wMxVFpH5Pp0uqd62XEK +Et6FHFIAlKx5+jP68P6WRQIgV6VRTAuxBSSpnNjYdifIPANEqDJipZS0e4LUblCY +QNc= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey new file mode 100644 index 000000000..4b818bdff Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..c679c8ee9 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3ulORy+1feDuh41hQ6PkXAiLvfD03zVr +Eu9cNTbNT7Fne9iyAg1R32z6MKmnyuPhZk8pPNcYsu8kKMCRHQfKKYlPhjO4+D58 +okZQnVhIdUgEpNJZCbrHB2QnT2dch0ml +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem new file mode 100644 index 000000000..cf1d2d465 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFjCCAb2gAwIBAgIUYxHjCF1HdZexrgAM73ec4jdHy8owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTM3MDczMTE4MjIwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE76ubZH/VHJszsYLHVKaUwKBR +UZv8P+Jq6Op5PeBf02JUKPM15DSF9n56RJq+7mrM9zBzPvBsUySFd+rr/BrsW6NF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FM7HDMehiHl8b92QSMN4Q1FB7JU/MAoGCCqGSM49BAMCA0cAMEQCIH4UJq+qY2OP +7DzBAwY7woYuy4zoT2kxyiexlix38aY4AiAo+8OKE1wFM+XKLUqI4zzgq2bpg1qb +U5aIsTpdz3N2tg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/61348d574115ae16f64e30953e079f9eddae2842adfeca1da831ac4de259156a_sk b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/61348d574115ae16f64e30953e079f9eddae2842adfeca1da831ac4de259156a_sk new file mode 100644 index 000000000..e8cd62f57 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/61348d574115ae16f64e30953e079f9eddae2842adfeca1da831ac4de259156a_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgP7xiy67hnrd9sD/T +gCwUD4t1PcaNImVI9f6g6AlQPHKhRANCAAQrvFWYCf8VCrfJv6jR3MFQ8LdHlPCB +wCwl/FCD9fg+pdqiF6v/uP2DDnzE/P+w2GEtlQ+Wp1O7zkct5djoA0MV +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..cab4093ab --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICmDCCAj6gAwIBAgIUAJMbAVjeI4shAIPbJkknJGgL7xEwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjIwMFoXDTMyMDgwNDA2MjcwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABCu8VZgJ/xUKt8m/qNHcwVDwt0eU8IHALCX8UIP1 ++D6l2qIXq/+4/YMOfMT8/7DYYS2VD5anU7vORy3l2OgDQxWjgdAwgc0wDgYDVR0P +AQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKfw+k4jY4qC24hFTN+y +zGAUv9MoMB8GA1UdIwQYMBaAFM7HDMehiHl8b92QSMN4Q1FB7JU/MBMGA1UdEQQM +MAqCCHNhbm5pc2gxMFgGCCoDBAUGBwgBBEx7ImF0dHJzIjp7ImhmLkFmZmlsaWF0 +aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEiLCJoZi5UeXBlIjoiY2xp +ZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQCZKBQ6Fm2B5kcq54Ifb8IopJ92zSBi +kI7ZCS8MNSR61QIgbeLPKf+uhzD52SfDN/sHihIHRFrACDEOym5ILMPx1t4= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/system-genesis-block/genesis.block b/tests/network-setups/fabric/network-artifacts/network1/system-genesis-block/genesis.block similarity index 53% rename from tests/network-setups/fabric/shared/network1/system-genesis-block/genesis.block rename to tests/network-setups/fabric/network-artifacts/network1/system-genesis-block/genesis.block index a6a7cef46..f61e35c84 100644 Binary files a/tests/network-setups/fabric/shared/network1/system-genesis-block/genesis.block and b/tests/network-setups/fabric/network-artifacts/network1/system-genesis-block/genesis.block differ diff --git a/tests/network-setups/fabric/shared/network1/wallet/user1.id b/tests/network-setups/fabric/network-artifacts/network1/wallet/user1.id similarity index 100% rename from tests/network-setups/fabric/shared/network1/wallet/user1.id rename to tests/network-setups/fabric/network-artifacts/network1/wallet/user1.id diff --git a/tests/network-setups/fabric/shared/network2/channel-artifacts/Org1MSPanchors.tx b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/Org1MSPanchors.tx similarity index 65% rename from tests/network-setups/fabric/shared/network2/channel-artifacts/Org1MSPanchors.tx rename to tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/Org1MSPanchors.tx index b1909234d..71bf327a4 100644 Binary files a/tests/network-setups/fabric/shared/network2/channel-artifacts/Org1MSPanchors.tx and b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/Org1MSPanchors.tx differ diff --git a/tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.block b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.block similarity index 50% rename from tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.block rename to tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.block index 23e879c32..eaa89dd43 100644 Binary files a/tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.block and b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.block differ diff --git a/tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.tx b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.tx similarity index 93% rename from tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.tx rename to tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.tx index a994e68de..fccaff51d 100644 Binary files a/tests/network-setups/fabric/shared/network2/channel-artifacts/mychannel.tx and b/tests/network-setups/fabric/network-artifacts/network2/channel-artifacts/mychannel.tx differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerPublicKey new file mode 100644 index 000000000..2c36147a6 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey new file mode 100644 index 000000000..8b92638a2 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9SyOSrNan0dp157pV5444DOA6/0hfpLb +Xax3VJwD46F5JTGS+ywB0la31M4s05NCSShW2M65Qwc2ioeZQWLTmOBkQtyJ1yzc +ruCXSCLJjHwndSI9jTmdArLmZIqeJIDx +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/ca-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/ca-cert.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/ca-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server.db b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/fabric-ca-server.db similarity index 88% rename from tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server.db rename to tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/fabric-ca-server.db index 42e44281c..b50e1bb8e 100644 Binary files a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server.db and b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/fabric-ca-server.db differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey new file mode 100644 index 000000000..2b193341f --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGkAgEBBDBtnYgK61JzblNKAiAWzjWkJLjRiKqwnPMQcf7bjxwm1LnACLvR2bf9 +faaWp20ALragBwYFK4EEACKhZANiAAT1LI5Ks1qfR2nXnulXnjjgM4Dr/SF+kttd +rHdUnAPjoXklMZL7LAHSVrfUzizTk0JJKFbYzrlDBzaKh5lBYtOY4GRC3InXLNyu +4JdIIsmMfCd1Ij2NOZ0CsuZkip4kgPE= +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey new file mode 100644 index 000000000..78edf5cd6 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey @@ -0,0 +1 @@ + >LLjPRSbC@ \ No newline at end of file diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/c8e7c3ec740c26225a50644bd7e0ec1fce62dc8991c442652758229b6e3dedce_sk b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/c8e7c3ec740c26225a50644bd7e0ec1fce62dc8991c442652758229b6e3dedce_sk new file mode 100644 index 000000000..ccd08eb44 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/c8e7c3ec740c26225a50644bd7e0ec1fce62dc8991c442652758229b6e3dedce_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgX4ILc8gdngRW7yLI +XzJQ0yoo8U1zoV2ckbVXFl5AtNehRANCAATTPLhLlG/H4uAV3izFdU42uHIpqfe7 +msygl2PMvLPZ0NJoV1WJeEUtaoV6fpac6EvqmHdPiMCAH4KIbK0A2LWs +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/f55d5b0330bca287938b240a76ef683613c0c10b38390fe6bbd055ae4bad202c_sk b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/f55d5b0330bca287938b240a76ef683613c0c10b38390fe6bbd055ae4bad202c_sk new file mode 100644 index 000000000..70ac69761 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/msp/keystore/f55d5b0330bca287938b240a76ef683613c0c10b38390fe6bbd055ae4bad202c_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2qMqTm1Dx+uiQq+b +2HSqPLCMKzHRqfrcKfN8f8z+AvGhRANCAARhjTKG7fy8CdilJoQG38H6VSdej4UV +y1lhPZFPQf3+Sp5S/xNuyuRL2xdRbUAJ0VWeCqbHrsJa8rXb0dHcKhvB +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/tls-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/tls-cert.pem new file mode 100644 index 000000000..a0e0fccde --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/ordererOrg/tls-cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICcjCCAhmgAwIBAgIUao6ds8voO58RkCy7Kw5waVeEC/wwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjQwMFowZDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEww1YjUxYzRjODM0OTYw +WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATTPLhLlG/H4uAV3izFdU42uHIpqfe7 +msygl2PMvLPZ0NJoV1WJeEUtaoV6fpac6EvqmHdPiMCAH4KIbK0A2LWso4GkMIGh +MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw +DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUrl4VnFx60w4bSykmhUOsafb6ZXgwHwYD +VR0jBBgwFoAUkJzAy2lRZvi+EbJ6uPBpecolltAwIgYDVR0RBBswGYIMNGZlNjI0 +ZmZmZmQwgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAwRAIgbPoDBY7hYnMuE0KO +s88Dtu6UDhRUFlGKEGPv8MStUeECIEdg3afT5bce2xAU4vlA0/jWMLzP6l+shXEn +Fofub0hX +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/ca-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/ca-cert.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/ca-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server.db b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/fabric-ca-server.db similarity index 81% rename from tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server.db rename to tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/fabric-ca-server.db index 9c46234ef..8501ad597 100644 Binary files a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server.db and b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/fabric-ca-server.db differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/74f4f59913d646a10a22dba3975b33ac433247effae20bb8268ed30b5522673e_sk b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/74f4f59913d646a10a22dba3975b33ac433247effae20bb8268ed30b5522673e_sk new file mode 100644 index 000000000..daefe153d --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/74f4f59913d646a10a22dba3975b33ac433247effae20bb8268ed30b5522673e_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgKaDm+SuixoHlvXoz +9fW+f26cW7I4gdQVXrXLSXPNUsyhRANCAATHmnHupbEg9lnHQ976/dTpla+gnnMS +4AXoe73Fp2ZPff42F1ipavhXAt4eNxilTnzWEg82+xpGUdXSOifX97q3 +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey new file mode 100644 index 000000000..c560512d6 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGkAgEBBDDR26hznJy7654M7Ja7k/eVIW4I40JWz3yGzZ1VkixhztBqs6vBusP3 +aSoEzpDTYQGgBwYFK4EEACKhZANiAASZ9aumZOWK2bHxD7JCDsykDBAfb97JjxGh +VkbsaZPNMXOKwcokB1KRdXs5vkli/uF0Xk3TvduPvprSufJ41MWDHlmdwuiJUtFo +B5GnqG9t8VF6yutrN2njGpX3jjX1Cd4= +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey new file mode 100644 index 000000000..b6ce6351a --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey @@ -0,0 +1 @@ +n,SMz2KbJH93I \ No newline at end of file diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/a6b930f2b348edf7e5c710f8a60ca7c1974b16bdc51356c7808614c73b4f0c40_sk b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/a6b930f2b348edf7e5c710f8a60ca7c1974b16bdc51356c7808614c73b4f0c40_sk new file mode 100644 index 000000000..21f519180 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/msp/keystore/a6b930f2b348edf7e5c710f8a60ca7c1974b16bdc51356c7808614c73b4f0c40_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgInMWrxJYJ1+/X5m/ +kegbOFZKrREPyqQOmbfQV4H2Gg+hRANCAATmKzkBoCD6duHMYMRAb6WKo0eGXzvp +a4xt5PyTp1E0CwGkjCnFFaWD2I2ue+WSSEIGNv0BTJzNDv4FjX419RiU +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/tls-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/tls-cert.pem new file mode 100644 index 000000000..8c3d02bcd --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/fabric-ca/org1/tls-cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICcjCCAhmgAwIBAgIUTHfjmtLrQR4zBVZs3I4fDcBPFTcwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjQwMFowZDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEww1Y2NjMDFkMGNlMjMw +WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATHmnHupbEg9lnHQ976/dTpla+gnnMS +4AXoe73Fp2ZPff42F1ipavhXAt4eNxilTnzWEg82+xpGUdXSOifX97q3o4GkMIGh +MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw +DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU4VIARjzV8rS1+7LpiaP6TLViapwwHwYD +VR0jBBgwFoAU4TjXAR8GAd/5x+NDNrIT9DymbZswIgYDVR0RBBswGYIMZTdiYmQx +MGZiNzg2gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAwRAIgISXZZUTKT3pzdX+Q +jSoRj9b+ca/H3GPhYH/flpw0488CICqWwDyb1S7wbnvRPWdb5oBU4wOVykmu6e1v +zZcAesXy +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/fabric-ca-client-config.yaml b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/fabric-ca-client-config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/fabric-ca-client-config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/fabric-ca-client-config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..2c36147a6 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..8b92638a2 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9SyOSrNan0dp157pV5444DOA6/0hfpLb +Xax3VJwD46F5JTGS+ywB0la31M4s05NCSShW2M65Qwc2ioeZQWLTmOBkQtyJ1yzc +ruCXSCLJjHwndSI9jTmdArLmZIqeJIDx +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/keystore/012e804cf869407db87e4d7868cd80113ee3eae2d5acad8561f60bc6d27464be_sk b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/keystore/012e804cf869407db87e4d7868cd80113ee3eae2d5acad8561f60bc6d27464be_sk new file mode 100644 index 000000000..f71e97081 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/keystore/012e804cf869407db87e4d7868cd80113ee3eae2d5acad8561f60bc6d27464be_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNhHCkxJ/a2w+laZE +DMryLWhmsuWyfRrpiI/A4qZdk/KhRANCAATqp/V1ZpbT+KisROThqqlhQkw/PTOw +al9D9R/y2d2ywyTJgTb2X+jnq8oiOCxrpzo2wv6A3yIE75/YliUEZVtE +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..7b78aa093 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOzCCAeKgAwIBAgIUWwyWhrzqactlbnxJuvvq4GZSL60wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABOqn9XVmltP4qKxE5OGqqWFCTD89M7BqX0P1H/LZ +3bLDJMmBNvZf6OeryiI4LGunOjbC/oDfIgTvn9iWJQRlW0SjdTBzMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTeu5RlSDfvb3Jt7qC7uZs9 +rpdd1TAfBgNVHSMEGDAWgBSQnMDLaVFm+L4Rsnq48Gl5yiWW0DATBgNVHREEDDAK +gghzYW5uaXNoMTAKBggqhkjOPQQDAgNHADBEAiAeiU7Tm/+KgAo9dmAAc83S/Q2H +uQVZtVPqXm7k49+5iwIgIkzz3yYb6ay+2LoxbqPGPNeiE2HQpKOBrja374VG5ZM= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..2c36147a6 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..8b92638a2 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9SyOSrNan0dp157pV5444DOA6/0hfpLb +Xax3VJwD46F5JTGS+ywB0la31M4s05NCSShW2M65Qwc2ioeZQWLTmOBkQtyJ1yzc +ruCXSCLJjHwndSI9jTmdArLmZIqeJIDx +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/4c21369668c86e0bf3b63d3243c6ffb193ba73157b71f3b8718164c95fc54b25_sk b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/4c21369668c86e0bf3b63d3243c6ffb193ba73157b71f3b8718164c95fc54b25_sk new file mode 100644 index 000000000..81bf39e01 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/4c21369668c86e0bf3b63d3243c6ffb193ba73157b71f3b8718164c95fc54b25_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6LyeRUqGN63hyc3f +FjojGOs+DjzyeObxu21i6QHCfJyhRANCAAQr5rvIFHheck9US8siGuD3PCpiK+Sq +mXWxHmwOnnrlQVXc5XFblt9mq99PBV4lfTKfnLfjkP2SGRuKANmIL1Ou +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem similarity index 51% rename from tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem rename to tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem index ee27f5a4d..ba9492178 100644 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/signcerts/cert.pem @@ -1,17 +1,17 @@ -----BEGIN CERTIFICATE----- -MIICtDCCAlugAwIBAgIUeUYCoDJjH1cg8uUIm4TUmwBgvUswCgYIKoZIzj0EAwIw +MIICtTCCAlugAwIBAgIUYHm4g6tW16Jxw0yl+/43H666VKgwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowYDELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowYDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABH3KN7brsXXit+bf60q+2tpF9CvNko54+Rq7 -QC0v//Psj0+w2nVnLgONYmkPRdyt/tHrYzn1fS15uxT/bZRR8oWjgeowgecwDgYD -VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDrDYQ7aqlICTHYr -zY2bk25uj2hUMB8GA1UdIwQYMBaAFP/qccGjA9pznt57d7IH+6x7tkaXMCoGA1Ud +ByqGSM49AgEGCCqGSM49AwEHA0IABCvmu8gUeF5yT1RLyyIa4Pc8KmIr5KqZdbEe +bA6eeuVBVdzlcVuW32ar308FXiV9Mp+ct+OQ/ZIZG4oA2YgvU66jgeowgecwDgYD +VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNb7GD3lqQy8OthS +V3CXZsaDv7JmMB8GA1UdIwQYMBaAFJCcwMtpUWb4vhGyerjwaXnKJZbQMCoGA1Ud EQQjMCGCFG9yZGVyZXIubmV0d29yazIuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYH CAEET3siYXR0cnMiOnsiaGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50 SUQiOiJvcmRlcmVyIiwiaGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwID -RwAwRAIgTVErz7AUfZEME5Fyn37dDwlD1/5rgVKys1ut77eduKwCIHlQi7nWyslu -pD4HlUtfvmWjxwEfLhXANv2CPZKIN6PD +SAAwRQIhALgXeTT/JUGvGqUiMBCiNqLD+ns4Ob/Jl8o5PW0Em7wvAiAiVw5NYmqY +uvVAH3UjR2Twwfoj8zhqNiRf88xY4yXqLQ== -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey new file mode 100644 index 000000000..2c36147a6 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey new file mode 100644 index 000000000..8b92638a2 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9SyOSrNan0dp157pV5444DOA6/0hfpLb +Xax3VJwD46F5JTGS+ywB0la31M4s05NCSShW2M65Qwc2ioeZQWLTmOBkQtyJ1yzc +ruCXSCLJjHwndSI9jTmdArLmZIqeJIDx +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/3fe44a7452d166ae9043780b6001920f12327aa7346e101aa6172650f310501f_sk b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/3fe44a7452d166ae9043780b6001920f12327aa7346e101aa6172650f310501f_sk new file mode 100644 index 000000000..4a40f9ccb --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/3fe44a7452d166ae9043780b6001920f12327aa7346e101aa6172650f310501f_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgf/9tRA47UiFvweyZ +4gPgZhJRG9xzF1L8NPajxVTnnYyhRANCAAR1AvwGjx0NAYb8RUyLPXrFxrqCt7t9 +uKV/V9wWIm4xGbVMMPzTFbj6aHu8qORHy9b0I9/SIMZoPGg4QgqfoHRc +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt new file mode 100644 index 000000000..7d872dca7 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC1jCCAnygAwIBAgIUbTQAsHwPskclj2ROJhFvSd+8+kwwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABHUC/AaPHQ0BhvxFTIs9esXGuoK3u324pX9X +3BYibjEZtUww/NMVuPpoe7yo5EfL1vQj39Igxmg8aDhCCp+gdFyjggEKMIIBBjAO +BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFJtXwGCdHtiy0stsqeznT5oouyG1MB8GA1Ud +IwQYMBaAFJCcwMtpUWb4vhGyerjwaXnKJZbQMCoGA1UdEQQjMCGCFG9yZGVyZXIu +bmV0d29yazIuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi +aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi +aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAICcXaFk9uJI +C1CKPzAHBsPgUsgk5vHo0MJbxJnG5t3GAiARtpvQZIGXdi93XyYR7w64jlfbXPQU +4dcvVHnD9dZ5IQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key new file mode 100644 index 000000000..4a40f9ccb --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgf/9tRA47UiFvweyZ +4gPgZhJRG9xzF1L8NPajxVTnnYyhRANCAAR1AvwGjx0NAYb8RUyLPXrFxrqCt7t9 +uKV/V9wWIm4xGbVMMPzTFbj6aHu8qORHy9b0I9/SIMZoPGg4QgqfoHRc +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem new file mode 100644 index 000000000..7d872dca7 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC1jCCAnygAwIBAgIUbTQAsHwPskclj2ROJhFvSd+8+kwwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABHUC/AaPHQ0BhvxFTIs9esXGuoK3u324pX9X +3BYibjEZtUww/NMVuPpoe7yo5EfL1vQj39Igxmg8aDhCCp+gdFyjggEKMIIBBjAO +BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFJtXwGCdHtiy0stsqeznT5oouyG1MB8GA1Ud +IwQYMBaAFJCcwMtpUWb4vhGyerjwaXnKJZbQMCoGA1UdEQQjMCGCFG9yZGVyZXIu +bmV0d29yazIuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi +aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi +aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAICcXaFk9uJI +C1CKPzAHBsPgUsgk5vHo0MJbxJnG5t3GAiARtpvQZIGXdi93XyYR7w64jlfbXPQU +4dcvVHnD9dZ5IQ== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..2c36147a6 Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..8b92638a2 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9SyOSrNan0dp157pV5444DOA6/0hfpLb +Xax3VJwD46F5JTGS+ywB0la31M4s05NCSShW2M65Qwc2ioeZQWLTmOBkQtyJ1yzc +ruCXSCLJjHwndSI9jTmdArLmZIqeJIDx +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem new file mode 100644 index 000000000..789786b2b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn +Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w +o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O +tQmBzAip3hsih1s= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/a9ed543c015ace8f956ce32962d6ab14dce0cfadde971c6f46df0efe03998925_sk b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/a9ed543c015ace8f956ce32962d6ab14dce0cfadde971c6f46df0efe03998925_sk new file mode 100644 index 000000000..0cb39f7e6 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/a9ed543c015ace8f956ce32962d6ab14dce0cfadde971c6f46df0efe03998925_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+ZYeAFJzr+QzzAtE +HhmEffIFkpTAdl+8U4J5CbS/PVuhRANCAAQo0my8oSfMJn5eZtmGUscj5UhW1adG +8I1v7qfk4v00ZNKVYdFs/diwqk3NQT8+PkThAmLaiMOz7Vi8KOnFebNL +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..ac740640d --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkqgAwIBAgIUBKQD1yGPUAj+A3tvVlG7mYWEZ/owCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowYzELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xFTATBgNVBAMTDG9yZGVyZXJBZG1pbjBZ +MBMGByqGSM49AgEGCCqGSM49AwEHA0IABCjSbLyhJ8wmfl5m2YZSxyPlSFbVp0bw +jW/up+Ti/TRk0pVh0Wz92LCqTc1BPz4+ROECYtqIw7PtWLwo6cV5s0ujgdYwgdMw +DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFLrv0rTr1c1b +V3nkD81lFPYxQfkNMB8GA1UdIwQYMBaAFJCcwMtpUWb4vhGyerjwaXnKJZbQMBMG +A1UdEQQMMAqCCHNhbm5pc2gxMF4GCCoDBAUGBwgBBFJ7ImF0dHJzIjp7ImhmLkFm +ZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JkZXJlckFkbWluIiwi +aGYuVHlwZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0cAMEQCICNQxJpCRtGf2rU3 +RjjkqNwwMIEJ4k6jBL+BPyy1FpI1AiAU31IEq5KUrS2iVqRiuwYCSBuN3J/FZyCy +KaRpayuUsA== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json similarity index 59% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json index f6d082d9e..5ab47bf2c 100644 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.docker.json @@ -26,7 +26,7 @@ "peer0.org1.network2.com": { "url": "grpcs://peer0.org1.network2.com:9051", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.network2.com", @@ -39,7 +39,7 @@ "url": "https://ca.org1.network2.com:5054", "caName": "ca-org1", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n" }, "httpOptions": { "verify": false diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.json b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.json similarity index 59% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.json rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.json index 5eb2bbaab..aa78b9575 100644 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.json +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.json @@ -26,7 +26,7 @@ "peer0.org1.network2.com": { "url": "grpcs://localhost:9051", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.network2.com", @@ -39,7 +39,7 @@ "url": "https://localhost:5054", "caName": "ca-org1", "tlsCACerts": { - "pem": "-----BEGIN CERTIFICATE-----\nMIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q\nQkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ\nbm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73\nBbhDFXqROY1Q+g==\n-----END CERTIFICATE-----\n" + "pem": "-----BEGIN CERTIFICATE-----\nMIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG\nA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl\ncmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy\ndmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH\nhl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF\nMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE\nFOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n\nVX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+\nTL2JfaeZkJJz42E=\n-----END CERTIFICATE-----\n" }, "httpOptions": { "verify": false diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.yaml b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.yaml similarity index 64% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.yaml rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.yaml index e552943ba..68034f2bc 100644 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/connection-org1.yaml +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/connection-org1.yaml @@ -13,6 +13,14 @@ client: timeout: peer: endorser: '300' +organizations: + Org1: + mspid: Org1MSP + cryptoPath: users/{username}@org1.network2.com/msp + peers: + - peer0.org1.network2.com + certificateAuthorities: + - ca.org1.network2.com channels: mychannel: orderers: @@ -30,50 +38,40 @@ orderers: tlsCACerts: pem: | -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw + MIICFzCCAb2gAwIBAgIUD9fr2Th1T0hW7NLkDt6bj+Mf5JQwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q - QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYY0yhu38vAnYpSaEBt/B+lUn + Xo+FFctZYT2RT0H9/kqeUv8TbsrkS9sXUW1ACdFVngqmx67CWvK129HR3CobwaNF MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ - bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 - BbhDFXqROY1Q+g== + FJCcwMtpUWb4vhGyerjwaXnKJZbQMAoGCCqGSM49BAMCA0gAMEUCIQCKyWEsYE8w + o+Bsvaytvli1PqM8hvMh+yUk+8bz8/AQBgIgAueAOZkBpteDoXQQxB8yi0jPNV3O + tQmBzAip3hsih1s= -----END CERTIFICATE----- - grpcOptions: ssl-target-name-override: orderer.network2.com hostnameOverride: orderer.network2.com - -organizations: - Org1: - mspid: Org1MSP - cryptoPath: users/{username}@org1.network2.com/msp - peers: - - peer0.org1.network2.com - certificateAuthorities: - - ca.org1.network2.com peers: peer0.org1.network2.com: url: grpcs://localhost:9051 tlsCACerts: pem: | -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw + MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q - QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH + hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ - bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 - BbhDFXqROY1Q+g== + FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n + VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ + TL2JfaeZkJJz42E= -----END CERTIFICATE----- grpcOptions: @@ -82,26 +80,23 @@ peers: certificateAuthorities: ca.org1.network2.com: url: https://localhost:5054 - caName: ca.org1.network2.com - registrar: - enrollId: admin - enrollSecret: adminpw + caName: ca-org1 tlsCACerts: pem: - | -----BEGIN CERTIFICATE----- - MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw + MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt - Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG + Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy - dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q - QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF + dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH + hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE - FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ - bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 - BbhDFXqROY1Q+g== + FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n + VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ + TL2JfaeZkJJz42E= -----END CERTIFICATE----- httpOptions: diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/fabric-ca-client-config.yaml b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/fabric-ca-client-config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/fabric-ca-client-config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/fabric-ca-client-config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/keystore/1826f80031dea43ee2308ddc5f8cc9948e6c3490ebb6146c88063a36415a9064_sk b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/keystore/1826f80031dea43ee2308ddc5f8cc9948e6c3490ebb6146c88063a36415a9064_sk new file mode 100644 index 000000000..71cdb1ff7 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/keystore/1826f80031dea43ee2308ddc5f8cc9948e6c3490ebb6146c88063a36415a9064_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgG0s7fjOUkT1FUffx +LASsiLH7ZNbJRkmVHbYg/a9Z+V+hRANCAAToM2oZAD+dAswKEe3l2+rmGXUvBYST +k5E1dA+TPqc2kDaqsRz1vsvKYDuBtDvSk6n6TUpNiHqe76h50w0AHtiI +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..afa25be5d --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOzCCAeKgAwIBAgIUCRvrUM87g9i8AuBC8JpbagBAv9swCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABOgzahkAP50CzAoR7eXb6uYZdS8FhJOTkTV0D5M+ +pzaQNqqxHPW+y8pgO4G0O9KTqfpNSk2Iep7vqHnTDQAe2IijdTBzMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSyRM4QAdbs45NfiHaymxq3 +Dr+wATAfBgNVHSMEGDAWgBThONcBHwYB3/nH40M2shP0PKZtmzATBgNVHREEDDAK +gghzYW5uaXNoMTAKBggqhkjOPQQDAgNHADBEAiAMUWy/5I3a8Pie/ydMSkuK2OCS +nejK9F85/4K/lPBL7gIgZ/zyyPEwvMAn6HxiVm+nP/0XXnn41KXEKnS/E6d9wMI= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/f1d0e29c4e887ab38554c60a4998e65374d1f2baf88d02e7af88befe74798c8a_sk b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/f1d0e29c4e887ab38554c60a4998e65374d1f2baf88d02e7af88befe74798c8a_sk new file mode 100644 index 000000000..36885d9fe --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/f1d0e29c4e887ab38554c60a4998e65374d1f2baf88d02e7af88befe74798c8a_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgM2rW1xA04pELcGdP +Z9zqGw998EqsV6VhmwZ+OzGCivyhRANCAASx1yHFADT/pY2c9Dflf8jB7D8QFhwm +YxUKdtu4LHAkNg8LFidS1PPC6QuaCJ0Ctucy9Aw9NTlNUFvgIcofjrJ0 +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..514830c42 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAkmgAwIBAgIUEm+L01gy1Ar+2K66A6Ci36nDDTswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowWzELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO +PQIBBggqhkjOPQMBBwNCAASx1yHFADT/pY2c9Dflf8jB7D8QFhwmYxUKdtu4LHAk +Ng8LFidS1PPC6QuaCJ0Ctucy9Aw9NTlNUFvgIcofjrJ0o4HdMIHaMA4GA1UdDwEB +/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBT+tF5Iul08ZdcFxSSc/+L6 +GB4+ojAfBgNVHSMEGDAWgBThONcBHwYB3/nH40M2shP0PKZtmzAiBgNVHREEGzAZ +ghdwZWVyMC5vcmcxLm5ldHdvcmsyLmNvbTBWBggqAwQFBgcIAQRKeyJhdHRycyI6 +eyJoZi5BZmZpbGlhdGlvbiI6IiIsImhmLkVucm9sbG1lbnRJRCI6InBlZXIwIiwi +aGYuVHlwZSI6InBlZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAOpb5Sv+KOtefONr ++4tvCtFLC4SbNBtStJ5bx998d1j2AiB12Lve+mzQexMNPHptZUGB+U+QCN99rVlc +11twuInhBA== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/1eff54fc76366bfda301db060b57cb25e58b2c22500c2dcf0358acfc81c0e8c4_sk b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/1eff54fc76366bfda301db060b57cb25e58b2c22500c2dcf0358acfc81c0e8c4_sk new file mode 100644 index 000000000..8199552eb --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/1eff54fc76366bfda301db060b57cb25e58b2c22500c2dcf0358acfc81c0e8c4_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgC8Hz91waRowckaKu +RSt9KLfkksFyE6KDcsk34klPmFChRANCAAS44u/hTzbdl2BTduCWMygumz8OCExk +KfeUgwK/ZKlfZDx5GfxexsCAGS0ISzHoxrIIoLCy+ooXpR03Ijmj6y6B +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt similarity index 50% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt index 405fab839..28c243dbb 100644 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzzCCAnWgAwIBAgIUJ94NHWqlezXftEQtZeGt4YVIrD8wCgYIKoZIzj0EAwIw +MIICzjCCAnWgAwIBAgIUbcQMRvqlWgwavmBs1FiKvFnhgsIwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowWzELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowWzELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAARaJ7CbbpGJrtuBHiy65CZnazKj/l1IdwGmAlw24g/B -LWjiGipKl5QJLr7FV3r6fsNcTQTOJJEC4SyfFi3JZLbio4IBCDCCAQQwDgYDVR0P +PQIBBggqhkjOPQMBBwNCAAS44u/hTzbdl2BTduCWMygumz8OCExkKfeUgwK/ZKlf +ZDx5GfxexsCAGS0ISzHoxrIIoLCy+ooXpR03Ijmj6y6Bo4IBCDCCAQQwDgYDVR0P AQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBREC6DT1j5qvbzqo7D31iqjtjEQcDAfBgNVHSMEGDAW -gBS5xG0DXfVWPnA5kg786sSNHCiZ8TAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l +Af8EAjAAMB0GA1UdDgQWBBTUPYrAA3p3UoodqEx95d4ZpDlrazAfBgNVHSMEGDAW +gBThONcBHwYB3/nH40M2shP0PKZtmzAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l dHdvcmsyLmNvbYIJbG9jYWxob3N0MFYGCCoDBAUGBwgBBEp7ImF0dHJzIjp7Imhm LkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoicGVlcjAiLCJoZi5U -eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNIADBFAiEAkIc9PlI1aUQ+QDfb7QKd -2ign4ueyuX/FaLibPWnhfUACIDXg/6W9woGbzIJSWRDxrfmJ7iZllyh1kCdaBhN5 -Tb6E +eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNHADBEAiANoj6oglzJJgALZFx3cucE +SbWcOv94K3U6rlfBodFS3AIgVMdNF9WhJWmp3LranF89NhfFDsJ50UbOcAn47OME +Ogw= -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key new file mode 100644 index 000000000..8199552eb --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgC8Hz91waRowckaKu +RSt9KLfkksFyE6KDcsk34klPmFChRANCAAS44u/hTzbdl2BTduCWMygumz8OCExk +KfeUgwK/ZKlfZDx5GfxexsCAGS0ISzHoxrIIoLCy+ooXpR03Ijmj6y6B +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem similarity index 50% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem index 405fab839..28c243dbb 100644 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/signcerts/cert.pem @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzzCCAnWgAwIBAgIUJ94NHWqlezXftEQtZeGt4YVIrD8wCgYIKoZIzj0EAwIw +MIICzjCCAnWgAwIBAgIUbcQMRvqlWgwavmBs1FiKvFnhgsIwCgYIKoZIzj0EAwIw aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowWzELMAkG +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowWzELMAkG A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAARaJ7CbbpGJrtuBHiy65CZnazKj/l1IdwGmAlw24g/B -LWjiGipKl5QJLr7FV3r6fsNcTQTOJJEC4SyfFi3JZLbio4IBCDCCAQQwDgYDVR0P +PQIBBggqhkjOPQMBBwNCAAS44u/hTzbdl2BTduCWMygumz8OCExkKfeUgwK/ZKlf +ZDx5GfxexsCAGS0ISzHoxrIIoLCy+ooXpR03Ijmj6y6Bo4IBCDCCAQQwDgYDVR0P AQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBREC6DT1j5qvbzqo7D31iqjtjEQcDAfBgNVHSMEGDAW -gBS5xG0DXfVWPnA5kg786sSNHCiZ8TAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l +Af8EAjAAMB0GA1UdDgQWBBTUPYrAA3p3UoodqEx95d4ZpDlrazAfBgNVHSMEGDAW +gBThONcBHwYB3/nH40M2shP0PKZtmzAtBgNVHREEJjAkghdwZWVyMC5vcmcxLm5l dHdvcmsyLmNvbYIJbG9jYWxob3N0MFYGCCoDBAUGBwgBBEp7ImF0dHJzIjp7Imhm LkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoicGVlcjAiLCJoZi5U -eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNIADBFAiEAkIc9PlI1aUQ+QDfb7QKd -2ign4ueyuX/FaLibPWnhfUACIDXg/6W9woGbzIJSWRDxrfmJ7iZllyh1kCdaBhN5 -Tb6E +eXBlIjoicGVlciJ9fTAKBggqhkjOPQQDAgNHADBEAiANoj6oglzJJgALZFx3cucE +SbWcOv94K3U6rlfBodFS3AIgVMdNF9WhJWmp3LranF89NhfFDsJ50UbOcAn47OME +Ogw= -----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/config.yaml b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/config.yaml similarity index 100% rename from tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/config.yaml rename to tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/config.yaml diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/80861e9c031f090c4bc6f9375001a6923fa134462a5f5cb3507eb3b2bc330d10_sk b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/80861e9c031f090c4bc6f9375001a6923fa134462a5f5cb3507eb3b2bc330d10_sk new file mode 100644 index 000000000..66cc52c7d --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/80861e9c031f090c4bc6f9375001a6923fa134462a5f5cb3507eb3b2bc330d10_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8akjs9S+FcxHy4RM +6tlbIzC2IYjqGeKt/R3mROB4766hRANCAAQY1ZiKuQVcl5uU4rulBS5pdCUGwU/A +qKkfj4+rz3f2kPSTKeF+bptTGbhvBivCLuNW6XrBlRyWJg1eSEGOxwD/ +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..efb7fa473 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICnTCCAkSgAwIBAgIUFSVcC080DxQ8zUaLmA8aXr/0bb8wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowYDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xEjAQBgNVBAMTCW9yZzFhZG1pbjBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABBjVmIq5BVyXm5Tiu6UFLml0JQbBT8CoqR+P +j6vPd/aQ9JMp4X5um1MZuG8GK8Iu41bpesGVHJYmDV5IQY7HAP+jgdMwgdAwDgYD +VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPXkyTyIuDL7q/2G +ty1/M2A+RX0RMB8GA1UdIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMBMGA1Ud +EQQMMAqCCHNhbm5pc2gxMFsGCCoDBAUGBwgBBE97ImF0dHJzIjp7ImhmLkFmZmls +aWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JnMWFkbWluIiwiaGYuVHlw +ZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0cAMEQCIA+Z9Z30NcLAa2FGwxergmdo +uR+ImVUPcuvI3j9U8U9yAiAKsUCRoJElnZlSsN7HhtYulZ/sipRHXjtc076zi3FQ +Rw== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey new file mode 100644 index 000000000..ae08bee1d Binary files /dev/null and b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey differ diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey new file mode 100644 index 000000000..10ea69cf5 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmfWrpmTlitmx8Q+yQg7MpAwQH2/eyY8R +oVZG7GmTzTFzisHKJAdSkXV7Ob5JYv7hdF5N073bj76a0rnyeNTFgx5ZncLoiVLR +aAeRp6hvbfFResrrazdp4xqV94419Qne +-----END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem new file mode 100644 index 000000000..e25ff8299 --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICFzCCAb2gAwIBAgIUajWU/EzwkVocqYksNXUdm04WvCswCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTM3MDczMTE4MjQwMFowaDELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy +dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5is5AaAg+nbhzGDEQG+liqNH +hl876WuMbeT8k6dRNAsBpIwpxRWlg9iNrnvlkkhCBjb9AUyczQ7+BY1+NfUYlKNF +MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE +FOE41wEfBgHf+cfjQzayE/Q8pm2bMAoGCCqGSM49BAMCA0gAMEUCIQCDmJzZfO1n +VX5eMdDkDDtDz+eAXhPsu7upJW0ukhxkTAIgJceBfxJYwM1Tof1ADInIY+M+U8y+ +TL2JfaeZkJJz42E= +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0f87dbe410da9703883f1fd2bef6b993686b4bdbbe689a6368003a303752511a_sk b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0f87dbe410da9703883f1fd2bef6b993686b4bdbbe689a6368003a303752511a_sk new file mode 100644 index 000000000..3e007515a --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0f87dbe410da9703883f1fd2bef6b993686b4bdbbe689a6368003a303752511a_sk @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgU57IrTkrtZvH4HGg +HCTa1b3XnT3cJRZtl8U9yAPwB8mhRANCAASW0gpe/pBxE9NBxha1w3SkpifDK+F/ +lwQ4OwL36WcRw7VZtZbpjV7r9CIQO6aw4gdeKBWAPrpwkU/nHIdChfG7 +-----END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem new file mode 100644 index 000000000..0d193984b --- /dev/null +++ b/tests/network-setups/fabric/network-artifacts/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIIClzCCAj6gAwIBAgIUZTb5zcBHmUFuvbVCvEPYrt8iBJ4wCgYIKoZIzj0EAwIw +aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK +EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt +Y2Etc2VydmVyMB4XDTIyMDgwNDE4MjQwMFoXDTMyMDgwNDA2MjkwMFowXTELMAkG +A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl +cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqG +SM49AgEGCCqGSM49AwEHA0IABJbSCl7+kHET00HGFrXDdKSmJ8Mr4X+XBDg7Avfp +ZxHDtVm1lumNXuv0IhA7prDiB14oFYA+unCRT+cch0KF8bujgdAwgc0wDgYDVR0P +AQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAmn1IIGDoL0KcOC3bAc +6jL6bCWCMB8GA1UdIwQYMBaAFOE41wEfBgHf+cfjQzayE/Q8pm2bMBMGA1UdEQQM +MAqCCHNhbm5pc2gxMFgGCCoDBAUGBwgBBEx7ImF0dHJzIjp7ImhmLkFmZmlsaWF0 +aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEiLCJoZi5UeXBlIjoiY2xp +ZW50In19MAoGCCqGSM49BAMCA0cAMEQCIHZo/jKLkbUUZTeB89v2hEubacKsSt6X +7xigKNwTXBqvAiBV5rDmL6sybwIn02x4wzSdJwBQavE82Pt8tIENTlQmXg== +-----END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/system-genesis-block/genesis.block b/tests/network-setups/fabric/network-artifacts/network2/system-genesis-block/genesis.block similarity index 52% rename from tests/network-setups/fabric/shared/network2/system-genesis-block/genesis.block rename to tests/network-setups/fabric/network-artifacts/network2/system-genesis-block/genesis.block index 1643406cb..52c2ccd9a 100644 Binary files a/tests/network-setups/fabric/shared/network2/system-genesis-block/genesis.block and b/tests/network-setups/fabric/network-artifacts/network2/system-genesis-block/genesis.block differ diff --git a/tests/network-setups/fabric/shared/network2/wallet/user1.id b/tests/network-setups/fabric/network-artifacts/network2/wallet/user1.id similarity index 100% rename from tests/network-setups/fabric/shared/network2/wallet/user1.id rename to tests/network-setups/fabric/network-artifacts/network2/wallet/user1.id diff --git a/tests/network-setups/fabric/shared/README.md b/tests/network-setups/fabric/shared/README.md index 7191590c7..892496806 100644 --- a/tests/network-setups/fabric/shared/README.md +++ b/tests/network-setups/fabric/shared/README.md @@ -7,26 +7,20 @@ If these get expired they can be generated again. First stop all testnet deploye ## Steps to generate -All paths in following steps are relative to this folder (`tests/network-setups/fabric/shared`). +All paths in following steps are relative to this folder (`tests/network-setups/fabric/dev`). 1. Run following to delete existing crypto materials and artifacts: ``` - cd network1 - rm -rf ordererOrganizations/ peerOrganizations/ system-genesis-block/ channel-artifacts/ fabric-ca/ordererOrg/ fabric-ca/org1/ - cd ../network2 - rm -rf ordererOrganizations/ peerOrganizations/ system-genesis-block/ channel-artifacts/ fabric-ca/ordererOrg/ fabric-ca/org1/ + make delete-artifacts + ``` +2. Run `make start-interop`. This will re-generate all crypto materials and artifacts. +3. To generate ccp file for docker, run: + ``` + make docker-ccp ``` -2. Go to `../dev`, and run `make start-interop`. This will re-generate all crypto materials and artifacts. -3. Go to `network1/peerOrganizations/org1.network1.com`, create a copy of `connection-org1.json`, named `connection-org1.docker.json`. Edit the `connection-org1.docker.json`: - - Line 27 change url, replace `localhost` to `peer0.org1.network1.com`. - - Line 39 change url, replace `localhost` to `ca.org1.network1.com`. -4. Repeat above step 3, for `network2` as well, by replacing `network1` with `network2` in step 3. 5. Run following to allow these crypto materials to be checked in github: ``` - sudo chmod 644 network1/fabric-ca/ordererOrg/msp/keystore/* - sudo chmod 644 network1/fabric-ca/org1/msp/keystore/* - sudo chmod 644 network2/fabric-ca/ordererOrg/msp/keystore/* - sudo chmod 644 network2/fabric-ca/org1/msp/keystore/* + make chmod-artifacts ``` ## Steps to update wallets and credentials in other components: @@ -36,9 +30,8 @@ All paths in following steps are relative to this folder (`tests/network-setups/ - Delete contents of `src/wallet-network1` and `src/wallet-network2`. - Delete contents of `src/data/credentials/network1` and `src/data/credentials/network2`. - Delete contents of `src/data/credentials_docker/network1` and `src/data/credentials_docker/network2`. -3. Now follow the steps to run testnet demo provided [here](https://labs.hyperledger.org/weaver-dlt-interoperability/docs/external/getting-started), to: - - Build and run `fabric-driver` for both networks. This will re-generate wallets for fabric-driver. - - Build `fabric-cli`. Set up `.env` and `config.json` as per the steps there. (Don't run anything else in fabric-cli from the steps there). +3. Now follow the steps to run testnet demo provided [here](https://labs.hyperledger.org/weaver-dlt-interoperability/docs/external/getting-started/test-network/setup-local#fabric-driver), to build and run `fabric-driver` for both networks. This will re-generate wallets for fabric-driver. +4. Build `fabric-cli`. Set up `.env` and `config.json` as per the steps in docs. (Don't run anything else in fabric-cli from the steps there). 4. Go to `samples/fabric/fabric-cli`, and run following commands to create credentials for fabric networks: ``` ./bin/fabric-cli configure create all --local-network=network1 @@ -49,8 +42,12 @@ All paths in following steps are relative to this folder (`tests/network-setups/ - Go to `samples/fabric/fabric-cli` and copy `src/data/credentials/network1` and `src/data/credentials/network2` to `src/data/credentials_docker` directory. - Go to `samples/corda/corda-simple-application/clients/src/main/resources/config` and then follow these steps: 1. With reference from `samples/fabric/fabric-cli/src/data/credentials/network1/access-control.json`, update the `rules.principal` key in `network1/access-control.json`. - 2. With reference from `samples/fabric/fabric-cli/src/data/credentials/network1/membership.json`, update the `members.Org1MSP.value` key in `network1/membership.json`. - 3. Repeat steps `a` and `b` for `network1-docker` as well with same reference. + 2. Copy `samples/fabric/fabric-cli/src/data/credentials/network1/membership.json` to `credentials/network1/membership.json`. + 3. Repeat steps `a` and `b` for `network1-docker`. 4. Repeat steps `a` and `b` for `network2` by replacing `network1` with `network2`. - +6. Go to `tests/network-setups/fabric/dev` folder, and finally run, to create backup of artifacts: + ``` + make backup + ``` +Note: Do Update the certs in `fabric-interop-cc/contracts/interop/test_data` and `corda-interop-app/interop-workflows/src/test/resources/test_data` folders for unit tests of `WriteExternalState`. --- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerPublicKey deleted file mode 100644 index b35c28f7e..000000000 Binary files a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey deleted file mode 100644 index dc4c6f6fb..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKJ7KBEAeS+e6lPUS3eCgZiImNpXJ2R0c -rVb28F2tYtczCf1dg7MFLDFaL4AieRATNZxAtHXOoo4smc+DCGHeFOB8IIEL8sHG -fUrGj43x0eFV16Our2mt1DzRhScQ/bCV ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/ca-cert.pem b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/ca-cert.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/ca-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server-config.yaml b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server-config.yaml index e433bbeba..64fe7009e 100644 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server-config.yaml +++ b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/fabric-ca-server-config.yaml @@ -269,13 +269,13 @@ signing: default: usage: - digital signature - expiry: 8760h + expiry: 87660h profiles: ca: usage: - cert sign - crl sign - expiry: 43800h + expiry: 87660h caconstraint: isca: true maxpathlen: 0 @@ -286,7 +286,7 @@ signing: - server auth - client auth - key agreement - expiry: 8760h + expiry: 87660h ########################################################################### # Certificate Signing Request (CSR) section. diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/94255e346295ca5a0e3bb32e7f83ae4cd3c985349a51610e6f9a35e930ea11eb_sk b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/94255e346295ca5a0e3bb32e7f83ae4cd3c985349a51610e6f9a35e930ea11eb_sk deleted file mode 100644 index a3201eced..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/94255e346295ca5a0e3bb32e7f83ae4cd3c985349a51610e6f9a35e930ea11eb_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgHZ/Dyhppx5rHx499 -4V8fFFTaoXnb1kiOW8zhF7a4g6ehRANCAARzCbbWKbFe+lv9NgJwg0ugs/BlRiRD -NU5jPcrp3O0gy2uDrGXI4VWRlO/SYtLlWTYKnPGru6ryOVMWVJfxwKMl ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey deleted file mode 100644 index 0a6eb603c..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGkAgEBBDBltYeYkxoPTO+z+pAYOyRAWb05XjiF9PoOOzlCISHyCY0dvjd8hspQ -ESqtHYwDEUOgBwYFK4EEACKhZANiAAQonsoEQB5L57qU9RLd4KBmIiY2lcnZHRyt -VvbwXa1i1zMJ/V2DswUsMVovgCJ5EBM1nEC0dc6ijiyZz4MIYd4U4HwggQvywcZ9 -SsaPjfHR4VXXo66vaa3UPNGFJxD9sJU= ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey deleted file mode 100644 index c5c72fc1c..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey +++ /dev/null @@ -1 +0,0 @@ - ;H#SuF=5`z+!d gNE& \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/d43d8da7496c8f02d534cd58cd4ae87f718c65ca2ca3832c72423a3802b68c66_sk b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/d43d8da7496c8f02d534cd58cd4ae87f718c65ca2ca3832c72423a3802b68c66_sk deleted file mode 100644 index da16c2437..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/msp/keystore/d43d8da7496c8f02d534cd58cd4ae87f718c65ca2ca3832c72423a3802b68c66_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3TVdc2rHUCPnlQZk -V1KAmi+t6SZY6GP8KDlp2JGC1ZahRANCAAQQ1AlJuf+r6I0pIOxWnSTH1tEAB32y -Wovyh2FQYAvn9Q7CFOpMjdgpXJQkvLHs8TobSpmN0dZ99rbzEJJ03Qam ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/tls-cert.pem b/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/tls-cert.pem deleted file mode 100644 index f5a8d9605..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/ordererOrg/tls-cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICczCCAhmgAwIBAgIUJIE7EnBqOt7qnfjQQHIiWHu1ng4wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTIyMDczMDA1NDYwMFowZDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEwxmNTg2ZjdiY2JhNTQw -WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARzCbbWKbFe+lv9NgJwg0ugs/BlRiRD -NU5jPcrp3O0gy2uDrGXI4VWRlO/SYtLlWTYKnPGru6ryOVMWVJfxwKMlo4GkMIGh -MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUHjIHH1YdUklBfock8aDBw4F4ilYwHwYD -VR0jBBgwFoAUPq1hA/+qEd3uE8rR1v9mdEM/hjQwIgYDVR0RBBswGYIMZjU4NmY3 -YmNiYTU0gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhALC6HyJ1GV8Lzj4A -0AwCWUfbtUAL2ymf20KbqTaleWHxAiBRpWMUE4kynCuGiqMbHER6yypD+6U/jC4H -nN25HMjQTQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/ca-cert.pem b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/ca-cert.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/ca-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server-config.yaml b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server-config.yaml index b7198b94a..b696bcce8 100644 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server-config.yaml +++ b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/fabric-ca-server-config.yaml @@ -269,13 +269,13 @@ signing: default: usage: - digital signature - expiry: 8760h + expiry: 87660h profiles: ca: usage: - cert sign - crl sign - expiry: 43800h + expiry: 87660h caconstraint: isca: true maxpathlen: 0 @@ -286,7 +286,7 @@ signing: - server auth - client auth - key agreement - expiry: 8760h + expiry: 87660h ########################################################################### # Certificate Signing Request (CSR) section. diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/5dfbce629e275090ced3e2e678a53afd1a529b416f42db95e8592bb820633e3e_sk b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/5dfbce629e275090ced3e2e678a53afd1a529b416f42db95e8592bb820633e3e_sk deleted file mode 100644 index c1219bd06..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/5dfbce629e275090ced3e2e678a53afd1a529b416f42db95e8592bb820633e3e_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgYubxseYFdkIAtpQE -nDaomhAGt+Qke3sjCIMKwZG8PvmhRANCAAR2rpGI0ewWeP+c9fE0ThyrYieh1Jbi -1UkMx55h9wK+UDU1JpojwT9yehUB0lH/AkIpOyXEg8FMNIlGMa//zswG ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey deleted file mode 100644 index d39577e51..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGkAgEBBDA26NPpOGmZlL7ShRPXGHeLYkXZ1TzCN8WDE2BZmb3kVKengVU0yhr9 -lCKBLlMXURegBwYFK4EEACKhZANiAAR22gRWRkDaG9bsy/qpPgo+C+fU9jxjpuD1 -ytt6xu2t4ingaWldyH/8f4xrMTDD2lfTZ8YSFY6uVsW+VhgrgapU+NLWVNjBNYjn -+Ks7JM11G+Q+voLcJaxvJfes2fNZKRg= ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey deleted file mode 100644 index 39e9cfc97..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/IssuerSecretKey +++ /dev/null @@ -1 +0,0 @@ -(Ĉr+3~E^Z. g \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/cd392f2c72a2673ecdd5400bf0220190470e56a5318f27e6052850765098f1df_sk b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/cd392f2c72a2673ecdd5400bf0220190470e56a5318f27e6052850765098f1df_sk deleted file mode 100644 index 1319b3a4a..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/msp/keystore/cd392f2c72a2673ecdd5400bf0220190470e56a5318f27e6052850765098f1df_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgV+HxMS8DCSEyBUIa -ICvAwY+bU2dBxlP2503TH1K+xwahRANCAAQz8Z6VKWJ9jr6sw4Tcb3lJcX51Mekb -yPlxgrzYRUJosJK82UIqCm6m5CduQvL5Xp2B/20pKcSxmCId4HoDIkr/ ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/tls-cert.pem b/tests/network-setups/fabric/shared/network1/fabric-ca/org1/tls-cert.pem deleted file mode 100644 index 919dedd51..000000000 --- a/tests/network-setups/fabric/shared/network1/fabric-ca/org1/tls-cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICczCCAhmgAwIBAgIUDyxQWKbSONMWISOkWvyo5wMOZJAwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTIyMDczMDA1NDYwMFowZDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEww2YmJkODk0MzAxNjYw -WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2rpGI0ewWeP+c9fE0ThyrYieh1Jbi -1UkMx55h9wK+UDU1JpojwT9yehUB0lH/AkIpOyXEg8FMNIlGMa//zswGo4GkMIGh -MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUS4zjtD/PRYNAHRhU6Th1QhdfXc8wHwYD -VR0jBBgwFoAUcob1gvo4LzrLkUhemq17ts5dIPwwIgYDVR0RBBswGYIMNmJiZDg5 -NDMwMTY2gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhAMN1Bw6fdATd3diB -F1gaj/T7keJUpZYpyMHwwVN0JnvZAiAtS4V7JyhtLwFYMw28XfwleaBJ70RaUP/K -wIz363DCfQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey deleted file mode 100644 index b35c28f7e..000000000 Binary files a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index dc4c6f6fb..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKJ7KBEAeS+e6lPUS3eCgZiImNpXJ2R0c -rVb28F2tYtczCf1dg7MFLDFaL4AieRATNZxAtHXOoo4smc+DCGHeFOB8IIEL8sHG -fUrGj43x0eFV16Our2mt1DzRhScQ/bCV ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/keystore/ae13856d0a06478551748e67a55a872b6eca64b4de3bb7c41625d223c055b40b_sk b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/keystore/ae13856d0a06478551748e67a55a872b6eca64b4de3bb7c41625d223c055b40b_sk deleted file mode 100644 index 04933b79a..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/keystore/ae13856d0a06478551748e67a55a872b6eca64b4de3bb7c41625d223c055b40b_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwFOAEpZ9xnaSpB+t -BJvyTxorPFiNA0DuQcUEUPSX1tKhRANCAAQNGYH2wRu1pYFhACJYxMd2QN2QOLlZ -Y3hDQX5ZiozLAI4aD7fHBqZeg/WeUKlN6cgCbI8Svl5ud0rSRSGquxpG ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem deleted file mode 100644 index 99f8c78ce..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICPDCCAeKgAwIBAgIUVCTlEdsJKLq5h3sUu4RI5P64EfcwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABA0ZgfbBG7WlgWEAIljEx3ZA3ZA4uVljeENBflmK -jMsAjhoPt8cGpl6D9Z5QqU3pyAJsjxK+Xm53StJFIaq7GkajdTBzMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRqOqSUdGPZWNNHw24AWmQI -I8fBDzAfBgNVHSMEGDAWgBQ+rWED/6oR3e4TytHW/2Z0Qz+GNDATBgNVHREEDDAK -gghzYW5uaXNoMTAKBggqhkjOPQQDAgNIADBFAiEArgEnWyhzAw6Ok7RGBnvBuZUf -/SwHfGsCuzW4/B3XkBUCIHORnjey2GWdVfuaylVUbxcV6mkiyAlCFvx8CWiUwzbb ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey deleted file mode 100644 index b35c28f7e..000000000 Binary files a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index dc4c6f6fb..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKJ7KBEAeS+e6lPUS3eCgZiImNpXJ2R0c -rVb28F2tYtczCf1dg7MFLDFaL4AieRATNZxAtHXOoo4smc+DCGHeFOB8IIEL8sHG -fUrGj43x0eFV16Our2mt1DzRhScQ/bCV ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/e77cc1ca55809c7a48c804fe7cc884be1a3bf58080c2fa71095838351616ed69_sk b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/e77cc1ca55809c7a48c804fe7cc884be1a3bf58080c2fa71095838351616ed69_sk deleted file mode 100644 index 38f7162d5..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/keystore/e77cc1ca55809c7a48c804fe7cc884be1a3bf58080c2fa71095838351616ed69_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguiVzYcBdp1LN1vLh -NSePcZ+kuMxaOoJasuqXvozfH8mhRANCAATFqNp5NXhlSV+Kwxc/BjWln87T6rbz -6UzSFxJyP98flse/kPjGRgfuKFHCVifbpenVopBwDuTjtjRUdxeFH1wP ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/msp/tlscacerts/tlsca.network1.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey deleted file mode 100644 index b35c28f7e..000000000 Binary files a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey deleted file mode 100644 index dc4c6f6fb..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKJ7KBEAeS+e6lPUS3eCgZiImNpXJ2R0c -rVb28F2tYtczCf1dg7MFLDFaL4AieRATNZxAtHXOoo4smc+DCGHeFOB8IIEL8sHG -fUrGj43x0eFV16Our2mt1DzRhScQ/bCV ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/39f5127d7653c2b2fceef7ed6d8815192305afa9716ad6d6377520659afda105_sk b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/39f5127d7653c2b2fceef7ed6d8815192305afa9716ad6d6377520659afda105_sk deleted file mode 100644 index 5f7cd0d8e..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/keystore/39f5127d7653c2b2fceef7ed6d8815192305afa9716ad6d6377520659afda105_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7y0PBJNvUDOJGAoY -pquNCLpsbcAf0dk1B+oBaKs1IOahRANCAATuJbR3uHAA6tSLa3u3Exkk5tXLdalz -xVBR4W7A8omTGcfoTz4v8omjO2hzHx/eE/1qLEmCBEE39V9c8gf9Ofvn ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt deleted file mode 100644 index c8be1d280..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1jCCAnygAwIBAgIUUFUPOt2Iq4BAbu4izr4jPvgTf+IwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABO4ltHe4cADq1Itre7cTGSTm1ct1qXPFUFHh -bsDyiZMZx+hPPi/yiaM7aHMfH94T/WosSYIEQTf1X1zyB/05++ejggEKMIIBBjAO -BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG -A1UdEwEB/wQCMAAwHQYDVR0OBBYEFAlEgmrPvzu5v0ZOBkyV8XITILkhMB8GA1Ud -IwQYMBaAFD6tYQP/qhHd7hPK0db/ZnRDP4Y0MCoGA1UdEQQjMCGCFG9yZGVyZXIu -bmV0d29yazEuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi -aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi -aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAMEMcNxYCENx -1CSSs8SYB+5CDSWXEK/ApKMAbqZ6Zo6/AiA/B9akIzDRqMSc7Xsl+nAVDzOOjFo1 -tGhAGDPrKszsGw== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key deleted file mode 100644 index 5f7cd0d8e..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/server.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7y0PBJNvUDOJGAoY -pquNCLpsbcAf0dk1B+oBaKs1IOahRANCAATuJbR3uHAA6tSLa3u3Exkk5tXLdalz -xVBR4W7A8omTGcfoTz4v8omjO2hzHx/eE/1qLEmCBEE39V9c8gf9Ofvn ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem deleted file mode 100644 index c8be1d280..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/signcerts/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1jCCAnygAwIBAgIUUFUPOt2Iq4BAbu4izr4jPvgTf+IwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABO4ltHe4cADq1Itre7cTGSTm1ct1qXPFUFHh -bsDyiZMZx+hPPi/yiaM7aHMfH94T/WosSYIEQTf1X1zyB/05++ejggEKMIIBBjAO -BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG -A1UdEwEB/wQCMAAwHQYDVR0OBBYEFAlEgmrPvzu5v0ZOBkyV8XITILkhMB8GA1Ud -IwQYMBaAFD6tYQP/qhHd7hPK0db/ZnRDP4Y0MCoGA1UdEQQjMCGCFG9yZGVyZXIu -bmV0d29yazEuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi -aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi -aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDSAAwRQIhAMEMcNxYCENx -1CSSs8SYB+5CDSWXEK/ApKMAbqZ6Zo6/AiA/B9akIzDRqMSc7Xsl+nAVDzOOjFo1 -tGhAGDPrKszsGw== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/orderers/orderer.network1.com/tls/tlscacerts/tls-localhost-9054-ca-orderer-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey deleted file mode 100644 index b35c28f7e..000000000 Binary files a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index dc4c6f6fb..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKJ7KBEAeS+e6lPUS3eCgZiImNpXJ2R0c -rVb28F2tYtczCf1dg7MFLDFaL4AieRATNZxAtHXOoo4smc+DCGHeFOB8IIEL8sHG -fUrGj43x0eFV16Our2mt1DzRhScQ/bCV ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem deleted file mode 100644 index 6d1103342..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/cacerts/localhost-9054-ca-orderer-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIURwEWXKViiCnfztwadQU0Xv3sV/MwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEENQJSbn/q+iNKSDsVp0kx9bR -AAd9slqL8odhUGAL5/UOwhTqTI3YKVyUJLyx7PE6G0qZjdHWffa28xCSdN0GpqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FD6tYQP/qhHd7hPK0db/ZnRDP4Y0MAoGCCqGSM49BAMCA0cAMEQCIAIPEZGutxkq -HnTrmpt16WEyl+R0cFnxVWHoP/mN2zxiAiBU7WwaDXCAQf9jiXGk3rCqF4KBjiXI -G/SqmgUTqBvo0g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/d7ac31a822ab05c8800fd03bddde304d16d6b4733b290981ec9b52baaf9f5e5c_sk b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/d7ac31a822ab05c8800fd03bddde304d16d6b4733b290981ec9b52baaf9f5e5c_sk deleted file mode 100644 index 71d3bcfbb..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/keystore/d7ac31a822ab05c8800fd03bddde304d16d6b4733b290981ec9b52baaf9f5e5c_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgZbiLfV458Jghw4r8 -QPW9CdyjqsIa7vCJ1vWrsQimdlOhRANCAAS2+UQWA+HryYEOqE+BuVN4Xw9z158x -izHsb2EQEih2AsMrDPrkY5pDgpBkEpGdpNnaLFu9XEvs6wkNLRAZDJjj ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem deleted file mode 100644 index fd8441fc2..000000000 --- a/tests/network-setups/fabric/shared/network1/ordererOrganizations/network1.com/users/Admin@network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICpDCCAkqgAwIBAgIUPbbUVj06uRAmtK8YPKV9RWO2KX4wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowYzELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xFTATBgNVBAMTDG9yZGVyZXJBZG1pbjBZ -MBMGByqGSM49AgEGCCqGSM49AwEHA0IABLb5RBYD4evJgQ6oT4G5U3hfD3PXnzGL -MexvYRASKHYCwysM+uRjmkOCkGQSkZ2k2dosW71cS+zrCQ0tEBkMmOOjgdYwgdMw -DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFGjMAddeIzz0 -EfVKyDlgmE6kz6rNMB8GA1UdIwQYMBaAFD6tYQP/qhHd7hPK0db/ZnRDP4Y0MBMG -A1UdEQQMMAqCCHNhbm5pc2gxMF4GCCoDBAUGBwgBBFJ7ImF0dHJzIjp7ImhmLkFm -ZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JkZXJlckFkbWluIiwi -aGYuVHlwZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0gAMEUCIQCvd9esiH0QAd/M -aOlp/Y65W9HAa3r3A6aGXjajwEtPwwIgDw9Z+1xjHHWDfbvN+F/dtW0FivaywldW -SNVhZ8DDePM= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/ca/ca.org1.network1.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/keystore/198a5af9008e2b0127f3120a5fa4330bc2d45b0e12c2e5c42e4f7eadfe36164c_sk b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/keystore/198a5af9008e2b0127f3120a5fa4330bc2d45b0e12c2e5c42e4f7eadfe36164c_sk deleted file mode 100644 index 0f6412972..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/keystore/198a5af9008e2b0127f3120a5fa4330bc2d45b0e12c2e5c42e4f7eadfe36164c_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgQlcrAY3FzkoVNDry -JXmZlklG85S9ing69LjKdBbGHdWhRANCAAQMeHLxz5qHVdDv2MySGh2A9T3ecotb -QzBo081M1Y6DXM8/iukYfGFvMU1nSMDkM0WQNBZhbS2xoSvvIAmcG2u5 ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem deleted file mode 100644 index 3c8b73fbd..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICPDCCAeKgAwIBAgIUduy0pkjS5yHnwECV0MXCTN9mGLMwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABAx4cvHPmodV0O/YzJIaHYD1Pd5yi1tDMGjTzUzV -joNczz+K6Rh8YW8xTWdIwOQzRZA0FmFtLbGhK+8gCZwba7mjdTBzMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRQUEsxidtjPaZG3pJneFyW -yxlzEjAfBgNVHSMEGDAWgBRyhvWC+jgvOsuRSF6arXu2zl0g/DATBgNVHREEDDAK -gghzYW5uaXNoMTAKBggqhkjOPQQDAgNIADBFAiEAqKp6LIfQBOAAt2q3HgWhaOcf -ukEqqJWlOoBD7wqd3NwCICWadcAzY5miwVtWbdb87ZPNP35Vlk4lcUvBL/771p4l ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/msp/tlscacerts/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/085360b244a3d2dbf494a2390df4fd0e38469608ecb0f9c4f235e543c303d127_sk b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/085360b244a3d2dbf494a2390df4fd0e38469608ecb0f9c4f235e543c303d127_sk deleted file mode 100644 index 70742b623..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/keystore/085360b244a3d2dbf494a2390df4fd0e38469608ecb0f9c4f235e543c303d127_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQggNbFvWKX5tF1uNd3 -BUCLCt3Nu/mmFpqbwb0oHrYtjUShRANCAATZMnSXQo+0qhqMnrblQ94lhLluoAyL -l1D5+bONDfEvQOHUOG+/W/Jj9Eu3U0L+Me4swW53vFbbG4kV/6XC1Y2Q ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem deleted file mode 100644 index 072eecfb3..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICojCCAkmgAwIBAgIUMcxcQMXCTq8iViBdU+DSbu5c3dswCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowWzELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAATZMnSXQo+0qhqMnrblQ94lhLluoAyLl1D5+bONDfEv -QOHUOG+/W/Jj9Eu3U0L+Me4swW53vFbbG4kV/6XC1Y2Qo4HdMIHaMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRezv+w23QwiaXpeXIHATj/ -bQJ0rjAfBgNVHSMEGDAWgBRyhvWC+jgvOsuRSF6arXu2zl0g/DAiBgNVHREEGzAZ -ghdwZWVyMC5vcmcxLm5ldHdvcmsxLmNvbTBWBggqAwQFBgcIAQRKeyJhdHRycyI6 -eyJoZi5BZmZpbGlhdGlvbiI6IiIsImhmLkVucm9sbG1lbnRJRCI6InBlZXIwIiwi -aGYuVHlwZSI6InBlZXIifX0wCgYIKoZIzj0EAwIDRwAwRAIgOrVfonbB8xvEO3b7 -nMN8wL+ua5UvFehJyGKDHHStaDYCIG5DVtN6Zm7CBttmqBRzukyS0igjzpOM1sqO -Se/xA/xx ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/5ef7cb27d6b4866bc9d704c91a90ce16937ec46dece2734ed9349d491a59e24d_sk b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/5ef7cb27d6b4866bc9d704c91a90ce16937ec46dece2734ed9349d491a59e24d_sk deleted file mode 100644 index 6a52eefe7..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/keystore/5ef7cb27d6b4866bc9d704c91a90ce16937ec46dece2734ed9349d491a59e24d_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWR2NFSPzYdY1RVNH -BZiLLCHG6vN2zcHaVMZ5blVW/W6hRANCAAQ49ZM9Y1fVHlzYp8LZTdbW4JROYNfI -rUdRZH/UsltlPN4S2eOeTB2nPKPt64r66TEzMYyNIx/n2bix105qq4Jv ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key deleted file mode 100644 index 6a52eefe7..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/server.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWR2NFSPzYdY1RVNH -BZiLLCHG6vN2zcHaVMZ5blVW/W6hRANCAAQ49ZM9Y1fVHlzYp8LZTdbW4JROYNfI -rUdRZH/UsltlPN4S2eOeTB2nPKPt64r66TEzMYyNIx/n2bix105qq4Jv ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/peers/peer0.org1.network1.com/tls/tlscacerts/tls-localhost-7054-ca-org1-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/tlsca/tlsca.org1.network1.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/7a2bc768da5d5ecf5ba6e206e27cc9960303200526435bc864bd96b3e82e819f_sk b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/7a2bc768da5d5ecf5ba6e206e27cc9960303200526435bc864bd96b3e82e819f_sk deleted file mode 100644 index 5d366c60f..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/keystore/7a2bc768da5d5ecf5ba6e206e27cc9960303200526435bc864bd96b3e82e819f_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9OVkGkiCVJdhddeQ -y5+83KLJ2RuJ219WWzQ/TuahODGhRANCAARfhtM9Yw4Bmcm6a/zcnSQBSPthHH1I -sXmQCYMRNrrKVU5Aa5nClGmBFGUtl4WOI0YNFLYkfHFl+tJa1QQouHEM ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem deleted file mode 100644 index 718c8e455..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/Admin@org1.network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICnTCCAkSgAwIBAgIUVt3GEZHXqj+2R+3UObDpQKHBxYYwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xEjAQBgNVBAMTCW9yZzFhZG1pbjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABF+G0z1jDgGZybpr/NydJAFI+2EcfUixeZAJ -gxE2uspVTkBrmcKUaYEUZS2XhY4jRg0UtiR8cWX60lrVBCi4cQyjgdMwgdAwDgYD -VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAVW9c1Bkf/R+78z -boG/kxNNiT8MMB8GA1UdIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MBMGA1Ud -EQQMMAqCCHNhbm5pc2gxMFsGCCoDBAUGBwgBBE97ImF0dHJzIjp7ImhmLkFmZmls -aWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JnMWFkbWluIiwiaGYuVHlw -ZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0cAMEQCIBdi4blZ0T/TqKioQtc5s+tS -FTMZczqTU5Tn4YVp/ORNAiBda7Ay1CqgV0kuEh9jJ/NvZl2P+sXK5Pre4sYj60N8 -QQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey deleted file mode 100644 index 2acebf637..000000000 Binary files a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 985bbf417..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdtoEVkZA2hvW7Mv6qT4KPgvn1PY8Y6bg -9crbesbtreIp4GlpXch//H+MazEww9pX02fGEhWOrlbFvlYYK4GqVPjS1lTYwTWI -5/irOyTNdRvkPr6C3CWsbyX3rNnzWSkY ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem deleted file mode 100644 index 6047e9ae5..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/cacerts/localhost-7054-ca-org1-network1-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUYyc2soSqUtWVHTOtud7D1FbCHp0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDYwMFoXDTM2MDcyNjA1NDYwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM/GelSlifY6+rMOE3G95SXF+ -dTHpG8j5cYK82EVCaLCSvNlCKgpupuQnbkLy+V6dgf9tKSnEsZgiHeB6AyJK/6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FHKG9YL6OC86y5FIXpqte7bOXSD8MAoGCCqGSM49BAMCA0cAMEQCIA9iMqQ/aJiC -a++ft4tN7io83jB17/fzG3BRC9soRR3bAiALgWNYk5118DKTkhFdJVQ0VIoopEtq -Gzi+/j4j7fu/wQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/43e1a75012fe2626d853745be6132512d9552ace941a60701c810771291b03ec_sk b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/43e1a75012fe2626d853745be6132512d9552ace941a60701c810771291b03ec_sk deleted file mode 100644 index cbe6b9ae1..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/keystore/43e1a75012fe2626d853745be6132512d9552ace941a60701c810771291b03ec_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgyUPe33zqIlEdM4aq -35fqlqcaVkH7uWBj/gz8WtTYVaGhRANCAASpFEGiH56bBpwHurdhLBPJF+zBGByB -y6gu70gNM6FNJk0aReIbK953WtxV5mGBGun5xIoepmYFPBaL0cD28WSw ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem deleted file mode 100644 index 891bc00f6..000000000 --- a/tests/network-setups/fabric/shared/network1/peerOrganizations/org1.network1.com/users/User1@org1.network1.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICmDCCAj6gAwIBAgIUZ/a0pQQfq5dLvxaJyzBmM4CyPLswCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDcwMFoXDTIyMDczMDA1NTIwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABKkUQaIfnpsGnAe6t2EsE8kX7MEYHIHLqC7vSA0z -oU0mTRpF4hsr3nda3FXmYYEa6fnEih6mZgU8FovRwPbxZLCjgdAwgc0wDgYDVR0P -AQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNt706kSKQClODp2Q2bU -OiwmqCPWMB8GA1UdIwQYMBaAFHKG9YL6OC86y5FIXpqte7bOXSD8MBMGA1UdEQQM -MAqCCHNhbm5pc2gxMFgGCCoDBAUGBwgBBEx7ImF0dHJzIjp7ImhmLkFmZmlsaWF0 -aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEiLCJoZi5UeXBlIjoiY2xp -ZW50In19MAoGCCqGSM49BAMCA0gAMEUCIQDs4Xyxoo9Mx45wY6coA4A0cG621tcP -IODxsjNkTKr+KwIgWZcLirV48YhcmCFmoAh3+WdaBAzDr2/APncLRv7QmX0= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerPublicKey deleted file mode 100644 index cf4837d09..000000000 Binary files a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey deleted file mode 100644 index 611fab391..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgJ8xIRqgf3y/NEW4a0sB149n0xIyMILm -cu/fPRD0T+rRCW4PmNtzJtIwF/dOvZ0o3sF2viN5od5prlozeBdY2T0Ba328PSHv -n2pCvE0oV7UmR8hL1kD/E1yZnc1J/arJ ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/ca-cert.pem b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/ca-cert.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/ca-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server-config.yaml b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server-config.yaml index 825c3678b..2ddde3d30 100644 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server-config.yaml +++ b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/fabric-ca-server-config.yaml @@ -269,13 +269,13 @@ signing: default: usage: - digital signature - expiry: 8760h + expiry: 87660h profiles: ca: usage: - cert sign - crl sign - expiry: 43800h + expiry: 87660h caconstraint: isca: true maxpathlen: 0 @@ -286,7 +286,7 @@ signing: - server auth - client auth - key agreement - expiry: 8760h + expiry: 87660h ########################################################################### # Certificate Signing Request (CSR) section. diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/4d66bd3a677d620e418fdb85cbeb757a7fdea932edc5ba3672d1fd1c0b087b13_sk b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/4d66bd3a677d620e418fdb85cbeb757a7fdea932edc5ba3672d1fd1c0b087b13_sk deleted file mode 100644 index ea7f87714..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/4d66bd3a677d620e418fdb85cbeb757a7fdea932edc5ba3672d1fd1c0b087b13_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgUaWIOme1cEHah2pC -EpNDnuQA9H9O+SkHiGrqaZW19y6hRANCAAREnqiSes/5ySxweieA70fv1wk8kHZK -S9CtPcvjT2G7oWq1Mxs1VgcKWn2DofTT64KXv7/YqMuUcAVUhTpDCRvJ ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey deleted file mode 100644 index 687f17b49..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerRevocationPrivateKey +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGkAgEBBDBDjpLRWhx9MkdFUuICvM9KeJsNQk/JJKQFgXXGUd5eBrox8gjq1Ved -lijdnkqDgt+gBwYFK4EEACKhZANiAASAnzEhGqB/fL80RbhrSwHXj2fTEjIwguZy -7989EPRP6tEJbg+Y23Mm0jAX9069nSjewXa+I3mh3mmuWjN4F1jZPQFrfbw9Ie+f -akK8TShXtSZHyEvWQP8TXJmdzUn9qsk= ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey deleted file mode 100644 index 4d6818a31..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/IssuerSecretKey +++ /dev/null @@ -1 +0,0 @@ -u+KsW:-$%m8t \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/e29c727a5c3adda2daa247431233e6d0c2cdca9bd2a8e7f76f8365e9a96e52f8_sk b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/e29c727a5c3adda2daa247431233e6d0c2cdca9bd2a8e7f76f8365e9a96e52f8_sk deleted file mode 100644 index ffaa7863d..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/msp/keystore/e29c727a5c3adda2daa247431233e6d0c2cdca9bd2a8e7f76f8365e9a96e52f8_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6VrmVfF3/99qxqQf -FVHHjdsFRjiKJ58BaXDo5ax0yaGhRANCAAR1SatEVtjaMWZrBZgukSB1wfTaPjbw -P/eCT7VWbsOUaN31C52JokoQTBCROEABbZlXHIlN4Mn0CvT870rj6NIH ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/tls-cert.pem b/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/tls-cert.pem deleted file mode 100644 index ef271a1e8..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/ordererOrg/tls-cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICczCCAhmgAwIBAgIUQ1673dwGHDu9Rw93JizniYU+M3IwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NDgwMFowZDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEww0ZmU2MjRmZmZmZDAw -WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAREnqiSes/5ySxweieA70fv1wk8kHZK -S9CtPcvjT2G7oWq1Mxs1VgcKWn2DofTT64KXv7/YqMuUcAVUhTpDCRvJo4GkMIGh -MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUudD4AsNpz+Ep98BB1jziRKTzO50wHwYD -VR0jBBgwFoAU/+pxwaMD2nOe3nt3sgf7rHu2RpcwIgYDVR0RBBswGYIMNGZlNjI0 -ZmZmZmQwgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhAMU7DBg8HM9XXyM8 -u7NXZc+MYIgPLQgPKvhC+rzwSm64AiBIXXOpUrcoql119o4UQrEhB2PVD/La9JWV -6H+Arxu0VQ== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/ca-cert.pem b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/ca-cert.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/ca-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server-config.yaml b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server-config.yaml index 9f14c57a7..4612d5447 100644 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server-config.yaml +++ b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/fabric-ca-server-config.yaml @@ -269,13 +269,13 @@ signing: default: usage: - digital signature - expiry: 8760h + expiry: 87660h profiles: ca: usage: - cert sign - crl sign - expiry: 43800h + expiry: 87660h caconstraint: isca: true maxpathlen: 0 @@ -286,7 +286,7 @@ signing: - server auth - client auth - key agreement - expiry: 8760h + expiry: 87660h ########################################################################### # Certificate Signing Request (CSR) section. diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/7d3e97c4644391d43429e1b9e781ff8a6a75f6fd974f25e9f674873feebd9ea1_sk b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/7d3e97c4644391d43429e1b9e781ff8a6a75f6fd974f25e9f674873feebd9ea1_sk deleted file mode 100644 index 4ae9bbdc3..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/7d3e97c4644391d43429e1b9e781ff8a6a75f6fd974f25e9f674873feebd9ea1_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNQry0UG5iTzM/38l -thuR+zFjky2o12A+3IM53IvmbMyhRANCAAQdfhthn3ywKOkLMGyaJbqPjZBCQH52 -kORLkiFuWwlPzB6wV/gSmSQV1HS60GB0vbtSZuaahMeHo/YBbAC2DpRO ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey deleted file mode 100644 index e0591fd05..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerRevocationPrivateKey +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGkAgEBBDCuVGe3RY/K6lDjMjebR3OQLNUNokeTNZafBA8rMo7Np0+rwaWu4fC4 -0VQVdVz4k/qgBwYFK4EEACKhZANiAAS7G7pxx6LDcFoMyD98dsjeslo56/siRp5J -k8h+xqQdgstbrdVuFQyvm8deLk+B4Y5Q5v3CM2k3tuQ3qKcOCq6eq1gcmU2u28AX -2OTs23ubzl1n9cOgjyl+fJngmZq+T/I= ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey deleted file mode 100644 index 2c540381e..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/IssuerSecretKey +++ /dev/null @@ -1 +0,0 @@ --F^ [2ު;0$"/>YZk9 \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/ff63d3aee2f2cb882477e67de733e49c3aa42209717522d2307fcf37d7cecaed_sk b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/ff63d3aee2f2cb882477e67de733e49c3aa42209717522d2307fcf37d7cecaed_sk deleted file mode 100644 index 22d735884..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/msp/keystore/ff63d3aee2f2cb882477e67de733e49c3aa42209717522d2307fcf37d7cecaed_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgW/mqGmpm8BSDVoCA -iLj08yCfWPoUK7qu/M90/hCdOX2hRANCAAQDDoVeSbLLuBIQQTfHK8CJLL/84JMl -ZaoXOEEYZzSpwT3y0z94kc+2gCXAeWRkzj0WBDEh0jyumqM0JSlCuCbM ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/tls-cert.pem b/tests/network-setups/fabric/shared/network2/fabric-ca/org1/tls-cert.pem deleted file mode 100644 index b5d46dbc0..000000000 --- a/tests/network-setups/fabric/shared/network2/fabric-ca/org1/tls-cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICcTCCAhmgAwIBAgIUd3SkX/D/PkKYFEbstE4tdZSgS4YwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NDgwMFowZDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRUwEwYDVQQDEwxlN2JiZDEwZmI3ODYw -WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQDDoVeSbLLuBIQQTfHK8CJLL/84JMl -ZaoXOEEYZzSpwT3y0z94kc+2gCXAeWRkzj0WBDEh0jyumqM0JSlCuCbMo4GkMIGh -MA4GA1UdDwEB/wQEAwIDqDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUlK+bqtU61AjaOTTy7Fg40w41s0UwHwYD -VR0jBBgwFoAUucRtA131Vj5wOZIO/OrEjRwomfEwIgYDVR0RBBswGYIMZTdiYmQx -MGZiNzg2gglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRgAwQwIgJzqY+4dqdS9JcoxW -PMzDYTzzcCqB1LmhwmOw616+xzMCHx+Hd2YBfkAY3KUe+5+LM1TkGC+ssHk6DGU9 -kLdZHtM= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey deleted file mode 100644 index cf4837d09..000000000 Binary files a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 611fab391..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgJ8xIRqgf3y/NEW4a0sB149n0xIyMILm -cu/fPRD0T+rRCW4PmNtzJtIwF/dOvZ0o3sF2viN5od5prlozeBdY2T0Ba328PSHv -n2pCvE0oV7UmR8hL1kD/E1yZnc1J/arJ ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/keystore/25ad3edad97423cb9ceba6b06b83ca7f217cd794857d1347dd27ad47f601cbe7_sk b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/keystore/25ad3edad97423cb9ceba6b06b83ca7f217cd794857d1347dd27ad47f601cbe7_sk deleted file mode 100644 index 0fc57376d..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/keystore/25ad3edad97423cb9ceba6b06b83ca7f217cd794857d1347dd27ad47f601cbe7_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtqwq+wuBtwD0ve8B -sTmIkwBCuEurl40ffoBPHaGdg02hRANCAAQnxvmbowKl3Dcej4vqK5o2XxNtATj0 -uTRvl5sHas7zBaRT60jZhEOF7xWiduULQtam3gCawJZ1+NvycykCGNyS ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem deleted file mode 100644 index c4fb3917d..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICPDCCAeKgAwIBAgIUVGktrA2AiBj4KFpflp1oKbsf3n0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABCfG+ZujAqXcNx6Pi+ormjZfE20BOPS5NG+Xmwdq -zvMFpFPrSNmEQ4XvFaJ25QtC1qbeAJrAlnX42/JzKQIY3JKjdTBzMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRCYTnqkfDlZWFFv88Wb7u/ -9OKOEjAfBgNVHSMEGDAWgBT/6nHBowPac57ee3eyB/use7ZGlzATBgNVHREEDDAK -gghzYW5uaXNoMTAKBggqhkjOPQQDAgNIADBFAiEAmVEoju+8Tn3y3UxXd+fsdkSY -kOz2uRztw0MaSc/KTSACIAuJIrZz9ILFAPT+GEZY0kcxAEZYNkr0j4ihdN2euwp5 ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey deleted file mode 100644 index cf4837d09..000000000 Binary files a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 611fab391..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgJ8xIRqgf3y/NEW4a0sB149n0xIyMILm -cu/fPRD0T+rRCW4PmNtzJtIwF/dOvZ0o3sF2viN5od5prlozeBdY2T0Ba328PSHv -n2pCvE0oV7UmR8hL1kD/E1yZnc1J/arJ ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/d30db3151430ff2c370f8f40cd6e23bb09ed8f3165c7b9957c8761bd9695297f_sk b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/d30db3151430ff2c370f8f40cd6e23bb09ed8f3165c7b9957c8761bd9695297f_sk deleted file mode 100644 index 7a032fdb2..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/keystore/d30db3151430ff2c370f8f40cd6e23bb09ed8f3165c7b9957c8761bd9695297f_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgGdEn3r1vd/S0cVwQ -GowrNFFF1MoA4eqHWrRbYAQqJAehRANCAAR9yje267F14rfm3+tKvtraRfQrzZKO -ePkau0AtL//z7I9PsNp1Zy4DjWJpD0Xcrf7R62M59X0tebsU/22UUfKF ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/msp/tlscacerts/tlsca.network2.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey deleted file mode 100644 index cf4837d09..000000000 Binary files a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey deleted file mode 100644 index 611fab391..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgJ8xIRqgf3y/NEW4a0sB149n0xIyMILm -cu/fPRD0T+rRCW4PmNtzJtIwF/dOvZ0o3sF2viN5od5prlozeBdY2T0Ba328PSHv -n2pCvE0oV7UmR8hL1kD/E1yZnc1J/arJ ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/cc2fe89245d366799edfc39e8cdfa32801c8ae5fc26211ea4faff9ae6672bd35_sk b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/cc2fe89245d366799edfc39e8cdfa32801c8ae5fc26211ea4faff9ae6672bd35_sk deleted file mode 100644 index 2759c2c7a..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/keystore/cc2fe89245d366799edfc39e8cdfa32801c8ae5fc26211ea4faff9ae6672bd35_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgUDXGmLy3ZJAggFb6 -dGVgigCf0fnGt5fabS7DBYQD5VihRANCAAQ2gziyzQSbLLnwM2M3FFJYJcpUdRzu -Zu72ALuZbpLVh7t49nvk0GXWltmFkOr5GiJYXYWTkFHTCNJWmBb1Y5fg ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt deleted file mode 100644 index 22cc7360c..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1TCCAnygAwIBAgIUdOC/9A7Jw4Cyl7jaPucFerGrcSIwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABDaDOLLNBJssufAzYzcUUlglylR1HO5m7vYA -u5luktWHu3j2e+TQZdaW2YWQ6vkaIlhdhZOQUdMI0laYFvVjl+CjggEKMIIBBjAO -BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG -A1UdEwEB/wQCMAAwHQYDVR0OBBYEFNEnR+Hn8AboGgOdxMnw1jzzWfS2MB8GA1Ud -IwQYMBaAFP/qccGjA9pznt57d7IH+6x7tkaXMCoGA1UdEQQjMCGCFG9yZGVyZXIu -bmV0d29yazIuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi -aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi -aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDRwAwRAIgFEbMfwIBO7F1 -jKGUXeWggFUVsAjtWU5RKPvSyxq+05oCIGZACKgoBpzlCM4diQlEdfBOE+0OmIwe -RHM8Om5MvdE1 ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key deleted file mode 100644 index 2759c2c7a..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/server.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgUDXGmLy3ZJAggFb6 -dGVgigCf0fnGt5fabS7DBYQD5VihRANCAAQ2gziyzQSbLLnwM2M3FFJYJcpUdRzu -Zu72ALuZbpLVh7t49nvk0GXWltmFkOr5GiJYXYWTkFHTCNJWmBb1Y5fg ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem deleted file mode 100644 index 22cc7360c..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/signcerts/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1TCCAnygAwIBAgIUdOC/9A7Jw4Cyl7jaPucFerGrcSIwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEQMA4GA1UECxMHb3JkZXJlcjEQMA4GA1UEAxMHb3JkZXJlcjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABDaDOLLNBJssufAzYzcUUlglylR1HO5m7vYA -u5luktWHu3j2e+TQZdaW2YWQ6vkaIlhdhZOQUdMI0laYFvVjl+CjggEKMIIBBjAO -BgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG -A1UdEwEB/wQCMAAwHQYDVR0OBBYEFNEnR+Hn8AboGgOdxMnw1jzzWfS2MB8GA1Ud -IwQYMBaAFP/qccGjA9pznt57d7IH+6x7tkaXMCoGA1UdEQQjMCGCFG9yZGVyZXIu -bmV0d29yazIuY29tgglsb2NhbGhvc3QwWwYIKgMEBQYHCAEET3siYXR0cnMiOnsi -aGYuQWZmaWxpYXRpb24iOiIiLCJoZi5FbnJvbGxtZW50SUQiOiJvcmRlcmVyIiwi -aGYuVHlwZSI6Im9yZGVyZXIifX0wCgYIKoZIzj0EAwIDRwAwRAIgFEbMfwIBO7F1 -jKGUXeWggFUVsAjtWU5RKPvSyxq+05oCIGZACKgoBpzlCM4diQlEdfBOE+0OmIwe -RHM8Om5MvdE1 ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/orderers/orderer.network2.com/tls/tlscacerts/tls-localhost-8054-ca-orderer-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey deleted file mode 100644 index cf4837d09..000000000 Binary files a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerPublicKey and /dev/null differ diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 611fab391..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgJ8xIRqgf3y/NEW4a0sB149n0xIyMILm -cu/fPRD0T+rRCW4PmNtzJtIwF/dOvZ0o3sF2viN5od5prlozeBdY2T0Ba328PSHv -n2pCvE0oV7UmR8hL1kD/E1yZnc1J/arJ ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem deleted file mode 100644 index 7bc4e17b0..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/cacerts/localhost-8054-ca-orderer-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFzCCAb2gAwIBAgIUcD3XTdKlKhRXdbBDR6f0TJeiPnowCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdUmrRFbY2jFmawWYLpEgdcH0 -2j428D/3gk+1Vm7DlGjd9QudiaJKEEwQkThAAW2ZVxyJTeDJ9Ar0/O9K4+jSB6NF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FP/qccGjA9pznt57d7IH+6x7tkaXMAoGCCqGSM49BAMCA0gAMEUCIQDES/I1hE8k -CbdiFv5GMSPI5ez9yoduP/kFGHUMW3XMVwIgBbMVw2r62VwuaN5peauo2iyC/bgY -HwkoUVYqbWHakNc= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/8163fd4f80204f53f3149c20b2a005780753ee8529259598d515f6e14024fe8a_sk b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/8163fd4f80204f53f3149c20b2a005780753ee8529259598d515f6e14024fe8a_sk deleted file mode 100644 index 8d064442b..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/keystore/8163fd4f80204f53f3149c20b2a005780753ee8529259598d515f6e14024fe8a_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7AtwLFfiPRqolVyi -26xp95pPllmipeYDF+HH5oxZraKhRANCAARSsdxQQTd+MTd2Wvlek0pv+ejE182f -WbitsP5wZILR1M6dw/8whHwRClnBhNTwUY64baQL6VtokqszhIoAaGbY ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem deleted file mode 100644 index 561208d3b..000000000 --- a/tests/network-setups/fabric/shared/network2/ordererOrganizations/network2.com/users/Admin@network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICpDCCAkqgAwIBAgIUdGGsx2r5tkuMe45vHb0t/orrky0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowYzELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xFTATBgNVBAMTDG9yZGVyZXJBZG1pbjBZ -MBMGByqGSM49AgEGCCqGSM49AwEHA0IABFKx3FBBN34xN3Za+V6TSm/56MTXzZ9Z -uK2w/nBkgtHUzp3D/zCEfBEKWcGE1PBRjrhtpAvpW2iSqzOEigBoZtijgdYwgdMw -DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFMpYhmiKaAIE -X6b9KgDBLrBg9Ct1MB8GA1UdIwQYMBaAFP/qccGjA9pznt57d7IH+6x7tkaXMBMG -A1UdEQQMMAqCCHNhbm5pc2gxMF4GCCoDBAUGBwgBBFJ7ImF0dHJzIjp7ImhmLkFm -ZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JkZXJlckFkbWluIiwi -aGYuVHlwZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0gAMEUCIQCHr2XNXOVp/fEf -mZ2sH9gtE2KqoUfm/eMh5YXgP9NEPgIgU4tB+yNAYLzYD4xpsxVYJnua8YgQxyeR -tsT98u5ra/0= ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/ca/ca.org1.network2.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/keystore/3fec22439cf4be3c4f4a960276c33dd1edcbed4a5e599a116854e71eaf427e96_sk b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/keystore/3fec22439cf4be3c4f4a960276c33dd1edcbed4a5e599a116854e71eaf427e96_sk deleted file mode 100644 index 6b260d093..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/keystore/3fec22439cf4be3c4f4a960276c33dd1edcbed4a5e599a116854e71eaf427e96_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjqJoO2I1RaEacrKJ -kBhM71l+VEz+LAj/BpjCrtp9myKhRANCAAT4+NC7hjKDh/DgFLzkllYRZ1Qpz9OP -WDifV04B5GWtZGYhX1/sqx9YB4UwQkEVZ0OHE9l2eEndO+fel1Yv+ffZ ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem deleted file mode 100644 index 4d215ff39..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICPDCCAeKgAwIBAgIUTfN3bMaAsw9byT4FKftS2Kqq03owCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABPj40LuGMoOH8OAUvOSWVhFnVCnP049YOJ9XTgHk -Za1kZiFfX+yrH1gHhTBCQRVnQ4cT2XZ4Sd07596XVi/599mjdTBzMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSiQY2wIh9E89v87tZyWzgl -2EJzIjAfBgNVHSMEGDAWgBS5xG0DXfVWPnA5kg786sSNHCiZ8TATBgNVHREEDDAK -gghzYW5uaXNoMTAKBggqhkjOPQQDAgNIADBFAiEAyVbGvyJ4f9XDA2zIffOrLtVg -4YGI0tZFPFf06V/TPYQCIAD/HIKUW2Mzva9HnxollEvRC/osMhwFewovZX4yySrQ ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/msp/tlscacerts/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/03bc2a06ccd3c6456e6aac3a010ac4979b258a864c5778180cc43dda00ef02ad_sk b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/03bc2a06ccd3c6456e6aac3a010ac4979b258a864c5778180cc43dda00ef02ad_sk deleted file mode 100644 index 4b557ea44..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/keystore/03bc2a06ccd3c6456e6aac3a010ac4979b258a864c5778180cc43dda00ef02ad_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs3vxTV/P8aVr7meQ -NZQ4bibzpDq4p83Rtf6vILACkh6hRANCAAQTYNDZhUatamvnrK9sOEabjUkwyxfg -EMaKKNISSDXFHLDQr/4eOHl7HyMW5vUW9hwyDUCHW6GyoNcLGrQjliKC ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem deleted file mode 100644 index 03a8b3296..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICojCCAkmgAwIBAgIUSnSLqeSZMrsh48pgWDu5dQRd9zwwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowWzELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjENMAsGA1UECxMEcGVlcjEOMAwGA1UEAxMFcGVlcjAwWTATBgcqhkjO -PQIBBggqhkjOPQMBBwNCAAQTYNDZhUatamvnrK9sOEabjUkwyxfgEMaKKNISSDXF -HLDQr/4eOHl7HyMW5vUW9hwyDUCHW6GyoNcLGrQjliKCo4HdMIHaMA4GA1UdDwEB -/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTAU/Q+0sdlFKnHcO5kVU3Q -apm6pjAfBgNVHSMEGDAWgBS5xG0DXfVWPnA5kg786sSNHCiZ8TAiBgNVHREEGzAZ -ghdwZWVyMC5vcmcxLm5ldHdvcmsyLmNvbTBWBggqAwQFBgcIAQRKeyJhdHRycyI6 -eyJoZi5BZmZpbGlhdGlvbiI6IiIsImhmLkVucm9sbG1lbnRJRCI6InBlZXIwIiwi -aGYuVHlwZSI6InBlZXIifX0wCgYIKoZIzj0EAwIDRwAwRAIgUMcdHlNrmgVuuBZf -A5EXBPeBDN8LFcMvCLurboQ7uUwCIDkvyZYJzZt5z2ZWYJ6EFWopXfYxbtgGWzM8 -5wP04TE5 ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/ca.crt +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/b921b2940a4a7cdb8dd8a4509fb0dc92a4099335a1b737e7380d5bbd5cbb57e6_sk b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/b921b2940a4a7cdb8dd8a4509fb0dc92a4099335a1b737e7380d5bbd5cbb57e6_sk deleted file mode 100644 index 49beb03da..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/keystore/b921b2940a4a7cdb8dd8a4509fb0dc92a4099335a1b737e7380d5bbd5cbb57e6_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgS1yF/RtySv2XAaRW -e3OD7GbXSi4vsRJYW75q6EueZDihRANCAARaJ7CbbpGJrtuBHiy65CZnazKj/l1I -dwGmAlw24g/BLWjiGipKl5QJLr7FV3r6fsNcTQTOJJEC4SyfFi3JZLbi ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key deleted file mode 100644 index 49beb03da..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/server.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgS1yF/RtySv2XAaRW -e3OD7GbXSi4vsRJYW75q6EueZDihRANCAARaJ7CbbpGJrtuBHiy65CZnazKj/l1I -dwGmAlw24g/BLWjiGipKl5QJLr7FV3r6fsNcTQTOJJEC4SyfFi3JZLbi ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/peers/peer0.org1.network2.com/tls/tlscacerts/tls-localhost-5054-ca-org1-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/tlsca/tlsca.org1.network2.com-cert.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/05e000f93c5285fb535f2d8d208949aeb68fd089dec6d386f21ff361eccc2072_sk b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/05e000f93c5285fb535f2d8d208949aeb68fd089dec6d386f21ff361eccc2072_sk deleted file mode 100644 index 4ea78dc71..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/keystore/05e000f93c5285fb535f2d8d208949aeb68fd089dec6d386f21ff361eccc2072_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBJqNwU9RJSaV/WVP -rUJ+ttXTEIgtftfstpocuCQ2FqahRANCAARze1a2RaQ+3AOEkKuj+Ccz/XKco/C0 -VdLUWOv6nA6tFkSV66zsgFtGkLUvixXehC75JAepujAu7+R4ma0GXuW8 ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem deleted file mode 100644 index b614ea256..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/Admin@org1.network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICnTCCAkSgAwIBAgIUdPsOn0tA0E/Uuv3GS2/6AhssbWIwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowYDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEOMAwGA1UECxMFYWRtaW4xEjAQBgNVBAMTCW9yZzFhZG1pbjBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABHN7VrZFpD7cA4SQq6P4JzP9cpyj8LRV0tRY -6/qcDq0WRJXrrOyAW0aQtS+LFd6ELvkkB6m6MC7v5HiZrQZe5byjgdMwgdAwDgYD -VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDuvrXq5+RV37zPg -8hMp+XVSxj+kMB8GA1UdIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMBMGA1Ud -EQQMMAqCCHNhbm5pc2gxMFsGCCoDBAUGBwgBBE97ImF0dHJzIjp7ImhmLkFmZmls -aWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoib3JnMWFkbWluIiwiaGYuVHlw -ZSI6ImFkbWluIn19MAoGCCqGSM49BAMCA0cAMEQCIDQairpz+UZnDl6El44wUf8H -w5/2vrdMRNWqCaNW3FivAiA7LRWkdHsUgVDWWp2KPzkiaAuCoDHPA433qMub/OPW -Eg== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey deleted file mode 100644 index 06ed0f36c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerPublicKey +++ /dev/null @@ -1,18 +0,0 @@ - -OU -Role - EnrollmentID -RevocationHandleD - 8N67 TtΩo&_ɀ ,h"D - vlcv6.@9j1v ]M/@=_bǝc9* - ӭ1+RV --u-pl_T@ ӥHmTRcw*Ͱ SI  d @xuC>cQGWW" .(N0|$I}QVaMwu j>2D - t{8hwAdnOhiW 0"{ \VeT2Q quCEC Tx:D - >SrΝDog+Ƣk" -&2O>&k9 -15{e>~-B 69zVtߡA`n]_hƟF*hSJ ?N,K?NBR(R wQrۏ{6P7"W Q \ No newline at end of file diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey deleted file mode 100644 index 34e48512c..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/IssuerRevocationPublicKey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuxu6cceiw3BaDMg/fHbI3rJaOev7Ikae -SZPIfsakHYLLW63VbhUMr5vHXi5PgeGOUOb9wjNpN7bkN6inDgqunqtYHJlNrtvA -F9jk7Nt7m85dZ/XDoI8pfnyZ4Jmavk/y ------END PUBLIC KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem deleted file mode 100644 index f30b4366a..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/cacerts/localhost-5054-ca-org1-network2-com.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICFjCCAb2gAwIBAgIUar7AQ9tuF+EnYEV5NzojPETw1B0wCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTM2MDcyNjA1NDgwMFowaDELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy -dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX4bYZ98sCjpCzBsmiW6j42Q -QkB+dpDkS5IhblsJT8wesFf4EpkkFdR0utBgdL27UmbmmoTHh6P2AWwAtg6UTqNF -MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE -FLnEbQNd9VY+cDmSDvzqxI0cKJnxMAoGCCqGSM49BAMCA0cAMEQCICqeGasMewgQ -bm3A30b/VARhu853QV7MeWbVi5J0lYE7AiAIGm0t947c/hKmiqG+JiU8hlsZzA73 -BbhDFXqROY1Q+g== ------END CERTIFICATE----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0e6057bbf43121b51abad6a86682540ecb8ff59924b569c0dca624b478025f3d_sk b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0e6057bbf43121b51abad6a86682540ecb8ff59924b569c0dca624b478025f3d_sk deleted file mode 100644 index e27359f18..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/keystore/0e6057bbf43121b51abad6a86682540ecb8ff59924b569c0dca624b478025f3d_sk +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghl5fobSHlI1NxXaP -3E17FDJSMVFpZWZVj2tX0Otv3B6hRANCAAS6CxajPv1a6rCawrgorkT6EU9yLk1W -DJ2ee2XLTy15kelDz8vcbmpsHFayn1FXeY1xKtrTx/WAC9DjpfX2d3/D ------END PRIVATE KEY----- diff --git a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem b/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem deleted file mode 100644 index 6261293f8..000000000 --- a/tests/network-setups/fabric/shared/network2/peerOrganizations/org1.network2.com/users/User1@org1.network2.com/msp/signcerts/cert.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIClzCCAj6gAwIBAgIUe6oImDpY+pwDQKOmgm5ojZgWIfgwCgYIKoZIzj0EAwIw -aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK -EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt -Y2Etc2VydmVyMB4XDTIxMDczMDA1NDgwMFoXDTIyMDczMDA1NTMwMFowXTELMAkG -A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl -cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwV1c2VyMTBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABLoLFqM+/VrqsJrCuCiuRPoRT3IuTVYMnZ57ZctP -LXmR6UPPy9xuamwcVrKfUVd5jXEq2tPH9YAL0OOl9fZ3f8OjgdAwgc0wDgYDVR0P -AQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFGs9zTSsu2PdYw4B4BUY -MuWU3rTMMB8GA1UdIwQYMBaAFLnEbQNd9VY+cDmSDvzqxI0cKJnxMBMGA1UdEQQM -MAqCCHNhbm5pc2gxMFgGCCoDBAUGBwgBBEx7ImF0dHJzIjp7ImhmLkFmZmlsaWF0 -aW9uIjoiIiwiaGYuRW5yb2xsbWVudElEIjoidXNlcjEiLCJoZi5UeXBlIjoiY2xp -ZW50In19MAoGCCqGSM49BAMCA0cAMEQCIBp8L/Pj5Uj08JFZ52PzIIOIXQriST16 -ZKNEHE37Yw93AiBRdsVowkw/PrqoBEoh6Zjomo7H/y/LSPNCZCa7b1D/XQ== ------END CERTIFICATE-----