Перейти к основному содержимому

@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 здесь делает одну попытку — логика повторов живёт уровнем выше, в транспорте, и это правильное разделение ответственности.