3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-01-31 07:12:17 +00:00

WalletTool: allow specification of debug levels and force a particular peer to be used. Add a bit of logging to WalletTool itself.

This commit is contained in:
Mike Hearn 2012-02-13 20:47:32 +01:00
parent 2c93dfba32
commit d08f2f7808

View File

@ -25,10 +25,14 @@ import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import org.bouncycastle.util.encoders.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.LogManager;
@ -40,15 +44,19 @@ import static joptsimple.util.DateConverter.datePattern;
*
*/
public class WalletTool {
private static final Logger log = LoggerFactory.getLogger(WalletTool.class);
private static final String HELP_TEXT =
"WalletTool: print and manipulate wallets\n\n" +
"Usage:\n" +
">>> GENERAL OPTIONS\n" +
" --debuglog Enables logging from the core library.\n" +
" --wallet=<file> Specifies what wallet file to load and save.\n" +
" --chain=<file> Specifies the name of the file that stores the block chain.\n" +
" --force Overrides any safety checks on the requested action.\n" +
" --date Provide a date in form YYYY/MM/DD to any action that requires one.\n" +
" --peer=1.2.3.4 Use the given IP address for connections instead of peer discovery.\n" +
"\n>>> ACTIONS\n" +
" --action=DUMP Prints the given wallet in textual form to stdout.\n" +
@ -56,8 +64,8 @@ public class WalletTool {
" Will complain and require --force if the wallet already exists.\n" +
" --action=ADD_KEY Adds a new key to the wallet, either specified or freshly generated.\n" +
" If --date is specified, that's the creation date.\n" +
" If --privkey is specified, use as a hex encoded private key. " +
"Don't specify --pubkey in that case, it will be derived automatically.\n" +
" If --privkey is specified, use as a hex encoded private key.\n" +
" Don't specify --pubkey in that case, it will be derived automatically.\n" +
" If --pubkey is specified, use as a hex encoded non-compressed public key.\n" +
" --action=DELETE_KEY Removes the key specified by --pubkey or --addr from the wallet.\n" +
" --action=SYNC Sync the wallet with the latest block chain (download new transactions).\n" +
@ -70,13 +78,15 @@ public class WalletTool {
private static OptionSpec<Date> dateFlag;
private static NetworkParameters params;
private static File walletFile;
private static OptionSet options;
public enum ActionEnum {
DUMP,
CREATE,
ADD_KEY,
DELETE_KEY,
SYNC
SYNC,
RESET
};
public enum NetworkEnum {
@ -109,7 +119,8 @@ public class WalletTool {
parser.accepts("pubkey").withRequiredArg();
parser.accepts("privkey").withRequiredArg();
parser.accepts("addr").withRequiredArg();
OptionSet options = parser.parse(args);
parser.accepts("peer").withRequiredArg();
options = parser.parse(args);
if (args.length == 0 || options.hasArgument("help") || options.nonOptionArguments().size() > 0) {
System.out.println(HELP_TEXT);
@ -118,6 +129,7 @@ public class WalletTool {
if (options.has("debuglog")) {
BriefLogFormatter.init();
log.info("Starting up ...");
} else {
// Disable logspam unless there is a flag.
LogManager.getLogManager().getLogger("").setLevel(Level.SEVERE);
@ -164,25 +176,27 @@ public class WalletTool {
// What should we do?
switch (action) {
case DUMP: dumpWallet(wallet); break;
case ADD_KEY: addKey(wallet, options); break;
case DELETE_KEY: deleteKey(wallet, options); break;
case ADD_KEY: addKey(wallet); break;
case DELETE_KEY: deleteKey(wallet); break;
case SYNC: syncChain(wallet, chainFileName); break;
case RESET: reset(wallet); break;
}
saveWallet(walletFile, wallet);
}
private static void reset(Wallet wallet) {
// Delete the transactions and save. In future, reset the chain head pointer.
wallet.clearTransactions(0);
saveWallet(walletFile, wallet);
}
private static void syncChain(final Wallet wallet, File chainFileName) {
try {
// Will create a fresh chain if one doesn't exist or there is an issue with this one.
System.out.println("Connecting ..." );
final BoundedOverheadBlockStore store = new BoundedOverheadBlockStore(params, chainFileName);
final BlockChain chain = new BlockChain(params, wallet, store);
final PeerGroup peers = new PeerGroup(params, chain);
peers.setUserAgent("WalletTool", "1.0");
peers.addWallet(wallet);
peers.addPeerDiscovery(new DnsDiscovery(params));
peers.setFastCatchupTimeSecs(wallet.getEarliestKeyCreationTime());
wallet.addEventListener(new AbstractWalletEventListener() {
@Override
public void onChange() {
@ -190,9 +204,9 @@ public class WalletTool {
}
});
final int startTransactions = wallet.getTransactions(true, true).size();
peers.start();
int startTransactions = wallet.getTransactions(true, true).size();
PeerGroup peers = connect(wallet, chain);
DownloadListener listener = new DownloadListener();
peers.startBlockChainDownload(listener);
try {
@ -212,6 +226,26 @@ public class WalletTool {
}
}
private static PeerGroup connect(Wallet wallet, BlockChain chain) {
PeerGroup peers = new PeerGroup(params, chain);
peers.setUserAgent("WalletTool", "1.0");
peers.addWallet(wallet);
peers.setFastCatchupTimeSecs(wallet.getEarliestKeyCreationTime());
if (options.has("peer")) {
String peer = (String) options.valueOf("peer");
try {
peers.addAddress(new PeerAddress(InetAddress.getByName(peer), params.port));
} catch (UnknownHostException e) {
System.err.println("Could not understand peer domain name/IP address: " + peer + ": " + e.getMessage());
System.exit(1);
}
} else {
peers.addPeerDiscovery(new DnsDiscovery(params));
}
peers.start();
return peers;
}
private static void createWallet(OptionSet options, NetworkParameters params, File walletFile) throws IOException {
if (walletFile.exists() && !options.has("force")) {
System.err.println("Wallet creation requested but " + walletFile + " already exists, use --force");
@ -238,7 +272,7 @@ public class WalletTool {
}
}
private static void addKey(Wallet wallet, OptionSet options) {
private static void addKey(Wallet wallet) {
ECKey key;
long creationTimeSeconds = 0;
if (options.has(dateFlag)) {
@ -268,7 +302,7 @@ public class WalletTool {
System.out.println("addr:" + key.toAddress(params) + " " + key);
}
private static void deleteKey(Wallet wallet, OptionSet options) {
private static void deleteKey(Wallet wallet) {
String pubkey = (String) options.valueOf("pubkey");
String addr = (String) options.valueOf("addr");
if (pubkey == null && addr == null) {