bitcoin

package
v0.62.1 Latest Latest
Warning

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

Go to latest
Published: Jul 22, 2021 License: MIT Imports: 47 Imported by: 0

Documentation

Index

Constants

View Source
const (
	BlockCacheSize      = 144
	MaximumConfirmation = 99999999
	MaxAsgardAddresses  = 100
	// EstimateAverageTxSize for THORChain the estimate tx size is hard code to 1000 here , as most of time it will spend 1 input, have 3 output
	// which is average at 250 vbytes , however asgard will consolidate UTXOs , which will take up to 1000 vbytes
	EstimateAverageTxSize = 1000
	DefaultCoinbaseValue  = 6.25
	MaxMempoolScanPerTry  = 500
)

BlockCacheSize the number of block meta that get store in storage.

View Source
const (
	TransactionFeeKey = "transactionfee-"
	PrefixBlockMeta   = `blockmeta-`
	PrefixMempool     = "mempool-"
	PrefixObservedTx  = "observed-"
)

PrefixUTXOStorage declares prefix to use in leveldb to avoid conflicts

View Source
const (
	// SatsPervBytes it should be enough , this one will only be used if signer can't find any previous UTXO , and fee info from local storage.
	SatsPervBytes = 25
	// MinUTXOConfirmation UTXO that has less confirmation then this will not be spent , unless it is yggdrasil
	MinUTXOConfirmation = 1
)

Variables

This section is empty.

Functions

func GetBech32AccountPubKey

func GetBech32AccountPubKey(key *btcec.PrivateKey) (common.PubKey, error)

GetBech32AccountPubKey convert the given private key to

Types

type BlockMeta

type BlockMeta struct {
	PreviousHash         string   `json:"previous_hash"`
	Height               int64    `json:"height"`
	BlockHash            string   `json:"block_hash"`
	SelfTransactions     []string `json:"self_transactions,omitempty"`     // keep the transactions that broadcast by itself
	CustomerTransactions []string `json:"customer_transactions,omitempty"` // keep the transactions that from customer
}

BlockMeta is a structure to store the blocks bifrost scanned

func NewBlockMeta

func NewBlockMeta(previousHash string, height int64, blockHash string) *BlockMeta

NewBlockMeta create a new instance of BlockMeta

func (*BlockMeta) AddCustomerTransaction added in v0.41.0

func (b *BlockMeta) AddCustomerTransaction(txID string)

AddCustomerTransaction add the given Transaction into block meta

func (*BlockMeta) AddSelfTransaction added in v0.41.0

func (b *BlockMeta) AddSelfTransaction(txID string)

AddSelfTransaction add the given Transaction into block meta

func (*BlockMeta) RemoveCustomerTransaction added in v0.41.0

func (b *BlockMeta) RemoveCustomerTransaction(txID string)

RemoveCustomerTransaction remove the given transaction from the block

func (*BlockMeta) TransactionHashExist added in v0.41.0

func (b *BlockMeta) TransactionHashExist(hash string) bool

TransactionHashExist check whether the given traction hash exist in the block meta

type BlockMetaAccessor

type BlockMetaAccessor interface {
	GetBlockMetas() ([]*BlockMeta, error)
	GetBlockMeta(height int64) (*BlockMeta, error)
	SaveBlockMeta(height int64, blockMeta *BlockMeta) error
	PruneBlockMeta(height int64, callback PruneBlockMetaCallback) error
	UpsertTransactionFee(fee float64, vSize int32) error
	GetTransactionFee() (float64, int32, error)
	TryAddToMemPoolCache(hash string) (bool, error)
	RemoveFromMemPoolCache(hash string) error
	TryAddToObservedTxCache(hash string) (bool, error)
	RemoveObservedTxCache(hash string) error
}

BlockMetaAccessor define methods need to access block meta storage

type Client

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

Client observes bitcoin chain and allows to sign and broadcast tx

func NewClient

