diff --git a/README.md b/README.md index fa4d1213..7718163c 100644 --- a/README.md +++ b/README.md @@ -15,20 +15,31 @@ Building the future one block at a time. Welcome to Qortal. # Building the Qortal Core from Source -## Build / run +## Build / Run - Requires Java 11. OpenJDK 11 recommended over Java SE. - Install Maven - Use Maven to fetch dependencies and build: `mvn clean package` +- Update Maven dependencies: `mvn install` - Built JAR should be something like `target/qortal-1.0.jar` - Create basic *settings.json* file: `echo '{}' > settings.json` - Run JAR in same working directory as *settings.json*: `java -jar target/qortal-1.0.jar` - Wrap in shell script, add JVM flags, redirection, backgrounding, etc. as necessary. - Or use supplied example shell script: *start.sh* +## IntelliJ IDEA Configuration + +- Run -> Edit Configurations +- Add New Application +- Name: qortal +- SDK: java 11 +- Main Class: org.qortal.controller.Controller +- Program arguments: settings.json -Dlog4j.configurationFile=log4j2.properties -ea +- Environment variables: Djava.net.preferIPv4Stack=false + # Using a pre-built Qortal 'jar' binary -If you would prefer to utilize a released version of Qortal, you may do so by downloading one of the available releases from the releases page, that are also linked on https://qortal.org and https://qortal.dev. +If you prefer to utilize a released version of Qortal, you may do so by downloading one of the available releases from the releases page, that are also linked on https://qortal.org and https://qortal.dev. # Learning Q-App Development diff --git a/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java b/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java index bc37a11a..1c7b34a8 100644 --- a/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java +++ b/src/main/java/org/qortal/transaction/CancelSellNameTransaction.java @@ -22,28 +22,23 @@ public class CancelSellNameTransaction extends Transaction { private CancelSellNameTransactionData cancelSellNameTransactionData; // Constructors - public CancelSellNameTransaction(Repository repository, TransactionData transactionData) { super(repository, transactionData); - this.cancelSellNameTransactionData = (CancelSellNameTransactionData) this.transactionData; } // More information - @Override public List getRecipientAddresses() throws DataException { - return Collections.emptyList(); + return Collections.emptyList(); // No recipient address for this transaction } // Navigation - public Account getOwner() { - return this.getCreator(); + return this.getCreator(); // The creator of the transaction is the owner } // Processing - @Override public ValidationResult isValid() throws DataException { String name = this.cancelSellNameTransactionData.getName(); @@ -57,61 +52,56 @@ public class CancelSellNameTransaction extends Transaction { if (!name.equals(Unicode.normalize(name))) return ValidationResult.NAME_NOT_NORMALIZED; + // Retrieve name data from repository NameData nameData = this.repository.getNameRepository().fromName(name); - // Check name exists + // Check if name exists if (nameData == null) return ValidationResult.NAME_DOES_NOT_EXIST; // Check name is currently for sale if (!nameData.isForSale()) { - // Only validate after feature-trigger timestamp, due to a small number of double cancelations in the chain history + // Validate after feature-trigger timestamp, due to potential double cancellations if (this.cancelSellNameTransactionData.getTimestamp() > BlockChain.getInstance().getCancelSellNameValidationTimestamp()) return ValidationResult.NAME_NOT_FOR_SALE; } - // Check transaction creator matches name's current owner + // Check if transaction creator matches the name's current owner Account owner = getOwner(); if (!owner.getAddress().equals(nameData.getOwner())) return ValidationResult.INVALID_NAME_OWNER; - // Check issuer has enough funds + // Check if issuer has enough balance for the transaction fee if (owner.getConfirmedBalance(Asset.QORT) < cancelSellNameTransactionData.getFee()) return ValidationResult.NO_BALANCE; - return ValidationResult.OK; - + return ValidationResult.OK; // All validations passed } @Override public void preProcess() throws DataException { - CancelSellNameTransactionData cancelSellNameTransactionData = (CancelSellNameTransactionData) transactionData; - - // Rebuild this name in the Names table from the transaction history - // This is necessary because in some rare cases names can be missing from the Names table after registration - // but we have been unable to reproduce the issue and track down the root cause + // Direct access to class field, no need to redeclare NamesDatabaseIntegrityCheck namesDatabaseIntegrityCheck = new NamesDatabaseIntegrityCheck(); - namesDatabaseIntegrityCheck.rebuildName(cancelSellNameTransactionData.getName(), this.repository); + namesDatabaseIntegrityCheck.rebuildName(this.cancelSellNameTransactionData.getName(), this.repository); } @Override public void process() throws DataException { - // Update Name + // Update the Name to reflect the cancellation of the sale Name name = new Name(this.repository, cancelSellNameTransactionData.getName()); name.cancelSell(cancelSellNameTransactionData); - // Save this transaction, with updated "name reference" to previous transaction that updated name + // Save this transaction with updated "name reference" this.repository.getTransactionRepository().save(cancelSellNameTransactionData); } @Override public void orphan() throws DataException { - // Revert name + // Revert the cancellation of the name sale Name name = new Name(this.repository, cancelSellNameTransactionData.getName()); name.uncancelSell(cancelSellNameTransactionData); - // Save this transaction, with removed "name reference" + // Save the transaction with the reverted "name reference" this.repository.getTransactionRepository().save(cancelSellNameTransactionData); } - } diff --git a/src/main/java/org/qortal/transaction/SellNameTransaction.java b/src/main/java/org/qortal/transaction/SellNameTransaction.java index b2fd1484..3b6bf5df 100644 --- a/src/main/java/org/qortal/transaction/SellNameTransaction.java +++ b/src/main/java/org/qortal/transaction/SellNameTransaction.java @@ -24,28 +24,23 @@ public class SellNameTransaction extends Transaction { private SellNameTransactionData sellNameTransactionData; // Constructors - public SellNameTransaction(Repository repository, TransactionData transactionData) { super(repository, transactionData); - this.sellNameTransactionData = (SellNameTransactionData) this.transactionData; } // More information - @Override public List getRecipientAddresses() throws DataException { - return Collections.emptyList(); + return Collections.emptyList(); // No direct recipient address for this transaction } // Navigation - public Account getOwner() { - return this.getCreator(); + return this.getCreator(); // Owner is the creator of the transaction } // Processing - @Override public ValidationResult isValid() throws DataException { String name = this.sellNameTransactionData.getName(); @@ -59,59 +54,54 @@ public class SellNameTransaction extends Transaction { if (!name.equals(Unicode.normalize(name))) return ValidationResult.NAME_NOT_NORMALIZED; + // Retrieve name data from repository NameData nameData = this.repository.getNameRepository().fromName(name); - // Check name exists + // Check if name exists if (nameData == null) return ValidationResult.NAME_DOES_NOT_EXIST; - // Check name isn't currently for sale + // Check name is not already for sale if (nameData.isForSale()) return ValidationResult.NAME_ALREADY_FOR_SALE; - // Check transaction's public key matches name's current owner + // Validate transaction's public key matches name's current owner Account owner = getOwner(); if (!owner.getAddress().equals(nameData.getOwner())) return ValidationResult.INVALID_NAME_OWNER; - // Check amount is positive - if (this.sellNameTransactionData.getAmount() <= 0) + // Check amount is positive and within valid range + long amount = this.sellNameTransactionData.getAmount(); + if (amount <= 0) return ValidationResult.NEGATIVE_AMOUNT; - - // Check amount within bounds - if (this.sellNameTransactionData.getAmount() >= MAX_AMOUNT) + if (amount >= MAX_AMOUNT) return ValidationResult.INVALID_AMOUNT; - // Check issuer has enough funds + // Check if owner has enough balance for the transaction fee if (owner.getConfirmedBalance(Asset.QORT) < this.sellNameTransactionData.getFee()) return ValidationResult.NO_BALANCE; - return ValidationResult.OK; + return ValidationResult.OK; // All validation checks passed } @Override public void preProcess() throws DataException { - SellNameTransactionData sellNameTransactionData = (SellNameTransactionData) transactionData; - - // Rebuild this name in the Names table from the transaction history - // This is necessary because in some rare cases names can be missing from the Names table after registration - // but we have been unable to reproduce the issue and track down the root cause + // Directly access class field rather than local variable for clarity NamesDatabaseIntegrityCheck namesDatabaseIntegrityCheck = new NamesDatabaseIntegrityCheck(); - namesDatabaseIntegrityCheck.rebuildName(sellNameTransactionData.getName(), this.repository); + namesDatabaseIntegrityCheck.rebuildName(this.sellNameTransactionData.getName(), this.repository); } @Override public void process() throws DataException { - // Sell Name + // Sell the name Name name = new Name(this.repository, this.sellNameTransactionData.getName()); name.sell(this.sellNameTransactionData); } @Override public void orphan() throws DataException { - // Revert name + // Revert the name sale in case of orphaning Name name = new Name(this.repository, this.sellNameTransactionData.getName()); name.unsell(this.sellNameTransactionData); } - } diff --git a/src/main/resources/i18n/SysTray_nl.properties b/src/main/resources/i18n/SysTray_nl.properties index f42d3e96..d6f946c8 100644 --- a/src/main/resources/i18n/SysTray_nl.properties +++ b/src/main/resources/i18n/SysTray_nl.properties @@ -45,10 +45,10 @@ SYNCHRONIZING_BLOCKCHAIN = Bezig met synchronizeren SYNCHRONIZING_CLOCK = Klok wordt gesynchronizeerd -RESTARTING_NODE = Knooppunt opnieuw starten +RESTARTING_NODE = Node opnieuw starten -APPLYING_RESTARTING_NODE = Herstartknooppunt toepassen. Wees alstublieft geduldig... +APPLYING_RESTARTING_NODE = Node wordt herstart. Even geduld alstublieft... -BOOTSTRAP_NODE = Opstartknooppunt +BOOTSTRAP_NODE = Opstarten van node (bootstrap) -APPLYING_BOOTSTRAP_AND_RESTARTING = Bootstrap toepassen en knooppunt opnieuw starten. Wees alstublieft geduldig... +APPLYING_BOOTSTRAP_AND_RESTARTING = Bootstrap toepassen en node opnieuw starten. Even geduld alstublieft... diff --git a/src/main/resources/i18n/TransactionValidity_nl.properties b/src/main/resources/i18n/TransactionValidity_nl.properties index 7ee466d1..09f11568 100644 --- a/src/main/resources/i18n/TransactionValidity_nl.properties +++ b/src/main/resources/i18n/TransactionValidity_nl.properties @@ -196,6 +196,7 @@ TX_GROUP_ID_MISMATCH = groep-ID komt niet overeen TRANSFER_PRIVS_DISABLED = overdrachtsrechten uitgeschakeld -TEMPORARY_DISABLED = Naamregistratie tijdelijk uitgeschakeld +TEMPORARY_DISABLED = naamregistratie tijdelijk uitgeschakeld GENERAL_TEMPORARY_DISABLED = Tijdelijk uitgeschakeld +