bitcoincash

package module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 9, 2017 License: MIT Imports: 46 Imported by: 0

README

Bitcoin Cash Wallet

This is a fork of https://github.com/OpenBazaar/spvwallet modfied for Bitcoin Cash. It includes a fully functional GUI wallet and CLI.

It uses stock btcd plus a few cash specific modifications found in the bchutil package.

To compile and run:

go get https://github.com/cpacia/BitcoinCash-Wallet
make install
bitcoincash

Or download a pre-compiled version from releases.

Documentation

Index

Constants

View Source
const (
	SYNCING = 0
	WAITING = 1
)
View Source
const (
	MAX_HEADERS = 2000
	CACHE_SIZE  = 100
)
View Source
const (
	// RedeemP2PKHSigScriptSize is the worst case (largest) serialize size
	// of a transaction input script that redeems a compressed P2PKH output.
	// It is calculated as:
	//
	//   - OP_DATA_73
	//   - 72 bytes DER signature + 1 byte sighash
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	RedeemP2PKHSigScriptSize = 1 + 73 + 1 + 33

	// RedeemP2SHMultisigSigScriptSize is the worst case (largest) serialize size
	// of a transaction input script that redeems a 2 of 3 P2SH multisig output with compressed keys.
	// It is calculated as:
	//
	//   - OP_0
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_PUSHDATA
	//   - OP_2
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP3
	//   - OP_CHECKMULTISIG
	RedeemP2SH2of3MultisigSigScriptSize = 1 + 1 + 72 + 1 + 72 + 1 + 1 + 1 + 33 + 1 + 33 + 1 + 33 + 1 + 1

	// RedeemP2SH1of2MultisigSigScriptSize is the worst case (largest) serialize size
	// of a transaction input script that redeems a 1 of 2 P2SH multisig output with compressed keys.
	// It is calculated as:
	//
	//   - OP_0
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_PUSHDATA
	//   - OP_1
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP2
	//   - OP_CHECKMULTISIG
	RedeemP2SH1of2MultisigSigScriptSize = 1 + 1 + 72 + 1 + 1 + 1 + 33 + 1 + 33 + 1 + 1

	// RedeemP2SHMultisigTimelock1SigScriptSize is the worst case (largest) serialize size
	// of a transaction input script that redeems a compressed P2SH timelocked multisig using the timeout.
	// It is calculated as:
	//
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_0
	//   - OP_PUSHDATA
	//   - OP_IF
	//   - OP_2
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP3
	//   - OP_CHECKMULTISIG
	//   - OP_ELSE
	//   - OP_PUSHDATA
	//   - 2 byte block height
	//   - OP_CHECKSEQUENCEVERIFY
	//   - OP_DROP
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_CHECKSIG
	//   - OP_ENDIF
	RedeemP2SHMultisigTimelock1SigScriptSize = 1 + 72 + 1 + 1 + 1 + 1 + 1 + 33 + 1 + 33 + 1 + 33 + 1 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 33 + 1 + 1

	// RedeemP2SHMultisigTimelock2SigScriptSize is the worst case (largest) serialize size
	// of a transaction input script that redeems a compressed P2SH timelocked multisig without using the timeout.
	// It is calculated as:
	//
	//   - OP_0
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_DATA_72
	//   - 72 bytes DER signature
	//   - OP_1
	//   - OP_PUSHDATA
	//   - OP_IF
	//   - OP_2
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP3
	//   - OP_CHECKMULTISIG
	//   - OP_ELSE
	//   - OP_PUSHDATA
	//   - 2 byte block height
	//   - OP_CHECKSEQUENCEVERIFY
	//   - OP_DROP
	//   - OP_DATA_33
	//   - 33 bytes serialized compressed pubkey
	//   - OP_CHECKSIG
	//   - OP_ENDIF
	RedeemP2SHMultisigTimelock2SigScriptSize = 1 + 1 + 72 + +1 + 72 + 1 + 1 + 1 + 1 + 1 + 33 + 1 + 33 + 1 + 33 + 1 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 33 + 1 + 1

	// P2PKHPkScriptSize is the size of a transaction output script that
	// pays to a compressed pubkey hash.  It is calculated as:
	//
	//   - OP_DUP
	//   - OP_HASH160
	//   - OP_DATA_20
	//   - 20 bytes pubkey hash
	//   - OP_EQUALVERIFY
	//   - OP_CHECKSIG
	P2PKHPkScriptSize = 1 + 1 + 1 + 20 + 1 + 1

	// RedeemP2PKHInputSize is the worst case (largest) serialize size of a
	// transaction input redeeming a compressed P2PKH output.  It is
	// calculated as:
	//
	//   - 32 bytes previous tx
	//   - 4 bytes output index
	//   - 1 byte compact int encoding value 107
	//   - 107 bytes signature script
	//   - 4 bytes sequence
	RedeemP2PKHInputSize = 32 + 4 + 1 + RedeemP2PKHSigScriptSize + 4

	// RedeemP2SH2of3MultisigInputSize is the worst case (largest) serialize size of a
	// transaction input redeeming a compressed P2SH 2 of 3 multisig output.  It is
	// calculated as:
	//
	//   - 32 bytes previous tx
	//   - 4 bytes output index
	//   - 1 byte compact int encoding value 107
	//   - signature script
	//   - 4 bytes sequence
	RedeemP2SH2of3MultisigInputSize = 32 + 4 + 1 + RedeemP2SH2of3MultisigSigScriptSize + 4

	// RedeemP2SH1of2MultisigInputSize is the worst case (largest) serialize size of a
	// transaction input redeeming a compressed P2SH 2 of 3 multisig output.  It is
	// calculated as:
	//
	//   - 32 bytes previous tx
	//   - 4 bytes output index
	//   - 1 byte compact int encoding value 107
	//   - signature script
	//   - 4 bytes sequence
	RedeemP2SH1of2MultisigInputSize = 32 + 4 + 1 + RedeemP2SH1of2MultisigSigScriptSize + 4

	// RedeemP2SHMultisigTimelock1InputSize is the worst case (largest) serialize size of a
	// transaction input redeeming a compressed p2sh timelocked multig output with using the timeout.  It is
	// calculated as:
	//
	//   - 32 bytes previous tx
	//   - 4 bytes output index
	//   - 1 byte compact int encoding value 107
	//   - signature script
	//   - 4 bytes sequence
	RedeemP2SHMultisigTimelock1InputSize = 32 + 4 + 1 + RedeemP2SHMultisigTimelock1SigScriptSize + 4

	// RedeemP2SHMultisigTimelock2InputSize is the worst case (largest) serialize size of a
	// transaction input redeeming a compressed P2SH timelocked multisig output without using the timeout.  It is
	// calculated as:
	//
	//   - 32 bytes previous tx
	//   - 4 bytes output index
	//   - 1 byte compact int encoding value 107
	//   - signature script
	//   - 4 bytes sequence
	RedeemP2SHMultisigTimelock2InputSize = 32 + 4 + 1 + RedeemP2SHMultisigTimelock2SigScriptSize + 4

	// P2PKHOutputSize is the serialize size of a transaction output with a
	// P2PKH output script.  It is calculated as:
	//
	//   - 8 bytes output value
	//   - 1 byte compact int encoding value 25
	//   - 25 bytes P2PKH output script
	P2PKHOutputSize = 8 + 1 + P2PKHPkScriptSize
)

