From 98d478531b5085e01e689b0405e0a8fb84b5c35b054b1ad0c35795a85c7b0e06 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Thu, 22 Jan 2026 02:09:28 +0300 Subject: [PATCH] 22 01 25 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit добавил комент Да вроде всё работает и тесты проходят. И блоки добавляются все что надо для MVP --- .../java/blockchain/body/ConnectionBody.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/shine-server-blockchain/src/main/java/blockchain/body/ConnectionBody.java b/shine-server-blockchain/src/main/java/blockchain/body/ConnectionBody.java index 0cb5ff7..054af7f 100644 --- a/shine-server-blockchain/src/main/java/blockchain/body/ConnectionBody.java +++ b/shine-server-blockchain/src/main/java/blockchain/body/ConnectionBody.java @@ -31,6 +31,44 @@ import java.util.Objects; * toLogin вычисляется автоматически из toBlockchainName: * toLogin = BlockchainNameUtil.loginFromBlockchainName(toBlockchainName) */ + +/** + * ========================================================================= + * ПРАВИЛО TARGET/ROOT ДЛЯ КАНАЛОВ И СВЯЗЕЙ (важно для подписок/друзей/контактов) + * ========================================================================= + * + * Термины: + * - ROOT линии/канала = блок, который "начинает" линию: + * * для канала "0" root = HEADER (blockNumber=0) + * * для канала "X" root = CREATE_CHANNEL (blockNumber этого блока) + * + * 1) СВЯЗИ МЕЖДУ ПОЛЬЗОВАТЕЛЯМИ (CONNECTION_*): + * FRIEND / CONTACT -> цель ВСЕГДА HEADER пользователя: + * toBlockNumber = 0 + * toBlockHash32 = hash32(HEADER цели) + * + * 2) ПОДПИСКИ НА КОНТЕНТ (FOLLOW/SUBSCRIBE): + * FOLLOW пользователя (в целом) -> цель = ROOT дефолтного канала "0" (то есть HEADER): + * toBlockNumber = 0 + * toBlockHash32 = hash32(HEADER цели) + * + * FOLLOW/подписка на конкретный канал пользователя -> + * цель = ROOT этого канала: + * - канал "0": toBlockNumber=0, toBlockHash32=hash32(HEADER) + * - канал "X": toBlockNumber=blockNumber(CREATE_CHANNEL), + * toBlockHash32=hash32(CREATE_CHANNEL) + * + * 3) ЗАПРЕТЫ ВАЛИДАЦИИ (желательно на сервере/в БД): + * - CONNECTION_FRIEND/CONTACT не могут ссылаться на не-HEADER (toBlockNumber != 0 запрещено). + * - FOLLOW на канал "X" не может ссылаться на произвольный пост внутри канала: + * разрешено ТОЛЬКО на ROOT (HEADER или CREATE_CHANNEL). + * + * Зачем так: + * - связи и подписки всегда стабильны и не ломаются при новых постах, + * - один понятный инвариант: "подписка всегда указывает на root линии". + * ========================================================================= + */ + public final class ConnectionBody implements BodyRecord, BodyHasTarget, BodyHasLine { public static final short TYPE = 3;