Не удалось создать каналы с новыми организациями в Fabric, возникла ошибка: Попытка включить члена, не входящего в консорциум

Вот что мне нужно сделать по шагам:

  1. Создайте коммутационную сеть с двумя организациями: Org1 и Org2.
  2. Создайте канал между ними: publicchannel.
  3. теперь добавьте Org3, используя шаги из этого руководства по структуре: https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html
  4. Создайте новый канал: org3org1channel между org3 и org1.

У меня проблемы с шагом 4, он возвращается:

Error: got unexpected status: BAD_REQUEST -- Attempted to include a member which is not in the consortium

когда я бегу:

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

Кроме того, я гарантирую, что все пути и переменные ENV указаны правильно.

Вот мой файл configtx.yaml:

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/msp

    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-config/peerOrganizations/bitpay.example.com/msp
        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Capabilities:
    Global: &ChannelCapabilities
        V1_1: true
    Orderer: &OrdererCapabilities
        V1_1: true
    Application: &ApplicationCapabilities
        V1_2: true

Application: &ApplicationDefaults
    Organizations:

Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Kafka:
        Brokers:
            - 127.0.0.1:9092
    Organizations:

Profiles:
    ExampleOrdererGenesis:
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            ExampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    ExampleChannel:
        Consortium: ExampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities
    TestChannel:
        Consortium: ExampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org3
            Capabilities:
                <<: *ApplicationCapabilities

Я создал новые каналы с новой организацией, используя хак:

  1. Я создал 2 организации в составе консорциума: org1, org2, channelcreatororg.
  2. Я создал новый канал с именем org3org1channel, состоящий только из org1.
  3. Теперь я использовал https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html, чтобы заставить org3 присоединиться к org3org1channel.

Это работает! Но я думаю, что это хак, потому что org1 уже был в определении блока генезиса ExampleConsortium. Предположим, я хочу добавить в эту сеть org4 и создать канал между org4 и org3. это будет невозможно. Для этого мы должны иметь возможность обновить определение консорциума в блоке генезиса.

Особое внимание следует уделить разделу «Профиль» вышеуказанного файла:

Profiles:
    ExampleOrdererGenesis:
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            ExampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    ExampleChannel:
        Consortium: ExampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities
    TestChannel:
        Consortium: ExampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org3
            Capabilities:
                <<: *ApplicationCapabilities

Я думаю, проблема в том, что ExampleOrdererGenesis содержит определение консорциума и не включает Org3. Может ли кто-нибудь помочь мне с шагами по обновлению с помощью инструмента configtxlator?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
853
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны обновлять этот раздел каждый раз, когда добавляете новую организацию в свой консорциум:

ExampleOrdererGenesis:
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            ExampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
                    - *Org3
                    - *Org4

Обновите эту часть в файле configtx.yaml, затем обновите конфигурацию с помощью инструмента configtxlator, как указано в этом руководстве https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html.

это не работает, так как я не могу перезапустить свою сеть. если бы я мог, это было бы очень простое решение. Видите ли, я уже запустил транзакцию генезисного блока, используя ExampleOrdererGenesis, где мое определение консорциума не включает Org4. Теперь мне нужен способ обновить эту транзакцию Genesis.

Ayush Tiwari 23.07.2019 11:27

Чтобы добавить новую организацию в консорциум, выполните следующие действия:

   $: peer channel fetch config config_block.pb -o orderer.example.com:7050
    -c testchainid

   $: configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json

   $: jq -s '.[0] * {"channel_group":{"groups":{"Consortiums":{"groups": {"TestConsortium": {"groups": {"Org3MSP":.[1]}}}}}}}' config.json ./org3.json > modified_config.json

   $: configtxlator proto_encode --input config.json --type common.Config
    --output config.pb

   $: configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

  $:  configtxlator compute_update --channel_id testchainid --original config.pb --updated modified_config.pb --output org_update.pb

   $: configtxlator proto_decode --input  org_update.pb --type common.ConfigUpdate | jq . > org_update.json

  $:  echo '{"payload":{"header":{"channel_header":{"channel_id":"testchainid", "type":2}},"data":{"config_update":'$(cat org_update.json)'}}}' | jq . > org_update_in_envelope.json

   $: configtxlator proto_encode --input org_update_in_envelope.json --type common.Envelope --output org_update_in_envelope.pb

   $: peer channel signconfigtx -f org_update_in_envelope.pb

   $: peer channel update -f org_update_in_envelope.pb -c testchainid -o orderer.example.com:7050
Ответ принят как подходящий

Я решил это по этой ссылке: https://github.com/rohitadivi/Reconfigure-BYFN/blob/master/Create_channel.md

Убедитесь, что вы понимаете, что такое testchaninid в шагах по ссылке выше. Мы создаем канал для заказчика, когда запускаем транзакцию генезисного блока с помощью команды peer. Мы получаем этот канал и обновляем его, а не любой другой канал.

Другие вопросы по теме