Worst case script and input/output size estimates.

View Source
const LOOKAHEADWINDOW = 100
View Source
const WALLET_VERSION = "0.3.0"

Variables

View Source
var (
	BKTHeaders  = []byte("Headers")
	BKTChainTip = []byte("ChainTip")
	KEYChainTip = []byte("ChainTip")
)
View Source
var (
	// ErrTorInvalidAddressResponse indicates an invalid address was
	// returned by the Tor DNS resolver.
	ErrTorInvalidAddressResponse = errors.New("invalid address response")

	// ErrTorInvalidProxyResponse indicates the Tor proxy returned a
	// response in an unexpected format.
	ErrTorInvalidProxyResponse = errors.New("invalid proxy response")

	// ErrTorUnrecognizedAuthMethod indicates the authentication method
	// provided is not recognized.
	ErrTorUnrecognizedAuthMethod = errors.New("invalid proxy authentication method")
)
View Source
var BitcoinCashMainnetForkBlock *chainhash.Hash
View Source
var BitcoinCashTestnet3ForkBlock *chainhash.Hash
View Source
var BumpFeeAlreadyConfirmedError = errors.New("Transaction is confirmed, cannot bump fee")
View Source
var BumpFeeNotFoundError = errors.New("Transaction either doesn't exist or has already been spent")
View Source
var BumpFeeTransactionDeadError = errors.New("Cannot bump fee of dead transaction")
View Source
var (
	MAX_UNCONFIRMED_TIME time.Duration = time.Hour * 24 * 7
)

