Добавлена ​​новая организация в существующую сеть Hyperledger Fabri c. Теперь возникают проблемы с подключением Peer к существующему каналу. - PullRequest
0 голосов
/ 24 января 2020

Этот вопрос поднимается из моего предыдущего вопроса о добавлении новой организации в существующий канал с использованием fabri c node sdk .

Gari помог решить мои проблемы с помощью Node SDK и я смог успешно добавить Org в канал mychannel, который является частью byfn. sh.

Теперь, следуя оригинальному учебнику , который я адаптировал, я хочу добавьте новых участников организации, чтобы присоединиться к каналу mychannel. Я застрял здесь в данный момент и не смог найти решение, несмотря на то, что смотрю на Stackoverflow, HL Lists и HL Jira.

На высоком уровне я следую следующим шагам:

  1. Добавить новую организацию в канал (использует Client.updateChannel API). Я могу сделать это успешно.
  2. Затем я поднимаю одноранговый узел и контейнеры couchdb docker для одноранговых узлов, связанных с новой организацией. Новая организация - Org3, а вот профиль подключения
{
    "name": "first-network-org3",
    "version": "1.0.0",
    "client": {
        "organization": "Org3",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300"
                }
            }
        }
    },
    "organizations": {
        "Org3": {
            "mspid": "Org3MSP",
            "peers": [
                "peer0.org3.example.com"
            ]
        }
    },
    "peers": {
        "peer0.org3.example.com": {
            "url": "grpcs://localhost:11051",
            "tlsCACerts": {
                "path": "/usr/local/fabric/fabric-samples/first-network/crypto-config/peerOrganizations/org3.example.com/tlsca/tlsca.org3.example.com-cert.pem"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org3.example.com"
            }
        }
    }
}
Я использую клиент, указывающий на профиль соединения Org1, и извлекаю объекты Network и Channel, а затем извлекаю блок происхождения канала. Затем я создаю новый профиль соединения, чтобы указать на одноранговые узлы Org3 и подключиться к и получить новую (Org3) ссылку на клиента. Используя этот клиент Org3, я создаю новый объект Peer (Client.newPeer) , а затем выдает channel.joinChannel(request).

Каждый раз из клиентского приложения я получаю следующую ошибку

Ошибка: 2 НЕИЗВЕСТНО: доступ запрещен: создатель канала [] org [Org1MSP]

Docker Журналы для Peer 3 говорят следующее:

2020-01-24 19: 46: 47.774 UT C [protoutils] ValidateProposalMessage -> WARN 039 канал [] : Ошибка MSP: ожидаемый идентификатор MSP Org3MSP, получено Org1MSP

2020-01-24 19: 46: 47.774 UT C [comm.grp c .server] 1 -> INFO 03a унарный вызов завершен, grp c .service = protos.Endorser grp c .method = ProcessProposal grp c .peer_address = 192.168.240.1: 49860 error = "доступ запрещен: создатель канала [] org [Org1MSP]" grp c .code = Неизвестный grp c .call_duration = 329,567 мкс

Я знаю, что эта ошибка связана с тем, что MSP ID, отправляемый с запросом Channel.joinChannel, - это Org1MSP, но я не уверен, почему. Я отправляю одноранговый узел, созданный с помощью клиента Org3, и идентификатор транзакции также является идентификатором транзакции администратора Org3.

Вот мой код:

