Как добавить новую организацию Orderer в существующую сеть Hyperledger Fabri c - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь добавить новую организацию Orderer в существующую службу заказов на основе RAFT. Я использую first-network из fabric-samples в качестве базовой сети. При создании крипто-материала, я изменил, чтобы генерировать крипто-материал для еще 1 организации заказчика. crypto-config.yaml выглядит следующим образом:

OrdererOrgs:
  # ---------------------------------------------------------------------------
  # Orderer
  # ---------------------------------------------------------------------------
  - Name: Orderer
    Domain: example.com
    EnableNodeOUs: true
    # ---------------------------------------------------------------------------
    # "Specs" - See PeerOrgs below for complete description
    # ---------------------------------------------------------------------------
    Specs:
      - Hostname: orderer
      - Hostname: orderer2
      - Hostname: orderer3
      - Hostname: orderer4
      - Hostname: orderer5
  - Name: Orderer1
    Domain: example1.com
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer
      - Hostname: orderer2
      - Hostname: orderer3

# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
  # ---------------------------------------------------------------------------
  # Org1
  # ---------------------------------------------------------------------------
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
      # Start: 5
      # Hostname: {{.Prefix}}{{.Index}} # default
    # ---------------------------------------------------------------------------
    # "Users"
    # ---------------------------------------------------------------------------
    # Count: The number of user accounts _in addition_ to Admin
    # ---------------------------------------------------------------------------
    Users:
      Count: 1
  # ---------------------------------------------------------------------------
  # Org2: See "Org1" for full specification
  # ---------------------------------------------------------------------------
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

Кроме того, configtx.yaml для создания MSP новой организации Orderer в формате JSON имеет вид:

Organizations:
    - &Orderer1Org
        # DefaultOrg defines the organization which is used in the sampleconfig
        # of the fabric.git development environment
        Name: Orderer1Org

        # ID to load the MSP definition as
        ID: Orderer1MSP

        MSPDir: ../crypto-config/ordererOrganizations/example1.com/msp

        # Policies defines the set of policies at this level of the config tree
        # For organization policies, their canonical path is usually
        #   /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Orderer1MSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('Orderer1MSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('Orderer1MSP.admin')"

Затем я загружаюсь сеть использует byfn.sh. Теперь я использую контейнер cli, чтобы изменить конфигурацию системного канала , выполнив следующие действия:

  1. Сначала я добавляю JSON организации к заказчику сгруппируйте следующим образом и отправьте обновление канала:

    jq -s '. [0] * {"channel_group": {"groups": {"Orderer": {"groups": {"Orderer1Org":. [1]}}}} 'config. json orderer1org. json >ified_config. json

  2. Затем я добавляю JSON организации в группу Консорциум следующим образом и отправляю обновление канала:

    jq -s '. [ 0] * {"channel_group": {"groups": {"Consortiums": {"groups": {"SampleConsortium": {"groups": {"Orderer1MSP":. [1]}}}}}}} 'config1. json orderer1org. json >ified_config1. json

  3. Затем я добавляю сертификаты orderer1 TLS организации в раздел Consenters и отправляю обновление канала:

    cert = `base64 ../crypto/ordererOrganizations/example1.com/orderers/orderer.example1.com/tls/server.crt | sed ': a; N; $! ba; s / \ n // g'`

    catified_config1. json | jq '.channel_group.groups.Orderer.values.ConsensusType.value.metadata.consenters + = [{"client_tls_cert": "' $ cert '", "host": "orderer.example1.com", "port": 7050 , "server_tls_cert": "'$ cert'"}]> >ified_config2. json

  4. Затем я обновляю группу приложения конфигурации системного канала с новым заказчиком Оргс JSON:

    jq -s '. [0] * {"channel_group": {"groups": {"Application": {"groups": {"Orderer1Org":. [1]}}}} 'config. json orderer1org. json >ified_config. json

Затем я запускаю одного из заказчиков в новой организации (orderer.example1.com), но происходит сбой контейнера со следующей ошибкой:

2020-04-09 13:09:05.600 UTC [orderer.common.cluster.replication] fetchLastBlockSeq -> WARN 0e8 Received status:FORBIDDEN  from orderer.example.com:7050: forbidden pulling the cha
nnel
2020-04-09 13:09:05.600 UTC [orderer.common.cluster.replication] func1 -> WARN 0e9 Received error of type 'forbidden pulling the channel' from {orderer.example.com:7050 [certs]}

The orderer.example.com журналы выдают эту ошибку:

2020-04-09 13:28:59.338 UTC [cauthdsl] deduplicate -> ERRO a3c Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authorit
y) for identity 0
2020-04-09 13:28:59.338 UTC [cauthdsl] deduplicate -> ERRO a3d Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authorit
y) for identity 0
2020-04-09 13:28:59.339 UTC [cauthdsl] deduplicate -> ERRO a3e Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authorit
y) for identity 0
2020-04-09 13:28:59.340 UTC [cauthdsl] deduplicate -> ERRO a3f Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authorit
y) for identity 0
2020-04-09 13:28:59.340 UTC [common.deliver] deliverBlocks -> WARN a40 [channel: byfn-sys-channel] Client authorization revoked for deliver request from 172.25.0.15:36196: implic
it policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 1 of the 'Readers' sub-policies to be satisfied: permission denied
2020-04-09 13:28:59.341 UTC [comm.grpc.server] 1 -> INFO a41 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.peer_address=172.25.0.15:36196
 grpc.peer_subject="CN=orderer.example1.com,L=San Francisco,ST=California,C=US" grpc.code=OK grpc.call_duration=4.992078ms

1 Ответ

1 голос
/ 11 апреля 2020

Мне удалось расширить first-network, добавив новую организацию Orderer следующим образом:

  1. Запустите сценарий first-network через byfn.sh в репозитории fabric-samples в * Режим 1008 *.
  2. Я создал криптоматериал, как описано в crypto-config.yaml в приведенном выше вопросе.
  3. Используйте инструмент configtxgen, чтобы напечатать MSP новой организации-заказчика в JSON формат.
  4. Смонтируйте или docker cp этот JSON файл в работающий контейнер cli.
  5. Установите среду внутри контейнера cli, соответствующую существующему узлу заказа. Импортируйте последнюю конфигурацию system-channel. Расшифруйте его в формате JSON.
  6. Измените раздел Orderer блока конфигурации канала системы, добавив MSP новой организации-заказчика следующим образом:

    jq -s '.[0] * {"channel_group":{"groups":{"Orderer":{"groups": {"Orderer1Org":.[1]}}}}}' config.json orderer1org.json > config1.json

  7. Измените раздел Consortiums блока конфигурации канала системы, добавив MSP новой организации-заказчика следующим образом:

    jq -s '.[0] * {"channel_group":{"groups":{"Consortiums":{"groups":{"SampleConsortium":{"groups": {"Orderer1MSP":.[1]}}}}}}}' config1.json orderer1org.json > config2.json

  8. Редактировать раздел Consenters блока конфигурации системного канала для добавления учетных данных TLS для узла orderer.example1.com новой организации-заказчика следующим образом:

    cert=`base64 ../crypto/ordererOrganizations/example1.com/orderers/orderer.example1.com/tls/server.crt | sed ':a;N;$!ba;s/\n//g'`

    cat config2.json | jq '.channel_group.groups.Orderer.values.ConsensusType.value.metadata.consenters += [{"client_tls_cert": "'$cert'", "host": "orderer.example1.com", "port": 7050, "server_tls_cert": "'$cert'"}] ' > modified_config.json

  9. Кодирует блок, находит дельту, создает транзакцию обновления канала, кодирует ее как конверт protobuf и отправляет транзакцию обновления канала.

  10. Извлекает последний блок конфигурации канала системы.
  11. Запустите одного из заказчиков (ранее добавленного в список участников), используя этот последний загруженный блок конфигурации системного канала в виде файла genesis.block.
  12. Выполните docker exec в cli co ntainer. Используя среду существующего узла заказчика, получите последнюю конфигурацию системного канала.
  13. Измените блок конфигурации системного канала, добавив конечную точку нового заказчика в раздел OrdererAddresses, следующим образом:

    cat config.json | jq '.channel_group.values.OrdererAddresses.value.addresses += ["orderer.example1.com:7050"] ' > modified_config.json

  14. Кодировать блок, находить дельту, создавать транзакцию обновления канала, кодировать ее как конверт protobuf и получать блок, подписанный администратором Orderer1Org, чтобы защитить mod_policy для ресурса /Channel/OrdererAddresses, для которого установлена ​​политика Admins. Эта неявная метаполитика ожидает подпись MAJORITY Admins на этом уровне обновления. Итак, поскольку количество организаций-заказчиков равно 2, нам нужны оба администратора организации, чтобы подписать эту транзакцию обновления канала системы. Установите среду, соответствующую Orderer1Org admin, и выполните следующую команду:

    peer channel signconfigtx -f ordorg_update_in_envelope.pb

  15. Установите для среды значение OrdererOrg admin и отправьте обновление канала сделка. peer channel update автоматически подпишет транзакцию от имени администратора OrdererOrg.

    peer channel update -f ordorg_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA

Для обновления любого канала приложения просто замените шаг 7, обновив раздел Application блока конфигурации канала приложения, чтобы добавить туда MSP новой организации-заказчика.

Надеюсь, это поможет!

...