Functions

func Bip44Derivation

func Bip44Derivation(masterPrivKey *hd.ExtendedKey) (internal, external *hd.ExtendedKey, err error)

m / purpose' / coin_type' / account' / change / address_index

func EstimateSerializeSize

func EstimateSerializeSize(inputCount int, txOuts []*wire.TxOut, addChangeOutput bool, inputType InputType) int

EstimateSerializeSize returns a worst case serialize size estimate for a signed transaction that spends inputCount number of compressed P2PKH outputs and contains each transaction output from txOuts. The estimated size is incremented for an additional P2PKH change output if addChangeOutput is true.

func ForkHeight

func ForkHeight(params *chaincfg.Params) uint32

func IsForkBlock

func IsForkBlock(params *chaincfg.Params, header wire.BlockHeader) bool

func LockTimeFromRedeemScript

func LockTimeFromRedeemScript(redeemScript []byte) (uint32, error)

func MakeMerkleParent

func MakeMerkleParent(left *chainhash.Hash, right *chainhash.Hash) (*chainhash.Hash, error)

func NewCoin

func NewCoin(txid []byte, index uint32, value btc.Amount, numConfs int64, scriptPubKey []byte) coinset.Coin

func NewUnsignedTransaction added in v0.3.0

func NewUnsignedTransaction(outputs []*wire.TxOut, feePerKb btc.Amount, fetchInputs txauthor.InputSource, fetchChange txauthor.ChangeSource) (*txauthor.AuthoredTx, error)

func SumOutputSerializeSizes

func SumOutputSerializeSizes(outputs []*wire.TxOut) (serializeSize int)

SumOutputSerializeSizes sums up the serialized size of the supplied outputs.

func TestStxo_IsEqual added in v0.3.0

func TestStxo_IsEqual(t *testing.T)

func TestUtxo_IsEqual added in v0.3.0

func TestUtxo_IsEqual(t *testing.T)

func TorLookupIP

func TorLookupIP(host string) ([]net.IP, error)

TorLookupIP uses Tor to resolve DNS via the SOCKS extension they provide for resolution over the Tor network. Tor itself doesn't support ipv6 so this doesn't either.

Types

type Blockchain

type Blockchain struct {
	// contains filtered or unexported fields
}

Wrapper around Headers implementation that handles all blockchain operations

func NewBlockchain

func NewBlockchain(filePath string, walletCreationDate time.Time, params *chaincfg.Params) (*Blockchain, error)

func (*Blockchain) CalcMedianTimePast

func (b *Blockchain) CalcMedianTimePast(header wire.BlockHeader) (time.Time, error)

func (*Blockchain) ChainState

func (b *Blockchain) ChainState() ChainState

func (*Blockchain) CheckHeader

func (b *Blockchain) CheckHeader(header wire.BlockHeader, prevHeader StoredHeader) bool

func (*Blockchain) Close

func (b *Blockchain) Close()

func (*Blockchain) CommitHeader

func (b *Blockchain) CommitHeader(header wire.BlockHeader) (bool, *StoredHeader, uint32, error)

func (*Blockchain) GetAncestor

func (b *Blockchain) GetAncestor(prevHeader StoredHeader, height int32) (*StoredHeader, error)

func (*Blockchain) GetBlockLocatorHashes

func (b *Blockchain) GetBlockLocatorHashes() []*chainhash.Hash

func (*Blockchain) GetCommonAncestor

func (b *Blockchain) GetCommonAncestor(bestHeader, prevBestHeader StoredHeader) (*StoredHeader, error)

Returns last header before reorg point

func (*Blockchain) GetEpoch

func (b *Blockchain) GetEpoch() (*wire.BlockHeader, error)

func (*Blockchain) GetNPrevBlockHashes

func (b *Blockchain) GetNPrevBlockHashes(n int) []*chainhash.Hash

