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 client.version=1.2.83
server.version=1.2.76 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 }) { function buildBlockPreimage({ prevBlockHashHex, blockNumber, msgType, msgSubType, msgVersion = 1, bodyBytes }) {
const prevHashBytes = hexToBytes(normalizeHex32(prevBlockHashHex)); const prevHashBytes = hexToBytes(normalizeHex32(prevBlockHashHex));
const body = bodyBytes || new Uint8Array(0); const body = bodyBytes || new Uint8Array(0);
@ -1092,12 +1100,12 @@ export class AuthService {
const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null; const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null;
const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber); const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, ''); const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal); const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber; prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash; prevLineHashHex = latestBlockHash;
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 thisLineNumber = Number.isFinite(latestLineStep)
? Math.max(0, latestVersionsTotal) ? Math.max(0, latestLineStep + 1)
: 1; : 1;
} }
} catch { } catch {
@ -1169,12 +1177,12 @@ export class AuthService {
const latestVersion = latestVersions[latestVersions.length - 1] || null; const latestVersion = latestVersions[latestVersions.length - 1] || null;
const latestBlockNumber = Number(latestVersion?.blockNumber ?? latestMessage?.messageRef?.blockNumber); const latestBlockNumber = Number(latestVersion?.blockNumber ?? latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestVersion?.blockHash ?? latestMessage?.messageRef?.blockHash, ''); const latestBlockHash = normalizeHex32(latestVersion?.blockHash ?? latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal); const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber; prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash; prevLineHashHex = latestBlockHash;
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 thisLineNumber = Number.isFinite(latestLineStep)
? Math.max(1, latestVersionsTotal) ? Math.max(0, latestLineStep)
: 1; : 1;
} }
} catch { } catch {
@ -1497,14 +1505,13 @@ export class AuthService {
const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null; const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null;
const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber); const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, ''); const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal); const latestLineStep = resolveLatestLineStep(latestMessage);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber; prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash; prevLineHashHex = latestBlockHash;
// В line-цепочке thisLineNumber — это номер шага линии, а не глобальный blockNumber. // Для нового POST берём следующий шаг после последнего сообщения линии.
// Для следующего POST берем шаг после последней известной версии сообщения. thisLineNumber = Number.isFinite(latestLineStep)
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 ? Math.max(0, latestLineStep + 1)
? Math.max(0, latestVersionsTotal)
: 1; : 1;
} }
} catch { } 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 { static List<PostBlock> channelPosts(Connection c, String ownerBch, int lineCode, int limit, boolean asc) throws SQLException {
String order = asc ? "ASC" : "DESC"; String order = asc ? "ASC" : "DESC";
String sql = """ 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 FROM blocks
WHERE bch_name=? AND msg_type=? AND msg_sub_type IN (?, ?) AND line_code=? WHERE bch_name=? AND msg_type=? AND msg_sub_type IN (?, ?) AND line_code=?
ORDER BY block_number ORDER BY block_number
@ -204,6 +204,7 @@ final class ChannelsReadSupport {
pb.toBlockNumber = (Integer) rs.getObject("to_block_number"); pb.toBlockNumber = (Integer) rs.getObject("to_block_number");
pb.toBlockHash = rs.getBytes("to_block_hash"); pb.toBlockHash = rs.getBytes("to_block_hash");
pb.msgSubType = rs.getInt("msg_sub_type"); pb.msgSubType = rs.getInt("msg_sub_type");
pb.thisLineNumber = (Integer) rs.getObject("this_line_number");
out.add(pb); out.add(pb);
} }
return out; return out;
@ -513,6 +514,7 @@ final class ChannelsReadSupport {
Integer toBlockNumber; Integer toBlockNumber;
byte[] toBlockHash; byte[] toBlockHash;
int msgSubType; int msgSubType;
Integer thisLineNumber;
} }
static final class TextInfo { static final class TextInfo {

View File

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

View File

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