Исправил что бы в интерфейсе BodyHasTarget не требывалось хранить в блоках  BodyHasTarget
и в блоках коннекстин не зранилась поле тоЛогин в байты блока.

(Все тесты тесты проходят)
This commit is contained in:
AidarKC 2026-01-15 15:13:29 +03:00
parent d9fe1f02b8
commit bbca821dcd
5 changed files with 21 additions and 41 deletions

View File

@ -3,18 +3,17 @@ package blockchain.body;
import utils.blockchain.BlockchainNameUtil;
/**
* BodyHasTarget контракт для body, которые "ссылаются" на цель (to-поля).
* BodyHasTarget дополнительный интерфейс для body, которые "ссылаются" на цель (to-поля).
*
* ВАЖНО (новое правило):
* Новое правило:
* - toLogin НЕ храним в байтах блока.
* - toLogin всегда вычисляем из toBchName по стандарту:
* toBchName = login + "-NNN" => toLogin = login
* - toLogin всегда вычисляется из toBchName по стандарту login+"-NNN".
*
* Все методы могут возвращать null (если target отсутствует).
* Все методы могут возвращать null.
*/
public interface BodyHasTarget {
/** login цели (nullable). */
/** login цели (nullable). Вычисляется из toBchName(). */
default String toLogin() {
String bch = toBchName();
if (bch == null) return null;
@ -28,5 +27,5 @@ public interface BodyHasTarget {
Integer toBlockGlobalNumber();
/** hash целевого блока (обычно 32 байта). Может быть null, если ссылки нет. */
byte[] toBlockHasheBytes();
byte[] toBlockHashBytes();
}

View File

@ -204,8 +204,7 @@ public final class ConnectionBody implements BodyRecord, BodyHasTarget, BodyHasL
/* ====================== BodyHasTarget ===================== */
// toLogin() теперь default в интерфейсе и вычисляется из toBchName()
@Override public String toBchName() { return toBlockchainName; }
@Override public Integer toBlockGlobalNumber() { return toBlockGlobalNumber; }
@Override public byte[] toBlockHasheBytes() { return toBlockHash32; }
@Override public byte[] toBlockHashBytes() { return toBlockHash32; }
}

View File

@ -120,11 +120,7 @@ public final class ReactionBody implements BodyRecord, BodyHasTarget {
/* ====================== BodyHasTarget ====================== */
@Override public String toLogin() { return null; }
@Override public String toBchName() { return toBlockchainName; }
@Override public Integer toBlockGlobalNumber() { return toBlockGlobalNumber; }
@Override public byte[] toBlockHasheBytes() { return toBlockHash32; }
@Override public byte[] toBlockHashBytes() { return toBlockHash32; }
}

View File

@ -133,13 +133,13 @@ public final class TextBody implements BodyRecord, BodyHasTarget, BodyHasLine {
}
public TextBody(int prevLineNumber,
byte[] prevLineHash32,
int thisLineNumber,
short subType,
String message,
String toBlockchainName,
Integer toBlockGlobalNumber,
byte[] toBlockHash32) {
byte[] prevLineHash32,
int thisLineNumber,
short subType,
String message,
String toBlockchainName,
Integer toBlockGlobalNumber,
byte[] toBlockHash32) {
Objects.requireNonNull(message, "message == null");
if (!isValidSubType(subType)) throw new IllegalArgumentException("Bad Text subType: " + (subType & 0xFFFF));
@ -198,7 +198,6 @@ public final class TextBody implements BodyRecord, BodyHasTarget, BodyHasLine {
if (thisLineNumber != -1) throw new IllegalArgumentException("thisLineNumber must be -1 when prevLineNumber=-1");
} else {
if (prevLineHash32 == null || prevLineHash32.length != 32) throw new IllegalArgumentException("prevLineHash32 invalid");
// thisLineNumber сервер пока не проверяет (принимаем как есть)
}
if (isHasTargetSubType(subType)) {
@ -218,8 +217,8 @@ public final class TextBody implements BodyRecord, BodyHasTarget, BodyHasLine {
if (msgUtf8.length == 0) throw new IllegalArgumentException("Text payload is empty");
if (msgUtf8.length > 65535) throw new IllegalArgumentException("Text too long (>65535 bytes)");
int cap = 4 + 32 + 4 // line fields
+ 2 + msgUtf8.length; // text
int cap = 4 + 32 + 4
+ 2 + msgUtf8.length;
byte[] nameBytes = null;
@ -264,20 +263,7 @@ public final class TextBody implements BodyRecord, BodyHasTarget, BodyHasLine {
@Override public int thisLineNumber() { return thisLineNumber; }
/* ====================== BodyHasTarget ===================== */
@Override public String toLogin() { return null; }
@Override
public String toBchName() {
return isHasTargetSubType(subType) ? toBlockchainName : null;
}
@Override
public Integer toBlockGlobalNumber() {
return isHasTargetSubType(subType) ? toBlockGlobalNumber : null;
}
@Override
public byte[] toBlockHasheBytes() {
return isHasTargetSubType(subType) ? toBlockHash32 : null;
}
@Override public String toBchName() { return isHasTargetSubType(subType) ? toBlockchainName : null; }
@Override public Integer toBlockGlobalNumber() { return isHasTargetSubType(subType) ? toBlockGlobalNumber : null; }
@Override public byte[] toBlockHashBytes() { return isHasTargetSubType(subType) ? toBlockHash32 : null; }
}

View File

@ -279,7 +279,7 @@ public final class Net_AddBlock_Handler implements JsonMessageHandler {
be.setToLogin(t.toLogin());
be.setToBchName(t.toBchName());
be.setToBlockNumber(t.toBlockGlobalNumber());
be.setToBlockHash(t.toBlockHasheBytes());
be.setToBlockHash(t.toBlockHashBytes());
}
// edit helper (optional): если TEXT_EDIT это "редактирование блока цели"