func (*Blockchain) SetChainState

func (b *Blockchain) SetChainState(state ChainState)

type ChainState

type ChainState int

type Checkpoint

type Checkpoint struct {
	Height uint32
	Header wire.BlockHeader
}

func GetCheckpoint

func GetCheckpoint(walletCreationDate time.Time, params *chaincfg.Params) Checkpoint

type Coin

type Coin struct {
	TxHash       *chainhash.Hash
	TxIndex      uint32
	TxValue      btc.Amount
	TxNumConfs   int64
	ScriptPubKey []byte
}

func (*Coin) Hash

func (c *Coin) Hash() *chainhash.Hash

func (*Coin) Index

func (c *Coin) Index() uint32

func (*Coin) NumConfs

func (c *Coin) NumConfs() int64

func (*Coin) PkScript

func (c *Coin) PkScript() []byte

func (*Coin) Value

func (c *Coin) Value() btc.Amount

func (*Coin) ValueAge

func (c *Coin) ValueAge() int64

type Config

type Config struct {
	// Network parameters. Set mainnet, testnet, or regtest using this.
	Params *chaincfg.Params

	// Bip39 mnemonic string. If empty a new mnemonic will be created.
	Mnemonic string

	// The date the wallet was created.
	// If before the earliest checkpoint the chain will be synced using the earliest checkpoint.
	CreationDate time.Time

	// The user-agent that shall be visible to peers
	UserAgent string

	// Location of the data directory
	RepoPath string

	// An implementation of the Datastore interface
	DB wallet.Datastore

	// If you wish to connect to a single trusted peer set this. Otherwise leave nil.
	TrustedPeer net.Addr

	// A Tor proxy can be set here causing the wallet will use Tor
	Proxy proxy.Dialer

	// The default fee-per-byte for each level
	LowFee    uint64
	MediumFee uint64
	HighFee   uint64

	// The highest allowable fee-per-byte
	MaxFee uint64

	// External API to query to look up fees. If this field is nil then the default fees will be used.
	// If the API is unreachable then the default fees will likewise be used. If the API returns a fee
	// greater than MaxFee then the MaxFee will be used in place. The API response must be formatted as
	// { "fastestFee": 40, "halfHourFee": 20, "hourFee": 10 }
	FeeAPI url.URL

	// A logger. You can write the logs to file or stdout or however else you want.
	Logger logging.Backend
}

func NewDefaultConfig

func NewDefaultConfig() *Config

type FeeProvider

type FeeProvider struct {
	// contains filtered or unexported fields
}

func NewFeeProvider

func NewFeeProvider(maxFee, priorityFee, normalFee, economicFee uint64, feeAPI string, proxy proxy.Dialer) *FeeProvider

func (*FeeProvider) GetFeePerByte

func (fp *FeeProvider) GetFeePerByte(feeLevel wallet.FeeLevel) uint64

type Fees

type Fees struct {
	FastestFee  uint64
	HalfHourFee uint64
	HourFee     uint64
}

type HeaderCache

type HeaderCache struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func (*HeaderCache) Get

func (h *HeaderCache) Get(hash chainhash.Hash) (StoredHeader, error)

func (*HeaderCache) Set

func (h *HeaderCache) Set(sh StoredHeader)

type HeaderDB

type HeaderDB struct {
	// contains filtered or unexported fields
}

HeaderDB implements Headers using bolt DB

func NewHeaderDB

func NewHeaderDB(filePath string) (*HeaderDB, error)

func (*HeaderDB) Close

func (h *HeaderDB) Close()

func (*HeaderDB) GetBestHeader

func (h *HeaderDB) GetBestHeader() (sh StoredHeader, err error)

func (*HeaderDB) GetHeader

func (h *HeaderDB) GetHeader(hash chainhash.Hash) (sh StoredHeader, err error)

func (*HeaderDB) GetPreviousHeader

func (h *HeaderDB) GetPreviousHeader(header wire.BlockHeader) (sh StoredHeader, err error)

func (*HeaderDB) Height

func (h *HeaderDB) Height() (uint32, error)

func (*HeaderDB) Print

func (h *HeaderDB) Print(w io.Writer)

func (*HeaderDB) Prune

func (h *HeaderDB) Prune() error

func (*HeaderDB) Put

