Hyperledger Fabri c - обновить конфигурацию канала, добавив новую организацию - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь добавить новую Org в существующую сеть Hyperledger fabri c.

Начальная сеть создается сценарием byfn. sh, который поддерживает Orderer и Org1 & Org2.

Я следовал этому примеру на Medium.com, чтобы создать файл protobuf для обновления. Все, что требует configtxgen, cryptogen и configtxlator, выполняется в соответствии с этим примером. Однако, когда дело доходит до выполнения команды peer channel signconfigtx -f org3_update_in_envelope.pb, я хотел бы сделать это, используя Fabri c Node SDK.

Здесь следует отметить, что если я выполню команды peer channel ... из В командной строке контейнера cli происходит обновление канала, поэтому я знаю, что файл org3_update_in_envelope.pb не поврежден.

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

 let envelope_pb_file_name = '/tmp/' + json.msp + '_update_in_envelope.pb'; // the pb file we create using command line
        let envelope_bytes = fs.readFileSync(envelope_pb_file_name);

        if (envelope_bytes === undefined) {
            throw new Error(`Could not read the protobuffer file ${envelope_pb_file_name}. Error`);
        }
        // have the nodeSDK extract out the config update
        let config_update = client.extractChannelConfig(envelope_bytes);
        let signature = client.signChannelConfig(config_update);
        let signatures = [];
        signatures.push(signature);
        //let orderers = this.loanNetwork.getChannel().getOrderers();
        let orderer, ordererName = "orderer.example.com:7050";
        const ORDERER_URL = 'grpcs://localhost:7050';
        const data = fs.readFileSync(SyndLoanConfig.chainconfig.networkpath + '/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem').toString();

            orderer = client.newOrderer(ORDERER_URL,
            {
                'pem': Buffer.from(data).toString(),
                'ssl-target-name-override': 'orderer.example.com'
            });

        let mspId = client.getMspid(); // mspId shows "OrdererMSP" after this call is executed

        const keyPath = SyndLoanConfig.chainconfig.networkpath + '/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore';
        let keyFile, keyFileAry = fs.readdirSync(keyPath).filter(fn => fn.endsWith('_sk'));

        for (let f of keyFileAry) {
            keyFile = f;
            break;

        }

        keyFile = path.join(keyPath,keyFile);
        const keyPEM = fs.readFileSync(keyFile).toString();

        const certPath = SyndLoanConfig.chainconfig.networkpath + '/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts';
        let certFile, certFileAry = fs.readdirSync(certPath).filter(fn => fn.endsWith('.pem'));

        for (let f of certFileAry) {
            certFile = f;
            break;

        }
        certFile = path.join(certPath,certFile);
        const certPEM = fs.readFileSync(certFile).toString();

        client.setAdminSigningIdentity(keyPEM, certPEM, "OrdererMSP");

        if (orderer === undefined) {
            throw new Error(`Could not find an orderer associated with channel ${orgJSON.channel}. Error.`)
        }

        let tx_id = client.newTransactionID();
        let request = {
            config: config_update, //the binary config
            // envelope: envelope_bytes,
            signatures: signatures, // the collected signatures
            name: orgJSON.channel, // the channel name
            orderer: orderer, //the orderer from above
            txId: tx_id //the generated transaction id
        };

        let addOrgResult = await client.updateChannel(request);

Переменная addOrgResult показывает следующую ошибку:

info: implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 1 of the 'Writers' sub-policies to be satisfied: permission denied     
status: FORBIDDEN

Журналы заказов показывают это:

2020-01-17 21:49:21.620 UTC [cauthdsl] deduplicate -> ERRO 057 Principal deserialization failure (MSP  is unknown) for identity 0
 2020-01-17 21:49:21.621 UTC [cauthdsl] deduplicate -> ERRO 058 Principal deserialization failure (MSP  is unknown) for identity 0
 2020-01-17 21:49:21.621 UTC [cauthdsl] deduplicate -> ERRO 059 Principal deserialization failure (MSP  is unknown) for identity 0
 2020-01-17 21:49:21.621 UTC [orderer.common.broadcast] ProcessMessage -> WARN 05a [channel: mychannel] Rejecting broadcast of config message from 192.168.208.1:56556 because of error: implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 1 of the 'Writers' sub-policies to be satisfied: permission denied

Проходя Полезный ответ Нихила Гупты на этот вопрос , похоже, что эта ошибка связана с

Ошибка перед предупреждением политики, ERRO 021 Ошибка основной десериализации (MSP SampleOrg неизвестен) для идентификатор 0 указывает, что идентификатор MSP, который был передан в качестве параметра с запросом, не был распознан службой заказа. Это может быть результатом передачи неверного идентификатора MSP в команду. Эта ошибка также может указывать на то, что ваша организация не присоединилась к консорциуму, размещенному на канале системы заказов. Если вы обновляете канал приложения, эта ошибка может возникнуть, если ваша организация еще не является участником канала, который вы пытаетесь обновить.

Однако я не уверен, как действовать, потому что у меня есть подключен к сети (Gateway.connect) с помощью Admin@example.com identity. Кроме того, я также звоню client.setAdminSigningIdentity(keyPEM, certPEM, "OrdererMSP"); перед обновлением.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 20 января 2020

Политика обновления канала по умолчанию требует большинства, что в вашем случае означает, что вам потребуются подписи как от администратора Org1, так и от администратора Org2, и тогда либо Org1, либо Org2 могут отправить фактическое обновление конфигурации заказчику.

Это означает, что вам нужно запустить

let config_update = client.extractChannelConfig(envelope_bytes);
let signature = client.signChannelConfig(config_update);
let signatures = [];
signatures.push(signature);

как администратор Org1 и администратор Org2.

Затем вы можете отправить транзакцию заказчику в качестве администратора Org1 или Администратор Org2 (но не администратор Orderer).

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