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

View File

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

View File

@ -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"); if (thisLineNumber != -1) throw new IllegalArgumentException("thisLineNumber must be -1 when prevLineNumber=-1");
} else { } else {
if (prevLineHash32 == null || prevLineHash32.length != 32) throw new IllegalArgumentException("prevLineHash32 invalid"); if (prevLineHash32 == null || prevLineHash32.length != 32) throw new IllegalArgumentException("prevLineHash32 invalid");
// thisLineNumber сервер пока не проверяет (принимаем как есть)
} }
if (isHasTargetSubType(subType)) { 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 == 0) throw new IllegalArgumentException("Text payload is empty");
if (msgUtf8.length > 65535) throw new IllegalArgumentException("Text too long (>65535 bytes)"); if (msgUtf8.length > 65535) throw new IllegalArgumentException("Text too long (>65535 bytes)");
int cap = 4 + 32 + 4 // line fields int cap = 4 + 32 + 4
+ 2 + msgUtf8.length; // text + 2 + msgUtf8.length;
byte[] nameBytes = null; byte[] nameBytes = null;
@ -264,20 +263,7 @@ public final class TextBody implements BodyRecord, BodyHasTarget, BodyHasLine {
@Override public int thisLineNumber() { return thisLineNumber; } @Override public int thisLineNumber() { return thisLineNumber; }
/* ====================== BodyHasTarget ===================== */ /* ====================== 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 @Override public byte[] toBlockHashBytes() { return isHasTargetSubType(subType) ? toBlockHash32 : null; }
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;
}
} }

View File

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