func (h *HeaderDB) Put(sh StoredHeader, newBestHeader bool) error

type Headers

type Headers interface {
	// Put a block header to the database
	// Total work and height are required to be calculated prior to insertion
	// If this is the new best header, the chain tip should also be updated
	Put(header StoredHeader, newBestHeader bool) error

	// Delete all headers after the MAX_HEADERS most recent
	Prune() error

	// Returns all information about the previous header
	GetPreviousHeader(header wire.BlockHeader) (StoredHeader, error)

	// Grab a header given hash
	GetHeader(hash chainhash.Hash) (StoredHeader, error)

	// Retrieve the best header from the database
	GetBestHeader() (StoredHeader, error)

	// Get the height of chain
	Height() (uint32, error)

	// Cleanly close the db
	Close()

	// Print all headers
	Print(io.Writer)
}

Database interface for storing block headers

type InputType

type InputType int
const (
	P2PKH InputType = iota
	P2SH_1of2_Multisig
	P2SH_2of3_Multisig
	P2SH_Multisig_Timelock_1Sig
	P2SH_Multisig_Timelock_2Sigs
)

type KeyManager

type KeyManager struct {
	// contains filtered or unexported fields
}

func NewKeyManager

func NewKeyManager(db wallet.Keys, params *chaincfg.Params, masterPrivKey *hd.ExtendedKey) (*KeyManager, error)

func (*KeyManager) GetCurrentKey

func (km *KeyManager) GetCurrentKey(purpose wallet.KeyPurpose) (*hd.ExtendedKey, error)

func (*KeyManager) GetFreshKey

func (km *KeyManager) GetFreshKey(purpose wallet.KeyPurpose) (*hd.ExtendedKey, error)

func (*KeyManager) GetKeyForScript

func (km *KeyManager) GetKeyForScript(scriptAddress []byte) (*hd.ExtendedKey, error)

func (*KeyManager) GetKeys

func (km *KeyManager) GetKeys() []*hd.ExtendedKey

func (*KeyManager) MarkKeyAsUsed

func (km *KeyManager) MarkKeyAsUsed(scriptAddress []byte) error

Mark the given key as used and extend the lookahead window

type MockDatastore added in v0.3.0

type MockDatastore struct {
	// contains filtered or unexported fields
}

func (*MockDatastore) Keys added in v0.3.0

func (m *MockDatastore) Keys() wallet.Keys

func (*MockDatastore) Stxos added in v0.3.0

func (m *MockDatastore) Stxos() wallet.Stxos

func (*MockDatastore) Txns added in v0.3.0

func (m *MockDatastore) Txns() wallet.Txns

func (*MockDatastore) Utxos added in v0.3.0

func (m *MockDatastore) Utxos() wallet.Utxos

func (*MockDatastore) WatchedScripts added in v0.3.0

func (m *MockDatastore) WatchedScripts() wallet.WatchedScripts

type PeerManager

type PeerManager struct {
	// contains filtered or unexported fields
}

func NewPeerManager

func NewPeerManager(config *PeerManagerConfig) (*PeerManager, error)

func (*PeerManager) BlockQueue added in v0.3.0

func (pm *PeerManager) BlockQueue() chan chainhash.Hash

func (*PeerManager) CheckForMoreBlocks

func (pm *PeerManager) CheckForMoreBlocks(height uint32) bool

Iterates over our peers and sees if any are reporting a height greater than our height. If so switch them to the download peer and start the chain download again.

func (*PeerManager) DequeueTx

func (pm *PeerManager) DequeueTx(peer *peer.Peer, txid chainhash.Hash) (int32, error)

func (*PeerManager) DownloadPeer

func (pm *PeerManager) DownloadPeer() *peer.Peer

func (*PeerManager) QueueTxForDownload

func (pm *PeerManager) QueueTxForDownload(peer *peer.Peer, txid chainhash.Hash, height int32)

func (*PeerManager) ReadyPeers added in v0.3.0

func (pm *PeerManager) ReadyPeers() []*peer.Peer

func (*PeerManager) Start

func (pm *PeerManager) Start()

func (*PeerManager) Stop

func (pm *PeerManager) Stop()

type PeerManagerConfig

