3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-07 23:03:04 +00:00

Add a few basic sanity checks on transactions received from the network at various points, to avoid syntactically invalid transactions from getting into the system (e.g. no inputs or outputs).

This commit is contained in:
Mike Hearn 2013-04-12 11:09:38 +02:00
parent 21ba7e0260
commit d14ac586d7
3 changed files with 10 additions and 3 deletions

View File

@ -448,6 +448,8 @@ public class Peer {
}
private void processTransaction(Transaction tx) throws VerificationException, IOException {
// Check a few basic syntax issues to ensure the received TX isn't nonsense.
tx.verify();
lock.lock();
try {
log.debug("{}: Received tx {}", vAddress, tx.getHashAsString());

View File

@ -883,6 +883,7 @@ public class Wallet implements Serializable, BlockChainListener {
// Do a brief risk analysis of the transaction and its dependencies to check for any possible attacks.
lock.lock();
try {
tx.verify();
// Repeat the check of relevancy here, even though the caller may have already done so - this is to avoid
// race conditions where receivePending may be being called in parallel.
if (!isPendingTransactionRelevant(tx))
@ -1440,6 +1441,7 @@ public class Wallet implements Serializable, BlockChainListener {
* <p>Triggers an auto save.</p>
*/
public void commitTx(Transaction tx) throws VerificationException {
tx.verify();
lock.lock();
try {
checkArgument(!pending.containsKey(tx.getHash()), "commitTx called on the same transaction twice");

View File

@ -786,9 +786,12 @@ public class PeerTest extends TestWithNetworkConnections {
connect();
Transaction t1 = new Transaction(unitTestParams);
t1.addInput(new TransactionInput(unitTestParams, t1, new byte[]{}));
t1.addOutput(Utils.toNanoCoins(1, 0), wallet.getChangeAddress());
inbound(peer, t1);
inbound(peer, new NotFoundMessage(unitTestParams, Lists.newArrayList(new InventoryItem(InventoryItem.Type.Transaction, t1.getInput(0).getHash()))));
t1.addOutput(Utils.toNanoCoins(1, 0), new ECKey().toAddress(unitTestParams));
Transaction t2 = new Transaction(unitTestParams);
t2.addInput(t1.getOutput(0));
t2.addOutput(Utils.toNanoCoins(1, 0), wallet.getChangeAddress());
inbound(peer, t2);
inbound(peer, new NotFoundMessage(unitTestParams, Lists.newArrayList(new InventoryItem(InventoryItem.Type.Transaction, t2.getInput(0).getHash()))));
assertTrue(throwables[0] instanceof NullPointerException);
}