mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-15 11:45:51 +00:00
FullPrunedBlockChain: add a runScripts property, defaulting to true. Resolves issue 463.
This commit is contained in:
parent
e3bcb49c4c
commit
ee206537d7
@ -45,6 +45,9 @@ public class FullPrunedBlockChain extends AbstractBlockChain {
|
|||||||
/** Keeps a map of block hashes to StoredBlocks. */
|
/** Keeps a map of block hashes to StoredBlocks. */
|
||||||
protected final FullPrunedBlockStore blockStore;
|
protected final FullPrunedBlockStore blockStore;
|
||||||
|
|
||||||
|
// Whether or not to execute scriptPubKeys before accepting a transaction (i.e. check signatures).
|
||||||
|
private boolean runScripts = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a BlockChain connected to the given wallet and store. To obtain a {@link Wallet} you can construct
|
* Constructs a BlockChain connected to the given wallet and store. To obtain a {@link Wallet} you can construct
|
||||||
* one from scratch, or you can deserialize a saved wallet from disk using {@link Wallet#loadFromFile(java.io.File)}
|
* one from scratch, or you can deserialize a saved wallet from disk using {@link Wallet#loadFromFile(java.io.File)}
|
||||||
@ -95,6 +98,17 @@ public class FullPrunedBlockChain extends AbstractBlockChain {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not to run scripts whilst accepting blocks (i.e. checking signatures, for most transactions).
|
||||||
|
* If you're accepting data from an untrusted node, such as one found via the P2P network, this should be set
|
||||||
|
* to true (which is the default). If you're downloading a chain from a node you control, script execution
|
||||||
|
* is redundant because you know the connected node won't relay bad data to you. In that case it's safe to set
|
||||||
|
* this to false and obtain a significant speedup.
|
||||||
|
*/
|
||||||
|
public void setRunScripts(boolean value) {
|
||||||
|
this.runScripts = value;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: Remove lots of duplicated code in the two connectTransactions
|
//TODO: Remove lots of duplicated code in the two connectTransactions
|
||||||
|
|
||||||
// TODO: execute in order of largest transaction (by input count) first
|
// TODO: execute in order of largest transaction (by input count) first
|
||||||
@ -218,7 +232,7 @@ public class FullPrunedBlockChain extends AbstractBlockChain {
|
|||||||
totalFees = totalFees.add(valueIn.subtract(valueOut));
|
totalFees = totalFees.add(valueIn.subtract(valueOut));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCoinBase) {
|
if (!isCoinBase && runScripts) {
|
||||||
// Because correctlySpends modifies transactions, this must come after we are done with tx
|
// Because correctlySpends modifies transactions, this must come after we are done with tx
|
||||||
FutureTask<VerificationException> future = new FutureTask<VerificationException>(new Verifier(tx, prevOutScripts, enforcePayToScriptHash));
|
FutureTask<VerificationException> future = new FutureTask<VerificationException>(new Verifier(tx, prevOutScripts, enforcePayToScriptHash));
|
||||||
scriptVerificationExecutor.execute(future);
|
scriptVerificationExecutor.execute(future);
|
||||||
|
@ -101,6 +101,41 @@ public class FullPrunedBlockChainTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void skipScripts() throws Exception {
|
||||||
|
store = new MemoryFullPrunedBlockStore(params, 10);
|
||||||
|
chain = new FullPrunedBlockChain(params, store);
|
||||||
|
|
||||||
|
// Check that we aren't accidentally leaving any references
|
||||||
|
// to the full StoredUndoableBlock's lying around (ie memory leaks)
|
||||||
|
|
||||||
|
ECKey outKey = new ECKey();
|
||||||
|
|
||||||
|
// Build some blocks on genesis block to create a spendable output
|
||||||
|
Block rollingBlock = params.getGenesisBlock().createNextBlockWithCoinbase(outKey.getPubKey());
|
||||||
|
chain.add(rollingBlock);
|
||||||
|
TransactionOutput spendableOutput = rollingBlock.getTransactions().get(0).getOutput(0);
|
||||||
|
for (int i = 1; i < params.getSpendableCoinbaseDepth(); i++) {
|
||||||
|
rollingBlock = rollingBlock.createNextBlockWithCoinbase(outKey.getPubKey());
|
||||||
|
chain.add(rollingBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
rollingBlock = rollingBlock.createNextBlock(null);
|
||||||
|
Transaction t = new Transaction(params);
|
||||||
|
t.addOutput(new TransactionOutput(params, t, Utils.toNanoCoins(50, 0), new byte[] {}));
|
||||||
|
TransactionInput input = t.addInput(spendableOutput);
|
||||||
|
// Invalid script.
|
||||||
|
input.setScriptBytes(new byte[]{});
|
||||||
|
rollingBlock.addTransaction(t);
|
||||||
|
rollingBlock.solve();
|
||||||
|
chain.setRunScripts(false);
|
||||||
|
try {
|
||||||
|
chain.add(rollingBlock);
|
||||||
|
} catch (VerificationException e) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFinalizedBlocks() throws Exception {
|
public void testFinalizedBlocks() throws Exception {
|
||||||
final int UNDOABLE_BLOCKS_STORED = 10;
|
final int UNDOABLE_BLOCKS_STORED = 10;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user