type PeerManagerConfig struct {

	// The network parameters to use
	Params *chaincfg.Params

	// The target number of outbound peers. Defaults to 10.
	TargetOutbound uint32

	// Duration of time to retry a connection. Defaults to 5 seconds.
	RetryDuration time.Duration

	// UserAgentName specifies the user agent name to advertise.  It is
	// highly recommended to specify this value.
	UserAgentName string

	// UserAgentVersion specifies the user agent version to advertise.  It
	// is highly recommended to specify this value and that it follows the
	// form "major.minor.revision" e.g. "2.6.41".
	UserAgentVersion string

	// The directory to store cached peers
	AddressCacheDir string

	// If this field is not nil the PeerManager will only connect to this address
	TrustedPeer net.Addr

	// Function to get bloom filter to give to peers
	GetFilter func() (*bloom.Filter, error)

	// Function to beging chain download
	StartChainDownload func(*peer.Peer)

	// Functon returns info about the last block in the chain
	GetNewestBlock func() (hash *chainhash.Hash, height int32, err error)

	// Listeners to handle messages from peers. If nil, no messages will be handled.
	Listeners *peer.MessageListeners

	// An optional proxy dialer. Will use net.Dial if nil.
	Proxy proxy.Dialer
}

type SPVWallet

type SPVWallet struct {
	// contains filtered or unexported fields
}

func NewSPVWallet

func NewSPVWallet(config *Config) (*SPVWallet, error)

func (*SPVWallet) AddTransactionListener

func (w *SPVWallet) AddTransactionListener(callback func(wallet.TransactionCallback))

func (*SPVWallet) AddWatchedScript

func (w *SPVWallet) AddWatchedScript(script []byte) error

func (*SPVWallet) AddressToScript

func (w *SPVWallet) AddressToScript(addr btc.Address) ([]byte, error)

func (*SPVWallet) Balance

func (w *SPVWallet) Balance() (confirmed, unconfirmed int64)

func (*SPVWallet) Broadcast

func (s *SPVWallet) Broadcast(tx *wire.MsgTx) error

func (*SPVWallet) BumpFee

func (w *SPVWallet) BumpFee(txid chainhash.Hash) (*chainhash.Hash, error)

func (*SPVWallet) ChainTip

func (w *SPVWallet) ChainTip() (uint32, chainhash.Hash)

func (*SPVWallet) Close

func (w *SPVWallet) Close()

func (*SPVWallet) ConnectedPeers

func (w *SPVWallet) ConnectedPeers() []*peer.Peer

func (*SPVWallet) CreateMultisigSignature

func (w *SPVWallet) CreateMultisigSignature(ins []wallet.TransactionInput, outs []wallet.TransactionOutput, key *hd.ExtendedKey, redeemScript []byte, feePerByte uint64) ([]wallet.Signature, error)

func (*SPVWallet) CreationDate

func (w *SPVWallet) CreationDate() time.Time

func (*SPVWallet) CurrencyCode

func (w *SPVWallet) CurrencyCode() string

func (*SPVWallet) CurrentAddress

func (w *SPVWallet) CurrentAddress(purpose wallet.KeyPurpose) btc.Address

func (*SPVWallet) DecodeAddress

func (w *SPVWallet) DecodeAddress(addr string) (btc.Address, error)

func (*SPVWallet) DumpHeaders

func (w *SPVWallet) DumpHeaders(writer io.Writer)

func (*SPVWallet) EstimateFee

func (w *SPVWallet) EstimateFee(ins []wallet.TransactionInput, outs []wallet.TransactionOutput, feePerByte uint64) uint64

func (*SPVWallet) GenerateMultisigScript

func (w *SPVWallet) GenerateMultisigScript(keys []hd.ExtendedKey, threshold int, timeout time.Duration, timeoutKey *hd.ExtendedKey) (addr btc.Address, redeemScript []byte, err error)

func (*SPVWallet) GetConfirmations

func (w *SPVWallet) GetConfirmations(txid chainhash.Hash) (uint32, uint32, error)

func (*SPVWallet) GetFeePerByte

func (w *SPVWallet) GetFeePerByte(feeLevel wallet.FeeLevel) uint64

func (*SPVWallet) GetKey

func (w *SPVWallet) GetKey(addr btc.Address) (*btcec.PrivateKey, error)

func (*SPVWallet) GetTransaction

