From 0942bb57b5003f8d6e02080844c1d91baaba9cb2 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Tue, 15 Apr 2014 13:35:11 +0200 Subject: [PATCH] Add a double spending test program --- .../google/bitcoin/examples/DoubleSpend.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 examples/src/main/java/com/google/bitcoin/examples/DoubleSpend.java diff --git a/examples/src/main/java/com/google/bitcoin/examples/DoubleSpend.java b/examples/src/main/java/com/google/bitcoin/examples/DoubleSpend.java new file mode 100644 index 00000000..130f9ac3 --- /dev/null +++ b/examples/src/main/java/com/google/bitcoin/examples/DoubleSpend.java @@ -0,0 +1,47 @@ +package com.google.bitcoin.examples; + +import com.google.bitcoin.core.*; +import com.google.bitcoin.kits.WalletAppKit; +import com.google.bitcoin.params.RegTestParams; +import com.google.bitcoin.utils.BriefLogFormatter; +import com.google.bitcoin.utils.Threading; + +import java.io.File; +import java.math.BigInteger; + +/** + * This is a little test app that waits for a coin on a local regtest node, then generates two transactions that double + * spend the same output and sends them. It's useful for testing double spend codepaths but is otherwise not something + * you would normally want to do. + */ +public class DoubleSpend { + public static void main(String[] args) throws Exception { + BriefLogFormatter.init(); + final RegTestParams params = RegTestParams.get(); + WalletAppKit kit = new WalletAppKit(params, new File("."), "doublespend"); + kit.connectToLocalHost(); + kit.setAutoSave(false); + kit.startAsync(); + kit.awaitRunning(); + + System.out.println(kit.wallet()); + + kit.wallet().getBalanceFuture(Utils.COIN, Wallet.BalanceType.AVAILABLE).get(); + Transaction tx1 = kit.wallet().createSend(new Address(params, "muYPFNCv7KQEG2ZLM7Z3y96kJnNyXJ53wm"), Utils.CENT); + Transaction tx2 = kit.wallet().createSend(new Address(params, "muYPFNCv7KQEG2ZLM7Z3y96kJnNyXJ53wm"), Utils.CENT.add(BigInteger.TEN)); + final Peer peer = kit.peerGroup().getConnectedPeers().get(0); + peer.addEventListener(new AbstractPeerEventListener() { + @Override + public Message onPreMessageReceived(Peer peer, Message m) { + System.err.println("Got a message!" + m.getClass().getSimpleName() + ": " + m); + return m; + } + }, Threading.SAME_THREAD); + peer.sendMessage(tx1); + peer.sendMessage(tx2); + + Thread.sleep(5000); + kit.stopAsync(); + kit.awaitTerminated(); + } +}