mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-22 03:30:37 +00:00
switch to go implementation of roaring bitmaps for alpine support (#1165)
This commit is contained in:
parent
61fbe34024
commit
6ccf57dace
@ -1,4 +1,6 @@
|
||||
FROM golang:1.15 as builder
|
||||
FROM golang:1.15-alpine as builder
|
||||
|
||||
RUN apk add --no-cache make gcc musl-dev linux-headers git
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@ -9,8 +11,9 @@ RUN go mod download
|
||||
ADD . .
|
||||
RUN make all
|
||||
|
||||
FROM ubuntu:18.04
|
||||
FROM alpine:3
|
||||
|
||||
RUN apk add --no-cache ca-certificates
|
||||
COPY --from=builder /app/build/bin/* /usr/local/bin/
|
||||
|
||||
EXPOSE 8545 8546 8547 30303 30303/udp 8080 9090 6060
|
||||
|
@ -3,7 +3,7 @@ package commands
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/RoaringBitmap/gocroaring"
|
||||
"github.com/RoaringBitmap/roaring"
|
||||
"github.com/ledgerwatch/turbo-geth/common"
|
||||
"github.com/ledgerwatch/turbo-geth/common/dbutils"
|
||||
"github.com/ledgerwatch/turbo-geth/common/hexutil"
|
||||
@ -105,7 +105,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
|
||||
}
|
||||
}
|
||||
|
||||
blockNumbers := gocroaring.New()
|
||||
blockNumbers := roaring.New()
|
||||
blockNumbers.AddRange(begin, end+1) // [min,max)
|
||||
|
||||
topicsBitmap, err := getTopicsBitmap(tx.(ethdb.HasTx).Tx().Cursor(dbutils.LogTopicIndex).Prefetch(1), crit.Topics, uint32(begin), uint32(end))
|
||||
@ -121,7 +121,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
|
||||
}
|
||||
|
||||
logAddrIndex := tx.(ethdb.HasTx).Tx().Cursor(dbutils.LogAddressIndex).Prefetch(1)
|
||||
var addrBitmap *gocroaring.Bitmap
|
||||
var addrBitmap *roaring.Bitmap
|
||||
for _, addr := range crit.Addresses {
|
||||
m, err := bitmapdb.Get(logAddrIndex, addr[:], uint32(begin), uint32(end))
|
||||
if err != nil {
|
||||
@ -130,7 +130,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
|
||||
if addrBitmap == nil {
|
||||
addrBitmap = m
|
||||
} else {
|
||||
addrBitmap = gocroaring.Or(addrBitmap, m)
|
||||
addrBitmap = roaring.Or(addrBitmap, m)
|
||||
}
|
||||
}
|
||||
|
||||
@ -142,7 +142,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
|
||||
}
|
||||
}
|
||||
|
||||
if blockNumbers.Cardinality() == 0 {
|
||||
if blockNumbers.GetCardinality() == 0 {
|
||||
return returnLogs(logs), nil
|
||||
}
|
||||
|
||||
@ -177,10 +177,10 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
|
||||
// {{}, {B}} matches any topic in first position AND B in second position
|
||||
// {{A}, {B}} matches topic A in first position AND B in second position
|
||||
// {{A, B}, {C, D}} matches topic (A OR B) in first position AND (C OR D) in second position
|
||||
func getTopicsBitmap(c ethdb.Cursor, topics [][]common.Hash, from, to uint32) (*gocroaring.Bitmap, error) {
|
||||
var result *gocroaring.Bitmap
|
||||
func getTopicsBitmap(c ethdb.Cursor, topics [][]common.Hash, from, to uint32) (*roaring.Bitmap, error) {
|
||||
var result *roaring.Bitmap
|
||||
for _, sub := range topics {
|
||||
var bitmapForORing *gocroaring.Bitmap
|
||||
var bitmapForORing *roaring.Bitmap
|
||||
for _, topic := range sub {
|
||||
m, err := bitmapdb.Get(c, topic[:], from, to)
|
||||
if err != nil {
|
||||
@ -189,7 +189,7 @@ func getTopicsBitmap(c ethdb.Cursor, topics [][]common.Hash, from, to uint32) (*
|
||||
if bitmapForORing == nil {
|
||||
bitmapForORing = m
|
||||
} else {
|
||||
bitmapForORing = gocroaring.FastOr(bitmapForORing, m)
|
||||
bitmapForORing = roaring.FastOr(bitmapForORing, m)
|
||||
}
|
||||
}
|
||||
|
||||
@ -197,7 +197,7 @@ func getTopicsBitmap(c ethdb.Cursor, topics [][]common.Hash, from, to uint32) (*
|
||||
if result == nil {
|
||||
result = bitmapForORing
|
||||
} else {
|
||||
result = gocroaring.And(bitmapForORing, result)
|
||||
result = roaring.And(bitmapForORing, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/RoaringBitmap/gocroaring"
|
||||
"github.com/RoaringBitmap/roaring"
|
||||
"github.com/c2h5oh/datasize"
|
||||
"github.com/ledgerwatch/turbo-geth/common"
|
||||
"github.com/ledgerwatch/turbo-geth/common/dbutils"
|
||||
@ -74,8 +74,8 @@ func promoteLogIndex(db ethdb.DbWithPendingMutations, start uint64, quit <-chan
|
||||
defer logEvery.Stop()
|
||||
|
||||
tx := db.(ethdb.HasTx).Tx()
|
||||
topics := map[string]*gocroaring.Bitmap{}
|
||||
addresses := map[string]*gocroaring.Bitmap{}
|
||||
topics := map[string]*roaring.Bitmap{}
|
||||
addresses := map[string]*roaring.Bitmap{}
|
||||
logTopicIndexCursor := tx.Cursor(dbutils.LogTopicIndex)
|
||||
defer logTopicIndexCursor.Close()
|
||||
logAddrIndexCursor := tx.Cursor(dbutils.LogAddressIndex)
|
||||
@ -114,14 +114,14 @@ func promoteLogIndex(db ethdb.DbWithPendingMutations, start uint64, quit <-chan
|
||||
if err := flushBitmaps(logTopicIndexCursor, topics); err != nil {
|
||||
return err
|
||||
}
|
||||
topics = map[string]*gocroaring.Bitmap{}
|
||||
topics = map[string]*roaring.Bitmap{}
|
||||
}
|
||||
|
||||
if needFlush(addresses, logIndicesMemLimit) {
|
||||
if err := flushBitmaps(logAddrIndexCursor, addresses); err != nil {
|
||||
return err
|
||||
}
|
||||
addresses = map[string]*gocroaring.Bitmap{}
|
||||
addresses = map[string]*roaring.Bitmap{}
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ func promoteLogIndex(db ethdb.DbWithPendingMutations, start uint64, quit <-chan
|
||||
topicStr := string(topic.Bytes())
|
||||
m, ok := topics[topicStr]
|
||||
if !ok {
|
||||
m = gocroaring.New()
|
||||
m = roaring.New()
|
||||
topics[topicStr] = m
|
||||
}
|
||||
m.Add(uint32(blockNum))
|
||||
@ -146,7 +146,7 @@ func promoteLogIndex(db ethdb.DbWithPendingMutations, start uint64, quit <-chan
|
||||
accStr := string(log.Address.Bytes())
|
||||
m, ok := addresses[accStr]
|
||||
if !ok {
|
||||
m = gocroaring.New()
|
||||
m = roaring.New()
|
||||
addresses[accStr] = m
|
||||
}
|
||||
m.Add(uint32(blockNum))
|
||||
@ -235,16 +235,16 @@ func unwindLogIndex(db ethdb.DbWithPendingMutations, from, to uint64, quitCh <-c
|
||||
return nil
|
||||
}
|
||||
|
||||
func needFlush(bitmaps map[string]*gocroaring.Bitmap, memLimit datasize.ByteSize) bool {
|
||||
func needFlush(bitmaps map[string]*roaring.Bitmap, memLimit datasize.ByteSize) bool {
|
||||
sz := uint64(0)
|
||||
for _, m := range bitmaps {
|
||||
sz += uint64(m.SerializedSizeInBytes())
|
||||
sz += m.GetSerializedSizeInBytes()
|
||||
}
|
||||
const memoryNeedsForKey = 32 * 2 // each key stored in RAM: as string ang slice of bytes
|
||||
return uint64(len(bitmaps)*memoryNeedsForKey)+sz > uint64(memLimit)
|
||||
}
|
||||
|
||||
func flushBitmaps(c ethdb.Cursor, inMem map[string]*gocroaring.Bitmap) error {
|
||||
func flushBitmaps(c ethdb.Cursor, inMem map[string]*roaring.Bitmap) error {
|
||||
keys := make([]string, 0, len(inMem))
|
||||
for k := range inMem {
|
||||
keys = append(keys, k)
|
||||
|
@ -52,7 +52,7 @@ func TestLogIndex(t *testing.T) {
|
||||
err = promoteLogIndex(tx, 0, nil)
|
||||
require.NoError(err)
|
||||
|
||||
// Check indices cardinality (in how many blocks they meet)
|
||||
// Check indices GetCardinality (in how many blocks they meet)
|
||||
logTopicIndex := tx.(ethdb.HasTx).Tx().Cursor(dbutils.LogTopicIndex)
|
||||
logAddrIndex := tx.(ethdb.HasTx).Tx().Cursor(dbutils.LogAddressIndex)
|
||||
|
||||
|
@ -3,7 +3,7 @@ package bitmapdb
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"github.com/RoaringBitmap/gocroaring"
|
||||
"github.com/RoaringBitmap/roaring"
|
||||
"github.com/c2h5oh/datasize"
|
||||
"github.com/ledgerwatch/turbo-geth/common"
|
||||
"github.com/ledgerwatch/turbo-geth/ethdb"
|
||||
@ -18,7 +18,7 @@ const ShardLimit = 3 * datasize.KB
|
||||
// if last existing shard size merge it with delta
|
||||
// if serialized size of delta > ShardLimit - break down to multiple shards
|
||||
// shard number - it's biggest value in bitmap
|
||||
func AppendMergeByOr(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) error {
|
||||
func AppendMergeByOr(c ethdb.Cursor, key []byte, delta *roaring.Bitmap) error {
|
||||
lastShardKey := make([]byte, len(key)+4)
|
||||
copy(lastShardKey, key)
|
||||
binary.BigEndian.PutUint32(lastShardKey[len(lastShardKey)-4:], ^uint32(0))
|
||||
@ -35,13 +35,13 @@ func AppendMergeByOr(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
last, err := gocroaring.Read(currentLastV)
|
||||
last := roaring.New()
|
||||
_, err := last.FromBuffer(currentLastV)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
delta = gocroaring.Or(delta, last)
|
||||
delta = roaring.Or(delta, last)
|
||||
|
||||
err = writeBitmapSharded(c, key, delta)
|
||||
if err != nil {
|
||||
@ -51,18 +51,18 @@ func AppendMergeByOr(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) error
|
||||
}
|
||||
|
||||
// writeBitmapSharded - write bitmap to db, perform sharding if delta > ShardLimit
|
||||
func writeBitmapSharded(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) error {
|
||||
func writeBitmapSharded(c ethdb.Cursor, key []byte, delta *roaring.Bitmap) error {
|
||||
shardKey := make([]byte, len(key)+4)
|
||||
copy(shardKey, key)
|
||||
sz := delta.SerializedSizeInBytes()
|
||||
sz := int(delta.GetSerializedSizeInBytes())
|
||||
if sz <= int(ShardLimit) {
|
||||
newV := make([]byte, delta.SerializedSizeInBytes())
|
||||
err := delta.Write(newV)
|
||||
newV := bytes.NewBuffer(make([]byte, 0, delta.GetSerializedSizeInBytes()))
|
||||
_, err := delta.WriteTo(newV)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
binary.BigEndian.PutUint32(shardKey[len(shardKey)-4:], ^uint32(0))
|
||||
err = c.Put(common.CopyBytes(shardKey), newV)
|
||||
err = c.Put(common.CopyBytes(shardKey), newV.Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -75,8 +75,8 @@ func writeBitmapSharded(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) er
|
||||
}
|
||||
step := (delta.Maximum() - delta.Minimum()) / shardsAmount
|
||||
step = step / 16
|
||||
shard, tmp := gocroaring.New(), gocroaring.New() // shard will write to db, tmp will use to add data to shard
|
||||
for delta.Cardinality() > 0 {
|
||||
shard, tmp := roaring.New(), roaring.New() // shard will write to db, tmp will use to add data to shard
|
||||
for delta.GetCardinality() > 0 {
|
||||
from := uint64(delta.Minimum())
|
||||
to := from + uint64(step)
|
||||
tmp.Clear()
|
||||
@ -85,18 +85,18 @@ func writeBitmapSharded(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) er
|
||||
shard.Or(tmp)
|
||||
shard.RunOptimize()
|
||||
delta.RemoveRange(from, to)
|
||||
if delta.Cardinality() == 0 {
|
||||
if delta.GetCardinality() == 0 {
|
||||
break
|
||||
}
|
||||
if shard.SerializedSizeInBytes() >= int(ShardLimit) {
|
||||
newV := make([]byte, shard.SerializedSizeInBytes())
|
||||
err := shard.Write(newV)
|
||||
if shard.GetSerializedSizeInBytes() >= uint64(ShardLimit) {
|
||||
newV := bytes.NewBuffer(make([]byte, 0, shard.GetSerializedSizeInBytes()))
|
||||
_, err := shard.WriteTo(newV)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
binary.BigEndian.PutUint32(shardKey[len(shardKey)-4:], shard.Maximum())
|
||||
|
||||
err = c.Put(common.CopyBytes(shardKey), newV)
|
||||
err = c.Put(common.CopyBytes(shardKey), newV.Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -104,14 +104,14 @@ func writeBitmapSharded(c ethdb.Cursor, key []byte, delta *gocroaring.Bitmap) er
|
||||
}
|
||||
}
|
||||
|
||||
if shard.SerializedSizeInBytes() > 0 {
|
||||
newV := make([]byte, shard.SerializedSizeInBytes())
|
||||
err := shard.Write(newV)
|
||||
if shard.GetSerializedSizeInBytes() > 0 {
|
||||
newV := bytes.NewBuffer(make([]byte, 0, shard.GetSerializedSizeInBytes()))
|
||||
_, err := shard.WriteTo(newV)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
binary.BigEndian.PutUint32(shardKey[len(shardKey)-4:], ^uint32(0))
|
||||
err = c.Put(common.CopyBytes(shardKey), newV)
|
||||
err = c.Put(common.CopyBytes(shardKey), newV.Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -142,7 +142,8 @@ func TruncateRange(tx ethdb.Tx, bucket string, key []byte, from, to uint64) erro
|
||||
break
|
||||
}
|
||||
|
||||
bm, err := gocroaring.Read(v)
|
||||
bm := roaring.New()
|
||||
_, err := bm.FromBuffer(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -161,12 +162,12 @@ func TruncateRange(tx ethdb.Tx, bucket string, key []byte, from, to uint64) erro
|
||||
}
|
||||
|
||||
bm.RunOptimize()
|
||||
newV := make([]byte, bm.SerializedSizeInBytes())
|
||||
err = bm.Write(newV)
|
||||
newV := bytes.NewBuffer(make([]byte, 0, bm.GetSerializedSizeInBytes()))
|
||||
_, err = bm.WriteTo(newV)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = c.Put(common.CopyBytes(k), newV)
|
||||
err = c.Put(common.CopyBytes(k), newV.Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -212,8 +213,8 @@ func TruncateRange(tx ethdb.Tx, bucket string, key []byte, from, to uint64) erro
|
||||
|
||||
// Get - reading as much shards as needed to satisfy [from, to] condition
|
||||
// join all shards to 1 bitmap by Or operator
|
||||
func Get(c ethdb.Cursor, key []byte, from, to uint32) (*gocroaring.Bitmap, error) {
|
||||
var shards []*gocroaring.Bitmap
|
||||
func Get(c ethdb.Cursor, key []byte, from, to uint32) (*roaring.Bitmap, error) {
|
||||
var shards []*roaring.Bitmap
|
||||
|
||||
fromKey := make([]byte, len(key)+4)
|
||||
copy(fromKey, key)
|
||||
@ -227,7 +228,8 @@ func Get(c ethdb.Cursor, key []byte, from, to uint32) (*gocroaring.Bitmap, error
|
||||
break
|
||||
}
|
||||
|
||||
bm, err := gocroaring.Read(v)
|
||||
bm := roaring.New()
|
||||
_, err := bm.FromBuffer(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -239,7 +241,7 @@ func Get(c ethdb.Cursor, key []byte, from, to uint32) (*gocroaring.Bitmap, error
|
||||
}
|
||||
|
||||
if len(shards) == 0 {
|
||||
return gocroaring.New(), nil
|
||||
return roaring.New(), nil
|
||||
}
|
||||
return gocroaring.FastOr(shards...), nil
|
||||
return roaring.FastOr(shards...), nil
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/RoaringBitmap/gocroaring"
|
||||
"github.com/RoaringBitmap/roaring"
|
||||
"github.com/ledgerwatch/turbo-geth/common/dbutils"
|
||||
"github.com/ledgerwatch/turbo-geth/ethdb"
|
||||
"github.com/ledgerwatch/turbo-geth/ethdb/bitmapdb"
|
||||
@ -26,7 +26,7 @@ func TestSharding(t *testing.T) {
|
||||
k := []byte{1}
|
||||
// Write/Read large bitmap works expected
|
||||
for i := uint32(0); i < 3_000_000; i += 1_000_000 {
|
||||
bm1 := gocroaring.New()
|
||||
bm1 := roaring.New()
|
||||
for j := i; j < i+1_000_000; j += 20 {
|
||||
bm1.AddRange(uint64(j), uint64(j+10))
|
||||
}
|
||||
@ -36,7 +36,7 @@ func TestSharding(t *testing.T) {
|
||||
|
||||
fromDb, err := bitmapdb.Get(c, k, 0, 10_000_000)
|
||||
require.NoError(t, err)
|
||||
expect := gocroaring.New()
|
||||
expect := roaring.New()
|
||||
for i := uint32(0); i < 3_000_000; i += 1_000_000 {
|
||||
for j := i; j < i+1_000_000; j += 20 {
|
||||
expect.AddRange(uint64(j), uint64(j+10))
|
||||
@ -53,7 +53,7 @@ func TestSharding(t *testing.T) {
|
||||
fromDb, err = bitmapdb.Get(c, k, 0, 10_000_000)
|
||||
require.NoError(t, err)
|
||||
|
||||
expect = gocroaring.New()
|
||||
expect = roaring.New()
|
||||
for i := uint32(0); i < 2_000_000; i += 1_000_000 {
|
||||
for j := i; j < i+1_000_000; j += 20 {
|
||||
expect.AddRange(uint64(j), uint64(j+10))
|
||||
|
2
go.mod
2
go.mod
@ -7,7 +7,7 @@ require (
|
||||
github.com/Azure/azure-storage-blob-go v0.8.0
|
||||
github.com/Azure/go-autorest/autorest/adal v0.8.3 // indirect
|
||||
github.com/JekaMas/notify v0.9.4
|
||||
github.com/RoaringBitmap/gocroaring v0.2.66-0.20200926170445-4232533f8158
|
||||
github.com/RoaringBitmap/roaring v0.5.1
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
||||
github.com/VictoriaMetrics/fastcache v1.5.7
|
||||
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847
|
||||
|
20
go.sum
20
go.sum
@ -29,8 +29,8 @@ github.com/JekaMas/notify v0.9.4 h1:Ns+DRf9kho8T0yQNSKoZqAnbvO/Hg3KmJCUaoRhL7MM=
|
||||
github.com/JekaMas/notify v0.9.4/go.mod h1:KYZd45vBSOYP2/9lY38EjZtvKRZMfgWaJk8bvBxhIYk=
|
||||
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/RoaringBitmap/gocroaring v0.2.66-0.20200926170445-4232533f8158 h1:vUCwVHxgwPjUvknaRJrqW1aoOo/TSj3Wls04zV5uE3E=
|
||||
github.com/RoaringBitmap/gocroaring v0.2.66-0.20200926170445-4232533f8158/go.mod h1:UY3cRDn1176ZP/joHjSQFUbD4WiK4j65wzbmXregcUc=
|
||||
github.com/RoaringBitmap/roaring v0.5.1 h1:ugdwntNygzk1FZnmtxUr+jM9AYrpU3I3zpt49npDWVo=
|
||||
github.com/RoaringBitmap/roaring v0.5.1/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw=
|
||||
@ -116,6 +116,10 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
|
||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2 h1:Ujru1hufTHVb++eG6OuNDKMxZnGIvF6o/u8q/8h2+I4=
|
||||
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
||||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 h1:gclg6gY70GLy3PbkQ1AERPfmLMMagS60DKF78eWwLn8=
|
||||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
||||
github.com/go-gl/gl v0.0.0-20180407155706-68e253793080/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
|
||||
github.com/go-gl/glfw v0.0.0-20180426074136-46a8d530c326/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
@ -177,6 +181,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99 h1:twflg0XRTjwKpxb/jFExr4HGq6on2dEOmnL6FV+fgPw=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
@ -213,6 +219,8 @@ github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGn
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
@ -266,6 +274,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY=
|
||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
@ -285,6 +295,8 @@ github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 h1:KcEvVBAvyHkUdFAygK
|
||||
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4=
|
||||
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM=
|
||||
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
|
||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
@ -350,6 +362,8 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
|
||||
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8=
|
||||
github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
|
||||
@ -372,6 +386,8 @@ github.com/valyala/gozstd v1.8.3 h1:nHlS+sCFoNLsZpRPKDviXkhHybaRSUjH2w0P/myYo0I=
|
||||
github.com/valyala/gozstd v1.8.3/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ=
|
||||
github.com/wcharczuk/go-chart v2.0.1+incompatible h1:0pz39ZAycJFF7ju/1mepnk26RLVLBCWz1STcD3doU0A=
|
||||
github.com/wcharczuk/go-chart v2.0.1+incompatible/go.mod h1:PF5tmL4EIx/7Wf+hEkpCqYi5He4u90sw+0+6FhrryuE=
|
||||
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
|
||||
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk=
|
||||
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
|
Loading…
Reference in New Issue
Block a user