func (w *SPVWallet) GetTransaction(txid chainhash.Hash) (wallet.Txn, error)

func (*SPVWallet) HasKey

func (w *SPVWallet) HasKey(addr btc.Address) bool

func (*SPVWallet) ImportKey

func (w *SPVWallet) ImportKey(privKey *btcec.PrivateKey, compress bool) error

func (*SPVWallet) IsDust

func (w *SPVWallet) IsDust(amount int64) bool

func (*SPVWallet) ListAddresses

func (w *SPVWallet) ListAddresses() []btc.Address

func (*SPVWallet) ListKeys

func (w *SPVWallet) ListKeys() []btcec.PrivateKey

func (*SPVWallet) MasterPrivateKey

func (w *SPVWallet) MasterPrivateKey() *hd.ExtendedKey

func (*SPVWallet) MasterPublicKey

func (w *SPVWallet) MasterPublicKey() *hd.ExtendedKey

func (*SPVWallet) Mnemonic

func (w *SPVWallet) Mnemonic() string

func (*SPVWallet) Multisign

func (w *SPVWallet) Multisign(ins []wallet.TransactionInput, outs []wallet.TransactionOutput, sigs1 []wallet.Signature, sigs2 []wallet.Signature, redeemScript []byte, feePerByte uint64, broadcast bool) ([]byte, error)

func (*SPVWallet) NewAddress

func (w *SPVWallet) NewAddress(purpose wallet.KeyPurpose) btc.Address

func (*SPVWallet) Params

func (w *SPVWallet) Params() *chaincfg.Params

func (*SPVWallet) ReSyncBlockchain

func (w *SPVWallet) ReSyncBlockchain(fromDate time.Time)

func (*SPVWallet) Rebroadcast

func (w *SPVWallet) Rebroadcast()

func (*SPVWallet) ScriptToAddress

func (w *SPVWallet) ScriptToAddress(script []byte) (btc.Address, error)

func (*SPVWallet) Spend

func (w *SPVWallet) Spend(amount int64, addr btc.Address, feeLevel wallet.FeeLevel) (*chainhash.Hash, error)

func (*SPVWallet) Start

func (w *SPVWallet) Start()

func (*SPVWallet) SweepAddress

func (w *SPVWallet) SweepAddress(utxos []wallet.Utxo, address *btc.Address, key *hd.ExtendedKey, redeemScript *[]byte, feeLevel wallet.FeeLevel) (*chainhash.Hash, error)

TODO: once segwit activates this will need to build segwit transactions if the utxo script is a witness program

func (*SPVWallet) Transactions

func (w *SPVWallet) Transactions() ([]wallet.Txn, error)

type StoredHeader

type StoredHeader struct {
	// contains filtered or unexported fields
}

type TxStore

type TxStore struct {
	wallet.Datastore
	// contains filtered or unexported fields
}

func NewTxStore

func NewTxStore(p *chaincfg.Params, db wallet.Datastore, keyManager *KeyManager) (*TxStore, error)

func (*TxStore) CheckDoubleSpends

func (ts *TxStore) CheckDoubleSpends(argTx *wire.MsgTx) ([]*chainhash.Hash, error)

GetDoubleSpends takes a transaction and compares it with all transactions in the db. It returns a slice of all txids in the db which are double spent by the received tx.

func (*TxStore) GetPendingInv

func (ts *TxStore) GetPendingInv() (*wire.MsgInv, error)

GetPendingInv returns an inv message containing all txs known to the db which are at height 0 (not known to be confirmed). This can be useful on startup or to rebroadcast unconfirmed txs.

func (*TxStore) GimmeFilter

func (ts *TxStore) GimmeFilter() (*bloom.Filter, error)

... or I'm gonna fade away

func (*TxStore) Ingest

func (ts *TxStore) Ingest(tx *wire.MsgTx, height int32) (uint32, error)

Ingest puts a tx into the DB atomically. This can result in a gain, a loss, or no result. Gain or loss in satoshis is returned.

func (*TxStore) PopulateAdrs

func (ts *TxStore) PopulateAdrs() error

PopulateAdrs just puts a bunch of adrs in ram; it doesn't touch the DB

Directories

Path Synopsis
api
pb
Package pb is a generated protocol buffer package.
Package pb is a generated protocol buffer package.
cmd
gui

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL