Я пытался следовать приведенным здесь инструкциям, чтобы создать новый канал (на основе существующего канала) и подключить существующий узел к этому каналу.https://fabric -sdk-node.github.io / tutorial-channel-create.html
Ошибка, с которой я сталкиваюсь, newChannel.joinChannel(j_request)
.Возникает [JoinChain][composerchannel2]: [Failed verifying that proposal's creator satisfies local MSP principal during channelless check policy with policy [Admins]: [This identity is not an admin]]
Но я не знаю, как убедиться, что текущий пользователь является администратором.
Моя сеть основана на базовой сети в каталоге примеров фабрики.Я регистрирую администратора, используя скрипт из примера fabcar.Увидеть ниже.Затем я пытаюсь убедиться, что пользователь с правами администратора является текущим пользователем, отправляющим запрос на присоединение к каналу следующим образом:
const setAdminAsUser = async () => {
try {
const admin = await fabric_client.getUserContext('admin', true)
return fabric_client.setUserContext(admin, true)
} catch(error) {
console.log('Error setting admin as user', error)
}
}
Тогда моя функция приглашения пиров на канал выглядит следующим образом (хотятолько одна организация и одноранговый узел):
const invitePeerToChannel = async () => {
console.log('invite peer to channel')
var newChannel = fabric_client.newChannel('composerchannel2');
var orderer = fabric_client.newOrderer('grpc://localhost:7050');
var peer = fabric_client.newPeer('grpc://localhost:7051');
newChannel.addOrderer(orderer);
newChannel.addPeer(peer);
tx_id = fabric_client.newTransactionID(true);
let g_request = {
txId: tx_id
};
// get the genesis block from the orderer
newChannel.getGenesisBlock(g_request).then((block) =>{
genesis_block = block;
tx_id = fabric_client.newTransactionID(true);
let j_request = {
targets: ['localhost:7051'],
block: genesis_block,
txId: tx_id
};
console.log(JSON.stringify(j_request))
// send genesis block to the peer
return newChannel.joinChannel(j_request);
}).then((results) =>{
if(results && results.response && results.response.status == 200) {
console.log('Joined correctly')
} else {
console.log('Failed', results)
}
});
}
Функция регистрации администратора на основе примера fabcar:
const enrollAdmin = () => {
// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
return Fabric_Client.newDefaultKeyValueStore({ path: store_path}).then((state_store) => {
// assign the store to the fabric client
fabric_client.setStateStore(state_store);
var crypto_suite = Fabric_Client.newCryptoSuite();
// use the same location for the state store (where the users' certificate are kept)
// and the crypto store (where the users' keys are kept)
var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
crypto_suite.setCryptoKeyStore(crypto_store);
fabric_client.setCryptoSuite(crypto_suite);
var tlsOptions = {
trustedRoots: [],
verify: false
};
// be sure to change the http to https when the CA is running TLS enabled
fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', tlsOptions , 'ca.org1.example.com', crypto_suite);
// first check to see if the admin is already enrolled
return fabric_client.getUserContext('admin', true);
}).then((user_from_store) => {
if (user_from_store && user_from_store.isEnrolled()) {
console.log('Successfully loaded admin from persistence');
admin_user = user_from_store;
return null;
} else {
// need to enroll it with CA server
return fabric_ca_client.enroll({
enrollmentID: 'admin',
enrollmentSecret: 'adminpw'
}).then((enrollment) => {
console.log('Successfully enrolled admin user "admin"');
return fabric_client.createUser(
{username: 'admin',
mspid: 'Org1MSP',
cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
});
}).then((user) => {
admin_user = user;
return fabric_client.setUserContext(admin_user);
}).catch((err) => {
console.error('Failed to enroll and persist admin. Error: ' + err.stack ? err.stack : err);
throw new Error('Failed to enroll admin');
});
}
}).then(() => {
console.log('Assigned the admin user to the fabric client ::' + admin_user.toString());
}).catch((err) => {
console.error('Failed to enroll admin: ' + err);
});
}
Удар кирпичной стены учебными документами, поэтому любая помощь будетбудьте великолепны!
РЕДАКТИРОВАТЬ:
Вот как я сейчас генерирую обновление конфигурации, а затем подписываю его.Это основано на руководстве по SDK.
// This takes a config file that includes the organisations that will be added to the channel
const encodeChannelConfig = () => {
return new Promise((resolve, reject) => {
console.log('encoding channel config')
var config_json = fs.readFileSync("./newChannel.json");
config_json = JSON.stringify(JSON.parse(config_json))
superagent.post('http://127.0.0.1:7059/protolator/encode/common.ConfigUpdate',
config_json)
.buffer()
.end((err, res) => {
if(err) {
return;
}
resolve(res.body);
});
})
}
const signChannelConfig = (encodedChannelConfig) => {
return new Promise((resolve, reject) => {
console.log('signing channel config')
var signature = fabric_client.signChannelConfig(encodedChannelConfig);
signatures.push(signature);
resolve(signatures);
})
}