SHA256
23 12 25
Дорабатываю добавление блоков!
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user