spvwallet

package module
v0.0.0-...-68eb465 Latest Latest
Warning

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

Go to latest
Published: Apr 19, 2017 License: MIT Imports: 40 Imported by: 0

README

Build Status Coverage Status Go Report Card

spvwallet

Lightweight p2p SPV wallet and library in Go. It connects directly to the bitcoin p2p network to fetch headers, merkle blocks, and transactions.

It uses a number of utilities from btcsuite but natively handles blockchain and wallet.

Library Usage:

// Create a new config
config := spvwallet.NewDefaultConfig()

// Select network
config.Params = &chaincfg.TestNet3Params

// Select wallet datastore
sqliteDatastore, _ := db.Create(config.RepoPath)
config.DB = sqliteDatastore

// Create the wallet
wallet, _ := spvwallet.NewSPVWallet(config)

// Start it!
go wallet.Start()

Easy peasy

The wallet implements the following interface:

type BitcoinWallet interface {

	// Start the wallet
	Start()

	// Return the network parameters
	Params() *chaincfg.Params

	// Returns the type of crytocurrency this wallet implements
	CurrencyCode() string

	// Get the master private key
	MasterPrivateKey() *hd.ExtendedKey

	// Get the master public key
	MasterPublicKey() *hd.ExtendedKey

	// Get the current address for the given purpose
	CurrentAddress(purpose spvwallet.KeyPurpose) btc.Address

	// Returns a fresh address that has never been returned by this function
	NewAddress(purpose spvwallet.KeyPurpose) btc.Address

	// Returns if the wallet has the key for the given address
	HasKey(addr btc.Address) bool

	// Get the confirmed and unconfirmed balances
	Balance() (confirmed, unconfirmed int64)

	// Returns a list of transactions for this wallet
	Transactions() ([]spvwallet.Txn, error)

	// Get info on a specific transaction
	GetTransaction(txid chainhash.Hash) (spvwallet.Txn, error)

	// Get the height of the blockchain
	ChainTip() uint32

	// Get the current fee per byte
	GetFeePerByte(feeLevel spvwallet.FeeLevel) uint64

	// Send bitcoins to an external wallet
	Spend(amount int64, addr btc.Address, feeLevel spvwallet.FeeLevel) (*chainhash.Hash, error)

	// Bump the fee for the given transaction
	BumpFee(txid chainhash.Hash) (*chainhash.Hash, error)

	// Calculates the estimated size of the transaction and returns the total fee for the given feePerByte
	EstimateFee(ins []spvwallet.TransactionInput, outs []spvwallet.TransactionOutput, feePerByte uint64) uint64

	// Build and broadcast a transaction that sweeps all coins from an address. If it is a p2sh multisig, the redeemScript must be included
	SweepAddress(utxos []spvwallet.Utxo, address *btc.Address, key *hd.ExtendedKey, redeemScript *[]byte, feeLevel spvwallet.FeeLevel) (*chainhash.Hash, error)

	// Create a signature for a multisig transaction
	CreateMultisigSignature(ins []spvwallet.TransactionInput, outs []spvwallet.TransactionOutput, key *hd.ExtendedKey, redeemScript []byte, feePerByte uint64) ([]spvwallet.Signature, error)

	// Combine signatures and optionally broadcast
	Multisign(ins []spvwallet.TransactionInput, outs []spvwallet.TransactionOutput, sigs1 []spvwallet.Signature, sigs2 []spvwallet.Signature, redeemScript []byte, feePerByte uint64, broadcast bool) ([]byte, error)

	// Generate a multisig script from public keys
	GenerateMultisigScript(keys []hd.ExtendedKey, threshold int) (addr btc.Address, redeemScript []byte, err error)

	// Add a script to the wallet and get notifications back when coins are received or spent from it
	AddWatchedScript(script []byte) error

	// Add a callback for incoming transactions
	AddTransactionListener(func(spvwallet.TransactionCallback))

	// Use this to re-download merkle blocks in case of missed transactions
	ReSyncBlockchain(fromHeight int32)

	// Return the number of confirmations for a transaction
	GetConfirmations(txid chainhash.Hash) (uint32, error)

	// Cleanly disconnect from the wallet
	Close()
}