public async addPeerToChannel(orgJSON) {
        try {
            let json = JSON.parse(JSON.stringify(orgJSON));

            if (json.name === undefined || json.msp === undefined || json.domain === undefined || json.peer === undefined
                ||
                json.peerport === undefined || json.channel === undefined || json.peerurl === undefined) {
                throw new Error("Invalid org info provided to addPeerToChannel method");
            }

            let client = this.loanGateway.getClient(); // get the client reference for Org1 ccp
            let cMSP = client.getMspid(); // confirms MSP ID is Org1MSP
            let network = await this.loanGateway.getNetwork(json.channel); // mychannel
            let channel = network.getChannel();

            if (client === undefined || network === undefined || channel === undefined) {
                throw new Error(`Invalid network, orderer, channel or client handle in function addPeerToChannel. Error.`);
            }

            let data = fs.readFileSync(SyndLoanConfig.chainconfig.networkpath + `/crypto-config/peerOrganizations/${json.domain}/peers/${json.peer}/tls/ca.crt`).toString();

            // load a new client for Org3
            const gateway = new Gateway();
            const wallet = this.localWallet;
            const ccpFile = fs.readFileSync(path.join(SyndLoanConfig.chainconfig.networkpath,'connection-org3_ac.json'));
            const ccp = JSON.parse(ccpFile.toString());
            await this.importWalletIdentityFromCryptoConfig('Admin@org3.example.com','Org3MSP');
            await gateway.connect(ccp, {
                identity: 'Admin@org3.example.com',
                wallet: wallet
            });

            let newClient = gateway.getClient();

            let peer = newClient.newPeer(json.peerurl,
                {
                    'pem': Buffer.from(data).toString(),
                    'ssl-target-name-override': json.peer,
                    'name': json.peer,
                    'grpc.keepalive_timeout_ms': 10000

                })

            if (peer === undefined) {
                throw new Error(`Could not create the peer for URL ${json.peerurl}. Error.`)
            }

            channel.addPeer(peer, json.msp);

            let request = {
                txId: client.newTransactionID() //the generated transaction id
            };

            let gBlock = await channel.getGenesisBlock(request);


          //  for(let p of ccp.peers)
          //  {
          //      ccp.peers[p].tlsCACerts.path = path.join(SyndLoanConfig.chainconfig.networkpath,ccp.peers[p].tlsCACerts.path);
          //  }

          //  let newNetwork = await gateway.getNetwork("mychannel");
          //  let newChannel = newNetwork.getChannel();

            let channel_request = {
                targets: [peer],
                block: gBlock,
                txId: newClient.newTransactionID(true)
            }


            let proposal_response = {};
            proposal_response = await channel.joinChannel(channel_request);

            if (proposal_response[0].code !== 200) 
            {
                    throw new Error(`Could not make the peer ${json.peer} join channel ${json.channel}. Error: ${proposal_response[0].message}`);

            }
        }
        catch (err) {
            throw new Error(err.message);
        }
    }

Я уверен, что что-то упустил, но Я не могу выяснить, что и почему отправляется запрос joinChannel с MSP, установленным в Org1MSP (кстати, где этот набор?)

Ценю любые советы о том, как поступить. Спасибо.

1 Ответ

0 голосов
/ 25 января 2020

Наконец-то удалось найти пример кода для Channel.joinChannel.

Для тех, кому интересно, эти примеры от ksachdeva чрезвычайно полезны.

По сути, то, что я делал неправильно, использовал объект канала, связанный с контекстом клиента Org1MSP, и использовал его для отправки вызова Channel.joinChannel.

Итак, исправление было следующим (в широком смысле)

Предполагая, что Org уже добавлен в канал,

  1. Создайте новый экземпляр клиента, используя общий профиль подключения нового Org, или вы можете создать новый экземпляр клиента с нуля, используя этот пример кода by ksachdeva.
  2. Создайте новый экземпляр канала, используя Client.newChannel("mychannel") или любой канал, к которому вы присоединяетесь.
  3. Создайте новый Orderer экземпляр, используя вызов Client.newOrderer, который служит Orderer для канала, к которому вы присоединяетесь. В терминологии byfn.sh это grpcs://localhost:7050 aka orderer.example.com.
  4. Создайте новый экземпляр Peer, используя информацию об одноранговой сети для партнера, которого вы добавляете в канал.
  5. Добавьте заказчика из шага 3 выше к объекту канала, созданному в шаге 2, используя Channel.addOrderer(orderer) API.
  6. Затем можно выполнить остальные шаги из учебника на сайте Fabri c Node SDK, т.е. получить блок genesis, создать запрос на присоединение к одноранговому узлу. и отправьте Channel.joinChannel(request).

Пожалуйста, просмотрите пример кода ksachdeva (ссылка предоставлена ​​ранее в этом ответе) для полного примера сквозного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...