Дорабатываю добавление блоков!
This commit is contained in:
AidarKC
2025-12-23 15:48:23 +03:00
parent d949895fec
commit 62e4338e88
6 changed files with 333 additions and 217 deletions
@@ -1,106 +1,106 @@
package blockchain;
import blockchain.body.BodyRecord;
import blockchain.body.HeaderBody;
import blockchain.body.TextBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ============================================================================
* BodyRecordParser — универсальный парсер тел (body) блоков .bch
* ============================================================================
*.
* 🧩 Назначение:
* Преобразует пару (recordType, recordTypeVersion, bodyBytes)
* в конкретный объект, реализующий интерфейс {@link BodyRecord}.
*.
* 🔹 Особенность:
* Используется объединённый 4-байтовый код:
*.
* fullCode = (recordType << 16) | (recordTypeVersion & 0xFFFF)
*.
* Это позволяет различать версии одного типа блока,
* например: TextBody v1, TextBody v2 и т.д.
*.
* 🔹 Пример:
* BodyRecord body = BodyRecordParser.parse(block.recordType, block.recordTypeVersion, block.body);
*.
* ============================================================================
*/
public final class BodyRecordParser {
private static final Logger log = LoggerFactory.getLogger(BodyRecordParser.class);
private BodyRecordParser() {}
/**
* Распарсить тело блока по типу и версии записи.
*
* @param recordType код типа записи (0 = Header, 1 = Text, ...)
* @param recordTypeVersion версия формата записи
* @param body массив байт тела записи
* @return объект, реализующий BodyRecord
*/
public static BodyRecord parse(short recordType, short recordTypeVersion, byte[] body) {
if (body == null)
throw new IllegalArgumentException("body == null");
// Объединяем тип и версию в 4-байтовый ключ
int fullCode = ((recordType & 0xFFFF) << 16) | (recordTypeVersion & 0xFFFF);
switch (fullCode) {
// ---------------------------------------------------------
// TYPE 0, VERSION 1 — HeaderBody v1
// ---------------------------------------------------------
// Заголовок цепочки пользователя (первый блок).
//
// Формат body (без общих 20 байт заголовка блока):
// [8] ASCII tag = "SHiNE001"
// [8] blockchainId (long, BE)
// [4] blockchainType (int, BE)
// [4] blockchainNumber (int, BE)
// [1] userLoginLength = N (unsigned byte)
// [N] userLogin (UTF-8)
// [2] versionUserBch (short, BE)
// [8] prevUserBchId (long, BE)
// [32] publicKey32
//
// Назначение:
// Создаёт новую пользовательскую цепочку (блок №0).
case (0x0000_0001):
return new HeaderBody(body);
// ---------------------------------------------------------
// TYPE 1, VERSION 1 — TextBody v1
// ---------------------------------------------------------
// Простое текстовое сообщение UTF-8.
//
// Формат body (без общих 20 байт заголовка блока):
// [N] message (UTF-8)
//
// Назначение:
// Текстовые и системные сообщения, описания, комментарии.
case (0x0001_0001):
return new TextBody(body);
// ---------------------------------------------------------
// РЕЗЕРВ — будущие типы и версии
// ---------------------------------------------------------
// Пример: (0x0001_0002) → TextBody v2 (например, JSON-структура)
// (0x0002_0001) → FileBody v1
//
// case (0x0001_0002):
// return new TextBodyV2(body);
//
// case (0x0002_0001):
// return new FileBody(body);
default:
throw new IllegalArgumentException(String.format(
"Неизвестный тип блока: type=%d version=%d (fullCode=0x%08X)",
recordType, recordTypeVersion, fullCode));
}
}
}
//package blockchain;
//
//import blockchain.body.BodyRecord;
//import blockchain.body.HeaderBody;
//import blockchain.body.TextBody;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
///**
// * ============================================================================
// * BodyRecordParser — универсальный парсер тел (body) блоков .bch
// * ============================================================================
// *.
// * 🧩 Назначение:
// * Преобразует пару (recordType, recordTypeVersion, bodyBytes)
// * в конкретный объект, реализующий интерфейс {@link BodyRecord}.
// *.
// * 🔹 Особенность:
// * Используется объединённый 4-байтовый код:
// *.
// * fullCode = (recordType << 16) | (recordTypeVersion & 0xFFFF)
// *.
// * Это позволяет различать версии одного типа блока,
// * например: TextBody v1, TextBody v2 и т.д.
// *.
// * 🔹 Пример:
// * BodyRecord body = BodyRecordParser.parse(block.recordType, block.recordTypeVersion, block.body);
// *.
// * ============================================================================
// */
//public final class BodyRecordParser {
//
// private static final Logger log = LoggerFactory.getLogger(BodyRecordParser.class);
//
// private BodyRecordParser() {}
//
// /**
// * Распарсить тело блока по типу и версии записи.
// *
// * @param recordType код типа записи (0 = Header, 1 = Text, ...)
// * @param recordTypeVersion версия формата записи
// * @param body массив байт тела записи
// * @return объект, реализующий BodyRecord
// */
// public static BodyRecord parse(short recordType, short recordTypeVersion, byte[] body) {
// if (body == null)
// throw new IllegalArgumentException("body == null");
//
// // Объединяем тип и версию в 4-байтовый ключ
// int fullCode = ((recordType & 0xFFFF) << 16) | (recordTypeVersion & 0xFFFF);
//
// switch (fullCode) {
//
// // ---------------------------------------------------------
// // TYPE 0, VERSION 1 — HeaderBody v1
// // ---------------------------------------------------------
// // Заголовок цепочки пользователя (первый блок).
// //
// // Формат body (без общих 20 байт заголовка блока):
// // [8] ASCII tag = "SHiNE001"
// // [8] blockchainId (long, BE)
// // [4] blockchainType (int, BE)
// // [4] blockchainNumber (int, BE)
// // [1] userLoginLength = N (unsigned byte)
// // [N] userLogin (UTF-8)
// // [2] versionUserBch (short, BE)
// // [8] prevUserBchId (long, BE)
// // [32] publicKey32
// //
// // Назначение:
// // Создаёт новую пользовательскую цепочку (блок №0).
// case (0x0000_0001):
// return new HeaderBody(body);
//
// // ---------------------------------------------------------
// // TYPE 1, VERSION 1 — TextBody v1
// // ---------------------------------------------------------
// // Простое текстовое сообщение UTF-8.
// //
// // Формат body (без общих 20 байт заголовка блока):
// // [N] message (UTF-8)
// //
// // Назначение:
// // Текстовые и системные сообщения, описания, комментарии.
// case (0x0001_0001):
// return new TextBody(body);
//
// // ---------------------------------------------------------
// // РЕЗЕРВ — будущие типы и версии
// // ---------------------------------------------------------
// // Пример: (0x0001_0002) → TextBody v2 (например, JSON-структура)
// // (0x0002_0001) → FileBody v1
// //
// // case (0x0001_0002):
// // return new TextBodyV2(body);
// //
// // case (0x0002_0001):
// // return new FileBody(body);
//
// default:
// throw new IllegalArgumentException(String.format(
// "Неизвестный тип блока: type=%d version=%d (fullCode=0x%08X)",
// recordType, recordTypeVersion, fullCode));
// }
// }
//}
@@ -1,5 +1,7 @@
package blockchain_new;
import utils.crypto.Ed25519Util;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
@@ -39,9 +41,9 @@ public final class BchCryptoVerifier_new {
ByteBuffer bb = ByteBuffer.allocate(
DOMAIN.length +
1 + loginBytes.length +
32 + 32 +
rawBytes.length
1 + loginBytes.length +
32 + 32 +
rawBytes.length
).order(ByteOrder.BIG_ENDIAN);
bb.put(DOMAIN);
@@ -63,11 +65,23 @@ public final class BchCryptoVerifier_new {
}
}
// TODO: сюда подключается твой Ed25519 util
/**
* Проверка подписи Ed25519:
* verify(hash32, signature64, publicKey32)
*/
public static boolean verifySignature(byte[] hash32,
byte[] signature64,
byte[] publicKey32) {
// TODO: Ed25519.verify(hash32, signature64, publicKey32)
return true;
Objects.requireNonNull(hash32, "hash32 == null");
Objects.requireNonNull(signature64, "signature64 == null");
Objects.requireNonNull(publicKey32, "publicKey32 == null");
if (hash32.length != 32) throw new IllegalArgumentException("hash32 != 32");
if (signature64.length != 64) throw new IllegalArgumentException("signature64 != 64");
if (publicKey32.length != 32) throw new IllegalArgumentException("publicKey32 != 32");
// ⚠️ Подстрой под твой Ed25519Util:
// Идея ровно такая: verify(messageHash, signature, publicKey)
return Ed25519Util.verify(hash32, signature64, publicKey32);
}
}