func NewClient(thorKeys *thorclient.Keys, cfg config.ChainConfiguration, server *tssp.TssServer, bridge *thorclient.ThorchainBridge, m *metrics.Metrics) (*Client, error)

NewClient generates a new Client

func (*Client) BroadcastTx

func (c *Client) BroadcastTx(txOut stypes.TxOutItem, payload []byte) (string, error)

BroadcastTx will broadcast the given payload to BTC chain

func (*Client) ConfirmationCountReady added in v0.41.0

func (c *Client) ConfirmationCountReady(txIn types.TxIn) bool

ConfirmationCountReady will be called by observer before send the txIn to thorchain confirmation counting is on block level , refer to https://medium.com/coinmonks/1confvalue-a-simple-pow-confirmation-rule-of-thumb-a8d9c6c483dd for detail

func (*Client) FetchMemPool added in v0.41.0

func (c *Client) FetchMemPool(height int64) (types.TxIn, error)

FetchMemPool retrieves txs from mempool

func (*Client) FetchTxs

func (c *Client) FetchTxs(height int64) (types.TxIn, error)

FetchTxs retrieves txs for a block height

func (*Client) GetAccount

func (c *Client) GetAccount(pkey common.PubKey) (common.Account, error)

GetAccount returns account with balance for an address

func (*Client) GetAccountByAddress

func (c *Client) GetAccountByAddress(string) (common.Account, error)

func (*Client) GetAddress

func (c *Client) GetAddress(poolPubKey common.PubKey) string

GetAddress returns address from pubkey

func (*Client) GetChain

func (c *Client) GetChain() common.Chain

GetChain returns BTC Chain

func (*Client) GetConfig

func (c *Client) GetConfig() config.ChainConfiguration

GetConfig - get the chain configuration

func (*Client) GetConfirmationCount added in v0.41.0

func (c *Client) GetConfirmationCount(txIn types.TxIn) int64

GetConfirmationCount return the number of blocks the tx need to wait before processing in THORChain

func (*Client) GetHeight

func (c *Client) GetHeight() (int64, error)

GetHeight returns current block height

func (*Client) IsBlockScannerHealthy added in v0.41.0

func (c *Client) IsBlockScannerHealthy() bool

func (*Client) OnObservedTxIn

func (c *Client) OnObservedTxIn(txIn types.TxInItem, blockHeight int64)

OnObservedTxIn gets called from observer when we have a valid observation For bitcoin chain client we want to save the utxo we can spend later to sign

func (*Client) RegisterPublicKey added in v0.41.0

func (c *Client) RegisterPublicKey(pkey common.PubKey) error

RegisterPublicKey register the given pubkey to bitcoin wallet

func (*Client) SignTx

func (c *Client) SignTx(tx stypes.TxOutItem, thorchainHeight int64) ([]byte, error)

SignTx is going to generate the outbound transaction, and also sign it

func (*Client) Start

func (c *Client) Start(globalTxsQueue chan types.TxIn, globalErrataQueue chan types.ErrataBlock)

Start starts the block scanner

func (*Client) Stop

func (c *Client) Stop()

Stop stops the block scanner

type KeySignWrapper

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

KeySignWrapper is a wrap of private key and also tss instance it also implement the txscript.Signable interface, and will decide which method to use based on the pubkey

func NewKeySignWrapper

func NewKeySignWrapper(privateKey *btcec.PrivateKey, tssKeyManager tss.ThorchainKeyManager) (*KeySignWrapper, error)

NewKeySignWrapper create a new instance of Keysign Wrapper

func (*KeySignWrapper) GetSignable

func (w *KeySignWrapper) GetSignable(poolPubKey common.PubKey) txscript.Signable

GetSignable based on the given poolPubKey

type LevelDBBlockMetaAccessor

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

LevelDBBlockMetaAccessor struct

func NewLevelDBBlockMetaAccessor

