From 015caec01cc4757f5b67d3efd7f7d6eee687d3018bc50a4e34fba825adfa5fc3 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Mon, 29 Dec 2025 13:53:22 +0300 Subject: [PATCH] =?UTF-8?q?29=2012=2025=20=D0=A3=D1=80=D0=B0=20=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=88=D0=BB=D0=B8!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blockchain/Net_AddBlock_Handler.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java index a1b8a0f..45e9153 100644 --- a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java +++ b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java @@ -265,7 +265,10 @@ public final class Net_AddBlock_Handler implements JsonMessageHandler { prevLineHash32 = new byte[32]; prevLineHashHex = ""; } else { - prevLineHashHex = nn(st.getLastLineHash(li)); + // ✅ ВАЖНОЕ ИСПРАВЛЕНИЕ: + // Если это первая запись в линии (lastLineNumber==0), + // то prevLineHash должен быть hash(genesis), а не пустота. + prevLineHashHex = computePrevLineHashHex(st, li); prevLineHash32 = hexTo32(prevLineHashHex); } } catch (Exception e) { @@ -316,6 +319,35 @@ public final class Net_AddBlock_Handler implements JsonMessageHandler { return new AddBlockResult(WireCodes.Status.OK, null, globalNumber, newHashHex); } + /** + * ✅ Правило: + * - lineIndex=0 (genesis линия): prevLineHash = 32 нулей (пустая строка => hexTo32 даст 32 нуля) + * - lineIndex>0: + * - если в этой линии ещё нет блоков (lastLineNumber==0) => prevLineHash = hash(genesis) (line0 hash) + * - иначе => prevLineHash = lastLineHash(lineIndex) + */ + private static String computePrevLineHashHex(BlockchainStateEntry st, int lineIndex) { + if (lineIndex == 0) { + return ""; // -> 32 нуля + } + + int lastLn = st.getLastLineNumber(lineIndex); + if (lastLn == 0) { + // первая запись линии -> от genesis + String genesis = nn(st.getLastLineHash(0)); + if (!genesis.isBlank()) return genesis; + + // fallback: если line0 почему-то не заполнена, но genesis глобально есть + String g = nn(st.getLastGlobalHash()); + if (!g.isBlank()) return g; + + // в крайнем случае вернём пустоту -> 32 нуля (лучше чем NPE), но это уже будет симптомом проблем state + return ""; + } + + return nn(st.getLastLineHash(lineIndex)); + } + private static final class AddBlockResult { final int httpStatus; final String reasonCode;