To create a wallet binary:

make install

Usage:

Usage:
  spvwallet [OPTIONS] <command>

Help Options:
  -h, --help  Show this help message

Available commands:
  addwatchedscript         add a script to watch
  balance                  get the wallet balance
  bumpfee                  bump the tx fee
  chaintip                 return the height of the chain
  createmultisigsignature  create a p2sh multisig signature
  currentaddress           get the current bitcoin address
  estimatefee              estimate the fee for a tx
  getconfirmations         get the number of confirmations for a tx
  getfeeperbyte            get the current bitcoin fee
  gettransaction           get a specific transaction
  haskey                   does key exist
  masterprivatekey         get the wallet's master private key
  masterpublickey          get the wallet's master public key
  multisign                combine multisig signatures
  newaddress               get a new bitcoin address
  peers                    get info about peers
  resyncblockchain         re-download the chain of headers
  spend                    send bitcoins
  start                    start the wallet
  stop                     stop the wallet
  sweepaddress             sweep all coins from an address
  transactions             get a list of transactions
  version                  print the version number

Finally a gRPC API is available on port 8234. The same interface is exposed via the API plus a streaming wallet notifier which fires when a new transaction (either incoming or outgoing) is recorded then again when it gains its first confirmation.

Documentation

Index

Constants

View Source
const (
	SYNCING = 0
	WAITING = 1
	REORG   = 2
)
View Source
const (
	MAINNET_CHECKPOINT_HEIGHT  = 443520
	TESTNET3_CHECKPOINT_HEIGHT = 1114848
	REGTEST_CHECKPOINT_HEIGHT  = 0
)
View Source
const (
	PRIOIRTY FeeLevel = 0
	NORMAL            = 1
	ECONOMIC          = 2
	FEE_BUMP          = 3
)
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

	// 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

	// 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 FlagPrefix = 0x00
View Source
const LOOKAHEADWINDOW = 100
View Source
const MAX_HEADERS = 2000
View Source
const WALLET_VERSION = "0.1.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 (
	MAX_UNCONFIRMED_TIME time.Duration = time.Hour * 24 * 7
)

Functions

func EstimateSerializeSize

func EstimateSerializeSize(inputCount int, txOuts []*wire.TxOut, addChangeOutput bool) 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 MakeMerkleParent

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

func NewCoin

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

func SumOutputSerializeSizes

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

SumOutputSerializeSizes sums up the serialized size of the supplied outputs.

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, params *chaincfg.Params) (*Blockchain, 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) GetBlockLocatorHashes

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

func (*Blockchain) GetEpoch

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

func (*Blockchain) GetLastGoodHeader

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

Returns last header before reorg point

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 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 user-agent that shall be visible to peers
	UserAgent string

	// Location of the data directory
	RepoPath string

	// An implementation of the Datastore interface
	DB 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 Datastore

type Datastore interface {
	Utxos() Utxos
	Stxos() Stxos
	Txns() Txns
	Keys() Keys
	WatchedScripts() WatchedScripts
}

type FeeLevel

type FeeLevel int

Selecting the correct fee for a transaction can be difficult for end users. We try to simplify this by create three generic fee levels (the exact data for which can either be hardcoded or fetched via API).

type Fees

type Fees struct {
	FastestFee  uint64
	HalfHourFee uint64
	HourFee     uint64
}

type HeaderDB

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

HeaderDB implements Headers using bolt DB

func NewHeaderDB

func NewHeaderDB(filePath string) *HeaderDB

func (*HeaderDB) Close

func (h *HeaderDB) Close()

func (*HeaderDB) GetBestHeader

func (h *HeaderDB) GetBestHeader() (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)

	// Retreive 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 KeyPath

type KeyPath struct {
	Purpose KeyPurpose
	Index   int
}

