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
|
// 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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue