gcs: switch basic filter to index prev output scripts of all inputs

This commit is contained in:
Olaoluwa Osuntokun 2018-06-14 17:42:53 -07:00
parent e993e6ce27
commit d3e82fcd5d
2 changed files with 11 additions and 18 deletions

View file

@ -335,9 +335,9 @@ func WithRandomKey() *GCSBuilder {
} }
// BuildBasicFilter builds a basic GCS filter from a block. A basic GCS filter // 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 // will contain all the previous output scripts spent by inputs within a block,
// data pushes within all the outputs created 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) { func BuildBasicFilter(block *wire.MsgBlock, prevOutScripts [][]byte) (*gcs.Filter, error) {
blockHash := block.BlockHash() blockHash := block.BlockHash()
b := WithKeyHash(&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, // 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 // adding each whole script itself.
// pkScript. for _, tx := range block.Transactions {
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)
}
}
// For each output in a transaction, we'll add each of the // For each output in a transaction, we'll add each of the
// individual data pushes within the script. // individual data pushes within the script.
for _, txOut := range tx.TxOut { 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() return b.Build()
} }

View file

@ -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 // FromBytes deserializes a GCS filter from a known N, P, and serialized filter
// as returned by Bytes(). // as returned by Bytes().
func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) {
// Basic sanity check. // Basic sanity check.
if P > 32 { if P > 32 {
return nil, ErrPTooBig return nil, ErrPTooBig
@ -287,7 +286,6 @@ func (f *Filter) N() uint32 {
// Match checks whether a []byte value is likely (within collision probability) // Match checks whether a []byte value is likely (within collision probability)
// to be a member of the set represented by the filter. // to be a member of the set represented by the filter.
func (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) { func (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) {
// Create a filter bitstream. // Create a filter bitstream.
filterData, err := f.Bytes() filterData, err := f.Bytes()
if err != nil { 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 // probability) to be a member of the set represented by the filter faster than
// calling Match() for each value individually. // calling Match() for each value individually.
func (f *Filter) MatchAny(key [KeySize]byte, data [][]byte) (bool, error) { func (f *Filter) MatchAny(key [KeySize]byte, data [][]byte) (bool, error) {
// Basic sanity check. // Basic sanity check.
if len(data) == 0 { if len(data) == 0 {
return false, nil return false, nil