Add antireplay cache

This commit is contained in:
9seconds
2021-03-15 10:43:32 +03:00
parent ab585fd699
commit ab1b3b4863
7 changed files with 97 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
package antireplay
import "github.com/9seconds/mtg/v2/mtglib"
type noop struct{}
func (n noop) SeenBefore(_ []byte) bool { return false }
func NewNoop() mtglib.AntiReplayCache {
return noop{}
}
+26
View File
@@ -0,0 +1,26 @@
package antireplay_test
import (
"testing"
"github.com/9seconds/mtg/v2/antireplay"
"github.com/stretchr/testify/suite"
)
type NoopTestSuite struct {
suite.Suite
}
func (suite *NoopTestSuite) TestOp() {
filter := antireplay.NewNoop()
suite.False(filter.SeenBefore([]byte{1, 2, 3}))
suite.False(filter.SeenBefore([]byte{4, 5, 6}))
suite.False(filter.SeenBefore([]byte{1, 2, 3}))
suite.False(filter.SeenBefore([]byte{4, 5, 6}))
}
func TestNoop(t *testing.T) {
t.Parallel()
suite.Run(t, &NoopTestSuite{})
}
+24
View File
@@ -0,0 +1,24 @@
package antireplay
import (
"github.com/9seconds/mtg/v2/mtglib"
"github.com/OneOfOne/xxhash"
boom "github.com/tylertreat/BoomFilters"
)
type stableBloomFilter struct {
filter boom.StableBloomFilter
}
func (s *stableBloomFilter) SeenBefore(digest []byte) bool {
return s.filter.TestAndAdd(digest)
}
func NewStableBloomFilter(byteSize uint, errorRate float64) mtglib.AntiReplayCache {
sf := boom.NewDefaultStableBloomFilter(byteSize*8, errorRate) // nolint: gomnd
sf.SetHash(xxhash.New64())
return &stableBloomFilter{
filter: *sf,
}
}
+26
View File
@@ -0,0 +1,26 @@
package antireplay_test
import (
"testing"
"github.com/9seconds/mtg/v2/antireplay"
"github.com/stretchr/testify/suite"
)
type StableBloomFilterTestSuite struct {
suite.Suite
}
func (suite *StableBloomFilterTestSuite) TestOp() {
filter := antireplay.NewStableBloomFilter(500, 0.001)
suite.False(filter.SeenBefore([]byte{1, 2, 3}))
suite.False(filter.SeenBefore([]byte{4, 5, 6}))
suite.True(filter.SeenBefore([]byte{1, 2, 3}))
suite.True(filter.SeenBefore([]byte{4, 5, 6}))
}
func TestStableBloomFilter(t *testing.T) {
t.Parallel()
suite.Run(t, &StableBloomFilterTestSuite{})
}