gcs: switch basic filter to index prev output scripts of all inputs
This commit is contained in:
parent
e993e6ce27
commit
d3e82fcd5d
2 changed files with 11 additions and 18 deletions
|
@ -335,9 +335,9 @@ func WithRandomKey() *GCSBuilder {
|
|||
}
|
||||
|
||||
// BuildBasicFilter builds a basic GCS filter from a block. A basic GCS filter
|
||||
// will contain all the previous outpoints spent within a block, as well as the
|
||||
// data pushes within all the outputs created within a block.
|
||||
func BuildBasicFilter(block *wire.MsgBlock) (*gcs.Filter, error) {
|
||||
// will contain all the previous output scripts spent by inputs within a block,
|
||||
// as well as the data pushes within all the outputs created within a block.
|
||||
func BuildBasicFilter(block *wire.MsgBlock, prevOutScripts [][]byte) (*gcs.Filter, error) {
|
||||
blockHash := block.BlockHash()
|
||||
b := WithKeyHash(&blockHash)
|
||||
|
||||
|
@ -349,18 +349,8 @@ func BuildBasicFilter(block *wire.MsgBlock) (*gcs.Filter, error) {
|
|||
}
|
||||
|
||||
// In order to build a basic filter, we'll range over the entire block,
|
||||
// adding the outpoint data as well as the data pushes within the
|
||||
// pkScript.
|
||||
for i, tx := range block.Transactions {
|
||||
// Skip the inputs for the coinbase transaction
|
||||
if i != 0 {
|
||||
// Each each txin, we'll add a serialized version of
|
||||
// the txid:index to the filters data slices.
|
||||
for _, txIn := range tx.TxIn {
|
||||
b.AddOutPoint(txIn.PreviousOutPoint)
|
||||
}
|
||||
}
|
||||
|
||||
// adding each whole script itself.
|
||||
for _, tx := range block.Transactions {
|
||||
// For each output in a transaction, we'll add each of the
|
||||
// individual data pushes within the script.
|
||||
for _, txOut := range tx.TxOut {
|
||||
|
@ -368,6 +358,12 @@ func BuildBasicFilter(block *wire.MsgBlock) (*gcs.Filter, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// In the second pass, we'll also add all the prevOutScripts
|
||||
// individually as elements.
|
||||
for _, prevScript := range prevOutScripts {
|
||||
b.AddEntry(prevScript)
|
||||
}
|
||||
|
||||
return b.Build()
|
||||
}
|
||||
|
||||
|
|
|
@ -175,7 +175,6 @@ func BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filte
|
|||
// FromBytes deserializes a GCS filter from a known N, P, and serialized filter
|
||||
// as returned by Bytes().
|
||||
func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) {
|
||||
|
||||
// Basic sanity check.
|
||||
if P > 32 {
|
||||
return nil, ErrPTooBig
|
||||
|
@ -287,7 +286,6 @@ func (f *Filter) N() uint32 {
|
|||
// Match checks whether a []byte value is likely (within collision probability)
|
||||
// to be a member of the set represented by the filter.
|
||||
func (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) {
|
||||
|
||||
// Create a filter bitstream.
|
||||
filterData, err := f.Bytes()
|
||||
if err != nil {
|
||||
|
@ -335,7 +333,6 @@ func (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) {
|
|||
// probability) to be a member of the set represented by the filter faster than
|
||||
// calling Match() for each value individually.
|
||||
func (f *Filter) MatchAny(key [KeySize]byte, data [][]byte) (bool, error) {
|
||||
|
||||
// Basic sanity check.
|
||||
if len(data) == 0 {
|
||||
return false, nil
|
||||
|
|
Loading…
Reference in a new issue