2017-05-16 05:20:44 +02:00
|
|
|
package chain
|
|
|
|
|
|
|
|
import (
|
2017-05-20 01:45:38 +02:00
|
|
|
"time"
|
|
|
|
|
2017-06-06 02:54:35 +02:00
|
|
|
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
|
|
|
"github.com/roasbeef/btcd/wire"
|
|
|
|
"github.com/roasbeef/btcutil"
|
|
|
|
"github.com/roasbeef/btcwallet/waddrmgr"
|
|
|
|
"github.com/roasbeef/btcwallet/wtxmgr"
|
2017-05-16 05:20:44 +02:00
|
|
|
)
|
|
|
|
|
2017-11-10 01:13:40 +01:00
|
|
|
// BackEnds returns a list of the available back ends.
|
|
|
|
// TODO: Refactor each into a driver and use dynamic registration.
|
|
|
|
func BackEnds() []string {
|
|
|
|
return []string{
|
|
|
|
"bitcoind",
|
|
|
|
"btcd",
|
|
|
|
"neutrino",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-16 05:20:44 +02:00
|
|
|
// Interface allows more than one backing blockchain source, such as a
|
|
|
|
// btcd RPC chain server, or an SPV library, as long as we write a driver for
|
|
|
|
// it.
|
|
|
|
type Interface interface {
|
|
|
|
Start() error
|
|
|
|
Stop()
|
|
|
|
WaitForShutdown()
|
|
|
|
GetBestBlock() (*chainhash.Hash, int32, error)
|
|
|
|
GetBlock(*chainhash.Hash) (*wire.MsgBlock, error)
|
2017-07-12 01:13:10 +02:00
|
|
|
GetBlockHash(int64) (*chainhash.Hash, error)
|
2017-09-20 22:33:12 +02:00
|
|
|
GetBlockHeader(*chainhash.Hash) (*wire.BlockHeader, error)
|
2017-05-16 05:20:44 +02:00
|
|
|
BlockStamp() (*waddrmgr.BlockStamp, error)
|
|
|
|
SendRawTransaction(*wire.MsgTx, bool) (*chainhash.Hash, error)
|
|
|
|
Rescan(*chainhash.Hash, []btcutil.Address, []*wire.OutPoint) error
|
|
|
|
NotifyReceived([]btcutil.Address) error
|
|
|
|
NotifyBlocks() error
|
|
|
|
Notifications() <-chan interface{}
|
2017-11-10 01:13:40 +01:00
|
|
|
BackEnd() string
|
2017-05-16 05:20:44 +02:00
|
|
|
}
|
2017-05-20 01:45:38 +02:00
|
|
|
|
|
|
|
// Notification types. These are defined here and processed from from reading
|
|
|
|
// a notificationChan to avoid handling these notifications directly in
|
2017-08-25 02:30:43 +02:00
|
|
|
// rpcclient callbacks, which isn't very Go-like and doesn't allow
|
2017-05-20 01:45:38 +02:00
|
|
|
// blocking client calls.
|
|
|
|
type (
|
|
|
|
// ClientConnected is a notification for when a client connection is
|
|
|
|
// opened or reestablished to the chain server.
|
|
|
|
ClientConnected struct{}
|
|
|
|
|
|
|
|
// BlockConnected is a notification for a newly-attached block to the
|
|
|
|
// best chain.
|
|
|
|
BlockConnected wtxmgr.BlockMeta
|
|
|
|
|
2017-05-21 04:36:40 +02:00
|
|
|
// FilteredBlockConnected is an alternate notification that contains
|
|
|
|
// both block and relevant transaction information in one struct, which
|
|
|
|
// allows atomic updates.
|
|
|
|
FilteredBlockConnected struct {
|
|
|
|
Block *wtxmgr.BlockMeta
|
|
|
|
RelevantTxs []*wtxmgr.TxRecord
|
|
|
|
}
|
|
|
|
|
2017-05-20 01:45:38 +02:00
|
|
|
// BlockDisconnected is a notifcation that the block described by the
|
|
|
|
// BlockStamp was reorganized out of the best chain.
|
|
|
|
BlockDisconnected wtxmgr.BlockMeta
|
|
|
|
|
|
|
|
// RelevantTx is a notification for a transaction which spends wallet
|
|
|
|
// inputs or pays to a watched address.
|
|
|
|
RelevantTx struct {
|
|
|
|
TxRecord *wtxmgr.TxRecord
|
|
|
|
Block *wtxmgr.BlockMeta // nil if unmined
|
|
|
|
}
|
|
|
|
|
|
|
|
// RescanProgress is a notification describing the current status
|
|
|
|
// of an in-progress rescan.
|
|
|
|
RescanProgress struct {
|
|
|
|
Hash *chainhash.Hash
|
|
|
|
Height int32
|
|
|
|
Time time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
// RescanFinished is a notification that a previous rescan request
|
|
|
|
// has finished.
|
|
|
|
RescanFinished struct {
|
|
|
|
Hash *chainhash.Hash
|
|
|
|
Height int32
|
|
|
|
Time time.Time
|
|
|
|
}
|
|
|
|
)
|