func NewLevelDBBlockMetaAccessor(db *leveldb.DB) (*LevelDBBlockMetaAccessor, error)

NewLevelDBBlockMetaAccessor creates a new level db backed BlockMeta accessor

func (*LevelDBBlockMetaAccessor) GetBlockMeta

func (t *LevelDBBlockMetaAccessor) GetBlockMeta(height int64) (*BlockMeta, error)

GetBlockMeta at given block height , when the requested block meta doesn't exist , it will return nil , thus caller need to double check it

func (*LevelDBBlockMetaAccessor) GetBlockMetas

func (t *LevelDBBlockMetaAccessor) GetBlockMetas() ([]*BlockMeta, error)

GetBlockMetas returns all the block metas in storage The chain client will Prune block metas every time it finished scan a block , so at maximum it will keep BlockCacheSize blocks thus it should not grow out of control

func (*LevelDBBlockMetaAccessor) GetTransactionFee

func (t *LevelDBBlockMetaAccessor) GetTransactionFee() (float64, int32, error)

GetTransactionFee from db

func (*LevelDBBlockMetaAccessor) PruneBlockMeta

func (t *LevelDBBlockMetaAccessor) PruneBlockMeta(height int64, callback PruneBlockMetaCallback) error

PruneBlockMeta remove all block meta that is older than the given block height with exception, if there are unspent transaction output in it , then the block meta will not be removed

func (*LevelDBBlockMetaAccessor) RemoveFromMemPoolCache added in v0.41.0

func (t *LevelDBBlockMetaAccessor) RemoveFromMemPoolCache(hash string) error

RemoveFromMemPoolCache remove the hash from cache

func (*LevelDBBlockMetaAccessor) RemoveObservedTxCache added in v0.54.0

func (t *LevelDBBlockMetaAccessor) RemoveObservedTxCache(hash string) error

RemoveObservedTxCache remove the hash from cache

func (*LevelDBBlockMetaAccessor) SaveBlockMeta

func (t *LevelDBBlockMetaAccessor) SaveBlockMeta(height int64, blockMeta *BlockMeta) error

SaveBlockMeta persistent the given BlockMeta into storage

func (*LevelDBBlockMetaAccessor) TryAddToMemPoolCache added in v0.41.0

func (t *LevelDBBlockMetaAccessor) TryAddToMemPoolCache(hash string) (bool, error)

TryAddToMemPoolCache trying to add the given hash to mempool hash return value bool indicated whether we added value to cache or not

func (*LevelDBBlockMetaAccessor) TryAddToObservedTxCache added in v0.54.0

func (t *LevelDBBlockMetaAccessor) TryAddToObservedTxCache(hash string) (bool, error)

TryAddToObservedTxCache store the transaction hash into local key value store so as bifrost will not report a tx twice, which will cause it to be slashed by thornode

func (*LevelDBBlockMetaAccessor) UpsertTransactionFee

func (t *LevelDBBlockMetaAccessor) UpsertTransactionFee(fee float64, vSize int32) error

UpsertTransactionFee update the transaction fee in storage

type PruneBlockMetaCallback added in v0.54.0

type PruneBlockMetaCallback func(meta *BlockMeta) bool

type TransactionFee

type TransactionFee struct {
	Fee   float64 `json:"fee"`
	VSize int32   `json:"v_size"`
}

TransactionFee on bitcoin

type TssSignable

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

TssSignable is a signable implementation backed by tss

func NewTssSignable

func NewTssSignable(pubKey common.PubKey, manager tss.ThorchainKeyManager) (*TssSignable, error)

NewTssSignable create a new instance of TssSignable

func (*TssSignable) GetPubKey

func (ts *TssSignable) GetPubKey() *btcec.PublicKey

func (*TssSignable) Sign

func (ts *TssSignable) Sign(payload []byte) (*btcec.Signature, error)

Sign the given payload

Jump to

Keyboard shortcuts

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