Change BlockMinter to pick BEST block if minting with several accounts

+ Removed obsolete BlockMinter.deleteInvalidTransactions()
This commit is contained in:
catbref 2019-11-12 14:56:45 +00:00
parent 482947dbf4
commit 8906ce9b26

View File

@ -1,15 +1,16 @@
package org.qora.block; package org.qora.block;
import java.math.BigInteger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.qora.account.Account;
import org.qora.account.PrivateKeyAccount; import org.qora.account.PrivateKeyAccount;
import org.qora.account.PublicKeyAccount; import org.qora.account.PublicKeyAccount;
import org.qora.block.Block.ValidationResult; import org.qora.block.Block.ValidationResult;
@ -17,6 +18,7 @@ import org.qora.controller.Controller;
import org.qora.data.account.MintingAccountData; import org.qora.data.account.MintingAccountData;
import org.qora.data.account.RewardShareData; import org.qora.data.account.RewardShareData;
import org.qora.data.block.BlockData; import org.qora.data.block.BlockData;
import org.qora.data.block.BlockSummaryData;
import org.qora.data.transaction.TransactionData; import org.qora.data.transaction.TransactionData;
import org.qora.network.Network; import org.qora.network.Network;
import org.qora.network.Peer; import org.qora.network.Peer;
@ -186,13 +188,27 @@ public class BlockMinter extends Thread {
if (goodBlocks.isEmpty()) if (goodBlocks.isEmpty())
continue; continue;
// Pick random block // Pick best block
// TODO/XXX - shouldn't this pick our BEST block instead? final int parentHeight = previousBlock.getBlockData().getHeight();
int winningIndex = new Random().nextInt(goodBlocks.size()); final byte[] parentBlockSignature = previousBlock.getSignature();
Block newBlock = goodBlocks.get(winningIndex);
// Delete invalid transactions. NOTE: discards repository changes on entry, saves changes on exit. Block newBlock = null;
// deleteInvalidTransactions(repository); BigInteger bestWeight = null;
for (int bi = 0; bi < goodBlocks.size(); ++bi) {
BlockData blockData = goodBlocks.get(bi).getBlockData();
BlockSummaryData blockSummaryData = new BlockSummaryData(blockData);
int minterLevel = Account.getRewardShareEffectiveMintingLevel(repository, blockData.getMinterPublicKey());
blockSummaryData.setMinterLevel(minterLevel);
BigInteger blockWeight = Block.calcBlockWeight(parentHeight, parentBlockSignature, blockSummaryData);
if (bestWeight == null || blockWeight.compareTo(bestWeight) < 0) {
newBlock = goodBlocks.get(bi);
bestWeight = blockWeight;
}
}
// Add unconfirmed transactions // Add unconfirmed transactions
addUnconfirmedTransactions(repository, newBlock); addUnconfirmedTransactions(repository, newBlock);
@ -255,29 +271,6 @@ public class BlockMinter extends Thread {
} }
} }
/**
* Deletes invalid, unconfirmed transactions from repository.
* <p>
* NOTE: calls Transaction.getInvalidTransactions which discards uncommitted
* repository changes.
* <p>
* Also commits the deletion of invalid transactions to the repository.
*
* @param repository
* @throws DataException
*/
private static void deleteInvalidTransactions(Repository repository) throws DataException {
List<TransactionData> invalidTransactions = Transaction.getInvalidTransactions(repository);
// Actually delete invalid transactions from database
for (TransactionData invalidTransactionData : invalidTransactions) {
LOGGER.trace(String.format("Deleting invalid, unconfirmed transaction %s", Base58.encode(invalidTransactionData.getSignature())));
repository.getTransactionRepository().delete(invalidTransactionData);
}
repository.saveChanges();
}
/** /**
* Adds unconfirmed transactions to passed block. * Adds unconfirmed transactions to passed block.
* <p> * <p>
@ -344,9 +337,6 @@ public class BlockMinter extends Thread {
ReentrantLock blockchainLock = Controller.getInstance().getBlockchainLock(); ReentrantLock blockchainLock = Controller.getInstance().getBlockchainLock();
blockchainLock.lock(); blockchainLock.lock();
try { try {
// Delete invalid transactions
// deleteInvalidTransactions(repository);
// Add unconfirmed transactions // Add unconfirmed transactions
addUnconfirmedTransactions(repository, newBlock); addUnconfirmedTransactions(repository, newBlock);