Merge pull request #12 from anytypeio/add-node-db
This commit is contained in:
commit
36181b0ef8
62
client/account/service.go
Normal file
62
client/account/service.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
|
)
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
accountData *account.AccountData
|
||||||
|
peerId string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Account() *account.AccountData {
|
||||||
|
return s.accountData
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() app.Component {
|
||||||
|
return &service{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
|
acc := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount()
|
||||||
|
|
||||||
|
decodedEncryptionKey, err := keys.DecodeKeyFromString(
|
||||||
|
acc.EncryptionKey,
|
||||||
|
encryptionkey.NewEncryptionRsaPrivKeyFromBytes,
|
||||||
|
nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
decodedSigningKey, err := keys.DecodeKeyFromString(
|
||||||
|
acc.SigningKey,
|
||||||
|
signingkey.NewSigningEd25519PrivKeyFromBytes,
|
||||||
|
nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
identity, err := decodedSigningKey.GetPublic().Raw()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s.accountData = &account.AccountData{
|
||||||
|
Identity: identity,
|
||||||
|
SignKey: decodedSigningKey,
|
||||||
|
EncKey: decodedEncryptionKey,
|
||||||
|
}
|
||||||
|
s.peerId = acc.PeerId
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Name() (name string) {
|
||||||
|
return commonaccount.CName
|
||||||
|
}
|
||||||
20
client/api/controller.go
Normal file
20
client/api/controller.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
type Controller interface {
|
||||||
|
// DeriveSpace derives the space from current account
|
||||||
|
DeriveSpace() (id string, err error)
|
||||||
|
// CreateSpace creates new space with random data
|
||||||
|
CreateSpace() (id string, err error)
|
||||||
|
GetAllSpacesIds() (ids []string, err error)
|
||||||
|
// LoadSpace asks node to load a particular space
|
||||||
|
LoadSpace(id string) (err error)
|
||||||
|
|
||||||
|
CreateDocument(spaceId string) (id string, err error)
|
||||||
|
GetAllDocumentIds(spaceId string) (ids []string, err error)
|
||||||
|
AddText(documentId, text string) (err error)
|
||||||
|
DumpDocumentTree(documentId string) (err error)
|
||||||
|
|
||||||
|
GetValidInvites(spaceId string) (invites []string, err error)
|
||||||
|
GenerateInvite(spaceId string) (invite string, err error)
|
||||||
|
JoinSpace(invite string) (err error)
|
||||||
|
}
|
||||||
41
client/badgerprovider/service.go
Normal file
41
client/badgerprovider/service.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package badgerprovider
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BadgerProvider interface {
|
||||||
|
app.ComponentRunnable
|
||||||
|
Badger() *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
var CName = "client.badgerprovider"
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
db *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
|
cfg := a.MustComponent(config.CName).(*config.Config)
|
||||||
|
s.db, err = badger.Open(badger.DefaultOptions(cfg.Storage.Path))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Name() (name string) {
|
||||||
|
return CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Badger() *badger.DB {
|
||||||
|
return s.db
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Run(ctx context.Context) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Close(ctx context.Context) (err error) {
|
||||||
|
return s.db.Close()
|
||||||
|
}
|
||||||
85
client/clientspace/clientcache/treecache.go
Normal file
85
client/clientspace/clientcache/treecache.go
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
package clientcache
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var log = logger.NewNamed("treecache")
|
||||||
|
var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree")
|
||||||
|
|
||||||
|
type ctxKey int
|
||||||
|
|
||||||
|
const spaceKey ctxKey = 0
|
||||||
|
|
||||||
|
type treeCache struct {
|
||||||
|
gcttl int
|
||||||
|
cache ocache.OCache
|
||||||
|
clientService clientspace.Service
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(ttl int) cache.TreeCache {
|
||||||
|
return &treeCache{
|
||||||
|
gcttl: ttl,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) Run(ctx context.Context) (err error) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) Close(ctx context.Context) (err error) {
|
||||||
|
return c.cache.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) Init(a *app.App) (err error) {
|
||||||
|
c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
||||||
|
c.cache = ocache.New(
|
||||||
|
func(ctx context.Context, id string) (value ocache.Object, err error) {
|
||||||
|
spaceId := ctx.Value(spaceKey).(string)
|
||||||
|
space, err := c.clientService.GetSpace(ctx, spaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return space.BuildTree(ctx, id, nil)
|
||||||
|
},
|
||||||
|
ocache.WithLogger(log.Sugar()),
|
||||||
|
ocache.WithGCPeriod(time.Minute),
|
||||||
|
ocache.WithTTL(time.Duration(c.gcttl)*time.Second),
|
||||||
|
ocache.WithRefCounter(false),
|
||||||
|
)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) Name() (name string) {
|
||||||
|
return cache.CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) {
|
||||||
|
var cacheRes ocache.Object
|
||||||
|
ctx = context.WithValue(ctx, spaceKey, spaceId)
|
||||||
|
cacheRes, err = c.cache.Get(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return cache.TreeResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
treeContainer, ok := cacheRes.(cache.TreeContainer)
|
||||||
|
if !ok {
|
||||||
|
err = ErrCacheObjectWithoutTree
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res = cache.TreeResult{
|
||||||
|
Release: func() {
|
||||||
|
c.cache.Release(id)
|
||||||
|
},
|
||||||
|
TreeContainer: treeContainer,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
58
client/clientspace/rpchandler.go
Normal file
58
client/clientspace/rpchandler.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package clientspace
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rpcHandler struct {
|
||||||
|
s *service
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) {
|
||||||
|
_, err = r.s.GetSpace(ctx, req.SpaceHeader.Id)
|
||||||
|
if err == nil {
|
||||||
|
err = spacesyncproto.ErrSpaceExists
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != cache.ErrSpaceNotFound {
|
||||||
|
err = spacesyncproto.ErrUnexpected
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := storage.SpaceStorageCreatePayload{
|
||||||
|
RecWithId: req.AclRoot,
|
||||||
|
SpaceHeaderWithId: req.SpaceHeader,
|
||||||
|
}
|
||||||
|
_, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload)
|
||||||
|
if err != nil {
|
||||||
|
err = spacesyncproto.ErrUnexpected
|
||||||
|
if err == storage.ErrSpaceStorageExists {
|
||||||
|
err = spacesyncproto.ErrSpaceExists
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) {
|
||||||
|
sp, err := r.s.GetSpace(ctx, req.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, spacesyncproto.ErrSpaceMissing
|
||||||
|
}
|
||||||
|
return sp.SpaceSyncRpc().HeadSync(ctx, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error {
|
||||||
|
msg, err := stream.Recv()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sp, err := r.s.GetSpace(stream.Context(), msg.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return spacesyncproto.ErrSpaceMissing
|
||||||
|
}
|
||||||
|
return sp.SpaceSyncRpc().Stream(stream)
|
||||||
|
}
|
||||||
102
client/clientspace/service.go
Normal file
102
client/clientspace/service.go
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package clientspace
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const CName = "client.clientspace"
|
||||||
|
|
||||||
|
var log = logger.NewNamed(CName)
|
||||||
|
|
||||||
|
func New() Service {
|
||||||
|
return &service{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service interface {
|
||||||
|
GetSpace(ctx context.Context, id string) (commonspace.Space, error)
|
||||||
|
CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error)
|
||||||
|
DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error)
|
||||||
|
app.ComponentRunnable
|
||||||
|
}
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
conf config.Space
|
||||||
|
spaceCache ocache.OCache
|
||||||
|
commonSpace commonspace.Service
|
||||||
|
spaceStorageProvider storage.SpaceStorageProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
|
s.conf = a.MustComponent(config.CName).(*config.Config).Space
|
||||||
|
s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service)
|
||||||
|
s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider)
|
||||||
|
s.spaceCache = ocache.New(
|
||||||
|
func(ctx context.Context, id string) (value ocache.Object, err error) {
|
||||||
|
return s.commonSpace.GetSpace(ctx, id)
|
||||||
|
},
|
||||||
|
ocache.WithLogger(log.Sugar()),
|
||||||
|
ocache.WithGCPeriod(time.Minute),
|
||||||
|
ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second),
|
||||||
|
ocache.WithRefCounter(false),
|
||||||
|
)
|
||||||
|
return spacesyncproto.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Name() (name string) {
|
||||||
|
return CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Run(ctx context.Context) (err error) {
|
||||||
|
go func() {
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
|
_, _ = s.GetSpace(ctx, "testDSpace")
|
||||||
|
}()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (space commonspace.Space, err error) {
|
||||||
|
id, err := s.commonSpace.CreateSpace(ctx, payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
obj, err := s.commonSpace.GetSpace(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return obj.(commonspace.Space), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (space commonspace.Space, err error) {
|
||||||
|
id, err := s.commonSpace.DeriveSpace(ctx, payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
obj, err := s.commonSpace.GetSpace(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return obj.(commonspace.Space), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) {
|
||||||
|
v, err := s.spaceCache.Get(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return v.(commonspace.Space), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Close(ctx context.Context) (err error) {
|
||||||
|
return s.spaceCache.Close()
|
||||||
|
}
|
||||||
13
client/document/service.go
Normal file
13
client/document/service.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package document
|
||||||
|
|
||||||
|
import "github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
|
||||||
|
type Service interface {
|
||||||
|
app.Component
|
||||||
|
CreateDocument(spaceId string) (id string, err error)
|
||||||
|
GetAllDocumentIds(spaceId string) (ids []string, err error)
|
||||||
|
AddText(documentId, text string) (err error)
|
||||||
|
DumpDocumentTree(documentId string) (err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CName = "client.document"
|
||||||
41
client/storage/helpers.go
Normal file
41
client/storage/helpers.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
func hasDB(db *badger.DB, key []byte) bool {
|
||||||
|
return db.View(func(txn *badger.Txn) error {
|
||||||
|
_, err := txn.Get(key)
|
||||||
|
return err
|
||||||
|
}) == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func putDB(db *badger.DB, key, value []byte) (err error) {
|
||||||
|
return db.Update(func(txn *badger.Txn) error {
|
||||||
|
return txn.Set(key, value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDB(db *badger.DB, key []byte) (value []byte, err error) {
|
||||||
|
err = db.View(func(txn *badger.Txn) error {
|
||||||
|
item, err := txn.Get(key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value, err = item.ValueCopy(value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTxn(txn *badger.Txn, key []byte) (value []byte, err error) {
|
||||||
|
item, err := txn.Get(key)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return item.ValueCopy(value)
|
||||||
|
}
|
||||||
79
client/storage/keys.go
Normal file
79
client/storage/keys.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
type aclKeys struct {
|
||||||
|
spaceId string
|
||||||
|
rootKey []byte
|
||||||
|
headKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newACLKeys(spaceId string) aclKeys {
|
||||||
|
return aclKeys{
|
||||||
|
spaceId: spaceId,
|
||||||
|
rootKey: storage.JoinStringsToBytes("space", spaceId, "a", "rootId"),
|
||||||
|
headKey: storage.JoinStringsToBytes("space", spaceId, "a", "headId"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a aclKeys) HeadIdKey() []byte {
|
||||||
|
return a.headKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a aclKeys) RootIdKey() []byte {
|
||||||
|
return a.rootKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a aclKeys) RawRecordKey(id string) []byte {
|
||||||
|
return storage.JoinStringsToBytes("space", a.spaceId, "a", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
type treeKeys struct {
|
||||||
|
id string
|
||||||
|
spaceId string
|
||||||
|
headsKey []byte
|
||||||
|
rootKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTreeKeys(spaceId, id string) treeKeys {
|
||||||
|
return treeKeys{
|
||||||
|
id: id,
|
||||||
|
spaceId: spaceId,
|
||||||
|
headsKey: storage.JoinStringsToBytes("space", spaceId, "t", id, "heads"),
|
||||||
|
rootKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId", id),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t treeKeys) HeadsKey() []byte {
|
||||||
|
return t.headsKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t treeKeys) RootIdKey() []byte {
|
||||||
|
return t.rootKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t treeKeys) RawChangeKey(id string) []byte {
|
||||||
|
return storage.JoinStringsToBytes("space", t.spaceId, "t", t.id, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
type spaceKeys struct {
|
||||||
|
headerKey []byte
|
||||||
|
treePrefixKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpaceKeys(spaceId string) spaceKeys {
|
||||||
|
return spaceKeys{
|
||||||
|
headerKey: storage.JoinStringsToBytes("space", spaceId),
|
||||||
|
treePrefixKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s spaceKeys) HeaderKey() []byte {
|
||||||
|
return s.headerKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s spaceKeys) TreeRootPrefix() []byte {
|
||||||
|
return s.treePrefixKey
|
||||||
|
}
|
||||||
119
client/storage/liststorage.go
Normal file
119
client/storage/liststorage.go
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ErrIncorrectKey = errors.New("key format is incorrect")
|
||||||
|
|
||||||
|
type listStorage struct {
|
||||||
|
db *badger.DB
|
||||||
|
keys aclKeys
|
||||||
|
id string
|
||||||
|
root *aclrecordproto.RawACLRecordWithId
|
||||||
|
}
|
||||||
|
|
||||||
|
func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.ListStorage, err error) {
|
||||||
|
keys := newACLKeys(spaceId)
|
||||||
|
rootId, err := getTxn(txn, keys.RootIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
stringId := string(rootId)
|
||||||
|
value, err := getTxn(txn, keys.RawRecordKey(stringId))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rootWithId := &aclrecordproto.RawACLRecordWithId{
|
||||||
|
Payload: value,
|
||||||
|
Id: stringId,
|
||||||
|
}
|
||||||
|
|
||||||
|
ls = &listStorage{
|
||||||
|
db: db,
|
||||||
|
keys: aclKeys{},
|
||||||
|
id: stringId,
|
||||||
|
root: rootWithId,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) {
|
||||||
|
keys := newACLKeys(spaceId)
|
||||||
|
_, err = getTxn(txn, keys.RootIdKey())
|
||||||
|
if err != badger.ErrKeyNotFound {
|
||||||
|
if err == nil {
|
||||||
|
return newListStorage(spaceId, db, txn)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.HeadIdKey(), []byte(root.Id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.RawRecordKey(root.Id), root.Payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = txn.Set(keys.RootIdKey(), []byte(root.Id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ls = &listStorage{
|
||||||
|
db: db,
|
||||||
|
keys: aclKeys{},
|
||||||
|
id: root.Id,
|
||||||
|
root: root,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) ID() (string, error) {
|
||||||
|
return l.id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
return l.root, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) Head() (head string, err error) {
|
||||||
|
bytes, err := getDB(l.db, l.keys.HeadIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
head = string(bytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) {
|
||||||
|
res, err := getDB(l.db, l.keys.RawRecordKey(id))
|
||||||
|
if err != nil {
|
||||||
|
if err == badger.ErrKeyNotFound {
|
||||||
|
err = storage.ErrUnknownRecord
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
raw = &aclrecordproto.RawACLRecordWithId{
|
||||||
|
Payload: res,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) SetHead(headId string) (err error) {
|
||||||
|
return putDB(l.db, l.keys.HeadIdKey(), []byte(headId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error {
|
||||||
|
return putDB(l.db, l.keys.RawRecordKey(rec.Id), rec.Payload)
|
||||||
|
}
|
||||||
129
client/storage/spacestorage.go
Normal file
129
client/storage/spacestorage.go
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
|
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type spaceStorage struct {
|
||||||
|
spaceId string
|
||||||
|
objDb *badger.DB
|
||||||
|
keys spaceKeys
|
||||||
|
aclStorage storage.ListStorage
|
||||||
|
header *spacesyncproto.RawSpaceHeaderWithId
|
||||||
|
mx sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpaceStorage(objDb *badger.DB, spaceId string) (store spacestorage.SpaceStorage, err error) {
|
||||||
|
keys := newSpaceKeys(spaceId)
|
||||||
|
err = objDb.View(func(txn *badger.Txn) error {
|
||||||
|
header, err := getTxn(txn, keys.HeaderKey())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
aclStorage, err := newListStorage(spaceId, objDb, txn)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
store = &spaceStorage{
|
||||||
|
spaceId: spaceId,
|
||||||
|
objDb: objDb,
|
||||||
|
keys: keys,
|
||||||
|
header: &spacesyncproto.RawSpaceHeaderWithId{
|
||||||
|
RawHeader: header,
|
||||||
|
Id: spaceId,
|
||||||
|
},
|
||||||
|
aclStorage: aclStorage,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err == badger.ErrKeyNotFound {
|
||||||
|
err = spacesyncproto.ErrSpaceMissing
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) {
|
||||||
|
keys := newSpaceKeys(payload.SpaceHeaderWithId.Id)
|
||||||
|
if hasDB(db, keys.HeaderKey()) {
|
||||||
|
err = spacesyncproto.ErrSpaceExists
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = db.Update(func(txn *badger.Txn) error {
|
||||||
|
aclStorage, err := createListStorage(payload.SpaceHeaderWithId.Id, db, txn, payload.RecWithId)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
store = &spaceStorage{
|
||||||
|
spaceId: payload.SpaceHeaderWithId.Id,
|
||||||
|
objDb: db,
|
||||||
|
keys: keys,
|
||||||
|
aclStorage: aclStorage,
|
||||||
|
header: payload.SpaceHeaderWithId,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) ID() (string, error) {
|
||||||
|
return s.spaceId, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) {
|
||||||
|
return newTreeStorage(s.objDb, s.spaceId, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) {
|
||||||
|
// we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation
|
||||||
|
s.mx.Lock()
|
||||||
|
defer s.mx.Unlock()
|
||||||
|
|
||||||
|
return createTreeStorage(s.objDb, s.spaceId, payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) {
|
||||||
|
return s.aclStorage, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) {
|
||||||
|
return s.header, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) StoredIds() (ids []string, err error) {
|
||||||
|
err = s.objDb.View(func(txn *badger.Txn) error {
|
||||||
|
opts := badger.DefaultIteratorOptions
|
||||||
|
opts.PrefetchValues = false
|
||||||
|
opts.Prefix = s.keys.TreeRootPrefix()
|
||||||
|
|
||||||
|
it := txn.NewIterator(opts)
|
||||||
|
defer it.Close()
|
||||||
|
|
||||||
|
for it.Rewind(); it.Valid(); it.Next() {
|
||||||
|
item := it.Item()
|
||||||
|
id := item.Key()
|
||||||
|
if len(id) <= len(s.keys.TreeRootPrefix())+1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
id = id[len(s.keys.TreeRootPrefix())+1:]
|
||||||
|
ids = append(ids, string(id))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) Close() (err error) {
|
||||||
|
return s.objDb.Close()
|
||||||
|
}
|
||||||
34
client/storage/storageservice.go
Normal file
34
client/storage/storageservice.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type storageService struct {
|
||||||
|
db *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() storage.SpaceStorageProvider {
|
||||||
|
return &storageService{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) Init(a *app.App) (err error) {
|
||||||
|
provider := a.MustComponent(badgerprovider.CName).(badgerprovider.BadgerProvider)
|
||||||
|
s.db = provider.Badger()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) Name() (name string) {
|
||||||
|
return storage.CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) {
|
||||||
|
return newSpaceStorage(s.db, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) {
|
||||||
|
return createSpaceStorage(s.db, payload)
|
||||||
|
}
|
||||||
135
client/storage/treestorage.go
Normal file
135
client/storage/treestorage.go
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type treeStorage struct {
|
||||||
|
db *badger.DB
|
||||||
|
keys treeKeys
|
||||||
|
id string
|
||||||
|
root *treechangeproto.RawTreeChangeWithId
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) {
|
||||||
|
keys := newTreeKeys(spaceId, treeId)
|
||||||
|
err = db.View(func(txn *badger.Txn) error {
|
||||||
|
_, err := txn.Get(keys.RootIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
root, err := getTxn(txn, keys.RawChangeKey(treeId))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rootWithId := &treechangeproto.RawTreeChangeWithId{
|
||||||
|
RawChange: root,
|
||||||
|
Id: treeId,
|
||||||
|
}
|
||||||
|
|
||||||
|
ts = &treeStorage{
|
||||||
|
db: db,
|
||||||
|
keys: keys,
|
||||||
|
id: treeId,
|
||||||
|
root: rootWithId,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) {
|
||||||
|
keys := newTreeKeys(spaceId, payload.TreeId)
|
||||||
|
if hasDB(db, keys.RootIdKey()) {
|
||||||
|
err = storage.ErrTreeExists
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = db.Update(func(txn *badger.Txn) error {
|
||||||
|
heads := storage.CreateHeadsPayload(payload.Heads)
|
||||||
|
|
||||||
|
for _, ch := range payload.Changes {
|
||||||
|
err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.HeadsKey(), heads)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = txn.Set(keys.RootIdKey(), nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ts = &treeStorage{
|
||||||
|
db: db,
|
||||||
|
keys: keys,
|
||||||
|
id: payload.RootRawChange.Id,
|
||||||
|
root: payload.RootRawChange,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) ID() (string, error) {
|
||||||
|
return t.id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) {
|
||||||
|
return t.root, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) Heads() (heads []string, err error) {
|
||||||
|
headsBytes, err := getDB(t.db, t.keys.HeadsKey())
|
||||||
|
if err != nil {
|
||||||
|
if err == badger.ErrKeyNotFound {
|
||||||
|
err = storage.ErrUnknownTreeId
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
heads = storage.ParseHeads(headsBytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) SetHeads(heads []string) (err error) {
|
||||||
|
payload := storage.CreateHeadsPayload(heads)
|
||||||
|
return putDB(t.db, t.keys.HeadsKey(), payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) {
|
||||||
|
return putDB(t.db, t.keys.RawChangeKey(change.Id), change.RawChange)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) {
|
||||||
|
res, err := getDB(t.db, t.keys.RawChangeKey(id))
|
||||||
|
if err != nil {
|
||||||
|
if err == badger.ErrKeyNotFound {
|
||||||
|
err = storage.ErrUnknownTreeId
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
raw = &treechangeproto.RawTreeChangeWithId{
|
||||||
|
RawChange: res,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) {
|
||||||
|
return hasDB(t.db, t.keys.RawChangeKey(id)), nil
|
||||||
|
}
|
||||||
172
cmd/benchmarks/db/badger.go
Normal file
172
cmd/benchmarks/db/badger.go
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/dgraph-io/badger/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type badgerTree struct {
|
||||||
|
id string
|
||||||
|
spaceId string
|
||||||
|
db *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
type badgerTransaction struct {
|
||||||
|
spaceId string
|
||||||
|
id string
|
||||||
|
txn *badger.Txn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTransaction) AddChange(key string, value []byte) (err error) {
|
||||||
|
badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key)
|
||||||
|
return b.txn.Set([]byte(badgerKey), value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTransaction) GetChange(key string) (val []byte, err error) {
|
||||||
|
badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key)
|
||||||
|
it, err := b.txn.Get([]byte(badgerKey))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return it.ValueCopy(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) Perform(f func(txn Transaction) error) error {
|
||||||
|
return b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
bTxn := &badgerTransaction{b.spaceId, b.id, txn}
|
||||||
|
return f(bTxn)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) Id() string {
|
||||||
|
return b.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) UpdateHead(head string) (err error) {
|
||||||
|
key := fmt.Sprintf("space/%s/tree/%s/heads", b.spaceId, b.id)
|
||||||
|
return b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
return txn.Set([]byte(key), []byte(head))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) AddChange(key string, value []byte) (err error) {
|
||||||
|
badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key)
|
||||||
|
return b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
return txn.Set([]byte(badgerKey), value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) GetChange(key string) (val []byte, err error) {
|
||||||
|
badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key)
|
||||||
|
err = b.db.View(func(txn *badger.Txn) error {
|
||||||
|
item, err := txn.Get([]byte(badgerKey))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
val, err = item.ValueCopy(val)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerTree) HasChange(key string) (has bool, err error) {
|
||||||
|
badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key)
|
||||||
|
err = b.db.View(func(txn *badger.Txn) error {
|
||||||
|
_, err := txn.Get([]byte(badgerKey))
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
has = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type badgerSpace struct {
|
||||||
|
id string
|
||||||
|
db *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpace) Id() string {
|
||||||
|
return b.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpace) CreateTree(id string) (Tree, error) {
|
||||||
|
key := fmt.Sprintf("space/%s/tree/%s", b.id, id)
|
||||||
|
err := b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
return txn.Set([]byte(key), []byte("exists"))
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &badgerTree{
|
||||||
|
id: id,
|
||||||
|
spaceId: b.id,
|
||||||
|
db: b.db,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpace) GetTree(id string) (Tree, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpace) Close() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type badgerSpaceCreator struct {
|
||||||
|
rootPath string
|
||||||
|
db *badger.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpaceCreator) CreateSpace(id string) (Space, error) {
|
||||||
|
key := fmt.Sprintf("space/%s", id)
|
||||||
|
err := b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
return txn.Set([]byte(key), []byte("exists"))
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &badgerSpace{
|
||||||
|
id: id,
|
||||||
|
db: b.db,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpaceCreator) GetSpace(id string) (Space, error) {
|
||||||
|
key := fmt.Sprintf("space/%s", id)
|
||||||
|
err := b.db.Update(func(txn *badger.Txn) error {
|
||||||
|
_, err := txn.Get([]byte(key))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &badgerSpace{
|
||||||
|
id: id,
|
||||||
|
db: b.db,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *badgerSpaceCreator) Close() error {
|
||||||
|
return b.db.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBadgerSpaceCreator() SpaceCreator {
|
||||||
|
rootPath := "badger.db.test"
|
||||||
|
db, err := badger.Open(badger.DefaultOptions(rootPath))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return &badgerSpaceCreator{
|
||||||
|
rootPath: rootPath,
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
30
cmd/benchmarks/db/common.go
Normal file
30
cmd/benchmarks/db/common.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package db
|
||||||
|
|
||||||
|
type Transaction interface {
|
||||||
|
AddChange(key string, value []byte) (err error)
|
||||||
|
GetChange(key string) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tree interface {
|
||||||
|
Id() string
|
||||||
|
UpdateHead(head string) (err error)
|
||||||
|
AddChange(key string, value []byte) (err error)
|
||||||
|
GetChange(key string) ([]byte, error)
|
||||||
|
HasChange(key string) (has bool, err error)
|
||||||
|
Perform(func(txn Transaction) error) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type Space interface {
|
||||||
|
Id() string
|
||||||
|
CreateTree(id string) (Tree, error)
|
||||||
|
GetTree(id string) (Tree, error)
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type SpaceCreator interface {
|
||||||
|
CreateSpace(id string) (Space, error)
|
||||||
|
GetSpace(id string) (Space, error)
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type SpaceCreatorFactory func() SpaceCreator
|
||||||
95
cmd/benchmarks/db/pogreb.go
Normal file
95
cmd/benchmarks/db/pogreb.go
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/akrylysov/pogreb"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type pogrebTree struct {
|
||||||
|
id string
|
||||||
|
db *pogreb.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) Perform(f func(txn Transaction) error) error {
|
||||||
|
return f(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) Id() string {
|
||||||
|
return p.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) UpdateHead(head string) (err error) {
|
||||||
|
return p.db.Put([]byte(fmt.Sprintf("t/%s/heads", p.id)), []byte(head))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) AddChange(key string, value []byte) (err error) {
|
||||||
|
changeKey := fmt.Sprintf("t/%s/%s", p.id, key)
|
||||||
|
return p.db.Put([]byte(changeKey), value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) GetChange(key string) (val []byte, err error) {
|
||||||
|
changeKey := fmt.Sprintf("t/%s/%s", p.id, key)
|
||||||
|
return p.db.Get([]byte(changeKey))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebTree) HasChange(key string) (has bool, err error) {
|
||||||
|
changeKey := fmt.Sprintf("t/%s/%s", p.id, key)
|
||||||
|
return p.db.Has([]byte(changeKey))
|
||||||
|
}
|
||||||
|
|
||||||
|
type pogrebSpace struct {
|
||||||
|
id string
|
||||||
|
db *pogreb.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpace) Id() string {
|
||||||
|
return p.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpace) CreateTree(id string) (Tree, error) {
|
||||||
|
return &pogrebTree{
|
||||||
|
id: id,
|
||||||
|
db: p.db,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpace) GetTree(id string) (Tree, error) {
|
||||||
|
return p.CreateTree(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpace) Close() error {
|
||||||
|
return p.db.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
type pogrebSpaceCreator struct {
|
||||||
|
rootPath string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpaceCreator) CreateSpace(id string) (Space, error) {
|
||||||
|
dbPath := path.Join(p.rootPath, id)
|
||||||
|
db, err := pogreb.Open(dbPath, &pogreb.Options{
|
||||||
|
BackgroundSyncInterval: time.Second * 30,
|
||||||
|
BackgroundCompactionInterval: time.Minute * 2,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &pogrebSpace{
|
||||||
|
id: id,
|
||||||
|
db: db,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpaceCreator) GetSpace(id string) (Space, error) {
|
||||||
|
return p.CreateSpace(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pogrebSpaceCreator) Close() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPogrebSpaceCreator() SpaceCreator {
|
||||||
|
return &pogrebSpaceCreator{rootPath: "db.test"}
|
||||||
|
}
|
||||||
190
cmd/benchmarks/dbbench.go
Normal file
190
cmd/benchmarks/dbbench.go
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db"
|
||||||
|
"math/rand"
|
||||||
|
"net/http"
|
||||||
|
_ "net/http/pprof"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
go func() {
|
||||||
|
fmt.Println(http.ListenAndServe("localhost:6060", nil))
|
||||||
|
}()
|
||||||
|
opts := options{
|
||||||
|
numSpaces: 10,
|
||||||
|
numEntriesInSpace: 100,
|
||||||
|
numChangesInTree: 1000,
|
||||||
|
numHeadUpdates: 100,
|
||||||
|
defValueSize: 1000,
|
||||||
|
lenHeadUpdate: 1000,
|
||||||
|
}
|
||||||
|
fmt.Println("badger")
|
||||||
|
bench(db.NewBadgerSpaceCreator, opts)
|
||||||
|
fmt.Println("pogreb")
|
||||||
|
bench(db.NewPogrebSpaceCreator, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
type options struct {
|
||||||
|
numSpaces int
|
||||||
|
numEntriesInSpace int
|
||||||
|
numChangesInTree int
|
||||||
|
numHeadUpdates int
|
||||||
|
defValueSize int
|
||||||
|
lenHeadUpdate int
|
||||||
|
}
|
||||||
|
|
||||||
|
func bench(factory db.SpaceCreatorFactory, opts options) {
|
||||||
|
spaceIdKey := func(n int) string {
|
||||||
|
return fmt.Sprintf("space%d", n)
|
||||||
|
}
|
||||||
|
treeIdKey := func(n int) string {
|
||||||
|
return fmt.Sprintf("tree%d", n)
|
||||||
|
}
|
||||||
|
changeIdKey := func(n int) string {
|
||||||
|
return fmt.Sprintf("change%d", n)
|
||||||
|
}
|
||||||
|
|
||||||
|
var byteSlice = func() []byte {
|
||||||
|
var buf = make([]byte, opts.defValueSize)
|
||||||
|
rand.Read(buf)
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
var headUpdate = func() []byte {
|
||||||
|
var buf = make([]byte, opts.lenHeadUpdate)
|
||||||
|
rand.Read(buf)
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
creator := factory()
|
||||||
|
// creating spaces
|
||||||
|
now := time.Now()
|
||||||
|
var spaces []db.Space
|
||||||
|
for i := 0; i < opts.numSpaces; i++ {
|
||||||
|
sp, err := creator.CreateSpace(spaceIdKey(i))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = sp.Close()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(opts.numSpaces, "spaces creation, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
now = time.Now()
|
||||||
|
// creating trees
|
||||||
|
var trees []db.Tree
|
||||||
|
for i := 0; i < opts.numSpaces; i++ {
|
||||||
|
space, err := creator.GetSpace(spaceIdKey(i))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
spaces = append(spaces, space)
|
||||||
|
for j := 0; j < opts.numEntriesInSpace; j++ {
|
||||||
|
tr, err := space.CreateTree(treeIdKey(j))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
trees = append(trees, tr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(opts.numSpaces*opts.numEntriesInSpace, "trees creation, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
now = time.Now()
|
||||||
|
|
||||||
|
// filling entries and updating heads
|
||||||
|
for _, t := range trees {
|
||||||
|
for i := 0; i < opts.numChangesInTree; i++ {
|
||||||
|
err := t.AddChange(changeIdKey(i), byteSlice())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//t.Perform(func(txn db.Transaction) error {
|
||||||
|
// for i := 0; i < opts.numChangesInTree; i++ {
|
||||||
|
// err := t.AddChange(changeIdKey(i), byteSlice())
|
||||||
|
// if err != nil {
|
||||||
|
// panic(err)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return nil
|
||||||
|
//})
|
||||||
|
for i := 0; i < opts.numHeadUpdates; i++ {
|
||||||
|
err := t.UpdateHead(string(headUpdate()))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total := opts.numSpaces * opts.numEntriesInSpace * opts.numChangesInTree
|
||||||
|
fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
now = time.Now()
|
||||||
|
|
||||||
|
// getting some values from tree
|
||||||
|
for _, t := range trees {
|
||||||
|
err := t.Perform(func(txn db.Transaction) error {
|
||||||
|
for i := 0; i < opts.numChangesInTree; i++ {
|
||||||
|
_, err := t.GetChange(changeIdKey(i))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(total, "changes getting perform, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
now = time.Now()
|
||||||
|
|
||||||
|
// getting some values from tree
|
||||||
|
for _, t := range trees {
|
||||||
|
for i := 0; i < opts.numChangesInTree; i++ {
|
||||||
|
res, err := t.GetChange(changeIdKey(i))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if res == nil {
|
||||||
|
panic("shouldn't be empty")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(total, "changes getting, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
now = time.Now()
|
||||||
|
|
||||||
|
// getting some values from tree
|
||||||
|
for _, t := range trees {
|
||||||
|
for i := 0; i < opts.numChangesInTree; i++ {
|
||||||
|
b, err := t.HasChange(changeIdKey(i))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if !b {
|
||||||
|
panic("should be able to check with has")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(total, "changes checking, spent ms", time.Now().Sub(now).Milliseconds())
|
||||||
|
|
||||||
|
exit := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)
|
||||||
|
sig := <-exit
|
||||||
|
for _, sp := range spaces {
|
||||||
|
err := sp.Close()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err := creator.Close()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(sig)
|
||||||
|
}
|
||||||
@ -15,6 +15,8 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
@ -89,7 +91,8 @@ func main() {
|
|||||||
|
|
||||||
func Bootstrap(a *app.App) {
|
func Bootstrap(a *app.App) {
|
||||||
a.Register(account.New()).
|
a.Register(account.New()).
|
||||||
// TODO: add space storage provider from node side
|
Register(storage.New()).
|
||||||
|
Register(nodecache.New(200)).
|
||||||
Register(nodeconf.New()).
|
Register(nodeconf.New()).
|
||||||
Register(secure.New()).
|
Register(secure.New()).
|
||||||
Register(dialer.New()).
|
Register(dialer.New()).
|
||||||
|
|||||||
@ -156,6 +156,7 @@ func genNodeConfig(addresses []string, apiPort string) (config.Config, error) {
|
|||||||
ListenAddrs: addresses,
|
ListenAddrs: addresses,
|
||||||
TLS: false,
|
TLS: false,
|
||||||
},
|
},
|
||||||
|
Storage: config.Storage{Path: "db"},
|
||||||
Account: config.Account{
|
Account: config.Account{
|
||||||
PeerId: peerID.String(),
|
PeerId: peerID.String(),
|
||||||
SigningKey: encSignKey,
|
SigningKey: encSignKey,
|
||||||
|
|||||||
@ -107,7 +107,6 @@ func (d *diffSyncer) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{
|
_, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{
|
||||||
SpaceId: d.spaceId,
|
|
||||||
SpaceHeader: header,
|
SpaceHeader: header,
|
||||||
AclRoot: root,
|
AclRoot: root,
|
||||||
})
|
})
|
||||||
|
|||||||
@ -25,7 +25,7 @@ import (
|
|||||||
type pushSpaceRequestMatcher struct {
|
type pushSpaceRequestMatcher struct {
|
||||||
spaceId string
|
spaceId string
|
||||||
aclRoot *aclrecordproto.RawACLRecordWithId
|
aclRoot *aclrecordproto.RawACLRecordWithId
|
||||||
spaceHeader *spacesyncproto.SpaceHeader
|
spaceHeader *spacesyncproto.RawSpaceHeaderWithId
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p pushSpaceRequestMatcher) Matches(x interface{}) bool {
|
func (p pushSpaceRequestMatcher) Matches(x interface{}) bool {
|
||||||
@ -34,7 +34,7 @@ func (p pushSpaceRequestMatcher) Matches(x interface{}) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.SpaceId == p.spaceId && res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader
|
return res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p pushSpaceRequestMatcher) String() string {
|
func (p pushSpaceRequestMatcher) String() string {
|
||||||
@ -73,7 +73,7 @@ func (m mockPeer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding)
|
|||||||
func newPushSpaceRequestMatcher(
|
func newPushSpaceRequestMatcher(
|
||||||
spaceId string,
|
spaceId string,
|
||||||
aclRoot *aclrecordproto.RawACLRecordWithId,
|
aclRoot *aclrecordproto.RawACLRecordWithId,
|
||||||
spaceHeader *spacesyncproto.SpaceHeader) *pushSpaceRequestMatcher {
|
spaceHeader *spacesyncproto.RawSpaceHeaderWithId) *pushSpaceRequestMatcher {
|
||||||
return &pushSpaceRequestMatcher{
|
return &pushSpaceRequestMatcher{
|
||||||
spaceId: spaceId,
|
spaceId: spaceId,
|
||||||
aclRoot: aclRoot,
|
aclRoot: aclRoot,
|
||||||
@ -125,7 +125,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
|
|||||||
t.Run("diff syncer sync space missing", func(t *testing.T) {
|
t.Run("diff syncer sync space missing", func(t *testing.T) {
|
||||||
aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl)
|
aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl)
|
||||||
aclRoot := &aclrecordproto.RawACLRecordWithId{}
|
aclRoot := &aclrecordproto.RawACLRecordWithId{}
|
||||||
spaceHeader := &spacesyncproto.SpaceHeader{}
|
spaceHeader := &spacesyncproto.RawSpaceHeaderWithId{}
|
||||||
|
|
||||||
connectorMock.EXPECT().
|
connectorMock.EXPECT().
|
||||||
GetResponsiblePeers(gomock.Any(), spaceId).
|
GetResponsiblePeers(gomock.Any(), spaceId).
|
||||||
|
|||||||
@ -39,11 +39,21 @@ func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload st
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
id, err := cid.NewCIDFromBytes(marshalled)
|
signature, err := payload.SigningKey.Sign(marshalled)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
rawHeader := &spacesyncproto.RawSpaceHeader{SpaceHeader: marshalled, Signature: signature}
|
||||||
|
marshalled, err = rawHeader.Marshal()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id, err := cid.NewCIDFromBytes(marshalled)
|
||||||
spaceId := NewSpaceId(id, payload.ReplicationKey)
|
spaceId := NewSpaceId(id, payload.ReplicationKey)
|
||||||
|
rawHeaderWithId := &spacesyncproto.RawSpaceHeaderWithId{
|
||||||
|
RawHeader: marshalled,
|
||||||
|
Id: spaceId,
|
||||||
|
}
|
||||||
|
|
||||||
// encrypting read key
|
// encrypting read key
|
||||||
hasher := fnv.New64()
|
hasher := fnv.New64()
|
||||||
@ -74,9 +84,8 @@ func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload st
|
|||||||
|
|
||||||
// creating storage
|
// creating storage
|
||||||
storagePayload = storage.SpaceStorageCreatePayload{
|
storagePayload = storage.SpaceStorageCreatePayload{
|
||||||
RecWithId: rawWithId,
|
RecWithId: rawWithId,
|
||||||
SpaceHeader: header,
|
SpaceHeaderWithId: rawHeaderWithId,
|
||||||
Id: id,
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -118,11 +127,21 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
id, err := cid.NewCIDFromBytes(marshalled)
|
signature, err := payload.SigningKey.Sign(marshalled)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
rawHeader := &spacesyncproto.RawSpaceHeader{SpaceHeader: marshalled, Signature: signature}
|
||||||
|
marshalled, err = rawHeader.Marshal()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id, err := cid.NewCIDFromBytes(marshalled)
|
||||||
spaceId := NewSpaceId(id, repKey)
|
spaceId := NewSpaceId(id, repKey)
|
||||||
|
rawHeaderWithId := &spacesyncproto.RawSpaceHeaderWithId{
|
||||||
|
RawHeader: marshalled,
|
||||||
|
Id: spaceId,
|
||||||
|
}
|
||||||
|
|
||||||
// deriving and encrypting read key
|
// deriving and encrypting read key
|
||||||
readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey)
|
readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey)
|
||||||
@ -157,9 +176,8 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st
|
|||||||
|
|
||||||
// creating storage
|
// creating storage
|
||||||
storagePayload = storage.SpaceStorageCreatePayload{
|
storagePayload = storage.SpaceStorageCreatePayload{
|
||||||
RecWithId: rawWithId,
|
RecWithId: rawWithId,
|
||||||
SpaceHeader: header,
|
SpaceHeaderWithId: rawHeaderWithId,
|
||||||
Id: id,
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,8 +22,8 @@ func New() Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
CreateSpace(ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (Space, error)
|
DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (string, error)
|
||||||
DeriveSpace(ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (Space, error)
|
CreateSpace(ctx context.Context, payload SpaceCreatePayload) (string, error)
|
||||||
GetSpace(ctx context.Context, id string) (sp Space, err error)
|
GetSpace(ctx context.Context, id string) (sp Space, err error)
|
||||||
app.Component
|
app.Component
|
||||||
}
|
}
|
||||||
@ -51,34 +51,32 @@ func (s *service) Name() (name string) {
|
|||||||
|
|
||||||
func (s *service) CreateSpace(
|
func (s *service) CreateSpace(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
cache cache.TreeCache,
|
payload SpaceCreatePayload) (id string, err error) {
|
||||||
payload SpaceCreatePayload) (sp Space, err error) {
|
|
||||||
storageCreate, err := storagePayloadForSpaceCreate(payload)
|
storageCreate, err := storagePayloadForSpaceCreate(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = s.storageProvider.CreateSpaceStorage(storageCreate)
|
store, err := s.storageProvider.CreateSpaceStorage(storageCreate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.GetSpace(ctx, storageCreate.Id)
|
return store.ID()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) DeriveSpace(
|
func (s *service) DeriveSpace(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
cache cache.TreeCache,
|
payload SpaceDerivePayload) (id string, err error) {
|
||||||
payload SpaceDerivePayload) (sp Space, err error) {
|
|
||||||
storageCreate, err := storagePayloadForSpaceDerive(payload)
|
storageCreate, err := storagePayloadForSpaceDerive(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = s.storageProvider.CreateSpaceStorage(storageCreate)
|
store, err := s.storageProvider.CreateSpaceStorage(storageCreate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.GetSpace(ctx, storageCreate.Id)
|
return store.ID()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) GetSpace(ctx context.Context, id string) (Space, error) {
|
func (s *service) GetSpace(ctx context.Context, id string) (Space, error) {
|
||||||
|
|||||||
@ -19,10 +19,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type SpaceCreatePayload struct {
|
type SpaceCreatePayload struct {
|
||||||
SigningKey signingkey.PrivKey
|
// SigningKey is the signing key of the owner
|
||||||
EncryptionKey encryptionkey.PrivKey
|
SigningKey signingkey.PrivKey
|
||||||
SpaceType string
|
// EncryptionKey is the encryption key of the owner
|
||||||
ReadKey []byte
|
EncryptionKey encryptionkey.PrivKey
|
||||||
|
// SpaceType is an arbitrary string
|
||||||
|
SpaceType string
|
||||||
|
// ReadKey is a first symmetric encryption key for a space
|
||||||
|
ReadKey []byte
|
||||||
|
// ReplicationKey is a key which is to be used to determine the node where the space should be held
|
||||||
ReplicationKey uint64
|
ReplicationKey uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,5 +151,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
|
|||||||
|
|
||||||
func (s *space) Close() error {
|
func (s *space) Close() error {
|
||||||
s.diffService.Close()
|
s.diffService.Close()
|
||||||
return s.syncService.Close()
|
s.syncService.Close()
|
||||||
|
return s.storage.Close()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -102,8 +102,7 @@ message ObjectErrorResponse {
|
|||||||
|
|
||||||
// PushSpaceRequest is a request to add space on a node containing only one acl record
|
// PushSpaceRequest is a request to add space on a node containing only one acl record
|
||||||
message PushSpaceRequest {
|
message PushSpaceRequest {
|
||||||
string spaceId = 1;
|
RawSpaceHeaderWithId spaceHeader = 2;
|
||||||
SpaceHeader spaceHeader = 2;
|
|
||||||
aclrecord.RawACLRecordWithId aclRoot = 3;
|
aclrecord.RawACLRecordWithId aclRoot = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,3 +117,13 @@ message SpaceHeader {
|
|||||||
uint64 replicationKey = 4;
|
uint64 replicationKey = 4;
|
||||||
bytes seed = 5;
|
bytes seed = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message RawSpaceHeader {
|
||||||
|
bytes spaceHeader = 1;
|
||||||
|
bytes signature = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RawSpaceHeaderWithId {
|
||||||
|
bytes rawHeader = 1;
|
||||||
|
string id = 2;
|
||||||
|
}
|
||||||
|
|||||||
@ -747,8 +747,7 @@ func (m *ObjectErrorResponse) GetError() string {
|
|||||||
|
|
||||||
// PushSpaceRequest is a request to add space on a node containing only one acl record
|
// PushSpaceRequest is a request to add space on a node containing only one acl record
|
||||||
type PushSpaceRequest struct {
|
type PushSpaceRequest struct {
|
||||||
SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"`
|
SpaceHeader *RawSpaceHeaderWithId `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"`
|
||||||
SpaceHeader *SpaceHeader `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"`
|
|
||||||
AclRoot *aclrecordproto.RawACLRecordWithId `protobuf:"bytes,3,opt,name=aclRoot,proto3" json:"aclRoot,omitempty"`
|
AclRoot *aclrecordproto.RawACLRecordWithId `protobuf:"bytes,3,opt,name=aclRoot,proto3" json:"aclRoot,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,14 +784,7 @@ func (m *PushSpaceRequest) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_PushSpaceRequest proto.InternalMessageInfo
|
var xxx_messageInfo_PushSpaceRequest proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *PushSpaceRequest) GetSpaceId() string {
|
func (m *PushSpaceRequest) GetSpaceHeader() *RawSpaceHeaderWithId {
|
||||||
if m != nil {
|
|
||||||
return m.SpaceId
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PushSpaceRequest) GetSpaceHeader() *SpaceHeader {
|
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.SpaceHeader
|
return m.SpaceHeader
|
||||||
}
|
}
|
||||||
@ -920,6 +912,110 @@ func (m *SpaceHeader) GetSeed() []byte {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RawSpaceHeader struct {
|
||||||
|
SpaceHeader []byte `protobuf:"bytes,1,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"`
|
||||||
|
Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) Reset() { *m = RawSpaceHeader{} }
|
||||||
|
func (m *RawSpaceHeader) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*RawSpaceHeader) ProtoMessage() {}
|
||||||
|
func (*RawSpaceHeader) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_5855f4ef9cf24cdb, []int{14}
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeader) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_RawSpaceHeader.Marshal(b, m, deterministic)
|
||||||
|
} else {
|
||||||
|
b = b[:cap(b)]
|
||||||
|
n, err := m.MarshalToSizedBuffer(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b[:n], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeader) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_RawSpaceHeader.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeader) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeader) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_RawSpaceHeader.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_RawSpaceHeader proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) GetSpaceHeader() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.SpaceHeader
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) GetSignature() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Signature
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type RawSpaceHeaderWithId struct {
|
||||||
|
RawHeader []byte `protobuf:"bytes,1,opt,name=rawHeader,proto3" json:"rawHeader,omitempty"`
|
||||||
|
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) Reset() { *m = RawSpaceHeaderWithId{} }
|
||||||
|
func (m *RawSpaceHeaderWithId) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*RawSpaceHeaderWithId) ProtoMessage() {}
|
||||||
|
func (*RawSpaceHeaderWithId) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_5855f4ef9cf24cdb, []int{15}
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_RawSpaceHeaderWithId.Marshal(b, m, deterministic)
|
||||||
|
} else {
|
||||||
|
b = b[:cap(b)]
|
||||||
|
n, err := m.MarshalToSizedBuffer(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b[:n], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_RawSpaceHeaderWithId.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_RawSpaceHeaderWithId.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_RawSpaceHeaderWithId proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) GetRawHeader() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.RawHeader
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value)
|
proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value)
|
||||||
proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange")
|
proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange")
|
||||||
@ -936,6 +1032,8 @@ func init() {
|
|||||||
proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest")
|
proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest")
|
||||||
proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse")
|
proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse")
|
||||||
proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader")
|
proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader")
|
||||||
|
proto.RegisterType((*RawSpaceHeader)(nil), "anySpace.RawSpaceHeader")
|
||||||
|
proto.RegisterType((*RawSpaceHeaderWithId)(nil), "anySpace.RawSpaceHeaderWithId")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -943,65 +1041,68 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor_5855f4ef9cf24cdb = []byte{
|
var fileDescriptor_5855f4ef9cf24cdb = []byte{
|
||||||
// 919 bytes of a gzipped FileDescriptorProto
|
// 965 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x8e, 0x1b, 0x45,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x92, 0xdb, 0x44,
|
||||||
0x10, 0xf6, 0x78, 0xbd, 0x6b, 0xbb, 0xbc, 0x3f, 0x4e, 0x87, 0x0d, 0x83, 0x43, 0x1c, 0x33, 0x07,
|
0x10, 0xb6, 0xbc, 0x3f, 0xb6, 0xdb, 0x5e, 0xaf, 0x33, 0xf9, 0x41, 0x38, 0xc4, 0x31, 0x3a, 0x50,
|
||||||
0xb4, 0x02, 0xb1, 0x46, 0xe6, 0x10, 0x60, 0x91, 0x50, 0xb2, 0x78, 0x65, 0x2b, 0xe4, 0x47, 0xbd,
|
0x5b, 0x50, 0xac, 0x29, 0x73, 0xe0, 0x67, 0xa9, 0x82, 0x64, 0xe3, 0x2d, 0xbb, 0x42, 0x92, 0xad,
|
||||||
0x09, 0x48, 0x88, 0x4b, 0x67, 0xa6, 0xd6, 0x1e, 0x32, 0x9e, 0x1e, 0xa6, 0xdb, 0x6c, 0xfc, 0x04,
|
0xd9, 0x04, 0xaa, 0x28, 0x2e, 0x13, 0x69, 0xd6, 0x16, 0x91, 0x35, 0x62, 0x66, 0x8c, 0xe3, 0x27,
|
||||||
0x5c, 0x40, 0xe2, 0x09, 0x90, 0x78, 0x16, 0x2e, 0x1c, 0x73, 0xcc, 0x11, 0xed, 0xbe, 0x08, 0xea,
|
0xe0, 0x02, 0x55, 0xbc, 0x02, 0xcf, 0xc2, 0x85, 0x63, 0x8e, 0x39, 0x52, 0xbb, 0x2f, 0x42, 0x4d,
|
||||||
0x9a, 0x19, 0xcf, 0xd8, 0x4c, 0xb2, 0xc7, 0x5c, 0x3c, 0x5d, 0x55, 0x5f, 0x55, 0x7f, 0xf5, 0xd3,
|
0x4b, 0xb2, 0x24, 0x47, 0x49, 0x8e, 0xb9, 0xd8, 0xd3, 0x3d, 0x5f, 0xf7, 0x7c, 0xf3, 0x75, 0x8f,
|
||||||
0xdd, 0x86, 0xcf, 0x5d, 0x39, 0x9b, 0xc9, 0xb0, 0x9f, 0x7c, 0x54, 0x24, 0x5c, 0xec, 0xd3, 0xaf,
|
0xdb, 0xf0, 0xa5, 0x2b, 0xe6, 0x73, 0x11, 0x0e, 0xe2, 0x2f, 0x15, 0x31, 0x97, 0x0f, 0xf0, 0x53,
|
||||||
0x5a, 0x84, 0x6e, 0x14, 0x4b, 0x2d, 0xfb, 0xf4, 0xab, 0x72, 0xed, 0x21, 0x29, 0x58, 0x43, 0x84,
|
0xad, 0x42, 0x37, 0x92, 0x42, 0x8b, 0x01, 0x7e, 0xaa, 0xcc, 0x7b, 0x88, 0x0e, 0x52, 0x67, 0xe1,
|
||||||
0x8b, 0x53, 0xa3, 0xeb, 0xf4, 0xa3, 0xe7, 0x93, 0xbe, 0x70, 0x83, 0xbe, 0x8e, 0x11, 0xdd, 0xa9,
|
0xea, 0xcc, 0xf8, 0xba, 0x83, 0xe8, 0xd9, 0x74, 0xc0, 0xdc, 0x60, 0xa0, 0x25, 0xe7, 0xee, 0x8c,
|
||||||
0x08, 0x27, 0xb8, 0xe2, 0x99, 0xab, 0x13, 0xd7, 0xce, 0x27, 0x99, 0x83, 0x70, 0x83, 0x18, 0x5d,
|
0x85, 0x53, 0x5e, 0x88, 0xcc, 0xdc, 0x71, 0x68, 0xf7, 0xd3, 0x34, 0x80, 0xb9, 0x81, 0xe4, 0xae,
|
||||||
0x19, 0x7b, 0x2b, 0xf8, 0xa5, 0x36, 0x81, 0x3b, 0x63, 0xd8, 0x19, 0xa1, 0xf0, 0x4e, 0x17, 0xa1,
|
0x90, 0x5e, 0x01, 0xbf, 0xf6, 0xc6, 0x70, 0x67, 0x02, 0x7b, 0x63, 0xce, 0xbc, 0xb3, 0x55, 0xe8,
|
||||||
0xcb, 0x4d, 0x14, 0xc6, 0xa0, 0x76, 0x16, 0xcb, 0x99, 0x6d, 0xf5, 0xac, 0x83, 0x1a, 0xa7, 0x35,
|
0x52, 0x93, 0x85, 0x10, 0xd8, 0x3e, 0x97, 0x62, 0x6e, 0x5b, 0x7d, 0xeb, 0x60, 0x9b, 0xe2, 0x9a,
|
||||||
0xdb, 0x85, 0xaa, 0x96, 0x76, 0x95, 0x34, 0x55, 0x2d, 0xd9, 0x3b, 0xb0, 0x19, 0xf8, 0x33, 0x5f,
|
0xb4, 0xa1, 0xaa, 0x85, 0x5d, 0x45, 0x4f, 0x55, 0x0b, 0x72, 0x0d, 0x76, 0x02, 0x7f, 0xee, 0x6b,
|
||||||
0xdb, 0x1b, 0x3d, 0xeb, 0x60, 0x87, 0x27, 0x82, 0x73, 0x0e, 0xbb, 0xcb, 0x50, 0xa8, 0xe6, 0x81,
|
0x7b, 0xab, 0x6f, 0x1d, 0xec, 0xd1, 0xd8, 0x70, 0x96, 0xd0, 0x5e, 0xa7, 0xe2, 0x6a, 0x11, 0x68,
|
||||||
0x36, 0xb1, 0xa6, 0x42, 0x4d, 0x29, 0xd6, 0x36, 0xa7, 0x35, 0x3b, 0x82, 0x06, 0x06, 0x38, 0xc3,
|
0x93, 0x6b, 0xc6, 0xd4, 0x0c, 0x73, 0xb5, 0x28, 0xae, 0xc9, 0x11, 0xd4, 0x79, 0xc0, 0xe7, 0x3c,
|
||||||
0x50, 0x2b, 0xbb, 0xda, 0xdb, 0x38, 0x68, 0x0d, 0x6e, 0x1f, 0x66, 0xd9, 0x1e, 0xae, 0xfa, 0x0f,
|
0xd4, 0xca, 0xae, 0xf6, 0xb7, 0x0e, 0x9a, 0xc3, 0xdb, 0x87, 0xe9, 0x6d, 0x0f, 0x8b, 0xf1, 0xa3,
|
||||||
0x13, 0x1c, 0x5f, 0x3a, 0x98, 0x8d, 0x5d, 0x39, 0x0f, 0x97, 0x1b, 0x93, 0xe0, 0x1c, 0xc1, 0x7e,
|
0x18, 0x47, 0xd7, 0x01, 0xe6, 0x60, 0x57, 0x2c, 0xc2, 0xf5, 0xc1, 0x68, 0x38, 0x47, 0x70, 0xbd,
|
||||||
0xa9, 0xa3, 0xe1, 0xed, 0x7b, 0xb4, 0x7b, 0x93, 0x57, 0x7d, 0x8f, 0xf8, 0xa0, 0xf0, 0x28, 0x93,
|
0x34, 0xd0, 0xf0, 0xf6, 0x3d, 0x3c, 0xbd, 0x41, 0xab, 0xbe, 0x87, 0x7c, 0x38, 0xf3, 0xf0, 0x26,
|
||||||
0x26, 0xa7, 0xb5, 0xf3, 0x23, 0xec, 0xe5, 0xce, 0x3f, 0xcf, 0x51, 0x69, 0x66, 0x43, 0x9d, 0x1a,
|
0x0d, 0x8a, 0x6b, 0xe7, 0x67, 0xd8, 0xcf, 0x82, 0x7f, 0x5d, 0x70, 0xa5, 0x89, 0x0d, 0x35, 0x2c,
|
||||||
0x32, 0xce, 0x7c, 0x33, 0x91, 0xf5, 0x61, 0x2b, 0x36, 0x55, 0xca, 0xa8, 0xbf, 0x5b, 0x42, 0xdd,
|
0xc8, 0x24, 0x8d, 0x4d, 0x4d, 0x32, 0x80, 0x5d, 0x69, 0x54, 0x4a, 0xa9, 0xbf, 0x57, 0x42, 0xdd,
|
||||||
0xd8, 0x79, 0x0a, 0x73, 0x4e, 0xa0, 0x5d, 0xa0, 0x16, 0xc9, 0x50, 0x21, 0x1b, 0x40, 0x3d, 0x26,
|
0xec, 0xd3, 0x04, 0xe6, 0x9c, 0x40, 0x27, 0x47, 0x2d, 0x12, 0xa1, 0xe2, 0x64, 0x08, 0x35, 0x89,
|
||||||
0x9a, 0xca, 0xb6, 0x28, 0x8a, 0xfd, 0xba, 0x02, 0xf0, 0x0c, 0xe8, 0x5c, 0x58, 0x70, 0xed, 0xd1,
|
0x34, 0x95, 0x6d, 0x61, 0x16, 0xfb, 0x75, 0x02, 0xd0, 0x14, 0xe8, 0x5c, 0x58, 0x70, 0xe5, 0xd1,
|
||||||
0xb3, 0x9f, 0xd0, 0xd5, 0xc6, 0xfa, 0x00, 0x95, 0x12, 0x13, 0x7c, 0x03, 0xd1, 0x2f, 0xa1, 0xee,
|
0xd3, 0x5f, 0xb8, 0xab, 0xcd, 0xee, 0x03, 0xae, 0x14, 0x9b, 0xf2, 0x37, 0x10, 0xfd, 0x1a, 0x6a,
|
||||||
0xca, 0x50, 0x63, 0xa8, 0x29, 0xd9, 0xd6, 0xa0, 0x97, 0xef, 0x91, 0xc7, 0x39, 0x4e, 0x20, 0xdf,
|
0xae, 0x08, 0x35, 0x0f, 0x35, 0x5e, 0xb6, 0x39, 0xec, 0x67, 0x67, 0x64, 0x79, 0x8e, 0x63, 0xc8,
|
||||||
0x89, 0x60, 0x8e, 0x3c, 0x73, 0x60, 0x5f, 0x03, 0xc4, 0x52, 0xea, 0x63, 0x9a, 0x2a, 0xaa, 0xb4,
|
0x0f, 0x2c, 0x58, 0x70, 0x9a, 0x06, 0x90, 0x6f, 0x01, 0xa4, 0x10, 0xfa, 0x18, 0xbb, 0x0a, 0x95,
|
||||||
0xe9, 0x51, 0x61, 0xd0, 0xb8, 0x38, 0x7f, 0x12, 0x23, 0x26, 0x80, 0xef, 0x7d, 0x3d, 0x1d, 0x7b,
|
0x36, 0x35, 0xca, 0x35, 0x1a, 0x65, 0xcb, 0xc7, 0x92, 0xf3, 0x18, 0xf0, 0xa3, 0xaf, 0x67, 0x13,
|
||||||
0xbc, 0xe0, 0xc2, 0x6e, 0xc0, 0x96, 0x41, 0x8f, 0x3d, 0xbb, 0x46, 0xac, 0x52, 0x89, 0x75, 0x01,
|
0x8f, 0xe6, 0x42, 0xc8, 0x0d, 0xd8, 0x35, 0xe8, 0x89, 0x67, 0x6f, 0x23, 0xab, 0xc4, 0x22, 0x3d,
|
||||||
0x74, 0x2c, 0xdc, 0xe7, 0x7e, 0x38, 0x19, 0x7b, 0xf6, 0x26, 0xd9, 0x0a, 0x1a, 0xe7, 0xef, 0x2a,
|
0x00, 0x2d, 0x99, 0xfb, 0xcc, 0x0f, 0xa7, 0x13, 0xcf, 0xde, 0xc1, 0xbd, 0x9c, 0xc7, 0xf9, 0xa7,
|
||||||
0xdc, 0x28, 0x27, 0xc7, 0xbe, 0x02, 0x30, 0xdd, 0x7a, 0x1a, 0x79, 0x42, 0x23, 0x25, 0xdb, 0x1a,
|
0x0a, 0x37, 0xca, 0xc9, 0x91, 0x6f, 0x00, 0x4c, 0xb5, 0x9e, 0x44, 0x1e, 0xd3, 0x1c, 0x2f, 0xdb,
|
||||||
0x74, 0xd6, 0x53, 0x1a, 0x2d, 0x11, 0xa3, 0x0a, 0x2f, 0xe0, 0xd9, 0x7d, 0xd8, 0x3b, 0x9b, 0x07,
|
0x1c, 0x76, 0x37, 0xaf, 0x34, 0x5e, 0x23, 0xc6, 0x15, 0x9a, 0xc3, 0x93, 0xfb, 0xb0, 0x7f, 0xbe,
|
||||||
0x41, 0xa1, 0xc7, 0x69, 0x55, 0x6e, 0xaf, 0x87, 0x38, 0x59, 0x85, 0x8d, 0x2a, 0x7c, 0xdd, 0x93,
|
0x08, 0x82, 0x5c, 0x8d, 0x13, 0x55, 0x6e, 0x6f, 0xa6, 0x38, 0x29, 0xc2, 0xc6, 0x15, 0xba, 0x19,
|
||||||
0x3d, 0x84, 0x76, 0xae, 0x4a, 0x5a, 0x9a, 0x16, 0xa9, 0xf7, 0xfa, 0x68, 0x09, 0x6e, 0x54, 0xe1,
|
0x49, 0x1e, 0x42, 0x27, 0x73, 0xc5, 0x25, 0x4d, 0x44, 0xea, 0xbf, 0x3e, 0x5b, 0x8c, 0x1b, 0x57,
|
||||||
0xff, 0xf3, 0x65, 0x43, 0xd8, 0xc1, 0x38, 0x96, 0xf1, 0x32, 0x58, 0x8d, 0x82, 0xdd, 0x5a, 0x0f,
|
0xe8, 0x2b, 0xb1, 0x64, 0x04, 0x7b, 0x5c, 0x4a, 0x21, 0xd7, 0xc9, 0xb6, 0x31, 0xd9, 0xad, 0xcd,
|
||||||
0x36, 0x2c, 0x82, 0x46, 0x15, 0xbe, 0xea, 0x75, 0xaf, 0x0e, 0x9b, 0xbf, 0x98, 0x52, 0x39, 0xbf,
|
0x64, 0xa3, 0x3c, 0x68, 0x5c, 0xa1, 0xc5, 0xa8, 0xbb, 0x35, 0xd8, 0xf9, 0xcd, 0x48, 0xe5, 0xfc,
|
||||||
0x5a, 0xd0, 0x5e, 0xaf, 0x87, 0x39, 0x38, 0xa6, 0x1e, 0xc9, 0xc4, 0x35, 0x79, 0x22, 0xb0, 0x2f,
|
0x6e, 0x41, 0x67, 0x53, 0x0f, 0xf3, 0x70, 0x8c, 0x1e, 0x71, 0xc7, 0x35, 0x68, 0x6c, 0x90, 0xaf,
|
||||||
0xa0, 0x9e, 0xb4, 0x34, 0x3f, 0x8a, 0x57, 0xb4, 0x39, 0xc3, 0x33, 0x07, 0xb6, 0x55, 0x28, 0x22,
|
0xa0, 0x16, 0x97, 0x34, 0x7b, 0x8a, 0x6f, 0x29, 0x73, 0x8a, 0x27, 0x0e, 0xb4, 0x54, 0xc8, 0x22,
|
||||||
0x35, 0x95, 0xfa, 0xb1, 0xd0, 0x53, 0x7b, 0x83, 0xe2, 0xae, 0xe8, 0x9c, 0xdf, 0x2c, 0xd8, 0x2f,
|
0x35, 0x13, 0xfa, 0x94, 0xe9, 0x99, 0xbd, 0x85, 0x79, 0x0b, 0x3e, 0xe7, 0x0f, 0x0b, 0xae, 0x97,
|
||||||
0x2d, 0xeb, 0xdb, 0xa1, 0xf3, 0xbb, 0x95, 0x8d, 0xd7, 0x7a, 0x5f, 0xde, 0x0e, 0x9f, 0x8f, 0xe1,
|
0xca, 0xfa, 0x6e, 0xe8, 0xfc, 0x69, 0xa5, 0xed, 0xb5, 0x59, 0x97, 0x77, 0xc3, 0xe7, 0x13, 0xb8,
|
||||||
0x7a, 0x49, 0x67, 0x0d, 0x17, 0xea, 0x6c, 0x7a, 0xa4, 0x13, 0xc1, 0xf9, 0xd3, 0x82, 0xf6, 0xe3,
|
0x5a, 0x52, 0x59, 0xc3, 0x05, 0x2b, 0x9b, 0x3c, 0xe9, 0xd8, 0x30, 0xe4, 0x3b, 0xa7, 0x0b, 0x35,
|
||||||
0xb9, 0x9a, 0xd2, 0x44, 0x5c, 0x7d, 0x51, 0xdd, 0x81, 0x16, 0x2d, 0xcd, 0x08, 0x60, 0x9c, 0x4e,
|
0xc3, 0x8e, 0x48, 0x65, 0xfc, 0x0e, 0x9a, 0xf8, 0xe0, 0x4d, 0xa1, 0xb9, 0x4c, 0x7a, 0xba, 0x97,
|
||||||
0xfb, 0x7e, 0x3e, 0x52, 0xa7, 0xb9, 0x91, 0x17, 0x91, 0xec, 0x0e, 0xd4, 0x85, 0x1b, 0x70, 0x29,
|
0x35, 0x0e, 0x65, 0xcb, 0xb3, 0x6c, 0x3f, 0xe1, 0x98, 0x0f, 0x21, 0x5f, 0x40, 0x8d, 0xb9, 0x01,
|
||||||
0x75, 0x3a, 0xd4, 0xb7, 0x0e, 0xf3, 0x27, 0x83, 0x8b, 0xf3, 0xbb, 0xc7, 0xdf, 0x72, 0x12, 0xb2,
|
0x15, 0x42, 0x27, 0x3d, 0x7c, 0xeb, 0x30, 0x9b, 0x10, 0x94, 0x2d, 0xef, 0x1c, 0x7f, 0x4f, 0xd1,
|
||||||
0x8c, 0x53, 0xb4, 0x73, 0x1d, 0xae, 0x15, 0xf8, 0x25, 0xb9, 0x38, 0x7f, 0x59, 0xd0, 0x2a, 0x6c,
|
0x48, 0x2f, 0x98, 0xa0, 0x9d, 0xab, 0x70, 0x25, 0x47, 0x27, 0xa6, 0xee, 0xfc, 0x6d, 0x41, 0x33,
|
||||||
0xc5, 0x3a, 0xd0, 0xf0, 0x3d, 0x0c, 0xb5, 0xaf, 0x17, 0xe9, 0xa3, 0xb0, 0x94, 0xd9, 0xfb, 0xd0,
|
0x77, 0x20, 0xe9, 0x42, 0xdd, 0xf7, 0x78, 0xa8, 0x7d, 0xbd, 0x4a, 0x66, 0xc0, 0xda, 0x26, 0x1f,
|
||||||
0xd4, 0xfe, 0x0c, 0x95, 0x16, 0xb3, 0x88, 0x08, 0x6f, 0xf0, 0x5c, 0x61, 0xac, 0x44, 0xf3, 0xc9,
|
0x40, 0x43, 0xfb, 0x73, 0xae, 0x34, 0x9b, 0x47, 0xc8, 0x7c, 0x8b, 0x66, 0x0e, 0xb3, 0x8b, 0x34,
|
||||||
0x22, 0x4a, 0x8e, 0x5b, 0x93, 0xe7, 0x0a, 0xf6, 0x21, 0xec, 0xc6, 0x18, 0x05, 0xbe, 0x2b, 0xb4,
|
0x1f, 0xaf, 0xa2, 0xf8, 0x75, 0x35, 0x68, 0xe6, 0x20, 0x1f, 0x41, 0x5b, 0xf2, 0x28, 0xf0, 0x5d,
|
||||||
0x2f, 0xc3, 0xfb, 0xb8, 0xa0, 0x43, 0x54, 0xe3, 0x6b, 0x5a, 0xf3, 0x00, 0x28, 0xc4, 0xe4, 0xee,
|
0xa6, 0x7d, 0x11, 0xde, 0xe7, 0x2b, 0x7c, 0x33, 0xdb, 0x74, 0xc3, 0x6b, 0x7e, 0xef, 0x15, 0xe7,
|
||||||
0xd9, 0xe6, 0xb4, 0xfe, 0xe8, 0x21, 0x34, 0x86, 0x71, 0x7c, 0x2c, 0x3d, 0x54, 0x6c, 0x17, 0xe0,
|
0xf1, 0x4f, 0x4d, 0x8b, 0xe2, 0xda, 0x39, 0x85, 0x76, 0x51, 0x16, 0xd2, 0x2f, 0xaa, 0x18, 0x13,
|
||||||
0x69, 0x88, 0x2f, 0x22, 0x74, 0x35, 0x7a, 0xed, 0x0a, 0x6b, 0xc3, 0x36, 0xd1, 0x7f, 0xe0, 0x2b,
|
0x2d, 0xa8, 0x64, 0xd8, 0xf8, 0xd3, 0x90, 0xe9, 0x85, 0xe4, 0xc8, 0xb5, 0x45, 0x33, 0x87, 0x73,
|
||||||
0xe5, 0x87, 0x93, 0xb6, 0xc5, 0xf6, 0xd2, 0x84, 0x86, 0x2f, 0x7c, 0xa5, 0x55, 0xbb, 0x6a, 0x14,
|
0x0f, 0xae, 0x95, 0x09, 0x6d, 0xa2, 0x24, 0x5b, 0x16, 0xb2, 0x66, 0x8e, 0x64, 0x36, 0x55, 0xd3,
|
||||||
0xd4, 0xbf, 0x47, 0x67, 0x67, 0x0a, 0x75, 0xdb, 0x1b, 0xbc, 0xb2, 0x60, 0x93, 0x20, 0xec, 0x2e,
|
0xd9, 0xf4, 0xf1, 0x43, 0xa8, 0x8f, 0xa4, 0x3c, 0x16, 0x1e, 0x57, 0xa4, 0x0d, 0xf0, 0x24, 0xe4,
|
||||||
0x34, 0xb2, 0xfb, 0x9c, 0xbd, 0x57, 0x76, 0xc7, 0x53, 0x17, 0x3b, 0x9d, 0xd2, 0xeb, 0x3f, 0x19,
|
0xcf, 0x23, 0xee, 0x6a, 0xee, 0x75, 0x2a, 0xa4, 0x03, 0x2d, 0x4c, 0xff, 0xc0, 0x57, 0xca, 0x0f,
|
||||||
0x86, 0x6f, 0xa0, 0xb9, 0xac, 0x2a, 0x2b, 0x00, 0xd7, 0x47, 0xa1, 0x73, 0xb3, 0xd4, 0x96, 0x46,
|
0xa7, 0x1d, 0x8b, 0xec, 0x27, 0x42, 0x8f, 0x9e, 0xfb, 0x4a, 0xab, 0x4e, 0xd5, 0x38, 0xb0, 0x8d,
|
||||||
0x39, 0x81, 0xad, 0x53, 0x1d, 0xa3, 0x98, 0xb1, 0x9b, 0x65, 0xcf, 0x40, 0xfa, 0x9c, 0x74, 0xde,
|
0x1e, 0x9d, 0x9f, 0x2b, 0xae, 0x3b, 0xde, 0xf0, 0xa5, 0x05, 0x3b, 0x08, 0x21, 0x77, 0xa0, 0x9e,
|
||||||
0x64, 0x3c, 0xb0, 0x3e, 0xb5, 0xee, 0x1d, 0xfd, 0x73, 0xd1, 0xb5, 0x5e, 0x5e, 0x74, 0xad, 0x7f,
|
0x8e, 0x15, 0xf2, 0x7e, 0xd9, 0xa8, 0xc1, 0x66, 0xea, 0x76, 0x4b, 0xa7, 0x50, 0xdc, 0x93, 0xf7,
|
||||||
0x2f, 0xba, 0xd6, 0x1f, 0x97, 0xdd, 0xca, 0xcb, 0xcb, 0x6e, 0xe5, 0xd5, 0x65, 0xb7, 0xf2, 0xc3,
|
0xa0, 0xb1, 0xae, 0x36, 0xc9, 0x01, 0x37, 0x3b, 0xb2, 0x7b, 0xb3, 0x74, 0x2f, 0xc9, 0x72, 0x02,
|
||||||
0x07, 0x57, 0xfe, 0xd5, 0x79, 0xb6, 0x45, 0x9f, 0xcf, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xce,
|
0xbb, 0x67, 0x5a, 0x72, 0x36, 0x27, 0x37, 0xcb, 0xa6, 0x51, 0x32, 0xd5, 0xba, 0x6f, 0xda, 0x3c,
|
||||||
0x99, 0xdc, 0xc5, 0x16, 0x09, 0x00, 0x00,
|
0xb0, 0x3e, 0xb3, 0xee, 0x1e, 0xfd, 0x7b, 0xd1, 0xb3, 0x5e, 0x5c, 0xf4, 0xac, 0xff, 0x2e, 0x7a,
|
||||||
|
0xd6, 0x5f, 0x97, 0xbd, 0xca, 0x8b, 0xcb, 0x5e, 0xe5, 0xe5, 0x65, 0xaf, 0xf2, 0xd3, 0x87, 0x6f,
|
||||||
|
0xfd, 0xc7, 0xf5, 0x74, 0x17, 0xbf, 0x3e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x4f, 0xd9,
|
||||||
|
0xa3, 0x9d, 0x09, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) {
|
func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) {
|
||||||
@ -1632,13 +1733,6 @@ func (m *PushSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
i--
|
i--
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
}
|
}
|
||||||
if len(m.SpaceId) > 0 {
|
|
||||||
i -= len(m.SpaceId)
|
|
||||||
copy(dAtA[i:], m.SpaceId)
|
|
||||||
i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId)))
|
|
||||||
i--
|
|
||||||
dAtA[i] = 0xa
|
|
||||||
}
|
|
||||||
return len(dAtA) - i, nil
|
return len(dAtA) - i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1719,6 +1813,80 @@ func (m *SpaceHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
return len(dAtA) - i, nil
|
return len(dAtA) - i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Signature) > 0 {
|
||||||
|
i -= len(m.Signature)
|
||||||
|
copy(dAtA[i:], m.Signature)
|
||||||
|
i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Signature)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
}
|
||||||
|
if len(m.SpaceHeader) > 0 {
|
||||||
|
i -= len(m.SpaceHeader)
|
||||||
|
copy(dAtA[i:], m.SpaceHeader)
|
||||||
|
i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceHeader)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
}
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Id) > 0 {
|
||||||
|
i -= len(m.Id)
|
||||||
|
copy(dAtA[i:], m.Id)
|
||||||
|
i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Id)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
}
|
||||||
|
if len(m.RawHeader) > 0 {
|
||||||
|
i -= len(m.RawHeader)
|
||||||
|
copy(dAtA[i:], m.RawHeader)
|
||||||
|
i = encodeVarintSpacesync(dAtA, i, uint64(len(m.RawHeader)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
}
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int {
|
func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int {
|
||||||
offset -= sovSpacesync(v)
|
offset -= sovSpacesync(v)
|
||||||
base := offset
|
base := offset
|
||||||
@ -2010,10 +2178,6 @@ func (m *PushSpaceRequest) Size() (n int) {
|
|||||||
}
|
}
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
l = len(m.SpaceId)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovSpacesync(uint64(l))
|
|
||||||
}
|
|
||||||
if m.SpaceHeader != nil {
|
if m.SpaceHeader != nil {
|
||||||
l = m.SpaceHeader.Size()
|
l = m.SpaceHeader.Size()
|
||||||
n += 1 + l + sovSpacesync(uint64(l))
|
n += 1 + l + sovSpacesync(uint64(l))
|
||||||
@ -2061,6 +2225,40 @@ func (m *SpaceHeader) Size() (n int) {
|
|||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeader) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.SpaceHeader)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSpacesync(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.Signature)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSpacesync(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *RawSpaceHeaderWithId) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.RawHeader)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSpacesync(uint64(l))
|
||||||
|
}
|
||||||
|
l = len(m.Id)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSpacesync(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
func sovSpacesync(x uint64) (n int) {
|
func sovSpacesync(x uint64) (n int) {
|
||||||
return (math_bits.Len64(x|1) + 6) / 7
|
return (math_bits.Len64(x|1) + 6) / 7
|
||||||
}
|
}
|
||||||
@ -3588,38 +3786,6 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error {
|
|||||||
return fmt.Errorf("proto: PushSpaceRequest: illegal tag %d (wire type %d)", fieldNum, wire)
|
return fmt.Errorf("proto: PushSpaceRequest: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
}
|
}
|
||||||
switch fieldNum {
|
switch fieldNum {
|
||||||
case 1:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowSpacesync
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= uint64(b&0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthSpacesync
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex < 0 {
|
|
||||||
return ErrInvalidLengthSpacesync
|
|
||||||
}
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.SpaceId = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 2:
|
case 2:
|
||||||
if wireType != 2 {
|
if wireType != 2 {
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType)
|
return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType)
|
||||||
@ -3650,7 +3816,7 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error {
|
|||||||
return io.ErrUnexpectedEOF
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
if m.SpaceHeader == nil {
|
if m.SpaceHeader == nil {
|
||||||
m.SpaceHeader = &SpaceHeader{}
|
m.SpaceHeader = &RawSpaceHeaderWithId{}
|
||||||
}
|
}
|
||||||
if err := m.SpaceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
if err := m.SpaceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -3951,6 +4117,240 @@ func (m *SpaceHeader) Unmarshal(dAtA []byte) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func (m *RawSpaceHeader) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: RawSpaceHeader: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: RawSpaceHeader: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.SpaceHeader = append(m.SpaceHeader[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.SpaceHeader == nil {
|
||||||
|
m.SpaceHeader = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.Signature == nil {
|
||||||
|
m.Signature = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipSpacesync(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *RawSpaceHeaderWithId) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: RawSpaceHeaderWithId: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: RawSpaceHeaderWithId: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field RawHeader", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.RawHeader = append(m.RawHeader[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.RawHeader == nil {
|
||||||
|
m.RawHeader = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSpacesync
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
stringLen |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
intStringLen := int(stringLen)
|
||||||
|
if intStringLen < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Id = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipSpacesync(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||||
|
return ErrInvalidLengthSpacesync
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func skipSpacesync(dAtA []byte) (n int, err error) {
|
func skipSpacesync(dAtA []byte) (n int, err error) {
|
||||||
l := len(dAtA)
|
l := len(dAtA)
|
||||||
iNdEx := 0
|
iNdEx := 0
|
||||||
|
|||||||
@ -133,6 +133,20 @@ func (mr *MockSpaceStorageMockRecorder) ACLStorage() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLStorage", reflect.TypeOf((*MockSpaceStorage)(nil).ACLStorage))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLStorage", reflect.TypeOf((*MockSpaceStorage)(nil).ACLStorage))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close mocks base method.
|
||||||
|
func (m *MockSpaceStorage) Close() error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Close")
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close indicates an expected call of Close.
|
||||||
|
func (mr *MockSpaceStorageMockRecorder) Close() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSpaceStorage)(nil).Close))
|
||||||
|
}
|
||||||
|
|
||||||
// CreateTreeStorage mocks base method.
|
// CreateTreeStorage mocks base method.
|
||||||
func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) {
|
func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@ -148,11 +162,26 @@ func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gom
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ID mocks base method.
|
||||||
|
func (m *MockSpaceStorage) ID() (string, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ID")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ID indicates an expected call of ID.
|
||||||
|
func (mr *MockSpaceStorageMockRecorder) ID() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockSpaceStorage)(nil).ID))
|
||||||
|
}
|
||||||
|
|
||||||
// SpaceHeader mocks base method.
|
// SpaceHeader mocks base method.
|
||||||
func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.SpaceHeader, error) {
|
func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "SpaceHeader")
|
ret := m.ctrl.Call(m, "SpaceHeader")
|
||||||
ret0, _ := ret[0].(*spacesyncproto.SpaceHeader)
|
ret0, _ := ret[0].(*spacesyncproto.RawSpaceHeaderWithId)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,18 +12,20 @@ import (
|
|||||||
const CName = "commonspace.storage"
|
const CName = "commonspace.storage"
|
||||||
|
|
||||||
var ErrSpaceStorageExists = errors.New("space storage exists")
|
var ErrSpaceStorageExists = errors.New("space storage exists")
|
||||||
|
var ErrSpaceStorageMissing = errors.New("space storage missing")
|
||||||
|
|
||||||
type SpaceStorage interface {
|
type SpaceStorage interface {
|
||||||
|
storage.Storage
|
||||||
storage.Provider
|
storage.Provider
|
||||||
ACLStorage() (storage.ListStorage, error)
|
ACLStorage() (storage.ListStorage, error)
|
||||||
SpaceHeader() (*spacesyncproto.SpaceHeader, error)
|
SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error)
|
||||||
StoredIds() ([]string, error)
|
StoredIds() ([]string, error)
|
||||||
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type SpaceStorageCreatePayload struct {
|
type SpaceStorageCreatePayload struct {
|
||||||
RecWithId *aclrecordproto.RawACLRecordWithId
|
RecWithId *aclrecordproto.RawACLRecordWithId
|
||||||
SpaceHeader *spacesyncproto.SpaceHeader
|
SpaceHeaderWithId *spacesyncproto.RawSpaceHeaderWithId
|
||||||
Id string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type SpaceStorageProvider interface {
|
type SpaceStorageProvider interface {
|
||||||
|
|||||||
@ -29,6 +29,7 @@ type Config struct {
|
|||||||
APIServer APIServer `yaml:"apiServer"`
|
APIServer APIServer `yaml:"apiServer"`
|
||||||
Nodes []Node `yaml:"nodes"`
|
Nodes []Node `yaml:"nodes"`
|
||||||
Space Space `yaml:"space"`
|
Space Space `yaml:"space"`
|
||||||
|
Storage Storage `yaml:"storage"`
|
||||||
Metric Metric `yaml:"metric"`
|
Metric Metric `yaml:"metric"`
|
||||||
Log Log `yaml:"log"`
|
Log Log `yaml:"log"`
|
||||||
}
|
}
|
||||||
|
|||||||
5
config/storage.go
Normal file
5
config/storage.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type Storage struct {
|
||||||
|
Path string `yaml:"path"`
|
||||||
|
}
|
||||||
@ -5,20 +5,41 @@ grpcServer:
|
|||||||
- 127.0.0.1:4430
|
- 127.0.0.1:4430
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
|
peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk
|
||||||
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
|
signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
|
encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A==
|
||||||
apiServer:
|
apiServer:
|
||||||
port: "8080"
|
port: "8080"
|
||||||
nodes:
|
nodes:
|
||||||
- peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
|
- peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk
|
||||||
address: 127.0.0.1:4430
|
address: 127.0.0.1:4430
|
||||||
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
|
signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
|
encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A==
|
||||||
- peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK
|
- peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp
|
||||||
address: 127.0.0.1:4431
|
address: 127.0.0.1:4431
|
||||||
signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg==
|
signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w==
|
encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK
|
||||||
|
- peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE
|
||||||
|
address: 127.0.0.1:4432
|
||||||
|
signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ==
|
||||||
|
encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA==
|
||||||
|
- peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6
|
||||||
|
address: 127.0.0.1:4530
|
||||||
|
signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ==
|
||||||
|
encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q=
|
||||||
|
isConsensus: true
|
||||||
|
- peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq
|
||||||
|
address: 127.0.0.1:4531
|
||||||
|
signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA==
|
||||||
|
encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/
|
||||||
|
isConsensus: true
|
||||||
|
- peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ
|
||||||
|
address: 127.0.0.1:4532
|
||||||
|
signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw==
|
||||||
|
encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt
|
||||||
|
isConsensus: true
|
||||||
space:
|
space:
|
||||||
gcTTL: 60
|
gcTTL: 60
|
||||||
syncPeriod: 10
|
syncPeriod: 10
|
||||||
|
storage:
|
||||||
|
path: db
|
||||||
|
|||||||
@ -3,16 +3,16 @@ grpcServer:
|
|||||||
- 127.0.0.1:4530
|
- 127.0.0.1:4530
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
|
peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT
|
||||||
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
|
signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg==
|
||||||
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
|
encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ
|
||||||
mongo:
|
mongo:
|
||||||
connect: mongodb://localhost:27017/?w=majority
|
connect: mongodb://localhost:27017/?w=majority
|
||||||
database: consensus
|
database: consensus
|
||||||
logCollection: log
|
logCollection: log
|
||||||
metric:
|
metric:
|
||||||
addr: "127.0.0.1:4000"
|
addr: ""
|
||||||
log:
|
log:
|
||||||
production: true
|
production: false
|
||||||
defaultLevel: debug
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
@ -3,12 +3,16 @@ grpcServer:
|
|||||||
- 127.0.0.1:4531
|
- 127.0.0.1:4531
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
|
peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen
|
||||||
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
|
signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
|
encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+
|
||||||
mongo:
|
mongo:
|
||||||
connect: mongodb://localhost:27017/?w=majority
|
connect: mongodb://localhost:27017/?w=majority
|
||||||
database: consensus
|
database: consensus
|
||||||
logCollection: log
|
logCollection: log
|
||||||
metric:
|
metric:
|
||||||
addr: "127.0.0.1:4001"
|
addr: ""
|
||||||
|
log:
|
||||||
|
production: false
|
||||||
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
@ -3,12 +3,16 @@ grpcServer:
|
|||||||
- 127.0.0.1:4532
|
- 127.0.0.1:4532
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
|
peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE
|
||||||
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
|
signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
|
encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq
|
||||||
mongo:
|
mongo:
|
||||||
connect: mongodb://localhost:27017/?w=majority
|
connect: mongodb://localhost:27017/?w=majority
|
||||||
database: consensus
|
database: consensus
|
||||||
logCollection: log
|
logCollection: log
|
||||||
metric:
|
metric:
|
||||||
addr: "127.0.0.1:4002"
|
addr: ""
|
||||||
|
log:
|
||||||
|
production: false
|
||||||
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
@ -5,39 +5,47 @@ grpcServer:
|
|||||||
- 127.0.0.1:4430
|
- 127.0.0.1:4430
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
|
peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT
|
||||||
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
|
signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
|
encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw==
|
||||||
apiServer:
|
apiServer:
|
||||||
port: "8080"
|
port: "8080"
|
||||||
nodes:
|
nodes:
|
||||||
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
|
- peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT
|
||||||
address: 127.0.0.1:4430
|
address: 127.0.0.1:4430
|
||||||
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
|
signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
|
encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw==
|
||||||
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
|
- peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R
|
||||||
address: 127.0.0.1:4431
|
address: 127.0.0.1:4431
|
||||||
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
|
signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
|
encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l
|
||||||
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
|
- peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp
|
||||||
address: 127.0.0.1:4432
|
address: 127.0.0.1:4432
|
||||||
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
|
signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
|
encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA==
|
||||||
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
|
- peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT
|
||||||
address: ec2-18-159-132-180.eu-central-1.compute.amazonaws.com:4530
|
address: 127.0.0.1:4530
|
||||||
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
|
signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg==
|
||||||
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
|
encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
|
- peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen
|
||||||
address: ec2-18-192-21-226.eu-central-1.compute.amazonaws.com:4530
|
address: 127.0.0.1:4531
|
||||||
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
|
signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
|
encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
|
- peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE
|
||||||
address: ec2-3-124-115-217.eu-central-1.compute.amazonaws.com:4530
|
address: 127.0.0.1:4532
|
||||||
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
|
signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
|
encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
space:
|
space:
|
||||||
gcTTL: 60
|
gcTTL: 60
|
||||||
syncPeriod: 10
|
syncPeriod: 10
|
||||||
|
storage:
|
||||||
|
path: db
|
||||||
|
metric:
|
||||||
|
addr: ""
|
||||||
|
log:
|
||||||
|
production: false
|
||||||
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
@ -5,39 +5,47 @@ grpcServer:
|
|||||||
- 127.0.0.1:4431
|
- 127.0.0.1:4431
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
|
peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R
|
||||||
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
|
signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
|
encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l
|
||||||
apiServer:
|
apiServer:
|
||||||
port: "8081"
|
port: "8081"
|
||||||
nodes:
|
nodes:
|
||||||
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
|
- peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT
|
||||||
address: 127.0.0.1:4430
|
address: 127.0.0.1:4430
|
||||||
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
|
signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
|
encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw==
|
||||||
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
|
- peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R
|
||||||
address: 127.0.0.1:4431
|
address: 127.0.0.1:4431
|
||||||
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
|
signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
|
encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l
|
||||||
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
|
- peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp
|
||||||
address: 127.0.0.1:4432
|
address: 127.0.0.1:4432
|
||||||
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
|
signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
|
encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA==
|
||||||
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
|
- peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT
|
||||||
address: 127.0.0.1:4530
|
address: 127.0.0.1:4530
|
||||||
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
|
signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg==
|
||||||
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
|
encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
|
- peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen
|
||||||
address: 127.0.0.1:4531
|
address: 127.0.0.1:4531
|
||||||
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
|
signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
|
encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
|
- peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE
|
||||||
address: 127.0.0.1:4532
|
address: 127.0.0.1:4532
|
||||||
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
|
signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
|
encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
space:
|
space:
|
||||||
gcTTL: 60
|
gcTTL: 60
|
||||||
syncPeriod: 10
|
syncPeriod: 10
|
||||||
|
storage:
|
||||||
|
path: db
|
||||||
|
metric:
|
||||||
|
addr: ""
|
||||||
|
log:
|
||||||
|
production: false
|
||||||
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
@ -5,39 +5,47 @@ grpcServer:
|
|||||||
- 127.0.0.1:4432
|
- 127.0.0.1:4432
|
||||||
tls: false
|
tls: false
|
||||||
account:
|
account:
|
||||||
peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
|
peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp
|
||||||
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
|
signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
|
encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA==
|
||||||
apiServer:
|
apiServer:
|
||||||
port: "8082"
|
port: "8082"
|
||||||
nodes:
|
nodes:
|
||||||
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
|
- peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT
|
||||||
address: 127.0.0.1:4430
|
address: 127.0.0.1:4430
|
||||||
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
|
signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
|
encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw==
|
||||||
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
|
- peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R
|
||||||
address: 127.0.0.1:4431
|
address: 127.0.0.1:4431
|
||||||
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
|
signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A==
|
||||||
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
|
encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l
|
||||||
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
|
- peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp
|
||||||
address: 127.0.0.1:4432
|
address: 127.0.0.1:4432
|
||||||
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
|
signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
|
encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA==
|
||||||
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
|
- peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT
|
||||||
address: 127.0.0.1:4530
|
address: 127.0.0.1:4530
|
||||||
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
|
signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg==
|
||||||
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
|
encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
|
- peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen
|
||||||
address: 127.0.0.1:4531
|
address: 127.0.0.1:4531
|
||||||
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
|
signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw==
|
||||||
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
|
encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
|
- peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE
|
||||||
address: 127.0.0.1:4532
|
address: 127.0.0.1:4532
|
||||||
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
|
signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ==
|
||||||
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
|
encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq
|
||||||
isConsensus: true
|
isConsensus: true
|
||||||
space:
|
space:
|
||||||
gcTTL: 60
|
gcTTL: 60
|
||||||
syncPeriod: 10
|
syncPeriod: 10
|
||||||
|
storage:
|
||||||
|
path: db
|
||||||
|
metric:
|
||||||
|
addr: ""
|
||||||
|
log:
|
||||||
|
production: false
|
||||||
|
defaultLevel: ""
|
||||||
|
namedLevels: {}
|
||||||
|
|||||||
11
go.mod
11
go.mod
@ -3,10 +3,12 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments
|
|||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/akrylysov/pogreb v0.10.1
|
||||||
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232
|
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232
|
||||||
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab
|
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab
|
||||||
github.com/cespare/xxhash v1.1.0
|
github.com/cespare/xxhash v1.1.0
|
||||||
github.com/cheggaaa/mb/v2 v2.0.1
|
github.com/cheggaaa/mb/v2 v2.0.1
|
||||||
|
github.com/dgraph-io/badger/v3 v3.2103.2
|
||||||
github.com/goccy/go-graphviz v0.0.9
|
github.com/goccy/go-graphviz v0.0.9
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/golang/mock v1.6.0
|
github.com/golang/mock v1.6.0
|
||||||
@ -38,10 +40,15 @@ require (
|
|||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
|
||||||
|
github.com/dgraph-io/ristretto v0.1.0 // indirect
|
||||||
|
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||||
github.com/fogleman/gg v1.3.0 // indirect
|
github.com/fogleman/gg v1.3.0 // indirect
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/golang/snappy v0.0.1 // indirect
|
github.com/golang/snappy v0.0.3 // indirect
|
||||||
|
github.com/google/flatbuffers v1.12.1 // indirect
|
||||||
github.com/klauspost/compress v1.15.1 // indirect
|
github.com/klauspost/compress v1.15.1 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.0.12 // indirect
|
github.com/klauspost/cpuid/v2 v2.0.12 // indirect
|
||||||
github.com/libp2p/go-buffer-pool v0.0.2 // indirect
|
github.com/libp2p/go-buffer-pool v0.0.2 // indirect
|
||||||
@ -65,10 +72,12 @@ require (
|
|||||||
github.com/xdg-go/scram v1.1.1 // indirect
|
github.com/xdg-go/scram v1.1.1 // indirect
|
||||||
github.com/xdg-go/stringprep v1.0.3 // indirect
|
github.com/xdg-go/stringprep v1.0.3 // indirect
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
|
||||||
|
go.opencensus.io v0.22.5 // indirect
|
||||||
go.uber.org/atomic v1.9.0 // indirect
|
go.uber.org/atomic v1.9.0 // indirect
|
||||||
go.uber.org/multierr v1.8.0 // indirect
|
go.uber.org/multierr v1.8.0 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
|
||||||
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
|
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
|
||||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
|||||||
44
go.sum
44
go.sum
@ -36,6 +36,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
|
github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
|
||||||
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
|
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
|
||||||
|
github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w=
|
||||||
|
github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
@ -43,6 +45,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
|
|||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||||
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk=
|
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk=
|
||||||
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0=
|
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0=
|
||||||
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s=
|
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s=
|
||||||
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=
|
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
@ -70,8 +73,12 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
|
|||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
|
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||||
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
|
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
|
||||||
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
|
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
|
||||||
|
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@ -79,12 +86,21 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK
|
|||||||
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
|
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
|
||||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
|
||||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
|
||||||
|
github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8=
|
||||||
|
github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M=
|
||||||
|
github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI=
|
||||||
|
github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug=
|
||||||
|
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
|
||||||
|
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||||
|
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||||
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
|
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
|
||||||
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@ -104,9 +120,11 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
|||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
@ -134,10 +152,13 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
|
|||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
|
||||||
|
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw=
|
||||||
|
github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
@ -164,11 +185,13 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
|
|||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c=
|
github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c=
|
||||||
github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U=
|
github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U=
|
||||||
github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw=
|
github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw=
|
||||||
github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w=
|
github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
||||||
github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0=
|
github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0=
|
||||||
github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o=
|
github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o=
|
||||||
@ -184,6 +207,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
|
|||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
|
github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
|
||||||
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
@ -207,6 +231,7 @@ github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN
|
|||||||
github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c=
|
github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c=
|
||||||
github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw=
|
github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw=
|
||||||
github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
|
||||||
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
|
||||||
@ -214,6 +239,8 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8Rv
|
|||||||
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||||
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
|
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
|
||||||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
@ -247,6 +274,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
|
|||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
|
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
|
||||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
@ -279,6 +307,7 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
|
|||||||
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
||||||
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
@ -287,6 +316,12 @@ github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w
|
|||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||||
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
|
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||||
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
@ -300,12 +335,14 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK
|
|||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
|
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
|
||||||
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
||||||
github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
|
github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
|
||||||
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
||||||
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
|
||||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
@ -328,6 +365,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0=
|
||||||
|
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
||||||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
@ -339,6 +378,7 @@ go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95a
|
|||||||
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
|
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
|
||||||
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
@ -417,6 +457,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
|
|||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -441,6 +482,7 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|||||||
@ -24,6 +24,12 @@ type treeCache struct {
|
|||||||
nodeService nodespace.Service
|
nodeService nodespace.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func New(ttl int) cache.TreeCache {
|
||||||
|
return &treeCache{
|
||||||
|
gcttl: ttl,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *treeCache) Run(ctx context.Context) (err error) {
|
func (c *treeCache) Run(ctx context.Context) (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -55,12 +61,6 @@ func (c *treeCache) Name() (name string) {
|
|||||||
return cache.CName
|
return cache.CName
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewNodeCache(ttl int) cache.TreeCache {
|
|
||||||
return &treeCache{
|
|
||||||
gcttl: ttl,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) {
|
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) {
|
||||||
var cacheRes ocache.Object
|
var cacheRes ocache.Object
|
||||||
ctx = context.WithValue(ctx, spaceKey, spaceId)
|
ctx = context.WithValue(ctx, spaceKey, spaceId)
|
||||||
|
|||||||
@ -12,7 +12,7 @@ type rpcHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) {
|
func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) {
|
||||||
_, err = r.s.GetSpace(ctx, req.SpaceId)
|
_, err = r.s.GetSpace(ctx, req.SpaceHeader.Id)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = spacesyncproto.ErrSpaceExists
|
err = spacesyncproto.ErrSpaceExists
|
||||||
return
|
return
|
||||||
@ -23,9 +23,8 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac
|
|||||||
}
|
}
|
||||||
|
|
||||||
payload := storage.SpaceStorageCreatePayload{
|
payload := storage.SpaceStorageCreatePayload{
|
||||||
RecWithId: req.AclRoot,
|
RecWithId: req.AclRoot,
|
||||||
SpaceHeader: req.SpaceHeader,
|
SpaceHeaderWithId: req.SpaceHeader,
|
||||||
Id: req.SpaceId,
|
|
||||||
}
|
}
|
||||||
_, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload)
|
_, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
66
node/storage/keys.go
Normal file
66
node/storage/keys.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type aclKeys struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
var aclHeadIdKey = []byte("a/headId")
|
||||||
|
var aclRootIdKey = []byte("a/rootId")
|
||||||
|
|
||||||
|
func (a aclKeys) HeadIdKey() []byte {
|
||||||
|
return aclHeadIdKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a aclKeys) RootIdKey() []byte {
|
||||||
|
return aclRootIdKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a aclKeys) RawRecordKey(id string) []byte {
|
||||||
|
return storage.JoinStringsToBytes("a", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
type treeKeys struct {
|
||||||
|
id string
|
||||||
|
headsKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTreeKeys(id string) treeKeys {
|
||||||
|
return treeKeys{
|
||||||
|
id: id,
|
||||||
|
headsKey: storage.JoinStringsToBytes("t", id, "heads"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t treeKeys) HeadsKey() []byte {
|
||||||
|
return t.headsKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t treeKeys) RawChangeKey(id string) []byte {
|
||||||
|
return storage.JoinStringsToBytes("t", t.id, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
type spaceKeys struct {
|
||||||
|
headerKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpaceKeys(spaceId string) spaceKeys {
|
||||||
|
return spaceKeys{headerKey: storage.JoinStringsToBytes("s", spaceId)}
|
||||||
|
}
|
||||||
|
|
||||||
|
var spaceIdKey = []byte("spaceId")
|
||||||
|
|
||||||
|
func (s spaceKeys) SpaceIdKey() []byte {
|
||||||
|
return spaceIdKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s spaceKeys) HeaderKey() []byte {
|
||||||
|
return s.headerKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func isRootIdKey(key string) bool {
|
||||||
|
return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "rootId")
|
||||||
|
}
|
||||||
129
node/storage/liststorage.go
Normal file
129
node/storage/liststorage.go
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/akrylysov/pogreb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
type listStorage struct {
|
||||||
|
db *pogreb.DB
|
||||||
|
keys aclKeys
|
||||||
|
id string
|
||||||
|
root *aclrecordproto.RawACLRecordWithId
|
||||||
|
}
|
||||||
|
|
||||||
|
func newListStorage(db *pogreb.DB) (ls storage.ListStorage, err error) {
|
||||||
|
keys := aclKeys{}
|
||||||
|
rootId, err := db.Get(keys.RootIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if rootId == nil {
|
||||||
|
err = storage.ErrUnknownACLId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
root, err := db.Get(keys.RawRecordKey(string(rootId)))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if root == nil {
|
||||||
|
err = storage.ErrUnknownACLId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rootWithId := &aclrecordproto.RawACLRecordWithId{
|
||||||
|
Payload: root,
|
||||||
|
Id: string(rootId),
|
||||||
|
}
|
||||||
|
|
||||||
|
ls = &listStorage{
|
||||||
|
db: db,
|
||||||
|
keys: aclKeys{},
|
||||||
|
id: string(rootId),
|
||||||
|
root: rootWithId,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) {
|
||||||
|
keys := aclKeys{}
|
||||||
|
has, err := db.Has(keys.RootIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if has {
|
||||||
|
return newListStorage(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.HeadIdKey(), []byte(root.Id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.RawRecordKey(root.Id), root.Payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.RootIdKey(), []byte(root.Id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ls = &listStorage{
|
||||||
|
db: db,
|
||||||
|
keys: aclKeys{},
|
||||||
|
id: root.Id,
|
||||||
|
root: root,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) ID() (string, error) {
|
||||||
|
return l.id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
return l.root, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) Head() (head string, err error) {
|
||||||
|
bytes, err := l.db.Get(l.keys.HeadIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if bytes == nil {
|
||||||
|
err = storage.ErrUnknownACLId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
head = string(bytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) {
|
||||||
|
res, err := l.db.Get(l.keys.RawRecordKey(id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if res == nil {
|
||||||
|
err = storage.ErrUnknownRecord
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
raw = &aclrecordproto.RawACLRecordWithId{
|
||||||
|
Payload: res,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) SetHead(headId string) (err error) {
|
||||||
|
return l.db.Put(l.keys.HeadIdKey(), []byte(headId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error {
|
||||||
|
return l.db.Put(l.keys.RawRecordKey(rec.Id), rec.Payload)
|
||||||
|
}
|
||||||
169
node/storage/spacestorage.go
Normal file
169
node/storage/spacestorage.go
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/akrylysov/pogreb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
|
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"path"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defPogrebOptions = &pogreb.Options{
|
||||||
|
BackgroundCompactionInterval: time.Minute * 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
type spaceStorage struct {
|
||||||
|
spaceId string
|
||||||
|
objDb *pogreb.DB
|
||||||
|
keys spaceKeys
|
||||||
|
aclStorage storage.ListStorage
|
||||||
|
header *spacesyncproto.RawSpaceHeaderWithId
|
||||||
|
mx sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) {
|
||||||
|
dbPath := path.Join(rootPath, spaceId)
|
||||||
|
objDb, err := pogreb.Open(dbPath, defPogrebOptions)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
objDb.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
keys := newSpaceKeys(spaceId)
|
||||||
|
has, err := objDb.Has(keys.SpaceIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !has {
|
||||||
|
err = spacestorage.ErrSpaceStorageMissing
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
header, err := objDb.Get(keys.HeaderKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if header == nil {
|
||||||
|
err = spacestorage.ErrSpaceStorageMissing
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
aclStorage, err := newListStorage(objDb)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
store = &spaceStorage{
|
||||||
|
spaceId: spaceId,
|
||||||
|
objDb: objDb,
|
||||||
|
keys: keys,
|
||||||
|
header: &spacesyncproto.RawSpaceHeaderWithId{
|
||||||
|
RawHeader: header,
|
||||||
|
Id: spaceId,
|
||||||
|
},
|
||||||
|
aclStorage: aclStorage,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) {
|
||||||
|
dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id)
|
||||||
|
db, err := pogreb.Open(dbPath, defPogrebOptions)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
db.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
keys := newSpaceKeys(payload.SpaceHeaderWithId.Id)
|
||||||
|
has, err := db.Has(keys.SpaceIdKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if has {
|
||||||
|
err = spacesyncproto.ErrSpaceExists
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
aclStorage, err := createListStorage(db, payload.RecWithId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.SpaceIdKey(), []byte(payload.SpaceHeaderWithId.Id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
store = &spaceStorage{
|
||||||
|
spaceId: payload.SpaceHeaderWithId.Id,
|
||||||
|
objDb: db,
|
||||||
|
keys: keys,
|
||||||
|
aclStorage: aclStorage,
|
||||||
|
header: payload.SpaceHeaderWithId,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) ID() (string, error) {
|
||||||
|
return s.spaceId, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) {
|
||||||
|
return newTreeStorage(s.objDb, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) {
|
||||||
|
// we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation
|
||||||
|
s.mx.Lock()
|
||||||
|
defer s.mx.Unlock()
|
||||||
|
|
||||||
|
return createTreeStorage(s.objDb, payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) {
|
||||||
|
return s.aclStorage, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) {
|
||||||
|
return s.header, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) StoredIds() (ids []string, err error) {
|
||||||
|
index := s.objDb.Items()
|
||||||
|
|
||||||
|
key, val, err := index.Next()
|
||||||
|
for err == nil {
|
||||||
|
strKey := string(key)
|
||||||
|
if isRootIdKey(strKey) {
|
||||||
|
ids = append(ids, string(val))
|
||||||
|
}
|
||||||
|
key, val, err = index.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != pogreb.ErrIterationDone {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *spaceStorage) Close() (err error) {
|
||||||
|
return s.objDb.Close()
|
||||||
|
}
|
||||||
33
node/storage/storageservice.go
Normal file
33
node/storage/storageservice.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type storageService struct {
|
||||||
|
rootPath string
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() storage.SpaceStorageProvider {
|
||||||
|
return &storageService{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) Init(a *app.App) (err error) {
|
||||||
|
cfg := a.MustComponent(config.CName).(*config.Config)
|
||||||
|
s.rootPath = cfg.Storage.Path
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) Name() (name string) {
|
||||||
|
return storage.CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) {
|
||||||
|
return newSpaceStorage(s.rootPath, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) {
|
||||||
|
return createSpaceStorage(s.rootPath, payload)
|
||||||
|
}
|
||||||
137
node/storage/treestorage.go
Normal file
137
node/storage/treestorage.go
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/akrylysov/pogreb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto"
|
||||||
|
)
|
||||||
|
|
||||||
|
type treeStorage struct {
|
||||||
|
db *pogreb.DB
|
||||||
|
keys treeKeys
|
||||||
|
id string
|
||||||
|
root *treechangeproto.RawTreeChangeWithId
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) {
|
||||||
|
keys := newTreeKeys(treeId)
|
||||||
|
heads, err := db.Get(keys.HeadsKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if heads == nil {
|
||||||
|
err = storage.ErrUnknownTreeId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
root, err := db.Get(keys.RawChangeKey(treeId))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if root == nil {
|
||||||
|
err = storage.ErrUnknownTreeId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rootWithId := &treechangeproto.RawTreeChangeWithId{
|
||||||
|
RawChange: root,
|
||||||
|
Id: treeId,
|
||||||
|
}
|
||||||
|
ts = &treeStorage{
|
||||||
|
db: db,
|
||||||
|
keys: keys,
|
||||||
|
id: treeId,
|
||||||
|
root: rootWithId,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) {
|
||||||
|
keys := newTreeKeys(payload.TreeId)
|
||||||
|
has, err := db.Has(keys.HeadsKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if has {
|
||||||
|
err = storage.ErrTreeExists
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
heads := storage.CreateHeadsPayload(payload.Heads)
|
||||||
|
|
||||||
|
for _, ch := range payload.Changes {
|
||||||
|
err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.Put(keys.HeadsKey(), heads)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ts = &treeStorage{
|
||||||
|
db: db,
|
||||||
|
keys: keys,
|
||||||
|
id: payload.RootRawChange.Id,
|
||||||
|
root: payload.RootRawChange,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) ID() (string, error) {
|
||||||
|
return t.id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) {
|
||||||
|
return t.root, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) Heads() (heads []string, err error) {
|
||||||
|
headsBytes, err := t.db.Get(t.keys.HeadsKey())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if heads == nil {
|
||||||
|
err = storage.ErrUnknownTreeId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
heads = storage.ParseHeads(headsBytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) SetHeads(heads []string) (err error) {
|
||||||
|
payload := storage.CreateHeadsPayload(heads)
|
||||||
|
return t.db.Put(t.keys.HeadsKey(), payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) {
|
||||||
|
return t.db.Put(t.keys.RawChangeKey(change.Id), change.RawChange)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) {
|
||||||
|
res, err := t.db.Get(t.keys.RawChangeKey(id))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if res == nil {
|
||||||
|
err = storage.ErrUnkownChange
|
||||||
|
}
|
||||||
|
|
||||||
|
raw = &treechangeproto.RawTreeChangeWithId{
|
||||||
|
RawChange: res,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) {
|
||||||
|
return t.db.Has(t.keys.RawChangeKey(id))
|
||||||
|
}
|
||||||
@ -324,7 +324,6 @@ func (m *ACLRoot) GetTimestamp() int64 {
|
|||||||
|
|
||||||
type ACLContentValue struct {
|
type ACLContentValue struct {
|
||||||
// Types that are valid to be assigned to Value:
|
// Types that are valid to be assigned to Value:
|
||||||
//
|
|
||||||
// *ACLContentValue_UserAdd
|
// *ACLContentValue_UserAdd
|
||||||
// *ACLContentValue_UserRemove
|
// *ACLContentValue_UserRemove
|
||||||
// *ACLContentValue_UserPermissionChange
|
// *ACLContentValue_UserPermissionChange
|
||||||
|
|||||||
@ -63,6 +63,15 @@ message ACLUserAdd {
|
|||||||
ACLUserPermissions permissions = 4;
|
ACLUserPermissions permissions = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// signing accept key
|
||||||
|
// rsa encryption key -> read keys
|
||||||
|
|
||||||
|
// accept key, encrypt key, invite id
|
||||||
|
// GetSpace(id) -> ... (space header + acl root) -> diff
|
||||||
|
// Join(ACLJoinRecord) -> Ok
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
message ACLUserInvite {
|
message ACLUserInvite {
|
||||||
bytes acceptPublicKey = 1;
|
bytes acceptPublicKey = 1;
|
||||||
bytes encryptPublicKey = 2;
|
bytes encryptPublicKey = 2;
|
||||||
|
|||||||
@ -67,6 +67,7 @@ func BuildACLList(storage storage.ListStorage) (ACLList, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) {
|
func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) {
|
||||||
|
// TODO: need to add context here
|
||||||
rootWithId, err := storage.Root()
|
rootWithId, err := storage.Root()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -76,7 +77,12 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rawRecordWithId, err := storage.Head()
|
head, err := storage.Head()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rawRecordWithId, err := storage.GetRawRecord(context.Background(), head)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
34
pkg/acl/storage/helpers.go
Normal file
34
pkg/acl/storage/helpers.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ParseHeads(headsPayload []byte) []string {
|
||||||
|
return strings.Split(string(headsPayload), "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateHeadsPayload(heads []string) []byte {
|
||||||
|
return JoinStringsToBytes(heads...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func JoinStringsToBytes(strs ...string) []byte {
|
||||||
|
var (
|
||||||
|
b bytes.Buffer
|
||||||
|
totalLen int
|
||||||
|
)
|
||||||
|
for _, s := range strs {
|
||||||
|
totalLen += len(s)
|
||||||
|
}
|
||||||
|
// adding separators
|
||||||
|
totalLen += len(strs) - 1
|
||||||
|
b.Grow(totalLen)
|
||||||
|
for idx, s := range strs {
|
||||||
|
if idx > 0 {
|
||||||
|
b.WriteString("/")
|
||||||
|
}
|
||||||
|
b.WriteString(s)
|
||||||
|
}
|
||||||
|
return b.Bytes()
|
||||||
|
}
|
||||||
@ -31,10 +31,14 @@ func (i *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, err
|
|||||||
return i.records[0], nil
|
return i.records[0], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *inMemoryACLListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) {
|
func (i *inMemoryACLListStorage) SetHead(headId string) error {
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *inMemoryACLListStorage) Head() (string, error) {
|
||||||
i.RLock()
|
i.RLock()
|
||||||
defer i.RUnlock()
|
defer i.RUnlock()
|
||||||
return i.records[len(i.records)-1], nil
|
return i.records[len(i.records)-1].Id, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) {
|
func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
|||||||
@ -3,13 +3,19 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrUnknownACLId = errors.New("acl does not exist")
|
||||||
|
var ErrACLExists = errors.New("acl already exists")
|
||||||
|
var ErrUnknownRecord = errors.New("record doesn't exist")
|
||||||
|
|
||||||
type ListStorage interface {
|
type ListStorage interface {
|
||||||
Storage
|
Storage
|
||||||
Root() (*aclrecordproto.RawACLRecordWithId, error)
|
Root() (*aclrecordproto.RawACLRecordWithId, error)
|
||||||
Head() (*aclrecordproto.RawACLRecordWithId, error)
|
Head() (string, error)
|
||||||
|
SetHead(headId string) error
|
||||||
|
|
||||||
GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error)
|
GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error)
|
||||||
AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error
|
AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error
|
||||||
|
|||||||
@ -66,10 +66,10 @@ func (mr *MockListStorageMockRecorder) GetRawRecord(arg0, arg1 interface{}) *gom
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Head mocks base method.
|
// Head mocks base method.
|
||||||
func (m *MockListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) {
|
func (m *MockListStorage) Head() (string, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Head")
|
ret := m.ctrl.Call(m, "Head")
|
||||||
ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId)
|
ret0, _ := ret[0].(string)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@ -110,6 +110,20 @@ func (mr *MockListStorageMockRecorder) Root() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetHead mocks base method.
|
||||||
|
func (m *MockListStorage) SetHead(arg0 string) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "SetHead", arg0)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHead indicates an expected call of SetHead.
|
||||||
|
func (mr *MockListStorageMockRecorder) SetHead(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHead", reflect.TypeOf((*MockListStorage)(nil).SetHead), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// MockTreeStorage is a mock of TreeStorage interface.
|
// MockTreeStorage is a mock of TreeStorage interface.
|
||||||
type MockTreeStorage struct {
|
type MockTreeStorage struct {
|
||||||
ctrl *gomock.Controller
|
ctrl *gomock.Controller
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var ErrUnknownTreeId = errors.New("tree does not exist")
|
var ErrUnknownTreeId = errors.New("tree does not exist")
|
||||||
|
var ErrTreeExists = errors.New("tree already exists")
|
||||||
|
var ErrUnkownChange = errors.New("change doesn't exist")
|
||||||
|
|
||||||
type TreeStorageCreatePayload struct {
|
type TreeStorageCreatePayload struct {
|
||||||
TreeId string
|
TreeId string
|
||||||
|
|||||||
@ -89,12 +89,16 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Head() (*aclrecordproto.RawACLRecordWithId, error) {
|
func (t *ACLListStorageBuilder) Head() (string, error) {
|
||||||
l := len(t.records)
|
l := len(t.records)
|
||||||
if l > 0 {
|
if l > 0 {
|
||||||
return t.rawRecords[l-1], nil
|
return t.rawRecords[l-1].Id, nil
|
||||||
}
|
}
|
||||||
return t.rawRoot, nil
|
return t.rawRoot.Id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ACLListStorageBuilder) SetHead(headId string) error {
|
||||||
|
panic("SetHead is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
|||||||
@ -60,7 +60,6 @@ var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo
|
|||||||
|
|
||||||
type PlainTextChange_Content struct {
|
type PlainTextChange_Content struct {
|
||||||
// Types that are valid to be assigned to Value:
|
// Types that are valid to be assigned to Value:
|
||||||
//
|
|
||||||
// *PlainTextChange_Content_TextAppend
|
// *PlainTextChange_Content_TextAppend
|
||||||
Value isPlainTextChange_Content_Value `protobuf_oneof:"value"`
|
Value isPlainTextChange_Content_Value `protobuf_oneof:"value"`
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,9 +85,11 @@ type entry struct {
|
|||||||
id string
|
id string
|
||||||
lastUsage time.Time
|
lastUsage time.Time
|
||||||
refCount uint32
|
refCount uint32
|
||||||
|
isClosing bool
|
||||||
load chan struct{}
|
load chan struct{}
|
||||||
loadErr error
|
loadErr error
|
||||||
value Object
|
value Object
|
||||||
|
close chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *entry) locked() bool {
|
func (e *entry) locked() bool {
|
||||||
@ -148,6 +150,7 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) {
|
|||||||
ok bool
|
ok bool
|
||||||
load bool
|
load bool
|
||||||
)
|
)
|
||||||
|
Load:
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
if c.closed {
|
if c.closed {
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
@ -161,11 +164,18 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) {
|
|||||||
}
|
}
|
||||||
c.data[id] = e
|
c.data[id] = e
|
||||||
}
|
}
|
||||||
e.lastUsage = c.timeNow()
|
closing := e.isClosing
|
||||||
if !c.noRefCounter {
|
if !e.isClosing {
|
||||||
e.refCount++
|
e.lastUsage = c.timeNow()
|
||||||
|
if !c.noRefCounter {
|
||||||
|
e.refCount++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
if closing {
|
||||||
|
<-e.close
|
||||||
|
goto Load
|
||||||
|
}
|
||||||
|
|
||||||
if load {
|
if load {
|
||||||
go c.load(ctx, id, e)
|
go c.load(ctx, id, e)
|
||||||
@ -188,20 +198,22 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) {
|
|||||||
func (c *oCache) Pick(ctx context.Context, id string) (value Object, err error) {
|
func (c *oCache) Pick(ctx context.Context, id string) (value Object, err error) {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
val, ok := c.data[id]
|
val, ok := c.data[id]
|
||||||
c.mu.Unlock()
|
if !ok || val.isClosing {
|
||||||
if !ok {
|
c.mu.Unlock()
|
||||||
return nil, ErrNotExists
|
return nil, ErrNotExists
|
||||||
}
|
}
|
||||||
|
c.mu.Unlock()
|
||||||
|
|
||||||
if c.metrics != nil {
|
if c.metrics != nil {
|
||||||
c.metrics.hit.Inc()
|
c.metrics.hit.Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return nil, ctx.Err()
|
return nil, ctx.Err()
|
||||||
case <-val.load:
|
case <-val.load:
|
||||||
|
return val.value, val.loadErr
|
||||||
}
|
}
|
||||||
<-val.load
|
|
||||||
return val.value, val.loadErr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *oCache) load(ctx context.Context, id string, e *entry) {
|
func (c *oCache) load(ctx context.Context, id string, e *entry) {
|
||||||
@ -248,17 +260,30 @@ func (c *oCache) Reset(id string) bool {
|
|||||||
|
|
||||||
func (c *oCache) Remove(id string) (ok bool, err error) {
|
func (c *oCache) Remove(id string) (ok bool, err error) {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
e, ok := c.data[id]
|
if c.closed {
|
||||||
if ok {
|
c.mu.Unlock()
|
||||||
delete(c.data, id)
|
err = ErrClosed
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
var e *entry
|
||||||
|
e, ok = c.data[id]
|
||||||
|
if !ok || e.isClosing {
|
||||||
|
c.mu.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e.isClosing = true
|
||||||
|
e.close = make(chan struct{})
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
if ok {
|
|
||||||
<-e.load
|
<-e.load
|
||||||
if e.value != nil {
|
if e.value != nil {
|
||||||
err = e.value.Close()
|
err = e.value.Close()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
c.mu.Lock()
|
||||||
|
close(e.close)
|
||||||
|
delete(c.data, e.id)
|
||||||
|
c.mu.Unlock()
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +323,7 @@ func (c *oCache) ForEach(f func(obj Object) (isContinue bool)) {
|
|||||||
for _, v := range c.data {
|
for _, v := range c.data {
|
||||||
select {
|
select {
|
||||||
case <-v.load:
|
case <-v.load:
|
||||||
if v.value != nil {
|
if v.value != nil && !v.isClosing {
|
||||||
objects = append(objects, v.value)
|
objects = append(objects, v.value)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -333,19 +358,23 @@ func (c *oCache) GC() {
|
|||||||
}
|
}
|
||||||
deadline := c.timeNow().Add(-c.ttl)
|
deadline := c.timeNow().Add(-c.ttl)
|
||||||
var toClose []*entry
|
var toClose []*entry
|
||||||
for k, e := range c.data {
|
for _, e := range c.data {
|
||||||
|
if e.isClosing {
|
||||||
|
continue
|
||||||
|
}
|
||||||
lu := e.lastUsage
|
lu := e.lastUsage
|
||||||
if lug, ok := e.value.(ObjectLastUsage); ok {
|
if lug, ok := e.value.(ObjectLastUsage); ok {
|
||||||
lu = lug.LastUsage()
|
lu = lug.LastUsage()
|
||||||
}
|
}
|
||||||
if !e.locked() && e.refCount <= 0 && lu.Before(deadline) {
|
if !e.locked() && e.refCount <= 0 && lu.Before(deadline) {
|
||||||
delete(c.data, k)
|
e.isClosing = true
|
||||||
|
e.close = make(chan struct{})
|
||||||
toClose = append(toClose, e)
|
toClose = append(toClose, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size := len(c.data)
|
size := len(c.data)
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
c.log.Infof("GC: removed %d; cache size: %d", len(toClose), size)
|
|
||||||
for _, e := range toClose {
|
for _, e := range toClose {
|
||||||
<-e.load
|
<-e.load
|
||||||
if e.value != nil {
|
if e.value != nil {
|
||||||
@ -354,9 +383,16 @@ func (c *oCache) GC() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
c.log.Infof("GC: removed %d; cache size: %d", len(toClose), size)
|
||||||
if len(toClose) > 0 && c.metrics != nil {
|
if len(toClose) > 0 && c.metrics != nil {
|
||||||
c.metrics.gc.Add(float64(len(toClose)))
|
c.metrics.gc.Add(float64(len(toClose)))
|
||||||
}
|
}
|
||||||
|
c.mu.Lock()
|
||||||
|
for _, e := range toClose {
|
||||||
|
close(e.close)
|
||||||
|
delete(c.data, e.id)
|
||||||
|
}
|
||||||
|
c.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *oCache) Len() int {
|
func (c *oCache) Len() int {
|
||||||
|
|||||||
@ -14,16 +14,23 @@ import (
|
|||||||
type testObject struct {
|
type testObject struct {
|
||||||
name string
|
name string
|
||||||
closeErr error
|
closeErr error
|
||||||
|
closeCh chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTestObject(name string, closeCh chan struct{}) *testObject {
|
||||||
|
return &testObject{
|
||||||
|
name: name,
|
||||||
|
closeCh: closeCh,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testObject) Close() (err error) {
|
func (t *testObject) Close() (err error) {
|
||||||
|
if t.closeCh != nil {
|
||||||
|
<-t.closeCh
|
||||||
|
}
|
||||||
return t.closeErr
|
return t.closeErr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testObject) ShouldClose() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOCache_Get(t *testing.T) {
|
func TestOCache_Get(t *testing.T) {
|
||||||
t.Run("successful", func(t *testing.T) {
|
t.Run("successful", func(t *testing.T) {
|
||||||
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
||||||
@ -109,20 +116,91 @@ func TestOCache_Get(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestOCache_GC(t *testing.T) {
|
func TestOCache_GC(t *testing.T) {
|
||||||
|
t.Run("test without close wait", func(t *testing.T) {
|
||||||
|
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
||||||
|
return &testObject{name: id}, nil
|
||||||
|
}, WithTTL(time.Millisecond*10))
|
||||||
|
val, err := c.Get(context.TODO(), "id")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, val)
|
||||||
|
assert.Equal(t, 1, c.Len())
|
||||||
|
c.GC()
|
||||||
|
assert.Equal(t, 1, c.Len())
|
||||||
|
time.Sleep(time.Millisecond * 30)
|
||||||
|
c.GC()
|
||||||
|
assert.Equal(t, 1, c.Len())
|
||||||
|
assert.True(t, c.Release("id"))
|
||||||
|
c.GC()
|
||||||
|
assert.Equal(t, 0, c.Len())
|
||||||
|
assert.False(t, c.Release("id"))
|
||||||
|
})
|
||||||
|
t.Run("test with close wait", func(t *testing.T) {
|
||||||
|
closeCh := make(chan struct{})
|
||||||
|
getCh := make(chan struct{})
|
||||||
|
|
||||||
|
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
||||||
|
return NewTestObject(id, closeCh), nil
|
||||||
|
}, WithTTL(time.Millisecond*10))
|
||||||
|
val, err := c.Get(context.TODO(), "id")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, val)
|
||||||
|
assert.Equal(t, 1, c.Len())
|
||||||
|
assert.True(t, c.Release("id"))
|
||||||
|
// making ttl pass
|
||||||
|
time.Sleep(time.Millisecond * 40)
|
||||||
|
// first gc will be run after 20 secs, so calling it manually
|
||||||
|
go c.GC()
|
||||||
|
// waiting until all objects are marked as closing
|
||||||
|
time.Sleep(time.Millisecond * 40)
|
||||||
|
var events []string
|
||||||
|
go func() {
|
||||||
|
_, err := c.Get(context.TODO(), "id")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, val)
|
||||||
|
events = append(events, "get")
|
||||||
|
close(getCh)
|
||||||
|
}()
|
||||||
|
events = append(events, "close")
|
||||||
|
// sleeping to make sure that Get is called
|
||||||
|
time.Sleep(time.Millisecond * 40)
|
||||||
|
close(closeCh)
|
||||||
|
|
||||||
|
<-getCh
|
||||||
|
require.Equal(t, []string{"close", "get"}, events)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_OCache_Remove(t *testing.T) {
|
||||||
|
closeCh := make(chan struct{})
|
||||||
|
getCh := make(chan struct{})
|
||||||
|
|
||||||
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
c := New(func(ctx context.Context, id string) (value Object, err error) {
|
||||||
return &testObject{name: id}, nil
|
return NewTestObject(id, closeCh), nil
|
||||||
}, WithTTL(time.Millisecond*10))
|
}, WithTTL(time.Millisecond*10))
|
||||||
val, err := c.Get(context.TODO(), "id")
|
val, err := c.Get(context.TODO(), "id")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, val)
|
require.NotNil(t, val)
|
||||||
assert.Equal(t, 1, c.Len())
|
assert.Equal(t, 1, c.Len())
|
||||||
c.GC()
|
// removing the object, so we will wait on closing
|
||||||
assert.Equal(t, 1, c.Len())
|
go func() {
|
||||||
time.Sleep(time.Millisecond * 30)
|
_, err := c.Remove("id")
|
||||||
c.GC()
|
require.NoError(t, err)
|
||||||
assert.Equal(t, 1, c.Len())
|
}()
|
||||||
assert.True(t, c.Release("id"))
|
time.Sleep(time.Millisecond * 40)
|
||||||
c.GC()
|
|
||||||
assert.Equal(t, 0, c.Len())
|
var events []string
|
||||||
assert.False(t, c.Release("id"))
|
go func() {
|
||||||
|
_, err := c.Get(context.TODO(), "id")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, val)
|
||||||
|
events = append(events, "get")
|
||||||
|
close(getCh)
|
||||||
|
}()
|
||||||
|
events = append(events, "close")
|
||||||
|
// sleeping to make sure that Get is called
|
||||||
|
time.Sleep(time.Millisecond * 40)
|
||||||
|
close(closeCh)
|
||||||
|
|
||||||
|
<-getCh
|
||||||
|
require.Equal(t, []string{"close", "get"}, events)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user