@hlf-core/api
@hlf-core/api — это самый нижний уровень работы с сетью. Он занимается ровно двумя вещами:
устанавливает соединение с Fabric через fabric-network и превращает сырые данные сети в
пригодные для работы. Про команды и протокол транспорта он ничего не знает — это уже
ответственность пакета @hlf-core/transport, который стоит прямо над ним.
Главный класс — FabricApiClient. Его connect() собирает по настройкам всю цепочку: кошелёк,
шлюз, сеть, канал, контракт, и после этого даёт доступ к network, channel, contract,
gateway и qsccContract. Кошелёк при этом создаётся в памяти — ключи на диск не пишутся, и это
сознательное решение. Отдельно стоит статический parseBlock(block): он дописывает блоку hash,
number и date, приводя сырой блок к удобному виду.
Настройки подключения описывает IFabricConnectionSettings — имя канала и chaincode, профиль
подключения, service discovery, идентичность (MSP, приватный ключ, сертификат) и, при необходимости,
отдельная TLS-идентичность.
Отдельного внимания заслуживает FabricContractQSCC, доступный как api.qsccContract — это обёртка
над системным контрактом Fabric. Через него читается высота и содержимое ledger: getInfo(),
getBlockNumber(), getBlock(n), getBlockByTransactionId(id), getTransaction(id). Здесь есть
одна тонкость, на которой легко обжечься: getBlockNumber() возвращает высоту ledger, а не номер
последнего блока — это не одно и то же, и путать их не стоит.
const api = new FabricApiClient(logger, {
fabricNetworkName: 'mychannel',
fabricChaincodeName: 'mychaincode',
// ...идентичность и профиль подключения
});
await api.connect();
const result = await api.contract.evaluateTransaction('myFunction', 'arg');
const block = await api.qsccContract.getBlock(42); // block.number, block.hash, block.date
К слову о надёжности: reconnect здесь делает одну попытку — логика повторов живёт уровнем выше,
в транспорте, и это правильное разделение ответственности.