diff --git a/gcs/builder/builder.go b/gcs/builder/builder.go index c27e900..02631d8 100644 --- a/gcs/builder/builder.go +++ b/gcs/builder/builder.go @@ -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() } diff --git a/gcs/gcs.go b/gcs/gcs.go index 37380ff..c583fc8 100644 --- a/gcs/gcs.go +++ b/gcs/gcs.go @@ -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