@hlf-core/chaincode
Это высокоуровневая, ORM-подобная библиотека для разработки chaincode. Она берёт на себя работу с key-value хранилищем Fabric и даёт вместо неё привычные понятия — сущности, связи parent-child, пагинацию, автоматическую сериализацию и валидацию. Проще говоря, мы перестаём думать ключами и начинаем думать объектами.
В основе лежит IStub — абстракция над ChaincodeStub из fabric-shim. Через неё идут чтение
и запись, диапазонные запросы, пагинация, и через неё же доступны user, requestId и
transaction. Поверх IStub стоит DatabaseManager — базовый менеджер key-value, а над ним
EntityManager<T> и его реализация EntityManagerImpl<T> с CRUD по сущностям. В типичном случае
нам достаточно реализовать два метода: toEntity(item), который восстанавливает сущность из
сырых данных, и prefix, задающий пространство ключей.
Связи между сущностями описывают EntityRelation и EntityRelationChild<T, M>. Устроены они
так, что на каждую связь пишется два ключа — прямой и обратный, и это не избыточность, а
необходимость: прямой ключ позволяет выбрать детей по родителю, обратный — снять связь, зная
только ребёнка. Каскадное удаление работает на той же паре.
class UserManager extends EntityManagerImpl<User> {
public toEntity(item: any): User {
return TransformUtil.toClass(User, item);
}
public get prefix(): string {
return 'user:';
}
}
await userManager.save(user);
const page = await userManager.findPaginated({pageSize: 20, pageBookmark: bm});
Ключи, на которых всё это держится, строит StateKey из
@hlf-core/common, а приём самих команд в chaincode обеспечивает
@hlf-core/transport-chaincode.