From e72cebcb280cee073d26474c6059ef8e6cb26d37 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 30 Aug 2016 16:05:27 +0200 Subject: [PATCH] initial commit --- .project | 17 + .settings/org.eclipse.m2e.core.prefs | 4 + opret-testapp/.classpath | 31 ++ opret-testapp/.gitignore | 4 + opret-testapp/.project | 23 ++ .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.eclipse.m2e.core.prefs | 4 + opret-testapp/pom.xml | 84 +++++ .../java/org/tcpid/opretj/testapp/App.java | 297 ++++++++++++++++++ .../org/tcpid/opretj/testapp/NetworkEnum.java | 43 +++ opret-testapp/src/main/resources/logback.xml | 21 ++ opretj/.classpath | 26 ++ opretj/.gitignore | 1 + opretj/.project | 23 ++ opretj/.settings/org.eclipse.jdt.core.prefs | 12 + opretj/.settings/org.eclipse.m2e.core.prefs | 4 + opretj/pom.xml | 54 ++++ .../org/tcpid/opretj/OPRETBaseHandler.java | 92 ++++++ .../opretj/OPRETChangeEventListener.java | 6 + .../java/org/tcpid/opretj/OPRETECParser.java | 136 ++++++++ .../opretj/OPRETECRevokeEventListener.java | 6 + .../tcpid/opretj/OPRETHandlerInterface.java | 32 ++ .../org/tcpid/opretj/OPRETSimpleLogger.java | 41 +++ .../org/tcpid/opretj/OPRETTransaction.java | 50 +++ .../java/org/tcpid/opretj/OPRETWallet.java | 194 ++++++++++++ .../org/tcpid/opretj/OPRETWalletAppKit.java | 60 ++++ pom.xml | 11 + 27 files changed, 1281 insertions(+) create mode 100644 .project create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 opret-testapp/.classpath create mode 100644 opret-testapp/.gitignore create mode 100644 opret-testapp/.project create mode 100644 opret-testapp/.settings/org.eclipse.jdt.core.prefs create mode 100644 opret-testapp/.settings/org.eclipse.m2e.core.prefs create mode 100644 opret-testapp/pom.xml create mode 100644 opret-testapp/src/main/java/org/tcpid/opretj/testapp/App.java create mode 100644 opret-testapp/src/main/java/org/tcpid/opretj/testapp/NetworkEnum.java create mode 100644 opret-testapp/src/main/resources/logback.xml create mode 100644 opretj/.classpath create mode 100644 opretj/.gitignore create mode 100644 opretj/.project create mode 100644 opretj/.settings/org.eclipse.jdt.core.prefs create mode 100644 opretj/.settings/org.eclipse.m2e.core.prefs create mode 100644 opretj/pom.xml create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETBaseHandler.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETChangeEventListener.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETECParser.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETECRevokeEventListener.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETHandlerInterface.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETSimpleLogger.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETTransaction.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETWallet.java create mode 100644 opretj/src/main/java/org/tcpid/opretj/OPRETWalletAppKit.java create mode 100644 pom.xml diff --git a/.project b/.project new file mode 100644 index 0000000..79f7f6f --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + opret-parent + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/opret-testapp/.classpath b/opret-testapp/.classpath new file mode 100644 index 0000000..6d7587a --- /dev/null +++ b/opret-testapp/.classpath @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/opret-testapp/.gitignore b/opret-testapp/.gitignore new file mode 100644 index 0000000..d0d01ce --- /dev/null +++ b/opret-testapp/.gitignore @@ -0,0 +1,4 @@ +/target/ +/walletappkit-example.spvchain +/walletappkit-example.wallet +/opretwalletorg.bitcoin.test.wallet diff --git a/opret-testapp/.project b/opret-testapp/.project new file mode 100644 index 0000000..f290b8f --- /dev/null +++ b/opret-testapp/.project @@ -0,0 +1,23 @@ + + + opret-testapp + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/opret-testapp/.settings/org.eclipse.jdt.core.prefs b/opret-testapp/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..714351a --- /dev/null +++ b/opret-testapp/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/opret-testapp/.settings/org.eclipse.m2e.core.prefs b/opret-testapp/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/opret-testapp/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/opret-testapp/pom.xml b/opret-testapp/pom.xml new file mode 100644 index 0000000..f59fcb0 --- /dev/null +++ b/opret-testapp/pom.xml @@ -0,0 +1,84 @@ + + 4.0.0 + + org.tcpid + opret-parent + 0.0.1-SNAPSHOT + + opret-testapp + + + + + + org.bitcoinj + bitcoinj-core + 0.14.3 + + + + junit + junit + 3.8.1 + test + + + + ch.qos.logback + logback-classic + 1.0.13 + + + + org.abstractj.kalium + kalium + 0.5.0 + + + + org.tcpid + opretj + 0.0.1-SNAPSHOT + + + net.sf.jopt-simple + jopt-simple + 4.3 + + + + + + 1.8 + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + org.tcpid.opretj.testapp.App + + + logback.configurationFile + ${basedir}/opret-testapp/src/main/resources/logback.xml + + + + + + + + \ No newline at end of file diff --git a/opret-testapp/src/main/java/org/tcpid/opretj/testapp/App.java b/opret-testapp/src/main/java/org/tcpid/opretj/testapp/App.java new file mode 100644 index 0000000..f238ced --- /dev/null +++ b/opret-testapp/src/main/java/org/tcpid/opretj/testapp/App.java @@ -0,0 +1,297 @@ +package org.tcpid.opretj.testapp; + +import static org.bitcoinj.script.ScriptOpCodes.OP_RETURN; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.List; +import java.util.Scanner; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; +import org.abstractj.kalium.keys.SigningKey; +import org.abstractj.kalium.keys.VerifyKey; +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.ECKey; +import org.bitcoinj.core.InsufficientMoneyException; +import org.bitcoinj.core.NetworkParameters; +import org.bitcoinj.core.Sha256Hash; +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionConfidence; +import org.bitcoinj.core.TransactionOutput; +import org.bitcoinj.core.Utils; +import org.bitcoinj.core.listeners.TransactionConfidenceEventListener; +import org.bitcoinj.script.Script; +import org.bitcoinj.script.ScriptBuilder; +import org.bitcoinj.wallet.KeyChain.KeyPurpose; +import org.bitcoinj.wallet.SendRequest; +import org.bitcoinj.wallet.Wallet; +import org.bitcoinj.wallet.Wallet.SendResult; +import org.bitcoinj.wallet.listeners.KeyChainEventListener; +import org.bitcoinj.wallet.listeners.ScriptsChangeEventListener; +import org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener; +import org.bitcoinj.wallet.listeners.WalletCoinsSentEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tcpid.opretj.*; + +import com.google.common.primitives.Bytes; + + +public class App { + private static final Logger logger = LoggerFactory.getLogger(App.class); + + public static final long OPRET_BIRTHDAY = 1471989600; + static byte[] rawKey = Sha256Hash.hash("TESTSEED".getBytes()); + static SigningKey sk = new SigningKey(rawKey); + static VerifyKey v = sk.getVerifyKey(); + private static byte[] pkhash = Sha256Hash.hash(v.toBytes()); + static byte[] revokemsg = Bytes.concat("Revoke ".getBytes(), pkhash); + + public static void check(final byte[] pkhash, final byte[] sig) { + logger.warn("CHECKING REVOKE PK {} - SIG {}", Utils.HEX.encode(pkhash), Utils.HEX.encode(sig)); + + if (!Arrays.equals(App.pkhash, pkhash)) { + logger.warn("Unknown PK {}", Utils.HEX.encode(pkhash)); + return; + } + + logger.warn("Using VerifyKey {}", v); + + if (v.verify(revokemsg, sig)) { + logger.warn("REVOKED VerifyKey {}", v); + } else { + logger.warn("SIGNATURE does not match!"); + } + } + + public static void main(String[] args) throws Exception { + OptionParser parser = new OptionParser(); + OptionSpec net = parser.accepts("net", "The network to run the examples on").withRequiredArg().ofType(NetworkEnum.class).defaultsTo(NetworkEnum.TEST); + parser.accepts("help", "Displays program options"); + OptionSet opts = parser.parse(args); + if (opts.has("help") || !opts.has(net)) { + System.err.println("usage: App --net=MAIN/TEST/REGTEST"); + parser.printHelpOn(System.err); + return; + } + final NetworkParameters params = net.value(opts).get(); + + final OPRETECParser bs = new OPRETECParser(); + + bs.addOPRETECRevokeEventListener(new OPRETECRevokeEventListener() { + public void onOPRETRevoke(final byte[] pkhash, final byte[] sig) { + // logger.warn("REVOKE PK {} - SIG {}", + // Utils.HEX.encode(pkhash), Utils.HEX.encode(sig)); + check(pkhash, sig); + } + }); + + long earliestTime; + if (params.getId().equals(NetworkParameters.ID_REGTEST)) { + earliestTime = OPRET_BIRTHDAY; + } else if (params.getId().equals(NetworkParameters.ID_TESTNET)) { + earliestTime = OPRET_BIRTHDAY; + } else { + earliestTime = Utils.currentTimeSeconds(); + } + + bs.addOPRET(pkhash, earliestTime); + //bs.addOPRET(Sha256Hash.hash("test1".getBytes()), earliestTime); + //bs.addOPRET(Utils.HEX.decode("0f490dee643b01b06e0ea84c253a90050a3543cfb7c74319fb47b04afee5b872"), earliestTime); + + // Now we initialize a new WalletAppKit. The kit handles all the + // boilerplate for us and is the easiest way to get everything up and + // running. + // Have a look at the WalletAppKit documentation and its source to + // understand what's happening behind the scenes: + // https://github.com/bitcoinj/bitcoinj/blob/master/core/src/main/java/org/bitcoinj/kits/WalletAppKit.java + final OPRETWalletAppKit kit = new OPRETWalletAppKit(params, new File("."), "opretwallet" + params.getId(), bs); + + // In case you want to connect with your local bitcoind tell the kit to + // connect to localhost. + // You must do that in reg test mode. + if (params.getId().equals(NetworkParameters.ID_REGTEST)) { + kit.connectToLocalHost(); + } + + // Now we start the kit and sync the blockchain. + // bitcoinj is working a lot with the Google Guava libraries. The + // WalletAppKit extends the AbstractIdleService. Have a look at the + // introduction to Guava services: + // https://github.com/google/guava/wiki/ServiceExplained + kit.startAsync(); + kit.awaitRunning(); + + final OPRETWallet wallet = kit.opretwallet(); + + wallet.addCoinsReceivedEventListener(new WalletCoinsReceivedEventListener() { + public void onCoinsReceived(Wallet wallet, Transaction tx, Coin prevBalance, Coin newBalance) { + System.out.println("-----> coins resceived: " + tx.getHashAsString()); + System.out.println("received: " + tx.getValue(wallet)); + } + }); + + wallet.addCoinsSentEventListener(new WalletCoinsSentEventListener() { + public void onCoinsSent(Wallet wallet, Transaction tx, Coin prevBalance, Coin newBalance) { + System.out.println("coins sent"); + } + }); + + wallet.addKeyChainEventListener(new KeyChainEventListener() { + public void onKeysAdded(List keys) { + System.out.println("new key added"); + } + }); + + wallet.addScriptsChangeEventListener(new ScriptsChangeEventListener() { + public void onScriptsChanged(Wallet wallet, List