A secure lbry wallet daemon written in Go
Find a file
Josh Rickmar f084802fec Refactor wallet transaction creation code.
This began as a change to improve the fee calculation code and evolved
into a much larger refactor which improves the readability and
modularity of all of the transaction creation code.

Transaction fee calculations have been switched from full increments
of the relay fee to a proportion based on the transaction size.  This
means that for a relay fee of 1e3 satoshis/kB, a 500 byte transaction
is only required to pay a 5e2 satoshi fee and a 1500 byte transaction
only need pay a 1.5e3 fee.  The previous code would end up estimating
these fees to be 1e3 and 2e3 respectively.

Because the previous code would add more fee than needed in almost
every case, the transaction size estimations were optimistic
(best/smallest case) and signing was done in a loop where the fee was
incremented by the relay fee again each time the actual size of the
signed transaction rendered the fee too low.  This has switched to
using worst case transaction size estimates rather than best case, and
signing is only performed once.

Transaction input signature creation has switched from using
txscript.SignatureScript to txscript.SignTxOutput.  The new API is
able to redeem outputs other than just P2PKH, so the previous
restrictions about P2SH outputs being unspendable (except through the
signrawtransaction RPC) no longer hold.

Several new public packages have been added:

wallet/txauthor - transaction authoring and signing
wallet/txfees - fee estimations and change output inclusion
wallet/txrules - simple consensus and mempool policy rule checks

Along with some internal packages:

wallet/internal/txsizes - transaction size estimation
internal/helpers - context free convenience functions

The txsizes package is internal as the estimations it provides are
specific for the algorithms used by these new packages.
2016-03-08 17:42:27 -05:00
chain Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
cmd/dropwtxmgr Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
docs Add guide for forced rescans. 2015-04-28 17:30:17 -04:00
internal Refactor wallet transaction creation code. 2016-03-08 17:42:27 -05:00
netparams Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
rpc Refactor wallet transaction creation code. 2016-03-08 17:42:27 -05:00
snacl Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
votingpool Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
waddrmgr Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
wallet Refactor wallet transaction creation code. 2016-03-08 17:42:27 -05:00
walletdb Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
wtxmgr Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
.gitignore Initial commit. 2013-08-21 10:37:30 -04:00
.travis.yml Update travis config for recent Go versions. 2015-12-08 11:40:20 -05:00
appveyor.yml Add AppVeyor continuous integration. 2015-06-30 22:54:36 -04:00
btcwallet.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
CHANGES Prepare for release 0.7.0. 2015-11-23 10:44:37 -05:00
config.go Refactor wallet transaction creation code. 2016-03-08 17:42:27 -05:00
deps.txt Add 0.7.0 deps to deps.txt. 2015-11-23 10:44:36 -05:00
LICENSE Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
log.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
params.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
README.md Update README for gRPC changes. 2016-02-09 10:42:43 -05:00
rpcserver.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
sample-btcwallet.conf Add option for one time TLS keys. 2016-02-11 00:15:30 -05:00
signal.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
version.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00
walletsetup.go Use LICENSE file and short license headers. 2016-02-28 22:22:34 -05:00

btcwallet

Build Status Build status

btcwallet is a daemon handling bitcoin wallet functionality for a single user. It acts as both an RPC client to btcd and an RPC server for wallet clients and legacy RPC applications.

Public and private keys are derived using the heirarchical deterministic format described by BIP0032. Unencrypted private keys are not supported and are never written to disk. btcwallet uses the m/44'/<coin type>'/<account>'/<branch>/<address index> HD path for all derived addresses, as described by BIP0044.

Due to the sensitive nature of public data in a BIP0032 wallet, btcwallet provides the option of encrypting not just private keys, but public data as well. This is intended to thwart privacy risks where a wallet file is compromised without exposing all current and future addresses (public keys) managed by the wallet. While access to this information would not allow an attacker to spend or steal coins, it does mean they could track all transactions involving your addresses and therefore know your exact balance. In a future release, public data encryption will extend to transactions as well.

btcwallet is not an SPV client and requires connecting to a local or remote btcd instance for asynchronous blockchain queries and notifications over websockets. Full btcd installation instructions can be found here. An alternative SPV mode that is compatible with btcd and Bitcoin Core is planned for a future release.