type KeyPurpose

type KeyPurpose int

The end leaves on the HD wallet have only two possible values. External keys are those given to other people for the purpose of receiving transactions. These may include keys used for refund addresses. Internal keys are used only by the wallet, primarily for change addresses but could also be used for shuffling around UTXOs.

const (
	EXTERNAL KeyPurpose = 0
	INTERNAL            = 1
)

type Keys

type Keys interface {
	// Put a bip32 key to the database
	Put(scriptPubKey []byte, keyPath KeyPath) error

	// Import a loose private key not part of the keychain
	ImportKey(scriptPubKey []byte, key *btcec.PrivateKey) error

	// Mark the script as used
	MarkKeyAsUsed(scriptPubKey []byte) error

	// Fetch the last index for the given key purpose
	// The bool should state whether the key has been used or not
	GetLastKeyIndex(purpose KeyPurpose) (int, bool, error)

	// Returns the first unused path for the given purpose
	GetPathForScript(scriptPubKey []byte) (KeyPath, error)

	// Returns an imported private key given a script
	GetKeyForScript(scriptPubKey []byte) (*btcec.PrivateKey, error)

	// Get a list of unused key indexes for the given purpose
	GetUnused(purpose KeyPurpose) ([]int, error)

	// Fetch all key paths
	GetAll() ([]KeyPath, error)

	// Get the number of unused keys following the last used key
	// for each key purpose.
	GetLookaheadWindows() map[KeyPurpose]int
}

Keys provides a database interface for the wallet to save key material, track used keys, and manage the look ahead window.

type PeerManager

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

func NewPeerManager

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

func (*PeerManager) CheckForMoreBlocks

func (pm *PeerManager) CheckForMoreBlocks(height uint32) (moar 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) ConnectedPeers

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

func (*PeerManager) DownloadPeer

func (pm *PeerManager) DownloadPeer() *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 {
	PeerManager *PeerManager
	// contains filtered or unexported fields
}

func NewSPVWallet

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

func (*SPVWallet) AddTransactionListener

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

func (*SPVWallet) AddWatchedScript

