Browse Source

Add support for "only one registered name per account" + de-static brokenMD160 blockchain flag

split-DB
catbref 6 years ago
parent
commit
edcbf4f318
  1. 15
      src/main/java/org/qora/block/BlockChain.java
  2. 2
      src/main/java/org/qora/crypto/Crypto.java
  3. 9
      src/main/java/org/qora/transaction/RegisterNameTransaction.java
  4. 1
      src/main/java/org/qora/transaction/Transaction.java
  5. 2
      src/test/java/org/qora/test/CryptoTests.java

15
src/main/java/org/qora/block/BlockChain.java

@ -84,8 +84,11 @@ public class BlockChain {
@XmlJavaTypeAdapter(StringLongMapXmlAdapter.class)
private Map<String, Long> 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

2
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);

9
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;

1
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;

2
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));
}

Loading…
Cancel
Save