Wallet clients can use one of two RPC servers:

  1. A legacy JSON-RPC server mostly compatible with Bitcoin Core

    The JSON-RPC server exists to ease the migration of wallet applications from Core, but complete compatibility is not guaranteed. Some portions of the API (and especially accounts) have to work differently due to other design decisions (mostly due to BIP0044). However, if you find a compatibility issue and feel that it could be reasonably supported, please report an issue. This server is enabled by default.

  2. An experimental gRPC server

    The gRPC server uses a new API built for btcwallet, but the API is not stabilized and the server is feature gated behind a config option (--experimentalrpclisten). If you don't mind applications breaking due to API changes, don't want to deal with issues of the legacy API, or need notifications for changes to the wallet, this is the RPC server to use. The gRPC server is documented here.

Mainnet support is currently disabled by default. Use of btcwallet on mainnet requires passing the --mainnet flag on the command line or adding mainnet=1 to the configuration file. Mainnet will be enabled by default in a future release after further database changes and testing.

Installation and updating

Windows - MSIs Available

Install the latest MSIs available here:

https://github.com/btcsuite/btcd/releases

https://github.com/btcsuite/btcwallet/releases

Windows/Linux/BSD/POSIX - Build from source

  • If necessary, install Go according to the installation instructions here: http://golang.org/doc/install. It is recommended to add $GOPATH/bin to your PATH at this point.

  • Run the following commands to obtain and install btcd, btcwallet and all dependencies:

go get -u -v github.com/btcsuite/btcd/...
go get -u -v github.com/btcsuite/btcwallet/...

Getting Started

The following instructions detail how to get started with btcwallet connecting to a localhost btcd. Commands should be run in cmd.exe or PowerShell on Windows, or any terminal emulator on *nix.

  • Run the following command to start btcd:
btcd --testnet -u rpcuser -P rpcpass
  • Run the following command to create a wallet:
btcwallet -u rpcuser -P rpcpass --create
  • Run the following command to start btcwallet:
btcwallet -u rpcuser -P rpcpass

If everything appears to be working, it is recommended at this point to copy the sample btcd and btcwallet configurations and update with your RPC username and password.

PowerShell (Installed from MSI):

PS> cp "$env:ProgramFiles\Btcd Suite\Btcd\sample-btcd.conf" $env:LOCALAPPDATA\Btcd\btcd.conf
PS> cp "$env:ProgramFiles\Btcd Suite\Btcwallet\sample-btcwallet.conf" $env:LOCALAPPDATA\Btcwallet\btcwallet.conf
PS> $editor $env:LOCALAPPDATA\Btcd\btcd.conf
PS> $editor $env:LOCALAPPDATA\Btcwallet\btcwallet.conf

PowerShell (Installed from source):

PS> cp $env:GOPATH\src\github.com\btcsuite\btcd\sample-btcd.conf $env:LOCALAPPDATA\Btcd\btcd.conf
PS> cp $env:GOPATH\src\github.com\btcsuite\btcwallet\sample-btcwallet.conf $env:LOCALAPPDATA\Btcwallet\btcwallet.conf
PS> $editor $env:LOCALAPPDATA\Btcd\btcd.conf
PS> $editor $env:LOCALAPPDATA\Btcwallet\btcwallet.conf

Linux/BSD/POSIX (Installed from source):

$ cp $GOPATH/src/github.com/btcsuite/btcd/sample-btcd.conf ~/.btcd/btcd.conf
$ cp $GOPATH/src/github.com/btcsuite/btcwallet/sample-btcwallet.conf ~/.btcwallet/btcwallet.conf
$ $EDITOR ~/.btcd/btcd.conf
$ $EDITOR ~/.btcwallet/btcwallet.conf

Issue Tracker

The integrated github issue tracker is used for this project.

GPG Verification Key

All official release tags are signed by Conformal so users can ensure the code has not been tampered with and is coming from the btcsuite developers. To verify the signature perform the following:

  • Download the public key from the Conformal website at https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt

  • Import the public key into your GPG keyring:

    gpg --import GIT-GPG-KEY-conformal.txt
    
  • Verify the release tag with the following command where TAG_NAME is a placeholder for the specific tag:

    git tag -v TAG_NAME
    

License

btcwallet is licensed under the liberal ISC License.