func (w *SPVWallet) AddWatchedScript(script []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

func (*SPVWallet) Close

func (w *SPVWallet) Close()

func (*SPVWallet) CreateMultisigSignature

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

func (*SPVWallet) CurrencyCode

func (w *SPVWallet) CurrencyCode() string

func (*SPVWallet) CurrentAddress

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

func (*SPVWallet) EstimateFee

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

func (*SPVWallet) GenerateMultisigScript

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

func (*SPVWallet) GetConfirmations

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

func (*SPVWallet) GetFeePerByte

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

func (*SPVWallet) GetTransaction

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

func (*SPVWallet) HasKey

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

func (*SPVWallet) MasterPrivateKey

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

func (*SPVWallet) MasterPublicKey

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

func (*SPVWallet) Multisign

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

func (*SPVWallet) NewAddress

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

func (*SPVWallet) Params

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

func (*SPVWallet) ReSyncBlockchain

func (w *SPVWallet) ReSyncBlockchain(fromHeight int32)

func (*SPVWallet) Rebroadcast

func (w *SPVWallet) Rebroadcast()

func (*SPVWallet) Spend

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

func (*SPVWallet) Start

func (w *SPVWallet) Start()

func (*SPVWallet) SweepAddress

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

func (*SPVWallet) Transactions

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

type Signature

type Signature struct {
	InputIndex uint32
	Signature  []byte
}

This object contains a single signature for a multisig transaction. InputIndex specifies the index for which this signature applies.

type StoredHeader

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

type Stxo

type Stxo struct {
	// When it used to be a UTXO
	Utxo Utxo

	// The height at which it met its demise
	SpendHeight int32

	// The tx that consumed it
	SpendTxid chainhash.Hash
}

type Stxos

type Stxos interface {
	// Put a stxo to the database
	Put(stxo Stxo) error

	// Fetch all stxos from the db
	GetAll() ([]Stxo, error)

	// Delete a stxo from the db
	Delete(stxo Stxo) error
}

type TransactionCallback

type TransactionCallback struct {
	Txid      []byte
	Outputs   []TransactionOutput
	Inputs    []TransactionInput
	Height    int32
	Timestamp time.Time
	Value     int64
	WatchOnly bool
}

This callback is passed to any registered transaction listeners when a transaction is detected for the wallet.

type TransactionInput

type TransactionInput struct {
	OutpointHash       []byte
	OutpointIndex      uint32
	LinkedScriptPubKey []byte
	Value              int64
}

type TransactionOutput

type TransactionOutput struct {
	ScriptPubKey []byte
	Value        int64
	Index        uint32
}

type TransactionRecord

type TransactionRecord struct {
	Txid         string
	Index        uint32
	Value        int64
	ScriptPubKey string
	Spent        bool
}

OpenBazaar uses p2sh addresses for escrow. This object can be used to store a record of a transaction going into or out of such an address. Incoming transactions should have a positive value and be market as spent when the UXTO is spent. Outgoing transactions should have a negative value. The spent field isn't relevant for outgoing transactions.

type TxStore

type TxStore struct {
	Adrs []btcutil.Address

	Param *chaincfg.Params

	Datastore
	// contains filtered or unexported fields
}

func NewTxStore

func NewTxStore(p *chaincfg.Params, db Datastore, masterPrivKey *hd.ExtendedKey) (*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) GetCurrentKey

func (ts *TxStore) GetCurrentKey(purpose KeyPurpose) (*hd.ExtendedKey, error)

func (*TxStore) GetFreshKey

func (ts *TxStore) GetFreshKey(purpose KeyPurpose) *hd.ExtendedKey

func (*TxStore) GetKeyForScript

func (ts *TxStore) GetKeyForScript(scriptPubKey []byte) (*hd.ExtendedKey, error)

func (*TxStore) GetKeys

func (ts *TxStore) GetKeys() []*hd.ExtendedKey

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

type Txn

type Txn struct {
	// Transaction ID
	Txid string

	// The value relevant to the wallet
	Value int64

	// The height at which it was mined
	Height int32

	// The time the transaction was first seen
	Timestamp time.Time

	// This transaction only involves a watch only address
	WatchOnly bool

	Bytes []byte
}

type Txns

type Txns interface {
	// Put a new transaction to the database
	Put(txn *wire.MsgTx, value, height int, timestamp time.Time, watchOnly bool) error

	// Fetch a raw tx and it's metadata given a hash
	Get(txid chainhash.Hash) (*wire.MsgTx, Txn, error)

	// Fetch all transactions from the db
	GetAll(includeWatchOnly bool) ([]Txn, error)

	// Update the height of a transaction
	UpdateHeight(txid chainhash.Hash, height int) error

	// Delete a transactions from the db
	Delete(txid *chainhash.Hash) error
}

type Utxo

type Utxo struct {
	// Previous txid and output index
	Op wire.OutPoint

	// Block height where this tx was confirmed, 0 for unconfirmed
	AtHeight int32

	// The higher the better
	Value int64

	// Output script
	ScriptPubkey []byte

	// If true this utxo will not be selected for spending. The primary
	// purpose is track multisig UTXOs which must have separate handling
	// to spend.
	WatchOnly bool
}

type Utxos

type Utxos interface {
	// Put a utxo to the database
	Put(utxo Utxo) error

	// Fetch all utxos from the db
	GetAll() ([]Utxo, error)

	// Make a utxo unspendable
	SetWatchOnly(utxo Utxo) error

	// Delete a utxo from the db
	Delete(utxo Utxo) error
}

type WatchedScripts

type WatchedScripts interface {
	// Add a script to watch
	Put(scriptPubKey []byte) error

	// Return all watched scripts
	GetAll() ([][]byte, error)

	// Delete a watched script
	Delete(scriptPubKey []byte) error
}

Directories

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

Jump to

Keyboard shortcuts

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