mirror of
https://github.com/Qortal/qortal.git
synced 2025-08-01 14:41:23 +00:00
Compare commits
17 Commits
sync-long-
...
v3.3.7
Author | SHA1 | Date | |
---|---|---|---|
|
35ce64cc3a | ||
|
09b218d16c | ||
|
7ea451e027 | ||
|
ffb27c3946 | ||
|
6e7d2b50a0 | ||
|
bd025f30ff | ||
|
c6cbd8e826 | ||
|
b85afe3ca7 | ||
|
5a4674c973 | ||
|
769418e5ae | ||
|
38faed5799 | ||
|
96cdf4a87e | ||
|
c0b1580561 | ||
|
28f9df7178 | ||
|
55a0c10855 | ||
|
7c5165763d | ||
|
d2836ebcb9 |
@@ -17,10 +17,10 @@
|
||||
<ROW Property="Manufacturer" Value="Qortal"/>
|
||||
<ROW Property="MsiLogging" MultiBuildValue="DefaultBuild:vp"/>
|
||||
<ROW Property="NTP_GOOD" Value="false"/>
|
||||
<ROW Property="ProductCode" Value="1033:{7DED0630-60A3-438A-B857-D95BD16213F1} 1049:{4A7BAAA1-E9EC-4E92-8963-34420EC1E3F4} 2052:{F3448469-4E4F-4600-AE05-DF7669B267E3} 2057:{0B980BC5-4C80-4A98-A4D2-B32D134AA276} " Type="16"/>
|
||||
<ROW Property="ProductCode" Value="1033:{A84E32B5-2136-4ED2-A27B-EDE714B99840} 1049:{4AB7B0D2-A5EF-4D2B-A557-9389338A357F} 2052:{E77D0C9A-701D-4029-97F7-CDDFF99FC635} 2057:{ACC6A9FC-FE77-4CBA-BEE0-1DA3345CFE17} " Type="16"/>
|
||||
<ROW Property="ProductLanguage" Value="2057"/>
|
||||
<ROW Property="ProductName" Value="Qortal"/>
|
||||
<ROW Property="ProductVersion" Value="3.3.5" Type="32"/>
|
||||
<ROW Property="ProductVersion" Value="3.3.6" Type="32"/>
|
||||
<ROW Property="RECONFIG_NTP" Value="true"/>
|
||||
<ROW Property="REMOVE_BLOCKCHAIN" Value="YES" Type="4"/>
|
||||
<ROW Property="REPAIR_BLOCKCHAIN" Value="YES" Type="4"/>
|
||||
@@ -212,7 +212,7 @@
|
||||
<ROW Component="ADDITIONAL_LICENSE_INFO_71" ComponentId="{12A3ADBE-BB7A-496C-8869-410681E6232F}" Directory_="jdk.zipfs_Dir" Attributes="0" KeyPath="ADDITIONAL_LICENSE_INFO_71" Type="0"/>
|
||||
<ROW Component="ADDITIONAL_LICENSE_INFO_8" ComponentId="{D53AD95E-CF96-4999-80FC-5812277A7456}" Directory_="java.naming_Dir" Attributes="0" KeyPath="ADDITIONAL_LICENSE_INFO_8" Type="0"/>
|
||||
<ROW Component="ADDITIONAL_LICENSE_INFO_9" ComponentId="{6B7EA9B0-5D17-47A8-B78C-FACE86D15E01}" Directory_="java.net.http_Dir" Attributes="0" KeyPath="ADDITIONAL_LICENSE_INFO_9" Type="0"/>
|
||||
<ROW Component="AI_CustomARPName" ComponentId="{191AD445-72DF-4850-BB4A-FE92D4B62BCF}" Directory_="APPDIR" Attributes="260" KeyPath="DisplayName" Options="1"/>
|
||||
<ROW Component="AI_CustomARPName" ComponentId="{CFFA164F-4D3E-4B4A-87BB-BACACAF6FD91}" Directory_="APPDIR" Attributes="260" KeyPath="DisplayName" Options="1"/>
|
||||
<ROW Component="AI_ExePath" ComponentId="{3644948D-AE0B-41BB-9FAF-A79E70490A08}" Directory_="APPDIR" Attributes="260" KeyPath="AI_ExePath"/>
|
||||
<ROW Component="APPDIR" ComponentId="{680DFDDE-3FB4-47A5-8FF5-934F576C6F91}" Directory_="APPDIR" Attributes="0"/>
|
||||
<ROW Component="AccessBridgeCallbacks.h" ComponentId="{288055D1-1062-47A3-AA44-5601B4E38AED}" Directory_="bridge_Dir" Attributes="0" KeyPath="AccessBridgeCallbacks.h" Type="0"/>
|
||||
|
2
pom.xml
2
pom.xml
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.qortal</groupId>
|
||||
<artifactId>qortal</artifactId>
|
||||
<version>3.3.5</version>
|
||||
<version>3.3.7</version>
|
||||
<packaging>jar</packaging>
|
||||
<properties>
|
||||
<skipTests>true</skipTests>
|
||||
|
@@ -57,6 +57,7 @@ import org.qortal.transform.TransformationException;
|
||||
import org.qortal.transform.transaction.ArbitraryTransactionTransformer;
|
||||
import org.qortal.transform.transaction.TransactionTransformer;
|
||||
import org.qortal.utils.Base58;
|
||||
import org.qortal.utils.NTP;
|
||||
import org.qortal.utils.ZipUtils;
|
||||
|
||||
@Path("/arbitrary")
|
||||
@@ -1099,7 +1100,8 @@ public class ArbitraryResource {
|
||||
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, error);
|
||||
}
|
||||
|
||||
if (!Controller.getInstance().isUpToDate()) {
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp)) {
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCKCHAIN_NEEDS_SYNC);
|
||||
}
|
||||
|
||||
|
@@ -42,6 +42,7 @@ import org.qortal.repository.DataException;
|
||||
import org.qortal.repository.Repository;
|
||||
import org.qortal.repository.RepositoryManager;
|
||||
import org.qortal.utils.Base58;
|
||||
import org.qortal.utils.NTP;
|
||||
|
||||
@Path("/crosschain/tradebot")
|
||||
@Tag(name = "Cross-Chain (Trade-Bot)")
|
||||
@@ -137,7 +138,8 @@ public class CrossChainTradeBotResource {
|
||||
if (tradeBotCreateRequest.qortAmount <= 0 || tradeBotCreateRequest.fundingQortAmount <= 0)
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ORDER_SIZE_TOO_SMALL);
|
||||
|
||||
if (!Controller.getInstance().isUpToDate())
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp))
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCKCHAIN_NEEDS_SYNC);
|
||||
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
@@ -198,7 +200,8 @@ public class CrossChainTradeBotResource {
|
||||
if (tradeBotRespondRequest.receivingAddress == null || !Crypto.isValidAddress(tradeBotRespondRequest.receivingAddress))
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_ADDRESS);
|
||||
|
||||
if (!Controller.getInstance().isUpToDate())
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp))
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCKCHAIN_NEEDS_SYNC);
|
||||
|
||||
// Extract data from cross-chain trading AT
|
||||
|
@@ -723,9 +723,9 @@ public class TransactionsResource {
|
||||
ApiError.BLOCKCHAIN_NEEDS_SYNC, ApiError.INVALID_SIGNATURE, ApiError.INVALID_DATA, ApiError.TRANSFORMATION_ERROR, ApiError.REPOSITORY_ISSUE
|
||||
})
|
||||
public String processTransaction(String rawBytes58) {
|
||||
// Only allow a transaction to be processed if our latest block is less than 30 minutes old
|
||||
// Only allow a transaction to be processed if our latest block is less than 60 minutes old
|
||||
// If older than this, we should first wait until the blockchain is synced
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (30 * 60 * 1000L);
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp))
|
||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCKCHAIN_NEEDS_SYNC);
|
||||
|
||||
|
@@ -69,7 +69,6 @@ public class BlockChain {
|
||||
newBlockSigHeight,
|
||||
shareBinFix,
|
||||
calcChainWeightTimestamp,
|
||||
newConsensusTimestamp,
|
||||
transactionV5Timestamp,
|
||||
transactionV6Timestamp,
|
||||
disableReferenceTimestamp
|
||||
@@ -404,10 +403,6 @@ public class BlockChain {
|
||||
return this.featureTriggers.get(FeatureTrigger.calcChainWeightTimestamp.name()).longValue();
|
||||
}
|
||||
|
||||
public long getNewConsensusTimestamp() {
|
||||
return this.featureTriggers.get(FeatureTrigger.newConsensusTimestamp.name()).longValue();
|
||||
}
|
||||
|
||||
public long getTransactionV5Timestamp() {
|
||||
return this.featureTriggers.get(FeatureTrigger.transactionV5Timestamp.name()).longValue();
|
||||
}
|
||||
|
@@ -715,24 +715,6 @@ public class Controller extends Thread {
|
||||
return lastMisbehaved != null && lastMisbehaved > NTP.getTime() - MISBEHAVIOUR_COOLOFF;
|
||||
};
|
||||
|
||||
/** True if peer has unknown height or lower height. */
|
||||
public static final Predicate<Peer> hasShorterBlockchain = peer -> {
|
||||
BlockData ourLatestBlockData = getInstance().getChainTip();
|
||||
int ourHeight = ourLatestBlockData.getHeight();
|
||||
final PeerChainTipData peerChainTipData = peer.getChainTipData();
|
||||
|
||||
// Ensure we have chain tip data for this peer
|
||||
if (peerChainTipData == null)
|
||||
return true;
|
||||
|
||||
// Remove if peer is at a lower height than us
|
||||
Integer peerHeight = peerChainTipData.getLastHeight();
|
||||
if (peerHeight == null || peerHeight < ourHeight)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
public static final Predicate<Peer> hasNoRecentBlock = peer -> {
|
||||
final Long minLatestBlockTimestamp = getMinimumLatestBlockTimestamp();
|
||||
final PeerChainTipData peerChainTipData = peer.getChainTipData();
|
||||
@@ -805,8 +787,8 @@ public class Controller extends Thread {
|
||||
String actionText;
|
||||
|
||||
// Use a more tolerant latest block timestamp in the isUpToDate() calls below to reduce misleading statuses.
|
||||
// Any block in the last 30 minutes is considered "up to date" for the purposes of displaying statuses.
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (30 * 60 * 1000L);
|
||||
// Any block in the last 60 minutes is considered "up to date" for the purposes of displaying statuses.
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
|
||||
synchronized (Synchronizer.getInstance().syncLock) {
|
||||
if (Settings.getInstance().isLite()) {
|
||||
|
@@ -280,6 +280,12 @@ public class OnlineAccountsManager extends Thread {
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't submit if we're more than 2 hours out of sync
|
||||
final Long minLatestBlockTimestamp = now - (2 * 60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<MintingAccountData> mintingAccounts;
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
mintingAccounts = repository.getAccountRepository().getMintingAccounts();
|
||||
|
@@ -171,8 +171,8 @@ public class Synchronizer extends Thread {
|
||||
|
||||
public Integer getSyncPercent() {
|
||||
synchronized (this.syncLock) {
|
||||
// Report as 100% synced if the latest block is within the last 30 mins
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (30 * 60 * 1000L);
|
||||
// Report as 100% synced if the latest block is within the last 60 mins
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (Controller.getInstance().isUpToDate(minLatestBlockTimestamp)) {
|
||||
return 100;
|
||||
}
|
||||
@@ -199,8 +199,6 @@ public class Synchronizer extends Thread {
|
||||
if (this.isSynchronizing)
|
||||
return true;
|
||||
|
||||
boolean isNewConsensusActive = NTP.getTime() >= BlockChain.getInstance().getNewConsensusTimestamp();
|
||||
|
||||
// Needs a mutable copy of the unmodifiableList
|
||||
List<Peer> peers = new ArrayList<>(Network.getInstance().getImmutableHandshakedPeers());
|
||||
|
||||
@@ -229,10 +227,6 @@ public class Synchronizer extends Thread {
|
||||
if (peers.size() < Settings.getInstance().getMinBlockchainPeers())
|
||||
return true;
|
||||
|
||||
if (isNewConsensusActive)
|
||||
// Disregard peers with a shorter chain
|
||||
peers.removeIf(Controller.hasShorterBlockchain);
|
||||
|
||||
// Disregard peers that have no block signature or the same block signature as us
|
||||
peers.removeIf(Controller.hasNoOrSameBlock);
|
||||
|
||||
@@ -241,13 +235,11 @@ public class Synchronizer extends Thread {
|
||||
|
||||
final int peersBeforeComparison = peers.size();
|
||||
|
||||
if (!isNewConsensusActive) {
|
||||
// Request recent block summaries from the remaining peers, and locate our common block with each
|
||||
Synchronizer.getInstance().findCommonBlocksWithPeers(peers);
|
||||
// Request recent block summaries from the remaining peers, and locate our common block with each
|
||||
Synchronizer.getInstance().findCommonBlocksWithPeers(peers);
|
||||
|
||||
// Compare the peers against each other, and against our chain, which will return an updated list excluding those without common blocks
|
||||
peers = Synchronizer.getInstance().comparePeers(peers);
|
||||
}
|
||||
// Compare the peers against each other, and against our chain, which will return an updated list excluding those without common blocks
|
||||
peers = Synchronizer.getInstance().comparePeers(peers);
|
||||
|
||||
// We may have added more inferior chain tips when comparing peers, so remove any peers that are currently on those chains
|
||||
peers.removeIf(Controller.hasInferiorChainTip);
|
||||
@@ -993,13 +985,8 @@ public class Synchronizer extends Thread {
|
||||
return SynchronizationResult.NOTHING_TO_DO;
|
||||
}
|
||||
|
||||
boolean isNewConsensusActive = NTP.getTime() >= BlockChain.getInstance().getNewConsensusTimestamp();
|
||||
|
||||
// Unless we're doing a forced sync, we might need to compare blocks after common block
|
||||
boolean isBlockComparisonNeeded = isNewConsensusActive
|
||||
? ourInitialHeight == peerHeight
|
||||
: ourInitialHeight > commonBlockHeight;
|
||||
if (!force && isBlockComparisonNeeded) {
|
||||
if (!force && ourInitialHeight > commonBlockHeight) {
|
||||
SynchronizationResult chainCompareResult = compareChains(repository, commonBlockData, ourLatestBlockData, peer, peerHeight, peerBlockSummaries);
|
||||
if (chainCompareResult != SynchronizationResult.OK)
|
||||
return chainCompareResult;
|
||||
@@ -1200,56 +1187,27 @@ public class Synchronizer extends Thread {
|
||||
peerBlockSummaries.addAll(moreBlockSummaries);
|
||||
}
|
||||
|
||||
boolean isNewConsensusActive = NTP.getTime() >= BlockChain.getInstance().getNewConsensusTimestamp();
|
||||
if (isNewConsensusActive) {
|
||||
int parentHeight = ourLatestBlockData.getHeight() - 1;
|
||||
// Fetch our corresponding block summaries
|
||||
List<BlockSummaryData> ourBlockSummaries = repository.getBlockRepository().getBlockSummaries(commonBlockHeight + 1, ourLatestBlockData.getHeight());
|
||||
|
||||
BlockSummaryData ourLatestBlockSummary = new BlockSummaryData(ourLatestBlockData);
|
||||
byte[] ourParentBlockSignature = ourLatestBlockData.getReference();
|
||||
// Populate minter account levels for both lists of block summaries
|
||||
populateBlockSummariesMinterLevels(repository, ourBlockSummaries);
|
||||
populateBlockSummariesMinterLevels(repository, peerBlockSummaries);
|
||||
|
||||
BlockSummaryData peersLatestBlockSummary = peerBlockSummaries.get(peerBlockSummaries.size() - 1);
|
||||
byte[] peersParentBlockSignature = peerBlockSummaries.size() > 1
|
||||
? peerBlockSummaries.get(peerBlockSummaries.size() - 1 - 1).getSignature()
|
||||
: commonBlockSig;
|
||||
final int mutualHeight = commonBlockHeight + Math.min(ourBlockSummaries.size(), peerBlockSummaries.size());
|
||||
|
||||
// Populate minter account levels for both lists of block summaries
|
||||
populateBlockSummariesMinterLevels(repository, Collections.singletonList(ourLatestBlockSummary));
|
||||
populateBlockSummariesMinterLevels(repository, Collections.singletonList(peersLatestBlockSummary));
|
||||
// Calculate cumulative chain weights of both blockchain subsets, from common block to highest mutual block.
|
||||
BigInteger ourChainWeight = Block.calcChainWeight(commonBlockHeight, commonBlockSig, ourBlockSummaries, mutualHeight);
|
||||
BigInteger peerChainWeight = Block.calcChainWeight(commonBlockHeight, commonBlockSig, peerBlockSummaries, mutualHeight);
|
||||
|
||||
BigInteger ourChainWeight = Block.calcBlockWeight(parentHeight, ourParentBlockSignature, ourLatestBlockSummary);
|
||||
BigInteger peerChainWeight = Block.calcBlockWeight(parentHeight, peersParentBlockSignature, peersLatestBlockSummary);
|
||||
NumberFormat accurateFormatter = new DecimalFormat("0.################E0");
|
||||
LOGGER.debug(String.format("commonBlockHeight: %d, commonBlockSig: %.8s, ourBlockSummaries.size(): %d, peerBlockSummaries.size(): %d", commonBlockHeight, Base58.encode(commonBlockSig), ourBlockSummaries.size(), peerBlockSummaries.size()));
|
||||
LOGGER.debug(String.format("Our chain weight: %s, peer's chain weight: %s (higher is better)", accurateFormatter.format(ourChainWeight), accurateFormatter.format(peerChainWeight)));
|
||||
|
||||
NumberFormat accurateFormatter = new DecimalFormat("0.################E0");
|
||||
LOGGER.debug(String.format("Our chain weight: %s, peer's chain weight: %s (higher is better)", accurateFormatter.format(ourChainWeight), accurateFormatter.format(peerChainWeight)));
|
||||
|
||||
// If our blockchain has greater weight then don't synchronize with peer
|
||||
if (ourChainWeight.compareTo(peerChainWeight) >= 0) {
|
||||
LOGGER.debug(String.format("Not synchronizing with peer %s as we have better blockchain", peer));
|
||||
return SynchronizationResult.INFERIOR_CHAIN;
|
||||
}
|
||||
} else {
|
||||
// Fetch our corresponding block summaries
|
||||
List<BlockSummaryData> ourBlockSummaries = repository.getBlockRepository().getBlockSummaries(commonBlockHeight + 1, ourLatestBlockData.getHeight());
|
||||
|
||||
// Populate minter account levels for both lists of block summaries
|
||||
populateBlockSummariesMinterLevels(repository, ourBlockSummaries);
|
||||
populateBlockSummariesMinterLevels(repository, peerBlockSummaries);
|
||||
|
||||
final int mutualHeight = commonBlockHeight + Math.min(ourBlockSummaries.size(), peerBlockSummaries.size());
|
||||
|
||||
// Calculate cumulative chain weights of both blockchain subsets, from common block to highest mutual block.
|
||||
BigInteger ourChainWeight = Block.calcChainWeight(commonBlockHeight, commonBlockSig, ourBlockSummaries, mutualHeight);
|
||||
BigInteger peerChainWeight = Block.calcChainWeight(commonBlockHeight, commonBlockSig, peerBlockSummaries, mutualHeight);
|
||||
|
||||
NumberFormat accurateFormatter = new DecimalFormat("0.################E0");
|
||||
LOGGER.debug(String.format("commonBlockHeight: %d, commonBlockSig: %.8s, ourBlockSummaries.size(): %d, peerBlockSummaries.size(): %d", commonBlockHeight, Base58.encode(commonBlockSig), ourBlockSummaries.size(), peerBlockSummaries.size()));
|
||||
LOGGER.debug(String.format("Our chain weight: %s, peer's chain weight: %s (higher is better)", accurateFormatter.format(ourChainWeight), accurateFormatter.format(peerChainWeight)));
|
||||
|
||||
// If our blockchain has greater weight then don't synchronize with peer
|
||||
if (ourChainWeight.compareTo(peerChainWeight) >= 0) {
|
||||
LOGGER.debug(String.format("Not synchronizing with peer %s as we have better blockchain", peer));
|
||||
return SynchronizationResult.INFERIOR_CHAIN;
|
||||
}
|
||||
// If our blockchain has greater weight then don't synchronize with peer
|
||||
if (ourChainWeight.compareTo(peerChainWeight) >= 0) {
|
||||
LOGGER.debug(String.format("Not synchronizing with peer %s as we have better blockchain", peer));
|
||||
return SynchronizationResult.INFERIOR_CHAIN;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -690,6 +690,7 @@ public class ArbitraryDataFileListManager {
|
||||
// Relay request hasn't reached the maximum number of hops yet, so can be rebroadcast
|
||||
|
||||
Message relayGetArbitraryDataFileListMessage = new GetArbitraryDataFileListMessage(signature, hashes, requestTime, requestHops, requestingPeer);
|
||||
relayGetArbitraryDataFileListMessage.setId(message.getId());
|
||||
|
||||
LOGGER.debug("Rebroadcasting hash list request from peer {} for signature {} to our other peers... totalRequestTime: {}, requestHops: {}", peer, Base58.encode(signature), totalRequestTime, requestHops);
|
||||
Network.getInstance().broadcast(
|
||||
|
@@ -339,6 +339,7 @@ public class ArbitraryMetadataManager {
|
||||
if (requestingPeer != null) {
|
||||
|
||||
ArbitraryMetadataMessage forwardArbitraryMetadataMessage = new ArbitraryMetadataMessage(signature, arbitraryMetadataMessage.getArbitraryMetadataFile());
|
||||
forwardArbitraryMetadataMessage.setId(arbitraryMetadataMessage.getId());
|
||||
|
||||
// Forward to requesting peer
|
||||
LOGGER.debug("Forwarding metadata to requesting peer: {}", requestingPeer);
|
||||
|
@@ -242,8 +242,8 @@ public class TradeBot implements Listener {
|
||||
if (!(event instanceof Synchronizer.NewChainTipEvent))
|
||||
return;
|
||||
|
||||
// Don't process trade bots or broadcast presence timestamps if our chain is more than 30 minutes old
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (30 * 60 * 1000L);
|
||||
// Don't process trade bots or broadcast presence timestamps if our chain is more than 60 minutes old
|
||||
final Long minLatestBlockTimestamp = NTP.getTime() - (60 * 60 * 1000L);
|
||||
if (!Controller.getInstance().isUpToDate(minLatestBlockTimestamp))
|
||||
return;
|
||||
|
||||
|
@@ -58,7 +58,6 @@
|
||||
"newBlockSigHeight": 320000,
|
||||
"shareBinFix": 399000,
|
||||
"calcChainWeightTimestamp": 1620579600000,
|
||||
"newConsensusTimestamp": 9999999999999,
|
||||
"transactionV5Timestamp": 1642176000000,
|
||||
"transactionV6Timestamp": 9999999999999,
|
||||
"disableReferenceTimestamp": 1655222400000
|
||||
|
@@ -6,15 +6,15 @@
|
||||
### Common ###
|
||||
JSON = JSON Nachricht konnte nicht geparst werden
|
||||
|
||||
INSUFFICIENT_BALANCE = insufficient balance
|
||||
INSUFFICIENT_BALANCE = Kein Ausgleich
|
||||
|
||||
UNAUTHORIZED = API-Aufruf nicht autorisiert
|
||||
|
||||
REPOSITORY_ISSUE = Repository-Fehler
|
||||
|
||||
NON_PRODUCTION = this API call is not permitted for production systems
|
||||
NON_PRODUCTION = Dieser APi-Aufruf ist nicht gestattet für Produtkion
|
||||
|
||||
BLOCKCHAIN_NEEDS_SYNC = blockchain needs to synchronize first
|
||||
BLOCKCHAIN_NEEDS_SYNC = Blockchain muss sich erst verbinden
|
||||
|
||||
NO_TIME_SYNC = noch keine Uhrensynchronisation
|
||||
|
||||
@@ -68,16 +68,16 @@ ORDER_UNKNOWN = unbekannte asset order ID
|
||||
GROUP_UNKNOWN = Gruppe unbekannt
|
||||
|
||||
### Foreign Blockchain ###
|
||||
FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = foreign blokchain or ElectrumX network issue
|
||||
FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = fremde Blockchain oder ElectrumX Netzwerk Problem
|
||||
|
||||
FOREIGN_BLOCKCHAIN_BALANCE_ISSUE = insufficient balance on foreign blockchain
|
||||
FOREIGN_BLOCKCHAIN_BALANCE_ISSUE = unzureichend Bilanz auf fremde blockchain
|
||||
|
||||
FOREIGN_BLOCKCHAIN_TOO_SOON = too soon to broadcast foreign blockchain transaction (LockTime/median block time)
|
||||
FOREIGN_BLOCKCHAIN_TOO_SOON = zu früh um fremde Blockchain-Transaktionen zu übertragen (Sperrzeit/mittlere Blockzeit)
|
||||
|
||||
### Trade Portal ###
|
||||
ORDER_SIZE_TOO_SMALL = order amount too low
|
||||
ORDER_SIZE_TOO_SMALL = Bestellmenge zu niedrig
|
||||
|
||||
### Data ###
|
||||
FILE_NOT_FOUND = Datei nicht gefunden
|
||||
|
||||
NO_REPLY = peer did not reply with data
|
||||
NO_REPLY = Peer hat nicht mit Daten verbinden
|
||||
|
83
src/main/resources/i18n/ApiError_ro.properties
Normal file
83
src/main/resources/i18n/ApiError_ro.properties
Normal file
@@ -0,0 +1,83 @@
|
||||
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
|
||||
# Keys are from api.ApiError enum
|
||||
|
||||
# "localeLang": "ro",
|
||||
|
||||
### Comun ###
|
||||
JSON = nu s-a reusit analizarea mesajului JSON
|
||||
|
||||
INSUFFICIENT_BALANCE = fonduri insuficiente
|
||||
|
||||
UNAUTHORIZED = Solicitare API neautorizata
|
||||
|
||||
REPOSITORY_ISSUE = eroare a depozitarului
|
||||
|
||||
NON_PRODUCTION = aceasta solictare API nu este permisa pentru sistemele de productie
|
||||
|
||||
BLOCKCHAIN_NEEDS_SYNC = blockchain-ul trebuie sa se sincronizeze mai intai
|
||||
|
||||
NO_TIME_SYNC = nu exista inca o sincronizare a ceasului
|
||||
|
||||
### Validation ###
|
||||
INVALID_SIGNATURE = semnatura invalida
|
||||
|
||||
INVALID_ADDRESS = adresa invalida
|
||||
|
||||
INVALID_PUBLIC_KEY = cheie publica invalid
|
||||
|
||||
INVALID_DATA = date invalida
|
||||
|
||||
INVALID_NETWORK_ADDRESS = invalid network address
|
||||
|
||||
ADDRESS_UNKNOWN = adresa contului necunoscuta
|
||||
|
||||
INVALID_CRITERIA = criteriu de cautare invalid
|
||||
|
||||
INVALID_REFERENCE = referinta invalida
|
||||
|
||||
TRANSFORMATION_ERROR = nu s-a putut transforma JSON in tranzactie
|
||||
|
||||
INVALID_PRIVATE_KEY = invalid private key
|
||||
|
||||
INVALID_HEIGHT = dimensiunea blocului invalida
|
||||
|
||||
CANNOT_MINT = contul nu poate produce moneda
|
||||
|
||||
### Blocks ###
|
||||
BLOCK_UNKNOWN = bloc necunoscut
|
||||
|
||||
### Transactions ###
|
||||
TRANSACTION_UNKNOWN = tranzactie necunoscuta
|
||||
|
||||
PUBLIC_KEY_NOT_FOUND = nu s-a gasit cheia publica
|
||||
|
||||
# this one is special in that caller expected to pass two additional strings, hence the two %s
|
||||
TRANSACTION_INVALID = tranzactie invalida: %s (%s)
|
||||
|
||||
### Naming ###
|
||||
NAME_UNKNOWN = nume necunoscut
|
||||
|
||||
### Asset ###
|
||||
INVALID_ASSET_ID = ID active invalid
|
||||
|
||||
INVALID_ORDER_ID = ID-ul de comanda al activului invalid
|
||||
|
||||
ORDER_UNKNOWN = ID necunoscut al comenzii activului
|
||||
|
||||
### Groups ###
|
||||
GROUP_UNKNOWN = grup necunoscut
|
||||
|
||||
### Foreign Blockchain ###
|
||||
FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = problema de blockchain strain sau de retea ElectrumX
|
||||
|
||||
FOREIGN_BLOCKCHAIN_BALANCE_ISSUE = sold insuficient pe blockchain strain
|
||||
|
||||
FOREIGN_BLOCKCHAIN_TOO_SOON = prea devreme pentru a difuza o tranzactie blockchain straina (LockTime/median block time)
|
||||
|
||||
### Trade Portal ###
|
||||
ORDER_SIZE_TOO_SMALL = valoarea tranzactiei este prea mica
|
||||
|
||||
### Data ###
|
||||
FILE_NOT_FOUND = nu s-a gasit fisierul
|
||||
|
||||
NO_REPLY = omologul nu a raspuns in termenul stabilit
|
46
src/main/resources/i18n/SysTray_ro.properties
Normal file
46
src/main/resources/i18n/SysTray_ro.properties
Normal file
@@ -0,0 +1,46 @@
|
||||
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
|
||||
# SysTray pop-up menu
|
||||
|
||||
APPLYING_UPDATE_AND_RESTARTING = Aplicarea actualizarii automate si repornire...
|
||||
|
||||
AUTO_UPDATE = Actualizare automata
|
||||
|
||||
BLOCK_HEIGHT = dimensiune
|
||||
|
||||
BUILD_VERSION = versiunea compilatiei
|
||||
|
||||
CHECK_TIME_ACCURACY = verificare exactitate ora
|
||||
|
||||
CONNECTING = Se conecteaza
|
||||
|
||||
CONNECTION = conexiune
|
||||
|
||||
CONNECTIONS = conexiuni
|
||||
|
||||
CREATING_BACKUP_OF_DB_FILES = Se creaza copia bazei de date
|
||||
|
||||
DB_BACKUP = Copie baza de date
|
||||
|
||||
DB_CHECKPOINT = Punct de control al bazei de date
|
||||
|
||||
DB_MAINTENANCE = Database Maintenance
|
||||
|
||||
EXIT = iesire
|
||||
|
||||
LITE_NODE = Nod Lite
|
||||
|
||||
MINTING_DISABLED = nu produce moneda
|
||||
|
||||
MINTING_ENABLED = \u2714 Minting
|
||||
|
||||
OPEN_UI = Deschidere interfata utilizator IU
|
||||
|
||||
PERFORMING_DB_CHECKPOINT = Salvarea modificarilor nerealizate ale bazei de date...
|
||||
|
||||
PERFORMING_DB_MAINTENANCE = Efectuarea intretinerii programate<74>
|
||||
|
||||
SYNCHRONIZE_CLOCK = Sincronizare ceas
|
||||
|
||||
SYNCHRONIZING_BLOCKCHAIN = Sincronizare
|
||||
|
||||
SYNCHRONIZING_CLOCK = Se sincronizeaza ceasul
|
195
src/main/resources/i18n/TransactionValidity_ro.properties
Normal file
195
src/main/resources/i18n/TransactionValidity_ro.properties
Normal file
@@ -0,0 +1,195 @@
|
||||
#
|
||||
|
||||
ACCOUNT_ALREADY_EXISTS = contul exista deja
|
||||
|
||||
ACCOUNT_CANNOT_REWARD_SHARE = contul nu poate genera reward-share
|
||||
|
||||
ADDRESS_ABOVE_RATE_LIMIT = adresa a atins limita specificata
|
||||
|
||||
ADDRESS_BLOCKED = aceasta adresa este blocata
|
||||
|
||||
ALREADY_GROUP_ADMIN = sunteti deja admin
|
||||
|
||||
ALREADY_GROUP_MEMBER = sunteti deja membru
|
||||
|
||||
ALREADY_VOTED_FOR_THAT_OPTION = deja ati votat pentru aceasta optiune
|
||||
|
||||
ASSET_ALREADY_EXISTS = activul deja exista
|
||||
|
||||
ASSET_DOES_NOT_EXIST = activul un exista
|
||||
|
||||
ASSET_DOES_NOT_MATCH_AT = activul nu se potriveste cu activul TA
|
||||
|
||||
ASSET_NOT_SPENDABLE = activul nu poate fi utilizat
|
||||
|
||||
AT_ALREADY_EXISTS = TA exista deja
|
||||
|
||||
AT_IS_FINISHED = TA s-a terminat
|
||||
|
||||
AT_UNKNOWN = TA necunoscuta
|
||||
|
||||
BAN_EXISTS = ban-ul este deja folosit
|
||||
|
||||
BAN_UNKNOWN = ban necunoscut
|
||||
|
||||
BANNED_FROM_GROUP = accesul la grup a fost blocat
|
||||
|
||||
BUYER_ALREADY_OWNER = cumparatorul este deja detinator
|
||||
|
||||
CLOCK_NOT_SYNCED = ceasul nu este sincronizat
|
||||
|
||||
DUPLICATE_MESSAGE = adresa a trimis mesaje duplicate
|
||||
|
||||
DUPLICATE_OPTION = optiune duplicata
|
||||
|
||||
GROUP_ALREADY_EXISTS = grupul deja exista
|
||||
|
||||
GROUP_APPROVAL_DECIDED = aprobarea grupului a fost deja decisa
|
||||
|
||||
GROUP_APPROVAL_NOT_REQUIRED = aprobarea grupului nu este solicitata
|
||||
|
||||
GROUP_DOES_NOT_EXIST = grupul nu exista
|
||||
|
||||
GROUP_ID_MISMATCH = ID-ul grupului incorect
|
||||
|
||||
GROUP_OWNER_CANNOT_LEAVE = proprietarul grupului nu poate parasi grupul
|
||||
|
||||
HAVE_EQUALS_WANT = a avea un obiect este acelasi lucru cu a vrea un obiect
|
||||
|
||||
INCORRECT_NONCE = numar PoW incorect
|
||||
|
||||
INSUFFICIENT_FEE = taxa insuficienta
|
||||
|
||||
INVALID_ADDRESS = adresa invalida
|
||||
|
||||
INVALID_AMOUNT = suma invalida
|
||||
|
||||
INVALID_ASSET_OWNER = propietar al activului invalid
|
||||
|
||||
INVALID_AT_TRANSACTION = tranzactie automata invalida
|
||||
|
||||
INVALID_AT_TYPE_LENGTH = TA invalida 'tip' lungime
|
||||
|
||||
INVALID_BUT_OK = invalid dar OK
|
||||
|
||||
INVALID_CREATION_BYTES = octeti de creatie invalizi
|
||||
|
||||
INVALID_DATA_LENGTH = lungimea datelor invalida
|
||||
|
||||
INVALID_DESCRIPTION_LENGTH = lungimea descrierii invalida
|
||||
|
||||
INVALID_GROUP_APPROVAL_THRESHOLD = prag de aprobare a grupului invalid
|
||||
|
||||
INVALID_GROUP_BLOCK_DELAY = intarziere invalida a blocului de aprobare a grupului
|
||||
|
||||
INVALID_GROUP_ID = ID de grup invalid
|
||||
|
||||
INVALID_GROUP_OWNER = proprietar de grup invalid
|
||||
|
||||
INVALID_LIFETIME = durata de viata invalida
|
||||
|
||||
INVALID_NAME_LENGTH = lungimea numelui invalida
|
||||
|
||||
INVALID_NAME_OWNER = numele proprietarului invalid
|
||||
|
||||
INVALID_OPTION_LENGTH = lungimea optiunii invalida
|
||||
|
||||
INVALID_OPTIONS_COUNT = contor de optiuni invalid
|
||||
|
||||
INVALID_ORDER_CREATOR = creator de ordine invalid
|
||||
|
||||
INVALID_PAYMENTS_COUNT = contor de plati invalid
|
||||
|
||||
INVALID_PUBLIC_KEY = cheie publica invalida
|
||||
|
||||
INVALID_QUANTITY = cantitate invalida
|
||||
|
||||
INVALID_REFERENCE = referinta invalida
|
||||
|
||||
INVALID_RETURN = returnare invalida
|
||||
|
||||
INVALID_REWARD_SHARE_PERCENT = procentaj al cotei de recompensa invalid
|
||||
|
||||
INVALID_SELLER = vanzator invalid
|
||||
|
||||
INVALID_TAGS_LENGTH = lungime a tagurilor invalida
|
||||
|
||||
INVALID_TIMESTAMP_SIGNATURE = semnatura timestamp invalida
|
||||
|
||||
INVALID_TX_GROUP_ID = ID-ul grupului de tranzactii invalid
|
||||
|
||||
INVALID_VALUE_LENGTH = lungimea "valorii "invalida
|
||||
|
||||
INVITE_UNKNOWN = invitatie de grup invalida
|
||||
|
||||
JOIN_REQUEST_EXISTS = cererea de aderare la grup exista deja
|
||||
|
||||
MAXIMUM_REWARD_SHARES = ati ajuns deja la numarul maxim de cote de recompensa pentru acest cont
|
||||
|
||||
MISSING_CREATOR = creator lipsa
|
||||
|
||||
MULTIPLE_NAMES_FORBIDDEN = este interzisa folosirea mai multor nume inregistrate pe cont
|
||||
|
||||
NAME_ALREADY_FOR_SALE = numele este deja de vanzare
|
||||
|
||||
NAME_ALREADY_REGISTERED = nume deja inregistrat
|
||||
|
||||
NAME_BLOCKED = numele este blocat
|
||||
|
||||
NAME_DOES_NOT_EXIST = numele nu exista
|
||||
|
||||
NAME_NOT_FOR_SALE = numele nu este de vanzare
|
||||
|
||||
NAME_NOT_NORMALIZED = numele nu este in forma "normalizata" Unicode
|
||||
|
||||
NEGATIVE_AMOUNT = suma invalida/negativa
|
||||
|
||||
NEGATIVE_FEE = taxa invalida/negativa
|
||||
|
||||
NEGATIVE_PRICE = pret invalid/negativ
|
||||
|
||||
NO_BALANCE = fonduri insuficiente
|
||||
|
||||
NO_BLOCKCHAIN_LOCK = nodul blochain-ului este momentan ocupat
|
||||
|
||||
NO_FLAG_PERMISSION = contul nu are aceasta permisiune
|
||||
|
||||
NOT_GROUP_ADMIN = contul nu este un administrator de grup
|
||||
|
||||
NOT_GROUP_MEMBER = contul nu este un membru al grupului
|
||||
|
||||
NOT_MINTING_ACCOUNT = contul nu poate genera moneda Qort
|
||||
|
||||
NOT_YET_RELEASED = caracteristica nu este inca disponibila
|
||||
|
||||
OK = OK
|
||||
|
||||
ORDER_ALREADY_CLOSED = ordinul de tranzactionare a activului este deja inchis
|
||||
|
||||
ORDER_DOES_NOT_EXIST = ordinul de comercializare a activului nu exista
|
||||
|
||||
POLL_ALREADY_EXISTS = sondajul exista deja
|
||||
|
||||
POLL_DOES_NOT_EXIST = sondajul nu exista
|
||||
|
||||
POLL_OPTION_DOES_NOT_EXIST = optiunea de sondaj nu exista
|
||||
|
||||
PUBLIC_KEY_UNKNOWN = cheie publica necunoscuta
|
||||
|
||||
REWARD_SHARE_UNKNOWN = cheie de cota de recompensa necunoscuta
|
||||
|
||||
SELF_SHARE_EXISTS = cota personala (cota de recompensa) exista deja
|
||||
|
||||
TIMESTAMP_TOO_NEW = timestamp prea nou
|
||||
|
||||
TIMESTAMP_TOO_OLD = timestamp prea vechi
|
||||
|
||||
TOO_MANY_UNCONFIRMED = contul are prea multe tranzactii neconfirmate in asteptare
|
||||
|
||||
TRANZACTIE_DEJA_CONFIRMATA = tranzactia a fost deja confirmata
|
||||
|
||||
TRANSACTION_ALREADY_EXISTS = tranzactia exista deja
|
||||
|
||||
TRANSACTION_UNKNOWN = tranzactie necunoscuta
|
||||
|
||||
TX_GROUP_ID_MISMATCH = ID-ul de grup al tranzactiei nu se potriveste
|
Reference in New Issue
Block a user