mirror of
https://github.com/btcsuite/btcd.git
synced 2025-01-19 05:33:36 +01:00
txscript: move hash cache mid-state computation to hashcache.go file
This commit is contained in:
parent
3ddf1b51a6
commit
cfe801fe2e
@ -5,12 +5,68 @@
|
||||
package txscript
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"sync"
|
||||
|
||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
)
|
||||
|
||||
// calcHashPrevOuts calculates a single hash of all the previous outputs
|
||||
// (txid:index) referenced within the passed transaction. This calculated hash
|
||||
// can be re-used when validating all inputs spending segwit outputs, with a
|
||||
// signature hash type of SigHashAll. This allows validation to re-use previous
|
||||
// hashing computation, reducing the complexity of validating SigHashAll inputs
|
||||
// from O(N^2) to O(N).
|
||||
func calcHashPrevOuts(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, in := range tx.TxIn {
|
||||
// First write out the 32-byte transaction ID one of whose
|
||||
// outputs are being referenced by this input.
|
||||
b.Write(in.PreviousOutPoint.Hash[:])
|
||||
|
||||
// Next, we'll encode the index of the referenced output as a
|
||||
// little endian integer.
|
||||
var buf [4]byte
|
||||
binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index)
|
||||
b.Write(buf[:])
|
||||
}
|
||||
|
||||
return chainhash.HashH(b.Bytes())
|
||||
}
|
||||
|
||||
// calcHashSequence computes an aggregated hash of each of the sequence numbers
|
||||
// within the inputs of the passed transaction. This single hash can be re-used
|
||||
// when validating all inputs spending segwit outputs, which include signatures
|
||||
// using the SigHashAll sighash type. This allows validation to re-use previous
|
||||
// hashing computation, reducing the complexity of validating SigHashAll inputs
|
||||
// from O(N^2) to O(N).
|
||||
func calcHashSequence(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, in := range tx.TxIn {
|
||||
var buf [4]byte
|
||||
binary.LittleEndian.PutUint32(buf[:], in.Sequence)
|
||||
b.Write(buf[:])
|
||||
}
|
||||
|
||||
return chainhash.HashH(b.Bytes())
|
||||
}
|
||||
|
||||
// calcHashOutputs computes a hash digest of all outputs created by the
|
||||
// transaction encoded using the wire format. This single hash can be re-used
|
||||
// when validating all inputs spending witness programs, which include
|
||||
// signatures using the SigHashAll sighash type. This allows computation to be
|
||||
// cached, reducing the total hashing complexity from O(N^2) to O(N).
|
||||
func calcHashOutputs(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, out := range tx.TxOut {
|
||||
wire.WriteTxOut(&b, 0, 0, out)
|
||||
}
|
||||
|
||||
return chainhash.HashH(b.Bytes())
|
||||
}
|
||||
|
||||
// TxSigHashes houses the partial set of sighashes introduced within BIP0143.
|
||||
// This partial set of sighashes may be re-used within each input across a
|
||||
// transaction when validating all inputs. As a result, validation complexity
|
||||
|
@ -292,60 +292,6 @@ func removeOpcodeByData(script []byte, dataToRemove []byte) []byte {
|
||||
return result
|
||||
}
|
||||
|
||||
// calcHashPrevOuts calculates a single hash of all the previous outputs
|
||||
// (txid:index) referenced within the passed transaction. This calculated hash
|
||||
// can be re-used when validating all inputs spending segwit outputs, with a
|
||||
// signature hash type of SigHashAll. This allows validation to re-use previous
|
||||
// hashing computation, reducing the complexity of validating SigHashAll inputs
|
||||
// from O(N^2) to O(N).
|
||||
func calcHashPrevOuts(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, in := range tx.TxIn {
|
||||
// First write out the 32-byte transaction ID one of whose
|
||||
// outputs are being referenced by this input.
|
||||
b.Write(in.PreviousOutPoint.Hash[:])
|
||||
|
||||
// Next, we'll encode the index of the referenced output as a
|
||||
// little endian integer.
|
||||
var buf [4]byte
|
||||
binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index)
|
||||
b.Write(buf[:])
|
||||
}
|
||||
|
||||
return chainhash.DoubleHashH(b.Bytes())
|
||||
}
|
||||
|
||||
// calcHashSequence computes an aggregated hash of each of the sequence numbers
|
||||
// within the inputs of the passed transaction. This single hash can be re-used
|
||||
// when validating all inputs spending segwit outputs, which include signatures
|
||||
// using the SigHashAll sighash type. This allows validation to re-use previous
|
||||
// hashing computation, reducing the complexity of validating SigHashAll inputs
|
||||
// from O(N^2) to O(N).
|
||||
func calcHashSequence(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, in := range tx.TxIn {
|
||||
var buf [4]byte
|
||||
binary.LittleEndian.PutUint32(buf[:], in.Sequence)
|
||||
b.Write(buf[:])
|
||||
}
|
||||
|
||||
return chainhash.DoubleHashH(b.Bytes())
|
||||
}
|
||||
|
||||
// calcHashOutputs computes a hash digest of all outputs created by the
|
||||
// transaction encoded using the wire format. This single hash can be re-used
|
||||
// when validating all inputs spending witness programs, which include
|
||||
// signatures using the SigHashAll sighash type. This allows computation to be
|
||||
// cached, reducing the total hashing complexity from O(N^2) to O(N).
|
||||
func calcHashOutputs(tx *wire.MsgTx) chainhash.Hash {
|
||||
var b bytes.Buffer
|
||||
for _, out := range tx.TxOut {
|
||||
wire.WriteTxOut(&b, 0, 0, out)
|
||||
}
|
||||
|
||||
return chainhash.DoubleHashH(b.Bytes())
|
||||
}
|
||||
|
||||
// calcWitnessSignatureHashRaw computes the sighash digest of a transaction's
|
||||
// segwit input using the new, optimized digest calculation algorithm defined
|
||||
// in BIP0143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki.
|
||||
|
Loading…
Reference in New Issue
Block a user