fix: считать шаг линии через lineStep перед AddBlock

This commit is contained in:
AidarKC 2026-05-21 16:57:31 +03:00
parent fd99250882
commit aa2644d812
6 changed files with 34 additions and 17 deletions

View File

@ -1,2 +1,2 @@
client.version=1.2.82
server.version=1.2.76
client.version=1.2.83
server.version=1.2.77

View File

@ -639,6 +639,14 @@ function normalizeMessageRefTarget(target, actionName = 'action') {
};
}
function resolveLatestLineStep(message) {
const lineStep = Number(message?.lineStep);
if (Number.isFinite(lineStep) && lineStep >= 0) return lineStep;
const fallbackByVersions = Number(message?.versionsTotal);
if (Number.isFinite(fallbackByVersions) && fallbackByVersions > 0) return Math.max(0, fallbackByVersions - 1);
return null;
}
function buildBlockPreimage({ prevBlockHashHex, blockNumber, msgType, msgSubType, msgVersion = 1, bodyBytes }) {
const prevHashBytes = hexToBytes(normalizeHex32(prevBlockHashHex));
const body = bodyBytes || new Uint8Array(0);
@ -1092,12 +1100,12 @@ export class AuthService {
const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null;
const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal);
const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash;
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0
? Math.max(0, latestVersionsTotal)
thisLineNumber = Number.isFinite(latestLineStep)
? Math.max(0, latestLineStep + 1)
: 1;
}
} catch {
@ -1169,12 +1177,12 @@ export class AuthService {
const latestVersion = latestVersions[latestVersions.length - 1] || null;
const latestBlockNumber = Number(latestVersion?.blockNumber ?? latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestVersion?.blockHash ?? latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal);
const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash;
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0
? Math.max(1, latestVersionsTotal)
thisLineNumber = Number.isFinite(latestLineStep)
? Math.max(0, latestLineStep)
: 1;
}
} catch {
@ -1497,14 +1505,13 @@ export class AuthService {
const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null;
const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal);
const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash;
// В line-цепочке thisLineNumber — это номер шага линии, а не глобальный blockNumber.
// Для следующего POST берем шаг после последней известной версии сообщения.
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0
? Math.max(0, latestVersionsTotal)
// Для нового POST берём следующий шаг после последнего сообщения линии.
thisLineNumber = Number.isFinite(latestLineStep)
? Math.max(0, latestLineStep + 1)
: 1;
}
} catch {

View File

@ -179,7 +179,7 @@ final class ChannelsReadSupport {
static List<PostBlock> channelPosts(Connection c, String ownerBch, int lineCode, int limit, boolean asc) throws SQLException {
String order = asc ? "ASC" : "DESC";
String sql = """
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,msg_sub_type
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,msg_sub_type,this_line_number
FROM blocks
WHERE bch_name=? AND msg_type=? AND msg_sub_type IN (?, ?) AND line_code=?
ORDER BY block_number
@ -204,6 +204,7 @@ final class ChannelsReadSupport {
pb.toBlockNumber = (Integer) rs.getObject("to_block_number");
pb.toBlockHash = rs.getBytes("to_block_hash");
pb.msgSubType = rs.getInt("msg_sub_type");
pb.thisLineNumber = (Integer) rs.getObject("this_line_number");
out.add(pb);
}
return out;
@ -513,6 +514,7 @@ final class ChannelsReadSupport {
Integer toBlockNumber;
byte[] toBlockHash;
int msgSubType;
Integer thisLineNumber;
}
static final class TextInfo {

View File

@ -100,6 +100,7 @@ public class Net_GetChannelMessages_Handler implements JsonMessageHandler {
item.setMsgSubType(post.msgSubType);
item.setAuthorLogin(post.login);
item.setAuthorBlockchainName(post.bchName);
item.setLineStep(post.thisLineNumber);
item.setTargetBlockchainName(post.toBchName);
item.setTargetBlockNumber(post.toBlockNumber);
item.setTargetBlockHash(ChannelsReadSupport.toHex(post.toBlockHash));

View File

@ -85,7 +85,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
private List<PostRow> findReplies(Connection c, String toBchName, int toBlockNumber, byte[] toBlockHash, int limit) throws Exception {
String sql = """
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number
FROM blocks
WHERE msg_type=1 AND msg_sub_type=?
AND to_bch_name=? AND to_block_number=? AND to_block_hash=?
@ -108,7 +108,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
private PostRow findByNumber(Connection c, String bchName, int blockNumber) throws Exception {
String sql = """
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number
FROM blocks
WHERE bch_name=? AND block_number=?
LIMIT 1
@ -134,6 +134,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
row.toBlockHash = rs.getBytes("to_block_hash");
row.lineCode = (Integer) rs.getObject("line_code");
row.msgSubType = rs.getInt("msg_sub_type");
row.thisLineNumber = (Integer) rs.getObject("this_line_number");
return row;
}
@ -146,6 +147,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
node.setMsgSubType(row.msgSubType);
node.setAuthorLogin(row.login);
node.setAuthorBlockchainName(row.bchName);
node.setLineStep(row.thisLineNumber);
node.setTargetBlockchainName(row.toBchName);
node.setTargetBlockNumber(row.toBlockNumber);
node.setTargetBlockHash(ChannelsReadSupport.toHex(row.toBlockHash));
@ -199,7 +201,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
private List<PostRow> findEdits(Connection c, String bch, int targetBlock, byte[] targetHash, int subType) throws Exception {
String sql = """
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type
SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number
FROM blocks
WHERE bch_name=? AND msg_type=1 AND msg_sub_type=?
AND to_block_number=? AND to_block_hash=?
@ -231,5 +233,6 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler {
byte[] toBlockHash;
Integer lineCode;
int msgSubType;
Integer thisLineNumber;
}
}

View File

@ -52,6 +52,7 @@ public class Net_GetChannelMessages_Response extends Net_Response {
private Integer msgSubType;
private String authorLogin;
private String authorBlockchainName;
private Integer lineStep;
private String targetBlockchainName;
private Integer targetBlockNumber;
private String targetBlockHash;
@ -74,6 +75,9 @@ public class Net_GetChannelMessages_Response extends Net_Response {
public String getAuthorBlockchainName() { return authorBlockchainName; }
public void setAuthorBlockchainName(String authorBlockchainName) { this.authorBlockchainName = authorBlockchainName; }
public Integer getLineStep() { return lineStep; }
public void setLineStep(Integer lineStep) { this.lineStep = lineStep; }
public String getTargetBlockchainName() { return targetBlockchainName; }
public void setTargetBlockchainName(String targetBlockchainName) { this.targetBlockchainName = targetBlockchainName; }