#hyperledger-fabric #hyperledger-fabric-sdk-js
#hyperledger-fabric #hyperledger-fabric-sdk-js
Вопрос:
В процессе обновления конфигурации канала есть 03 основных этапа:
- (1) Получите последнюю конфигурацию от заказчика.
- (2) Измените конфигурацию.
- (3) Подпишите и отправьте транзакцию заказчику для обновления конфигурации канала.
Я получил ошибку на шаге (3) при попытке вызвать updateChannel()
функцию, которая:
{ статус: ‘BAD_REQUEST’,
информация: ‘ошибка авторизации обновления: ошибка проверки DeltaSet: политика для [Value] / Channel / Orderer / BatchSize не выполнена: не удалось достичь неявного порога в 1 вложенную политику, требуется 1 оставшаяся’ }
Я следовал коду из hyperledger-sdk-node repo об обновлении канала здесь
Политика заказчика сети выглядит следующим образом (я не уверен в проблеме, с которой я столкнулся здесь)
# Policies defines the set of policies at this level of the config tree
# For Orderer policies, their canonical path is
# /Channel/Orderer/<PolicyName>
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
# BlockValidation specifies what signatures must be included in the block
# from the orderer for the peer to validate it.
BlockValidation:
Type: ImplicitMeta
Rule: "ANY Writers"
Подробнее о соответствующем коде:
let signatures = [];
signatures.push(client.signChannelConfig(config_proto));
let request = {
name: channelName,
// orderer: channel.getOrderer("orderer.example.com"), // Do I really need this?
config: config_proto, // response from requesting configtxlator/compute
txId: client.newTransactionID(),
signatures: signatures
};
try {
let result = await client.updateChannel(request); // ERROR HERE
console.log("result", result);
} catch (error) {
console.log(error);
}
Если вам нужна дополнительная информация, просто скажите мне! Любые идеи должны быть полезны
Ответ №1:
Я нашел способ заставить эту штуку работать!
В моем случае я хочу изменить BatchSize
свойство конфигурации заказчика, для которого требуются подписи большинства администраторов организаций-заказчиков (более подробно).
После завершения модификации мне нужно подписать запрос администратором заказчика.
Следующий код включает:
(1) Получить key
и certificate
администратора заказчика:
const keyPath = path.join(__dirname, '../../fabric/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore');
const keyPEM = Buffer.from(readAllFiles(keyPath)[0]).toString();
const certPath = path.join(__dirname, '../../fabric/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts');
const certPEM = readAllFiles(certPath)[0];
(2) Присвоить идентификатор подписи client
:
client.setAdminSigningIdentity(keyPEM.toString(), certPEM.toString(), "OrdererMSP");
Теперь он готов к подписанию и отправке заказчику!
let signatures = [];
signatures.push(client.signChannelConfig(config_proto));
let request = {
name: channelName,
config: config_proto, // response from requesting configtxlator/compute
txId: client.newTransactionID(),
signatures: signatures
};
try {
let result = await client.updateChannel(request);
console.log("result", result);
} catch (error) {
console.log(error);
}
Функция readAllFiles:
function readAllFiles(dir) {
const files = fs.readdirSync(dir);
const certs = [];
files.forEach((file_name) => {
const file_path = path.join(dir, file_name);
logger.debug(' looking at file ::' file_path);
const data = fs.readFileSync(file_path);
certs.push(data);
});
return certs;
}