forked from Qortal/qortal
Change BlockMinter to pick BEST block if minting with several accounts
+ Removed obsolete BlockMinter.deleteInvalidTransactions()
This commit is contained in:
parent
482947dbf4
commit
8906ce9b26
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user