org.bitcoinj.examples.PrivateKeys Maven / Gradle / Ivy
/*
* Copyright 2011 Google Inc.
* Copyright 2014 Andreas Schildbach
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.bitcoinj.examples;
import org.bitcoinj.core.*;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.store.MemoryBlockStore;
import org.bitcoinj.wallet.Wallet;
import java.math.BigInteger;
import java.net.InetAddress;
/**
* This example shows how to solve the challenge Hal posted here:
*
* http://www.bitcoin.org/smf/index.php?topic=3638
* .0
*
* in which a private key with some coins associated with it is published. The goal is to import the private key,
* claim the coins and then send them to a different address.
*/
public class PrivateKeys {
public static void main(String[] args) throws Exception {
// TODO: Assumes main network not testnet. Make it selectable.
NetworkParameters params = MainNetParams.get();
try {
// Decode the private key from Satoshis Base58 variant. If 51 characters long then it's from Bitcoins
// dumpprivkey command and includes a version byte and checksum, or if 52 characters long then it has
// compressed pub key. Otherwise assume it's a raw key.
ECKey key;
if (args[0].length() == 51 || args[0].length() == 52) {
DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(params, args[0]);
key = dumpedPrivateKey.getKey();
} else {
BigInteger privKey = Base58.decodeToBigInteger(args[0]);
key = ECKey.fromPrivate(privKey);
}
System.out.println("Address from private key is: " + key.toAddress(params).toString());
// And the address ...
Address destination = Address.fromBase58(params, args[1]);
// Import the private key to a fresh wallet.
Wallet wallet = new Wallet(params);
wallet.importKey(key);
// Find the transactions that involve those coins.
final MemoryBlockStore blockStore = new MemoryBlockStore(params);
BlockChain chain = new BlockChain(params, wallet, blockStore);
final PeerGroup peerGroup = new PeerGroup(params, chain);
peerGroup.addAddress(new PeerAddress(InetAddress.getLocalHost()));
peerGroup.startAsync();
peerGroup.downloadBlockChain();
peerGroup.stopAsync();
// And take them!
System.out.println("Claiming " + wallet.getBalance().toFriendlyString());
wallet.sendCoins(peerGroup, destination, wallet.getBalance());
// Wait a few seconds to let the packets flush out to the network (ugly).
Thread.sleep(5000);
System.exit(0);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("First arg should be private key in Base58 format. Second argument should be address " +
"to send to.");
}
}
}