From edcbf4f3185f9a4647a5baa07714ae2fa5cb2fea Mon Sep 17 00:00:00 2001 From: catbref Date: Wed, 27 Feb 2019 10:34:25 +0000 Subject: [PATCH] Add support for "only one registered name per account" + de-static brokenMD160 blockchain flag --- src/main/java/org/qora/block/BlockChain.java | 15 +++++++++++---- src/main/java/org/qora/crypto/Crypto.java | 2 +- .../qora/transaction/RegisterNameTransaction.java | 9 +++++++-- .../java/org/qora/transaction/Transaction.java | 1 + src/test/java/org/qora/test/CryptoTests.java | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/qora/block/BlockChain.java b/src/main/java/org/qora/block/BlockChain.java index 0c7681b7..c008ff5d 100644 --- a/src/main/java/org/qora/block/BlockChain.java +++ b/src/main/java/org/qora/block/BlockChain.java @@ -84,8 +84,11 @@ public class BlockChain { @XmlJavaTypeAdapter(StringLongMapXmlAdapter.class) private Map featureTriggers; - // This property is slightly different as we need it early and we want to avoid getInstance() loop - private static boolean useBrokenMD160ForAddresses = false; + /** Whether to use legacy, broken RIPEMD160 implementation when converting public keys to addresses. */ + private boolean useBrokenMD160ForAddresses = false; + + /** Whether only one registered name is allowed per account. */ + private boolean oneNamePerAccount = false; // Constructors, etc. @@ -217,8 +220,12 @@ public class BlockChain { return this.defaultGroupId; } - public static boolean getUseBrokenMD160ForAddresses() { - return useBrokenMD160ForAddresses; + public boolean getUseBrokenMD160ForAddresses() { + return this.useBrokenMD160ForAddresses; + } + + public boolean oneNamePerAccount() { + return this.oneNamePerAccount; } // Convenience methods for specific blockchain feature triggers diff --git a/src/main/java/org/qora/crypto/Crypto.java b/src/main/java/org/qora/crypto/Crypto.java index 647df9bc..31bc2459 100644 --- a/src/main/java/org/qora/crypto/Crypto.java +++ b/src/main/java/org/qora/crypto/Crypto.java @@ -50,7 +50,7 @@ public class Crypto { byte[] inputHash = digest(input); // Use RIPEMD160 to create shorter address - if (BlockChain.getUseBrokenMD160ForAddresses()) { + if (BlockChain.getInstance().getUseBrokenMD160ForAddresses()) { // Legacy BROKEN MD160 BrokenMD160 brokenMD160 = new BrokenMD160(); inputHash = brokenMD160.digest(inputHash); diff --git a/src/main/java/org/qora/transaction/RegisterNameTransaction.java b/src/main/java/org/qora/transaction/RegisterNameTransaction.java index 8e85e014..cd2e8d93 100644 --- a/src/main/java/org/qora/transaction/RegisterNameTransaction.java +++ b/src/main/java/org/qora/transaction/RegisterNameTransaction.java @@ -8,6 +8,7 @@ import java.util.List; import org.qora.account.Account; import org.qora.account.PublicKeyAccount; import org.qora.asset.Asset; +import org.qora.block.BlockChain; import org.qora.crypto.Crypto; import org.qora.data.transaction.RegisterNameTransactionData; import org.qora.data.transaction.TransactionData; @@ -75,6 +76,12 @@ public class RegisterNameTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { + Account registrant = getRegistrant(); + + // If accounts are only allowed one registered name then check for this + if (BlockChain.getInstance().oneNamePerAccount() && !this.repository.getNameRepository().getNamesByOwner(registrant.getAddress()).isEmpty()) + return ValidationResult.MULTIPLE_NAMES_FORBIDDEN; + // Check owner address is valid if (!Crypto.isValidAddress(registerNameTransactionData.getOwner())) return ValidationResult.INVALID_ADDRESS; @@ -102,8 +109,6 @@ public class RegisterNameTransaction extends Transaction { return ValidationResult.NEGATIVE_FEE; // Check reference is correct - Account registrant = getRegistrant(); - if (!Arrays.equals(registrant.getLastReference(), registerNameTransactionData.getReference())) return ValidationResult.INVALID_REFERENCE; diff --git a/src/main/java/org/qora/transaction/Transaction.java b/src/main/java/org/qora/transaction/Transaction.java index 28584d76..622a6950 100644 --- a/src/main/java/org/qora/transaction/Transaction.java +++ b/src/main/java/org/qora/transaction/Transaction.java @@ -186,6 +186,7 @@ public abstract class Transaction { TRANSACTION_ALREADY_CONFIRMED(66), INVALID_TX_GROUP_ID(67), TX_GROUP_ID_MISMATCH(68), + MULTIPLE_NAMES_FORBIDDEN(69), NOT_YET_RELEASED(1000); public final int value; diff --git a/src/test/java/org/qora/test/CryptoTests.java b/src/test/java/org/qora/test/CryptoTests.java index bbb25ef2..c8947c82 100644 --- a/src/test/java/org/qora/test/CryptoTests.java +++ b/src/test/java/org/qora/test/CryptoTests.java @@ -31,7 +31,7 @@ public class CryptoTests extends Common { @Test public void testPublicKeyToAddress() { byte[] publicKey = HashCode.fromString("775ada64a48a30b3bfc4f1db16bca512d4088704975a62bde78781ce0cba90d6").asBytes(); - String expected = BlockChain.getUseBrokenMD160ForAddresses() ? "QUD9y7NZqTtNwvSAUfewd7zKUGoVivVnTW" : "QPc6TvGJ5RjW6LpwUtafx7XRCdRvyN6rsA"; + String expected = BlockChain.getInstance().getUseBrokenMD160ForAddresses() ? "QUD9y7NZqTtNwvSAUfewd7zKUGoVivVnTW" : "QPc6TvGJ5RjW6LpwUtafx7XRCdRvyN6rsA"; assertEquals(expected, Crypto.toAddress(publicKey)); }