SHA256
24 12 25
Дорабатываю добавление блоков. Поставил todo что доделать
This commit is contained in:
+2
-2
@@ -14,7 +14,7 @@ import server.logic.ws_protocol.JSON.handlers.auth.Net_CreateAuthSession__Handle
|
||||
import server.logic.ws_protocol.JSON.handlers.auth.Net_RefreshSession_Handler;
|
||||
import server.logic.ws_protocol.JSON.handlers.auth.Net_CloseActiveSession_Handler;
|
||||
import server.logic.ws_protocol.JSON.handlers.auth.Net_ListSessions_Handler;
|
||||
import server.logic.ws_protocol.JSON.handlers.blockchain.Net_AddBlock_new_Handler;
|
||||
import server.logic.ws_protocol.JSON.handlers.blockchain.Net_AddBlock_Handler;
|
||||
import server.logic.ws_protocol.JSON.handlers.tempToTest.Net_AddUser_Handler;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -37,7 +37,7 @@ public final class JsonHandlerRegistry {
|
||||
"CreateAuthSession", new Net_CreateAuthSession__Handler(),
|
||||
"CloseActiveSession", new Net_CloseActiveSession_Handler(),
|
||||
"ListSessions", new Net_ListSessions_Handler(),
|
||||
"AddBlock", new Net_AddBlock_new_Handler()
|
||||
"AddBlock", new Net_AddBlock_Handler()
|
||||
// сюда потом добавишь другие операции
|
||||
);
|
||||
|
||||
|
||||
+22
-9
@@ -28,7 +28,7 @@ import java.util.Base64;
|
||||
*
|
||||
* Ответ наружу: только reasonCode + serverLastGlobalNumber/serverLastGlobalHash
|
||||
*/
|
||||
public final class BlockchainStateService_new {
|
||||
public final class BlockchainStateService {
|
||||
|
||||
/** Результат атомарного addBlock */
|
||||
public static final class AddBlockResult {
|
||||
@@ -49,19 +49,19 @@ public final class BlockchainStateService_new {
|
||||
}
|
||||
}
|
||||
|
||||
private static volatile BlockchainStateService_new instance;
|
||||
private static volatile BlockchainStateService instance;
|
||||
|
||||
private final SqliteDbController db = SqliteDbController.getInstance();
|
||||
private final BlocksDAO blocksDAO = BlocksDAO.getInstance();
|
||||
private final BlockchainStateDAO stateDAO = BlockchainStateDAO.getInstance();
|
||||
private final SolanaUsersDAO solanaUsersDAO = SolanaUsersDAO.getInstance();
|
||||
|
||||
private BlockchainStateService_new() {}
|
||||
private BlockchainStateService() {}
|
||||
|
||||
public static BlockchainStateService_new getInstance() {
|
||||
public static BlockchainStateService getInstance() {
|
||||
if (instance == null) {
|
||||
synchronized (BlockchainStateService_new.class) {
|
||||
if (instance == null) instance = new BlockchainStateService_new();
|
||||
synchronized (BlockchainStateService.class) {
|
||||
if (instance == null) instance = new BlockchainStateService();
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
@@ -80,10 +80,12 @@ public final class BlockchainStateService_new {
|
||||
return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "empty_blockchain_name", 0, "");
|
||||
|
||||
// Можно быстро проверить, что login согласован с blockchainName (если хочешь строгость)
|
||||
String loginFromName = BlockchainNameUtil.loginFromBlockchainName(blockchainName);
|
||||
if (loginFromName == null || loginFromName.isBlank())
|
||||
String loginFromBlockchainName = BlockchainNameUtil.loginFromBlockchainName(blockchainName);
|
||||
if (loginFromBlockchainName == null || loginFromBlockchainName.isBlank())
|
||||
return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "bad_blockchain_name", 0, "");
|
||||
|
||||
|
||||
// todo действительно давай прото брать логин из имени блокчена и не передавать его отдельно в запросе!
|
||||
if (login == null || login.isBlank()) {
|
||||
// раз уж у нас есть loginFromName — можно принимать login пустым,
|
||||
// но ты явно передаёшь login, поэтому пока так:
|
||||
@@ -91,7 +93,7 @@ public final class BlockchainStateService_new {
|
||||
}
|
||||
|
||||
// (опционально) сверка
|
||||
if (!loginFromName.equals(login)) {
|
||||
if (!loginFromBlockchainName.equals(login)) {
|
||||
return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "login_not_match_blockchain_name", 0, "");
|
||||
}
|
||||
|
||||
@@ -102,6 +104,10 @@ public final class BlockchainStateService_new {
|
||||
return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "bad_block_base64", 0, "");
|
||||
}
|
||||
|
||||
// todo ну и ещё тут нужно проверить что не только сам формат блока верный, но и запись в этом блоке верная - тоесть что её можно распарсить!
|
||||
|
||||
|
||||
|
||||
final BchBlockEntry block;
|
||||
try {
|
||||
block = new BchBlockEntry(blockBytes);
|
||||
@@ -133,6 +139,8 @@ public final class BlockchainStateService_new {
|
||||
|
||||
// 2) состояние блокчейна
|
||||
BlockchainStateEntry st = stateDAO.getByBlockchainName(c, blockchainName);
|
||||
|
||||
//todo тут надо учесть тот случай что если это 0 блок тоесть начало блокчейна то логично что ещё нет самого файла блокчейна и по этому нет и BlockchainStateEntry
|
||||
if (st == null) {
|
||||
c.rollback();
|
||||
return new AddBlockResult(WireCodes.Status.NOT_FOUND, "blockchain_state_not_found", 0, "");
|
||||
@@ -156,6 +164,9 @@ public final class BlockchainStateService_new {
|
||||
}
|
||||
|
||||
byte[] prevLineHash32 = prevGlobalHash32; // пока линии не используем
|
||||
//todo точно так же как и глобальный проверяем преведущий хэш по линии. он пока не используется, в том плане что у нас везде линия 0 и приведущий хэш по линии по сути равен приведущему глобальному хэшу, но его тоже надо проверять.
|
||||
// по сути можно сказать он используется просто пока везде только одна линия с индексом 0
|
||||
|
||||
|
||||
// 5) крипто-проверка
|
||||
boolean ok = BchCryptoVerifier.verifyAll(
|
||||
@@ -173,6 +184,8 @@ public final class BlockchainStateService_new {
|
||||
return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "bad_signature_or_hash", st.getLastGlobalNumber(), nn(st.getLastGlobalHash()));
|
||||
}
|
||||
|
||||
|
||||
//todo сам код добавление блока вынести в отдельный класс - тк там надо потом усложнить действие
|
||||
// 6) вставка блока
|
||||
insertBlockRow(c, login, blockchainName, globalNumber, prevGlobalHashHex, blockBytes);
|
||||
|
||||
+7
-2
@@ -8,13 +8,14 @@ import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_Response;
|
||||
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
|
||||
import server.logic.ws_protocol.WireCodes;
|
||||
|
||||
public final class Net_AddBlock_new_Handler implements JsonMessageHandler {
|
||||
public final class Net_AddBlock_Handler implements JsonMessageHandler {
|
||||
|
||||
@Override
|
||||
public Net_Response handle(Net_Request baseReq, ConnectionContext ctx) throws Exception {
|
||||
|
||||
Net_AddBlock_Request req = (Net_AddBlock_Request) baseReq;
|
||||
|
||||
var r = BlockchainStateService_new.getInstance().addBlockAtomically(
|
||||
var r = BlockchainStateService.getInstance().addBlockAtomically(
|
||||
req.getLogin(),
|
||||
req.getBlockchainName(),
|
||||
req.getGlobalNumber(),
|
||||
@@ -22,6 +23,10 @@ public final class Net_AddBlock_new_Handler implements JsonMessageHandler {
|
||||
req.getBlockBytesB64()
|
||||
);
|
||||
|
||||
// todo если пришёл запрос на добавление то надо блочить работу с этим блокчейном по req.getBlockchainName(),
|
||||
// с помощью класса BlockchainLocks и разлочивать работу только в конце завершения работы этого хэндлера, что бы не случилось паралельной работы двух потоков с одним и тем же блокчейном!
|
||||
|
||||
|
||||
Net_AddBlock_Response resp = new Net_AddBlock_Response();
|
||||
resp.setOp(req.getOp());
|
||||
resp.setRequestId(req.getRequestId());
|
||||
Reference in New Issue
Block a user