txauthor

package
v0.0.14 Latest Latest
Warning

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

Go to latest
Published: Dec 3, 2024 License: ISC Imports: 16 Imported by: 0

Documentation

Overview

Package txauthor provides transaction creation code for wallets.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AddAllInputScripts

func AddAllInputScripts(signer frost.Signer, linearCombinations map[string]*crypto.LinearCombination, data []byte,
	tx *wire.MsgTx, prevPkScripts [][]byte, inputValues []btcutil.Amount, secrets SecretsSource) error

AddAllInputScripts modifies transaction a transaction by adding inputs scripts for each input. Previous output scripts being redeemed by each input are passed in prevPkScripts and the slice length must match the number of inputs. Private keys and redeem scripts are looked up using a SecretsSource based on the previous output script.

func RandomizeOutputPosition

func RandomizeOutputPosition(outputs []*wire.TxOut, index int) int

RandomizeOutputPosition randomizes the position of a transaction's output by swapping it with a random output. The new index is returned. This should be done before signing.

func SerializeTxData added in v0.0.12

func SerializeTxData(txData *TxData) ([]byte, error)

func SumOutputValues

func SumOutputValues(outputs []*wire.TxOut) (totalOutput btcutil.Amount)

SumOutputValues sums up the list of TxOuts and returns an Amount.

func TXPrevOutFetcher

func TXPrevOutFetcher(tx *wire.MsgTx, prevPkScripts [][]byte,
	inputValues []btcutil.Amount) (*txscript.MultiPrevOutFetcher, error)

TXPrevOutFetcher creates a txscript.PrevOutFetcher from a given slice of previous pk scripts and input values.

Types

type AuthoredTx

type AuthoredTx struct {
	Tx              *wire.MsgTx
	PrevScripts     [][]byte
	PrevInputValues []btcutil.Amount
	TotalInput      btcutil.Amount
	ChangeIndex     int // negative if no change
}

AuthoredTx holds the state of a newly-created transaction and the change output (if one was added).

func NewUnsignedTransaction

func NewUnsignedTransaction(outputs []*wire.TxOut, feeRatePerKb btcutil.Amount,
	fetchInputs InputSource, changeSource *ChangeSource) (*AuthoredTx, error)

NewUnsignedTransaction creates an unsigned transaction paying to one or more non-change outputs. An appropriate transaction fee is included based on the transaction size.

Transaction inputs are chosen from repeated calls to fetchInputs with increasing targets amounts.

If any remaining output value can be returned to the wallet via a change output without violating mempool dust rules, a P2WPKH change output is appended to the transaction outputs. Since the change output may not be necessary, fetchChange is called zero or one times to generate this script. This function must return a P2WPKH script or smaller, otherwise fee estimation will be incorrect.

If successful, the transaction, total input value spent, and all previous output scripts are returned. If the input source was unable to provide enough input value to pay for every output any any necessary fees, an InputSourceError is returned.

BUGS: Fee estimation may be off when redeeming non-compressed P2PKH outputs.

func NewUnsignedTransactionWithAddedStroomFee added in v0.0.13

func NewUnsignedTransactionWithAddedStroomFee(outputs []*wire.TxOut, feeRatePerKb btcutil.Amount,
	fetchInputs InputSource, changeSource *ChangeSource, feeCoefficient float64) (*AuthoredTx, error)

func (*AuthoredTx) AddAllInputScripts

func (tx *AuthoredTx) AddAllInputScripts(signer frost.Signer, linearCombinations map[string]*crypto.LinearCombination,
	data []byte, secrets SecretsSource) error

AddAllInputScripts modifies an authored transaction by adding inputs scripts for each input of an authored transaction. Private keys and redeem scripts are looked up using a SecretsSource based on the previous output script.

func (*AuthoredTx) RandomizeChangePosition

func (tx *AuthoredTx) RandomizeChangePosition()

RandomizeChangePosition randomizes the position of an authored transaction's change output. This should be done before signing.

type ChangeSource

type ChangeSource struct {
	// NewScript is a closure that produces unique change output scripts per
	// invocation.
	NewScript func() ([]byte, error)

	// ScriptSize is the size in bytes of scripts produced by `NewScript`.
	ScriptSize int
}

ChangeSource provides change output scripts for transaction creation.

type InputSource

type InputSource func(target btcutil.Amount) (total btcutil.Amount, inputs []*wire.TxIn,
	inputValues []btcutil.Amount, scripts [][]byte, err error)

InputSource provides transaction inputs referencing spendable outputs to construct a transaction outputting some target amount. If the target amount can not be satisified, this can be signaled by returning a total amount less than the target or by returning a more detailed error implementing InputSourceError.

type InputSourceError

type InputSourceError interface {
	error
	InputSourceError()
}

InputSourceError describes the failure to provide enough input value from unspent transaction outputs to meet a target amount. A typed error is used so input sources can provide their own implementations describing the reason for the error, for example, due to spendable policies or locked coins rather than the wallet not having enough available input value.

type SecretsSource

type SecretsSource interface {
	txscript.KeyDB
	txscript.ScriptDB
	ChainParams() *chaincfg.Params
}

SecretsSource provides private keys and redeem scripts necessary for constructing transaction input signatures. Secrets are looked up by the corresponding Address for the previous output script. Addresses for lookup are created using the source's blockchain parameters and means a single SecretsSource can only manage secrets for a single chain.

TODO: Rewrite this interface to look up private keys and redeem scripts for pubkeys, pubkey hashes, script hashes, etc. as separate interface methods. This would remove the ChainParams requirement of the interface and could avoid unnecessary conversions from previous output scripts to Addresses. This can not be done without modifications to the txscript package.

type TxData added in v0.0.12

type TxData struct {
	SignatureData []byte
	PkScript      []byte
	InputValue    int64
	Tx            *wire.MsgTx
	SigHashes     *txscript.TxSigHashes
	Idx           int
}

func DeserializeTxData added in v0.0.12

func DeserializeTxData(data []byte) (*TxData, error)

func NewTxData added in v0.0.12

func NewTxData(signatureData []byte, pkScript []byte, inputValue int64, tx *wire.MsgTx,
	sigHashes *txscript.TxSigHashes, idx int) *TxData

func NewTxDataWithSignatureDataOnly added in v0.0.12

func NewTxDataWithSignatureDataOnly(signatureData []byte) *TxData

Jump to

Keyboard shortcuts

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