Class WalletAppKit
- All Implemented Interfaces:
com.google.common.util.concurrent.Service
Utility class that wraps the boilerplate needed to set up a new SPV bitcoinj app. Instantiate it with a directory
and file prefix, optionally configure a few things, then use startAsync and optionally awaitRunning. The object will
construct and configure a BlockChain
, SPVBlockStore
, Wallet
and PeerGroup
. Depending
on the value of the blockingStartup property, startup will be considered complete once the block chain has fully
synchronized, so it can take a while.
To add listeners and modify the objects that are constructed, you can either do that by overriding the
onSetupCompleted()
method (which will run on a background thread) and make your changes there,
or by waiting for the service to start and then accessing the objects from wherever you want. However, you cannot
access the objects this class creates until startup is complete.
The asynchronous design of this class may seem puzzling (just use AbstractIdleService.awaitRunning()
if you don't want that).
It is to make it easier to fit bitcoinj into GUI apps, which require a high degree of responsiveness on their main
thread which handles all the animation and user interaction. Even when blockingStart is false, initializing bitcoinj
means doing potentially blocking file IO, generating keys and other potentially intensive operations. By running it
on a background thread, there's no risk of accidentally causing UI lag.
Note that AbstractIdleService.awaitRunning()
can throw an unchecked IllegalStateException
if anything goes wrong during startup - you should probably handle it and use Throwable.getCause()
to figure
out what went wrong more precisely. Same thing if you just use the AbstractIdleService.startAsync()
method.
-
Nested Class Summary
Nested classes/interfaces inherited from interface com.google.common.util.concurrent.Service
com.google.common.util.concurrent.Service.Listener, com.google.common.util.concurrent.Service.State
-
Field Summary
Modifier and TypeFieldDescriptionprotected boolean
protected boolean
protected InputStream
protected Context
protected final File
protected PeerDiscovery
protected DownloadProgressTracker
protected final String
protected static final org.slf4j.Logger
protected final NetworkParameters
protected PeerAddress[]
protected final Script.ScriptType
protected DeterministicKey
protected DeterministicSeed
protected final KeyChainGroupStructure
protected boolean
protected String
protected BlockChain
protected String
protected PeerGroup
protected SPVBlockStore
protected Wallet
protected File
protected WalletProtobufSerializer.WalletFactory
-
Constructor Summary
ConstructorDescriptionWalletAppKit
(Context context, Script.ScriptType preferredOutputScriptType, KeyChainGroupStructure structure, File directory, String filePrefix) Creates a new WalletAppKit, with the givenContext
.WalletAppKit
(NetworkParameters params, File directory, String filePrefix) Creates a new WalletAppKit, with a newly createdContext
.WalletAppKit
(NetworkParameters params, Script.ScriptType preferredOutputScriptType, KeyChainGroupStructure structure, File directory, String filePrefix) Creates a new WalletAppKit, with a newly createdContext
. -
Method Summary
Modifier and TypeMethodDescriptionchain()
Will only connect to localhost.protected PeerGroup
protected Wallet
boolean
Tests to see if the spvchain file has an operating system file lock on it.protected void
This method is invoked on a background thread after all objects are initialised, but before the peer group or block chain download is started.params()
protected List<WalletExtension>
Override this to return wallet extensions if any are necessary.restoreWalletFromKey
(DeterministicKey accountKey) If an account key is set here then any existing wallet that matches the file name will be renamed to a backup name, the chain file will be deleted, and the wallet object will be instantiated with the given key instead of a fresh seed being created.If a seed is set here then any existing wallet that matches the file name will be renamed to a backup name, the chain file will be deleted, and the wallet object will be instantiated with the given seed instead of a fresh one being created.setAutoSave
(boolean value) If true, the wallet will save itself to disk automatically whenever it changes.setAutoStop
(boolean autoStop) If true, will register a shutdown hook to stop the library.setBlockingStartup
(boolean blockingStartup) If true (the default) then the startup of this service won't be considered complete until the network has been brought up, peer connections established and the block chain synchronised.setCheckpoints
(InputStream checkpoints) If set, the file is expected to contain a checkpoints file calculated with BuildCheckpoints.setDiscovery
(PeerDiscovery discovery) Sets the peer discovery class to use.setDownloadListener
(DownloadProgressTracker listener) If you want to learn about the sync process, you can provide a listener here.setPeerNodes
(PeerAddress... addresses) Will only connect to the given addresses.protected void
setupAutoSave
(Wallet wallet) setUserAgent
(String userAgent, String version) Sets the string that will appear in the subver field of the version message.setWalletFactory
(WalletProtobufSerializer.WalletFactory walletFactory) Sets a wallet factory which will be used when the kit creates a new wallet.protected void
shutDown()
protected void
startUp()
store()
wallet()
Methods inherited from class com.google.common.util.concurrent.AbstractIdleService
addListener, awaitRunning, awaitRunning, awaitTerminated, awaitTerminated, executor, failureCause, isRunning, serviceName, startAsync, state, stopAsync, toString
-
Field Details
-
log
protected static final org.slf4j.Logger log -
params
-
preferredOutputScriptType
-
structure
-
filePrefix
-
vChain
-
vStore
-
vWallet
-
vPeerGroup
-
directory
-
vWalletFile
-
useAutoSave
protected boolean useAutoSave -
peerAddresses
-
downloadListener
-
autoStop
protected boolean autoStop -
checkpoints
-
blockingStartup
protected boolean blockingStartup -
userAgent
-
version
-
walletFactory
-
restoreFromSeed
-
restoreFromKey
-
discovery
-
context
-
-
Constructor Details
-
WalletAppKit
Creates a new WalletAppKit, with a newly createdContext
. Files will be stored in the given directory. -
WalletAppKit
public WalletAppKit(NetworkParameters params, Script.ScriptType preferredOutputScriptType, @Nullable KeyChainGroupStructure structure, File directory, String filePrefix) Creates a new WalletAppKit, with a newly createdContext
. Files will be stored in the given directory. -
WalletAppKit
public WalletAppKit(Context context, Script.ScriptType preferredOutputScriptType, @Nullable KeyChainGroupStructure structure, File directory, String filePrefix) Creates a new WalletAppKit, with the givenContext
. Files will be stored in the given directory.
-
-
Method Details
-
setPeerNodes
Will only connect to the given addresses. Cannot be called after startup. -
connectToLocalHost
Will only connect to localhost. Cannot be called after startup. -
setAutoSave
If true, the wallet will save itself to disk automatically whenever it changes. -
setDownloadListener
If you want to learn about the sync process, you can provide a listener here. For instance, aDownloadProgressTracker
is a good choice. This has no effect unless setBlockingStartup(false) has been called too, due to some missing implementation code. -
setAutoStop
If true, will register a shutdown hook to stop the library. Defaults to true. -
setCheckpoints
If set, the file is expected to contain a checkpoints file calculated with BuildCheckpoints. It makes initial block sync faster for new users - please refer to the documentation on the bitcoinj website (https://bitcoinj.github.io/speeding-up-chain-sync) for further details. -
setBlockingStartup
If true (the default) then the startup of this service won't be considered complete until the network has been brought up, peer connections established and the block chain synchronised. ThereforeAbstractIdleService.awaitRunning()
can potentially take a very long time. If false, then startup is considered complete once the network activity begins and peer connections/block chain sync will continue in the background. -
setUserAgent
Sets the string that will appear in the subver field of the version message.- Parameters:
userAgent
- A short string that should be the name of your app, e.g. "My Wallet"version
- A short string that contains the version number, e.g. "1.0-BETA"
-
setWalletFactory
Sets a wallet factory which will be used when the kit creates a new wallet. -
restoreWalletFromSeed
If a seed is set here then any existing wallet that matches the file name will be renamed to a backup name, the chain file will be deleted, and the wallet object will be instantiated with the given seed instead of a fresh one being created. This is intended for restoring a wallet from the original seed. To implement restore you would shut down the existing appkit, if any, then recreate it with the seed given by the user, then start up the new kit. The next time your app starts it should work as normal (that is, don't keep calling this each time). -
restoreWalletFromKey
If an account key is set here then any existing wallet that matches the file name will be renamed to a backup name, the chain file will be deleted, and the wallet object will be instantiated with the given key instead of a fresh seed being created. This is intended for restoring a wallet from an account key. To implement restore you would shut down the existing appkit, if any, then recreate it with the key given by the user, then start up the new kit. The next time your app starts it should work as normal (that is, don't keep calling this each time). -
setDiscovery
Sets the peer discovery class to use. If none is provided then DNS is used, which is a reasonable default. -
provideWalletExtensions
Override this to return wallet extensions if any are necessary.
When this is called, chain(), store(), and peerGroup() will return the created objects, however they are not initialized/started.
- Throws:
Exception
-
onSetupCompleted
protected void onSetupCompleted()This method is invoked on a background thread after all objects are initialised, but before the peer group or block chain download is started. You can tweak the objects configuration here. -
isChainFileLocked
Tests to see if the spvchain file has an operating system file lock on it. Useful for checking if your app is already running. If another copy of your app is running and you start the appkit anyway, an exception will be thrown during the startup process. Returns false if the chain file does not exist or is a directory.- Throws:
IOException
-
startUp
- Specified by:
startUp
in classcom.google.common.util.concurrent.AbstractIdleService
- Throws:
Exception
-
setupAutoSave
-
createWallet
-
createPeerGroup
-
shutDown
- Specified by:
shutDown
in classcom.google.common.util.concurrent.AbstractIdleService
- Throws:
Exception
-
params
-
chain
-
store
-
wallet
-
peerGroup
-
directory
-