files: ref, proxyStore, index

This commit is contained in:
Sergey Cherepanov 2022-12-21 21:23:47 +03:00 committed by Mikhail Iudin
parent 185f4aeb59
commit 41e2b26116
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
43 changed files with 2625 additions and 340 deletions

File diff suppressed because it is too large Load Diff

View File

@ -50,6 +50,9 @@ type DRPCClientApiClient interface {
AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error) AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error)
AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error) AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error)
LoadSpace(ctx context.Context, in *LoadSpaceRequest) (*LoadSpaceResponse, error) LoadSpace(ctx context.Context, in *LoadSpaceRequest) (*LoadSpaceResponse, error)
PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error)
GetFile(ctx context.Context, in *GetFileRequest) (*GetFileResponse, error)
DeleteFile(ctx context.Context, in *DeleteFileRequest) (*DeleteFileResponse, error)
} }
type drpcClientApiClient struct { type drpcClientApiClient struct {
@ -152,6 +155,33 @@ func (c *drpcClientApiClient) LoadSpace(ctx context.Context, in *LoadSpaceReques
return out, nil return out, nil
} }
func (c *drpcClientApiClient) PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error) {
out := new(PutFileResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcClientApiClient) GetFile(ctx context.Context, in *GetFileRequest) (*GetFileResponse, error) {
out := new(GetFileResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/GetFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcClientApiClient) DeleteFile(ctx context.Context, in *DeleteFileRequest) (*DeleteFileResponse, error) {
out := new(DeleteFileResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/DeleteFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
type DRPCClientApiServer interface { type DRPCClientApiServer interface {
CreateSpace(context.Context, *CreateSpaceRequest) (*CreateSpaceResponse, error) CreateSpace(context.Context, *CreateSpaceRequest) (*CreateSpaceResponse, error)
DeriveSpace(context.Context, *DeriveSpaceRequest) (*DeriveSpaceResponse, error) DeriveSpace(context.Context, *DeriveSpaceRequest) (*DeriveSpaceResponse, error)
@ -163,6 +193,9 @@ type DRPCClientApiServer interface {
AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error) AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error)
AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error) AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error)
LoadSpace(context.Context, *LoadSpaceRequest) (*LoadSpaceResponse, error) LoadSpace(context.Context, *LoadSpaceRequest) (*LoadSpaceResponse, error)
PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error)
GetFile(context.Context, *GetFileRequest) (*GetFileResponse, error)
DeleteFile(context.Context, *DeleteFileRequest) (*DeleteFileResponse, error)
} }
type DRPCClientApiUnimplementedServer struct{} type DRPCClientApiUnimplementedServer struct{}
@ -207,9 +240,21 @@ func (s *DRPCClientApiUnimplementedServer) LoadSpace(context.Context, *LoadSpace
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
} }
func (s *DRPCClientApiUnimplementedServer) PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCClientApiUnimplementedServer) GetFile(context.Context, *GetFileRequest) (*GetFileResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCClientApiUnimplementedServer) DeleteFile(context.Context, *DeleteFileRequest) (*DeleteFileResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
type DRPCClientApiDescription struct{} type DRPCClientApiDescription struct{}
func (DRPCClientApiDescription) NumMethods() int { return 10 } func (DRPCClientApiDescription) NumMethods() int { return 13 }
func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) {
switch n { switch n {
@ -303,6 +348,33 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
in1.(*LoadSpaceRequest), in1.(*LoadSpaceRequest),
) )
}, DRPCClientApiServer.LoadSpace, true }, DRPCClientApiServer.LoadSpace, true
case 10:
return "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer).
PutFile(
ctx,
in1.(*PutFileRequest),
)
}, DRPCClientApiServer.PutFile, true
case 11:
return "/clientapi.ClientApi/GetFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer).
GetFile(
ctx,
in1.(*GetFileRequest),
)
}, DRPCClientApiServer.GetFile, true
case 12:
return "/clientapi.ClientApi/DeleteFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer).
DeleteFile(
ctx,
in1.(*DeleteFileRequest),
)
}, DRPCClientApiServer.DeleteFile, true
default: default:
return "", nil, nil, nil, false return "", nil, nil, nil, false
} }
@ -471,3 +543,51 @@ func (x *drpcClientApi_LoadSpaceStream) SendAndClose(m *LoadSpaceResponse) error
} }
return x.CloseSend() return x.CloseSend()
} }
type DRPCClientApi_PutFileStream interface {
drpc.Stream
SendAndClose(*PutFileResponse) error
}
type drpcClientApi_PutFileStream struct {
drpc.Stream
}
func (x *drpcClientApi_PutFileStream) SendAndClose(m *PutFileResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCClientApi_GetFileStream interface {
drpc.Stream
SendAndClose(*GetFileResponse) error
}
type drpcClientApi_GetFileStream struct {
drpc.Stream
}
func (x *drpcClientApi_GetFileStream) SendAndClose(m *GetFileResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCClientApi_DeleteFileStream interface {
drpc.Stream
SendAndClose(*DeleteFileResponse) error
}
type drpcClientApi_DeleteFileStream struct {
drpc.Stream
}
func (x *drpcClientApi_DeleteFileStream) SendAndClose(m *DeleteFileResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
return err
}
return x.CloseSend()
}

View File

@ -14,6 +14,9 @@ service ClientApi {
rpc AllTrees(AllTreesRequest) returns(AllTreesResponse); rpc AllTrees(AllTreesRequest) returns(AllTreesResponse);
rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse); rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse);
rpc LoadSpace(LoadSpaceRequest) returns(LoadSpaceResponse); rpc LoadSpace(LoadSpaceRequest) returns(LoadSpaceResponse);
rpc PutFile(PutFileRequest) returns(PutFileResponse);
rpc GetFile(GetFileRequest) returns(GetFileResponse);
rpc DeleteFile(DeleteFileRequest) returns(DeleteFileResponse);
} }
message CreateSpaceRequest { message CreateSpaceRequest {
@ -103,4 +106,28 @@ message TreeParamsRequest {
message TreeParamsResponse { message TreeParamsResponse {
string rootId = 1; string rootId = 1;
repeated string headIds = 2; repeated string headIds = 2;
} }
message PutFileRequest {
string path = 1;
string spaceId = 2;
}
message PutFileResponse {
string hash = 1;
}
message GetFileRequest {
string hash = 1;
string path = 2;
}
message GetFileResponse {
string path = 1;
}
message DeleteFileRequest {
string hash = 1;
}
message DeleteFileResponse {}

View File

@ -7,9 +7,14 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
"github.com/ipfs/go-cid"
"go.uber.org/zap"
"io"
"math/rand" "math/rand"
"os"
) )
type rpcHandler struct { type rpcHandler struct {
@ -17,6 +22,7 @@ type rpcHandler struct {
storageService storage.ClientStorage storageService storage.ClientStorage
docService document.Service docService document.Service
account account.Service account account.Service
file fileservice.FileService
} }
func (r *rpcHandler) LoadSpace(ctx context.Context, request *apiproto.LoadSpaceRequest) (resp *apiproto.LoadSpaceResponse, err error) { func (r *rpcHandler) LoadSpace(ctx context.Context, request *apiproto.LoadSpaceRequest) (resp *apiproto.LoadSpaceResponse, err error) {
@ -144,3 +150,50 @@ func (r *rpcHandler) TreeParams(ctx context.Context, request *apiproto.TreeParam
} }
return return
} }
func (r *rpcHandler) PutFile(ctx context.Context, request *apiproto.PutFileRequest) (*apiproto.PutFileResponse, error) {
f, err := os.Open(request.Path)
if err != nil {
return nil, err
}
defer f.Close()
n, err := r.file.AddFile(ctx, f)
if err != nil {
return nil, err
}
return &apiproto.PutFileResponse{
Hash: n.Cid().String(),
}, nil
}
func (r *rpcHandler) GetFile(ctx context.Context, request *apiproto.GetFileRequest) (*apiproto.GetFileResponse, error) {
c, err := cid.Parse(request.Hash)
if err != nil {
return nil, err
}
f, err := os.Create(request.Path)
if err != nil {
return nil, err
}
defer f.Close()
rd, err := r.file.GetFile(ctx, c)
if err != nil {
return nil, err
}
defer rd.Close()
wr, err := io.Copy(f, rd)
if err != nil && err != io.EOF {
return nil, err
}
log.Info("copied bytes", zap.Int64("size", wr))
return &apiproto.GetFileResponse{
Path: request.Path,
}, nil
}
func (r *rpcHandler) DeleteFile(ctx context.Context, request *apiproto.DeleteFileRequest) (*apiproto.DeleteFileResponse, error) {
//TODO implement me
panic("implement me")
}

View File

@ -9,6 +9,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
@ -36,6 +37,7 @@ type service struct {
storageService clientstorage.ClientStorage storageService clientstorage.ClientStorage
docService document.Service docService document.Service
account account.Service account account.Service
file fileservice.FileService
*server.BaseDrpcServer *server.BaseDrpcServer
} }
@ -46,6 +48,7 @@ func (s *service) Init(a *app.App) (err error) {
s.account = a.MustComponent(account.CName).(account.Service) s.account = a.MustComponent(account.CName).(account.Service)
s.cfg = a.MustComponent(config.CName).(*config.Config) s.cfg = a.MustComponent(config.CName).(*config.Config)
s.transport = a.MustComponent(secure.CName).(secure.Service) s.transport = a.MustComponent(secure.CName).(secure.Service)
s.file = a.MustComponent(fileservice.CName).(fileservice.FileService)
return nil return nil
} }
@ -64,7 +67,7 @@ func (s *service) Run(ctx context.Context) (err error) {
if err != nil { if err != nil {
return return
} }
return apiproto.DRPCRegisterClientApi(s, &rpcHandler{s.spaceService, s.storageService, s.docService, s.account}) return apiproto.DRPCRegisterClientApi(s, &rpcHandler{s.spaceService, s.storageService, s.docService, s.account, s.file})
} }
func (s *service) Close(ctx context.Context) (err error) { func (s *service) Close(ctx context.Context) (err error) {

View File

@ -11,10 +11,11 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/rpcstore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/rpcstore" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric"
@ -111,6 +112,7 @@ func Bootstrap(a *app.App) {
Register(server.New()). Register(server.New()).
Register(document.New()). Register(document.New()).
Register(rpcstore.New()). Register(rpcstore.New()).
Register(fileservice.New()).
Register(filestorage.New()). Register(filestorage.New()).
Register(api.New()) Register(api.New())
} }

View File

@ -0,0 +1,255 @@
package badgerfilestore
import (
"bytes"
"errors"
"github.com/dgraph-io/badger/v3"
"github.com/ipfs/go-cid"
"sync"
"time"
)
const keyIndexPrefix = "files/indexes/"
type Op string
const (
OpAdd Op = "add"
OpDelete Op = "del"
OpLoad Op = "load"
)
func NewFileBadgerIndex(db *badger.DB) *FileBadgerIndex {
return &FileBadgerIndex{
db: db,
workCh: make(chan struct{}, 1),
}
}
var cidsPool = &sync.Pool{
New: func() any {
return &Cids{}
},
}
type FileBadgerIndex struct {
db *badger.DB
workCh chan struct{}
}
func (i *FileBadgerIndex) Add(cids *Cids) error {
addTimeBin, _ := time.Now().MarshalBinary()
defer i.pingWorkCh()
return i.db.Update(func(txn *badger.Txn) error {
keys := cids.Keys()
for _, k := range keys {
if err := txn.Set(k, addTimeBin); err != nil {
return err
}
}
return nil
})
}
func (i *FileBadgerIndex) Done(cids *Cids) (err error) {
if len(cids.SpaceOps) == 0 {
return nil
}
return i.db.Update(func(txn *badger.Txn) error {
keys := cids.Keys()
for _, k := range keys {
if err := txn.Delete(k); err != nil {
return err
}
}
return nil
})
}
func (i *FileBadgerIndex) List(limit int) (cids *Cids, err error) {
cids = NewCids()
err = i.db.View(func(txn *badger.Txn) error {
it := txn.NewIterator(badger.IteratorOptions{
PrefetchSize: limit,
PrefetchValues: false,
Prefix: []byte(keyIndexPrefix),
})
defer it.Close()
var l int
for it.Rewind(); it.Valid(); it.Next() {
e := cids.AddKey(it.Item().Key())
if e == nil {
l++
if l == limit {
return nil
}
}
}
return nil
})
return
}
func (i *FileBadgerIndex) Len() (l int, err error) {
err = i.db.View(func(txn *badger.Txn) error {
it := txn.NewIterator(badger.IteratorOptions{
PrefetchSize: 100,
PrefetchValues: false,
Prefix: []byte(keyIndexPrefix),
})
defer it.Close()
var l int
for it.Rewind(); it.Valid(); it.Next() {
l++
}
return nil
})
return
}
func (i *FileBadgerIndex) pingWorkCh() {
select {
case i.workCh <- struct{}{}:
default:
}
}
func (i *FileBadgerIndex) HasWorkCh() chan struct{} {
l, err := i.Len()
if err != nil {
return i.workCh
}
if l > 0 {
i.pingWorkCh()
}
return i.workCh
}
var errInvalidKey = errors.New("invalid key")
var sep = []byte("/")
func parseCIDOp(key []byte) (spaceId string, op Op, k cid.Cid, err error) {
if len(key) <= len(keyIndexPrefix) {
err = errInvalidKey
return
}
key = key[len(keyIndexPrefix):]
fi := bytes.Index(key, sep)
if fi < 0 {
err = errInvalidKey
return
}
spaceId = string(key[:fi])
key = key[fi+1:]
fi = bytes.Index(key, sep)
if fi < 0 {
err = errInvalidKey
return
}
op = Op(key[:fi])
k, err = cid.Cast(key[fi+1:])
return
}
func NewCids() *Cids {
return cidsPool.Get().(*Cids)
}
type SpaceCidOps struct {
SpaceId string
Add []cid.Cid
Delete []cid.Cid
Load []cid.Cid
}
type Cids struct {
SpaceOps []SpaceCidOps
keysBuf [][]byte
}
func (c *Cids) Add(spaceId string, op Op, k cid.Cid) {
var spaceIndex = -1
for i, so := range c.SpaceOps {
if so.SpaceId == spaceId {
spaceIndex = i
break
}
}
if spaceIndex == -1 {
spaceIndex = len(c.SpaceOps)
if len(c.SpaceOps) < cap(c.SpaceOps) {
c.SpaceOps = c.SpaceOps[0 : len(c.SpaceOps)+1]
c.SpaceOps[spaceIndex].SpaceId = spaceId
} else {
c.SpaceOps = append(c.SpaceOps, SpaceCidOps{SpaceId: spaceId})
}
}
switch op {
case OpAdd:
c.SpaceOps[spaceIndex].Add = append(c.SpaceOps[spaceIndex].Add, k)
case OpDelete:
c.SpaceOps[spaceIndex].Delete = append(c.SpaceOps[spaceIndex].Delete, k)
case OpLoad:
c.SpaceOps[spaceIndex].Load = append(c.SpaceOps[spaceIndex].Load, k)
}
}
func (c *Cids) Keys() [][]byte {
addKey := func(spaceId string, k cid.Cid, op Op) {
if len(c.keysBuf) < cap(c.keysBuf) {
c.keysBuf = c.keysBuf[:len(c.keysBuf)+1]
} else {
c.keysBuf = append(c.keysBuf, nil)
}
ki := len(c.keysBuf) - 1
buf := bytes.NewBuffer(c.keysBuf[ki][:0])
buf.WriteString(keyIndexPrefix)
buf.WriteString(spaceId)
buf.WriteString("/")
buf.WriteString(string(op))
buf.WriteString("/")
buf.WriteString(k.KeyString())
c.keysBuf[ki] = buf.Bytes()
}
for _, sop := range c.SpaceOps {
for _, k := range sop.Add {
addKey(sop.SpaceId, k, OpAdd)
}
for _, k := range sop.Delete {
addKey(sop.SpaceId, k, OpDelete)
}
for _, k := range sop.Load {
addKey(sop.SpaceId, k, OpLoad)
}
}
return c.keysBuf
}
func (c *Cids) AddKey(key []byte) error {
spaceId, op, k, err := parseCIDOp(key)
if err != nil {
return err
}
c.Add(spaceId, op, k)
return nil
}
func (c *Cids) Len() (l int) {
for _, so := range c.SpaceOps {
l += len(so.Load)
l += len(so.Delete)
l += len(so.Add)
}
return
}
func (c *Cids) Release() {
c.keysBuf = c.keysBuf[:0]
for i, sop := range c.SpaceOps {
c.SpaceOps[i].Add = sop.Add[:0]
c.SpaceOps[i].Delete = sop.Delete[:0]
c.SpaceOps[i].Load = sop.Load[:0]
}
c.SpaceOps = c.SpaceOps[:0]
cidsPool.Put(c)
}

View File

@ -0,0 +1,104 @@
package badgerfilestore
import (
"bytes"
"fmt"
"github.com/dgraph-io/badger/v3"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"os"
"testing"
)
func TestFileBadgerIndex_Add(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "badgerfileindextest_*")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
db, err := badger.Open(badger.DefaultOptions(tmpDir))
require.NoError(t, err)
defer db.Close()
index := NewFileBadgerIndex(db)
var cids = NewCids()
defer cids.Release()
for _, spaceId := range []string{"space1", "space2"} {
for i := 0; i < 5; i++ {
cids.Add(spaceId, OpAdd, blocks.NewBlock([]byte(fmt.Sprint("add", i))).Cid())
}
for i := 0; i < 3; i++ {
cids.Add(spaceId, OpDelete, blocks.NewBlock([]byte(fmt.Sprint("del", i))).Cid())
}
for i := 0; i < 2; i++ {
cids.Add(spaceId, OpLoad, blocks.NewBlock([]byte(fmt.Sprint("load", i))).Cid())
}
}
require.NoError(t, index.Add(cids))
cids, err = index.List(100)
require.NoError(t, err)
assert.Len(t, cids.SpaceOps, 2)
for _, s := range cids.SpaceOps {
assert.Len(t, s.Add, 5)
assert.Len(t, s.Delete, 3)
assert.Len(t, s.Load, 2)
}
}
func TestCids_Add(t *testing.T) {
for i := 0; i < 3; i++ {
var bs = []blocks.Block{
blocks.NewBlock([]byte("1")),
blocks.NewBlock([]byte("2")),
blocks.NewBlock([]byte("3")),
blocks.NewBlock([]byte("4")),
blocks.NewBlock([]byte("5")),
}
cids := NewCids()
for _, b := range bs {
cids.Add("1", OpAdd, b.Cid())
}
keys := cids.Keys()
contains := func(c cid.Cid) bool {
for _, k := range keys {
if bytes.HasSuffix(k, c.Bytes()) {
return true
}
}
return false
}
for _, b := range bs {
assert.True(t, contains(b.Cid()))
}
kcids := NewCids()
for _, k := range keys {
require.NoError(t, kcids.AddKey(k))
}
require.Len(t, kcids.SpaceOps, 1)
assert.Equal(t, kcids.SpaceOps[0].Add, cids.SpaceOps[0].Add)
cids.Release()
kcids.Release()
}
}
func BenchmarkCids_Add(b *testing.B) {
var bs = []blocks.Block{
blocks.NewBlock([]byte("1")),
blocks.NewBlock([]byte("2")),
blocks.NewBlock([]byte("3")),
blocks.NewBlock([]byte("4")),
blocks.NewBlock([]byte("5")),
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
cids := NewCids()
for _, b := range bs {
cids.Add("1", OpAdd, b.Cid())
}
cids.Keys()
cids.Release()
}
}

View File

@ -1,4 +1,4 @@
package filebadgerstore package badgerfilestore
import ( import (
"context" "context"
@ -6,11 +6,12 @@ import (
"github.com/dgraph-io/badger/v3" "github.com/dgraph-io/badger/v3"
blocks "github.com/ipfs/go-block-format" blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format"
) )
const keyPrefix = "files/blocks/" const keyPrefix = "files/blocks/"
func NewBadgerStorage(db *badger.DB) fileblockstore.BlockStoreExistsCIDs { func NewBadgerStorage(db *badger.DB) fileblockstore.BlockStoreLocal {
return &badgerStorage{db: db} return &badgerStorage{db: db}
} }
@ -19,16 +20,19 @@ type badgerStorage struct {
} }
func (f *badgerStorage) Get(ctx context.Context, k cid.Cid) (b blocks.Block, err error) { func (f *badgerStorage) Get(ctx context.Context, k cid.Cid) (b blocks.Block, err error) {
err = f.db.View(func(txn *badger.Txn) error { err = f.db.View(func(txn *badger.Txn) (e error) {
it, gerr := txn.Get(key(k)) it, e := txn.Get(key(k))
if gerr != nil { if e != nil {
return gerr return e
} }
return it.Value(func(val []byte) error { if b, e = blockFromItem(it); e != nil {
b = blocks.NewBlock(val) return e
return nil }
}) return
}) })
if err == badger.ErrKeyNotFound {
err = &format.ErrNotFound{Cid: k}
}
return return
} }
@ -43,10 +47,11 @@ func (f *badgerStorage) GetMany(ctx context.Context, ks []cid.Cid) <-chan blocks
if gerr != nil { if gerr != nil {
return gerr return gerr
} }
_ = it.Value(func(val []byte) error { b, berr := blockFromItem(it)
res <- blocks.NewBlock(val) if berr != nil {
return nil return berr
}) }
res <- b
} }
return nil return nil
}) })
@ -86,3 +91,26 @@ func (f *badgerStorage) ExistsCids(ctx context.Context, ks []cid.Cid) (exists []
func key(c cid.Cid) []byte { func key(c cid.Cid) []byte {
return []byte(keyPrefix + c.String()) return []byte(keyPrefix + c.String())
} }
func parseCID(key []byte) (cid.Cid, error) {
if len(key) <= len(keyPrefix) {
return cid.Cid{}, errInvalidKey
}
return cid.Decode(string(key[len(keyPrefix):]))
}
func blockFromItem(it *badger.Item) (b blocks.Block, err error) {
c, err := parseCID(it.Key())
if err != nil {
return nil, err
}
if err = it.Value(func(val []byte) error {
if b, err = blocks.NewBlockWithCid(val, c); err != nil {
return err
}
return nil
}); err != nil {
return
}
return
}

View File

@ -0,0 +1,101 @@
package badgerfilestore
import (
"context"
"github.com/dgraph-io/badger/v3"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"os"
"testing"
"time"
)
var ctx = context.Background()
func TestBadgerStorage_Add(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "badgerfilestore_*")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
db, err := badger.Open(badger.DefaultOptions(tmpDir))
require.NoError(t, err)
defer db.Close()
s := NewBadgerStorage(db)
bs := []blocks.Block{
blocks.NewBlock([]byte("1")),
blocks.NewBlock([]byte("2")),
blocks.NewBlock([]byte("3")),
}
assert.NoError(t, s.Add(ctx, bs))
}
func TestBadgerStorage_Get(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "badgerfilestore_*")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
db, err := badger.Open(badger.DefaultOptions(tmpDir))
require.NoError(t, err)
defer db.Close()
s := NewBadgerStorage(db)
bs := []blocks.Block{
blocks.NewBlock([]byte("1")),
blocks.NewBlock([]byte("2")),
blocks.NewBlock([]byte("3")),
}
require.NoError(t, s.Add(ctx, bs))
cids := make([]cid.Cid, 0, len(bs))
for _, b := range bs {
cids = append(cids, b.Cid())
}
cids = append(cids, blocks.NewBlock([]byte("4")).Cid())
b, err := s.Get(ctx, bs[0].Cid())
require.NoError(t, err)
assert.Equal(t, bs[0].RawData(), b.RawData())
ecids, err := s.ExistsCids(ctx, cids)
require.NoError(t, err)
assert.Len(t, ecids, 3)
}
func TestBadgerStorage_GetMany(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "badgerfilestore_*")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
db, err := badger.Open(badger.DefaultOptions(tmpDir))
require.NoError(t, err)
defer db.Close()
s := NewBadgerStorage(db)
bs := []blocks.Block{
blocks.NewBlock([]byte("1")),
blocks.NewBlock([]byte("2")),
blocks.NewBlock([]byte("3")),
}
require.NoError(t, s.Add(ctx, bs))
cids := make([]cid.Cid, 0, len(bs))
for _, b := range bs {
cids = append(cids, b.Cid())
}
res := s.GetMany(ctx, cids)
var resB []blocks.Block
for i := 0; i < len(bs); i++ {
select {
case b := <-res:
resB = append(resB, b)
case <-time.After(time.Second):
t.Error("timeout")
return
}
}
assert.Len(t, resB, 3)
_, ok := <-res
assert.False(t, ok)
}

View File

@ -3,16 +3,18 @@ package filestorage
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/filebadgerstore" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/badgerfilestore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/rpcstore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore/cachestore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/rpcstore"
"io" "io"
) )
const CName = fileblockstore.CName const CName = fileblockstore.CName
var log = logger.NewNamed(CName)
func New() FileStorage { func New() FileStorage {
return &fileStorage{} return &fileStorage{}
} }
@ -24,15 +26,20 @@ type FileStorage interface {
type fileStorage struct { type fileStorage struct {
fileblockstore.BlockStore fileblockstore.BlockStore
syncer *syncer
syncerCancel context.CancelFunc
} }
func (f *fileStorage) Init(a *app.App) (err error) { func (f *fileStorage) Init(a *app.App) (err error) {
db := a.MustComponent(badgerprovider.CName).(badgerprovider.BadgerProvider).Badger() db := a.MustComponent(badgerprovider.CName).(badgerprovider.BadgerProvider).Badger()
bs := filebadgerstore.NewBadgerStorage(db) bs := badgerfilestore.NewBadgerStorage(db)
f.BlockStore = &cachestore.CacheStore{ ps := &proxyStore{
Cache: bs, cache: bs,
Origin: a.MustComponent(rpcstore.CName).(rpcstore.Service).NewStore(), origin: a.MustComponent(rpcstore.CName).(rpcstore.Service).NewStore(),
index: badgerfilestore.NewFileBadgerIndex(db),
} }
f.BlockStore = ps
f.syncer = &syncer{ps: ps, done: make(chan struct{})}
return return
} }
@ -41,9 +48,15 @@ func (f *fileStorage) Name() (name string) {
} }
func (f *fileStorage) Run(ctx context.Context) (err error) { func (f *fileStorage) Run(ctx context.Context) (err error) {
ctx, f.syncerCancel = context.WithCancel(ctx)
go f.syncer.run(ctx)
return return
} }
func (f *fileStorage) Close(ctx context.Context) (err error) { func (f *fileStorage) Close(ctx context.Context) (err error) {
if f.syncerCancel != nil {
f.syncerCancel()
<-f.syncer.done
}
return f.BlockStore.(io.Closer).Close() return f.BlockStore.(io.Closer).Close()
} }

View File

@ -0,0 +1,130 @@
package filestorage
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/badgerfilestore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format"
"go.uber.org/zap"
"io"
)
type proxyStore struct {
cache fileblockstore.BlockStoreLocal
origin fileblockstore.BlockStore
index *badgerfilestore.FileBadgerIndex
}
func (c *proxyStore) Get(ctx context.Context, k cid.Cid) (b blocks.Block, err error) {
log.Debug("get cid", zap.String("cid", k.String()))
if b, err = c.cache.Get(ctx, k); err != nil {
if format.IsNotFound(err) {
err = nil
log.Debug("proxyStore local cid not found", zap.String("cid", k.String()))
} else {
return
}
} else {
return
}
if b, err = c.origin.Get(ctx, k); err != nil {
log.Debug("proxyStore remote cid error", zap.String("cid", k.String()), zap.Error(err))
return
}
if addErr := c.cache.Add(ctx, []blocks.Block{b}); addErr != nil {
log.Error("block fetched from origin but got error for add to cache", zap.Error(addErr))
}
return
}
func (c *proxyStore) GetMany(ctx context.Context, ks []cid.Cid) <-chan blocks.Block {
cachedCids, localErr := c.cache.ExistsCids(ctx, ks)
var originCids []cid.Cid
if localErr != nil {
log.Error("proxy store hasCIDs error", zap.Error(localErr))
originCids = ks
} else {
if len(cachedCids) != len(ks) {
set := cid.NewSet()
for _, cCid := range cachedCids {
set.Add(cCid)
}
originCids = ks[:0]
for _, k := range ks {
if !set.Has(k) {
originCids = append(originCids, k)
}
}
}
}
log.Debug("get many cids", zap.Int("cached", len(cachedCids)), zap.Int("origin", len(originCids)))
if len(originCids) == 0 {
return c.cache.GetMany(ctx, cachedCids)
}
var results = make(chan blocks.Block)
go func() {
defer close(results)
localResults := c.cache.GetMany(ctx, cachedCids)
originResults := c.origin.GetMany(ctx, originCids)
oOk, cOk := true, true
for {
var cb, ob blocks.Block
select {
case cb, cOk = <-localResults:
if cOk {
results <- cb
}
case ob, oOk = <-originResults:
if oOk {
if addErr := c.cache.Add(ctx, []blocks.Block{ob}); addErr != nil {
log.Error("add block to cache error", zap.Error(addErr))
}
results <- ob
}
case <-ctx.Done():
return
}
if !oOk && !cOk {
return
}
}
}()
return results
}
func (c *proxyStore) Add(ctx context.Context, bs []blocks.Block) error {
indexCids := badgerfilestore.NewCids()
defer indexCids.Release()
for _, b := range bs {
indexCids.Add(fileblockstore.CtxGetSpaceId(ctx), badgerfilestore.OpAdd, b.Cid())
}
if err := c.index.Add(indexCids); err != nil {
return err
}
return c.cache.Add(ctx, bs)
}
func (c *proxyStore) Delete(ctx context.Context, k cid.Cid) error {
indexCids := badgerfilestore.NewCids()
defer indexCids.Release()
indexCids.Add(fileblockstore.CtxGetSpaceId(ctx), badgerfilestore.OpDelete, k)
if err := c.index.Add(indexCids); err != nil {
return err
}
return c.cache.Delete(ctx, k)
}
func (c *proxyStore) Close() (err error) {
if closer, ok := c.cache.(io.Closer); ok {
if localErr := closer.Close(); localErr != nil {
log.Error("error while closing cache store", zap.Error(localErr))
}
}
if closer, ok := c.origin.(io.Closer); ok {
return closer.Close()
}
return nil
}

View File

@ -1,13 +1,17 @@
package cachestore package filestorage
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/badgerfilestore"
"github.com/dgraph-io/badger/v3"
blocks "github.com/ipfs/go-block-format" blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format" format "github.com/ipfs/go-ipld-format"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"os"
"sync"
"testing" "testing"
"time" "time"
) )
@ -16,29 +20,29 @@ var ctx = context.Background()
func TestCacheStore_Add(t *testing.T) { func TestCacheStore_Add(t *testing.T) {
t.Run("success", func(t *testing.T) { t.Run("success", func(t *testing.T) {
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(nil), defer cs.Finish(t)
Origin: newTestStore(nil),
}
defer cs.Close()
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
require.NoError(t, cs.Add(ctx, testBlocks)) require.NoError(t, cs.Add(ctx, testBlocks))
for _, b := range testBlocks { for _, b := range testBlocks {
gb, err := cs.Cache.Get(ctx, b.Cid()) gb, err := cs.cache.Get(ctx, b.Cid())
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, gb) assert.NotNil(t, gb)
} }
cids, err := cs.index.List(100)
require.NoError(t, err)
require.Len(t, cids.SpaceOps, 1)
assert.Len(t, cids.SpaceOps[0].Add, len(testBlocks))
}) })
} }
func TestCacheStore_Get(t *testing.T) { func TestCacheStore_Get(t *testing.T) {
t.Run("exists local", func(t *testing.T) { t.Run("exists local", func(t *testing.T) {
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(testBlocks), defer cs.Finish(t)
Origin: newTestStore(testBlocks), require.NoError(t, cs.cache.Add(ctx, testBlocks))
} require.NoError(t, cs.origin.Add(ctx, testBlocks))
defer cs.Close()
for _, b := range testBlocks { for _, b := range testBlocks {
gb, err := cs.Get(ctx, b.Cid()) gb, err := cs.Get(ctx, b.Cid())
assert.NoError(t, err) assert.NoError(t, err)
@ -47,18 +51,17 @@ func TestCacheStore_Get(t *testing.T) {
}) })
t.Run("exists remote", func(t *testing.T) { t.Run("exists remote", func(t *testing.T) {
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(testBlocks[:1]), defer cs.Finish(t)
Origin: newTestStore(testBlocks), require.NoError(t, cs.cache.Add(ctx, testBlocks[:1]))
} require.NoError(t, cs.origin.Add(ctx, testBlocks))
defer cs.Close()
for _, b := range testBlocks { for _, b := range testBlocks {
gb, err := cs.Get(ctx, b.Cid()) gb, err := cs.Get(ctx, b.Cid())
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, gb) assert.NotNil(t, gb)
} }
for _, b := range testBlocks { for _, b := range testBlocks {
lb, err := cs.Cache.Get(ctx, b.Cid()) lb, err := cs.cache.Get(ctx, b.Cid())
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, lb) assert.NotNil(t, lb)
} }
@ -68,61 +71,63 @@ func TestCacheStore_Get(t *testing.T) {
func TestCacheStore_GetMany(t *testing.T) { func TestCacheStore_GetMany(t *testing.T) {
t.Run("all local", func(t *testing.T) { t.Run("all local", func(t *testing.T) {
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(testBlocks), defer cs.Finish(t)
Origin: newTestStore(testBlocks), require.NoError(t, cs.cache.Add(ctx, testBlocks))
} require.NoError(t, cs.origin.Add(ctx, testBlocks))
defer cs.Close()
var cids, resCids []cid.Cid var cids, resCids []cid.Cid
for _, b := range testBlocks { for _, b := range testBlocks {
cids = append(cids, b.Cid()) cids = append(cids, b.Cid())
} }
ch := cs.GetMany(ctx, cids) ch := cs.GetMany(ctx, cids)
for { func() {
select { for {
case b, ok := <-ch: select {
if !ok { case b, ok := <-ch:
if !ok {
return
} else {
resCids = append(resCids, b.Cid())
}
case <-time.After(time.Second):
assert.NoError(t, fmt.Errorf("timeout"))
return return
} else {
resCids = append(resCids, b.Cid())
} }
case <-time.After(time.Second):
assert.NoError(t, fmt.Errorf("timeout"))
return
} }
} }()
assert.ElementsMatch(t, cids, resCids) assert.ElementsMatch(t, cids, resCids)
}) })
t.Run("partial local", func(t *testing.T) { t.Run("partial local", func(t *testing.T) {
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(testBlocks[:1]), defer cs.Finish(t)
Origin: newTestStore(testBlocks), require.NoError(t, cs.cache.Add(ctx, testBlocks[:1]))
} require.NoError(t, cs.origin.Add(ctx, testBlocks))
defer cs.Close()
var cids, resCids []cid.Cid var cids, resCids []cid.Cid
for _, b := range testBlocks { for _, b := range testBlocks {
cids = append(cids, b.Cid()) cids = append(cids, b.Cid())
} }
ch := cs.GetMany(ctx, cids) ch := cs.GetMany(ctx, cids)
for { func() {
select { for {
case b, ok := <-ch: select {
if !ok { case b, ok := <-ch:
if !ok {
return
} else {
resCids = append(resCids, b.Cid())
}
case <-time.After(time.Second):
assert.NoError(t, fmt.Errorf("timeout"))
return return
} else {
resCids = append(resCids, b.Cid())
} }
case <-time.After(time.Second):
assert.NoError(t, fmt.Errorf("timeout"))
return
} }
} }()
assert.ElementsMatch(t, cids, resCids) require.Equal(t, len(cids), len(resCids))
for _, b := range testBlocks { for _, b := range testBlocks {
gb, err := cs.Cache.Get(ctx, b.Cid()) gb, err := cs.cache.Get(ctx, b.Cid())
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, gb) assert.NotNil(t, gb)
} }
@ -131,14 +136,12 @@ func TestCacheStore_GetMany(t *testing.T) {
func TestCacheStore_Delete(t *testing.T) { func TestCacheStore_Delete(t *testing.T) {
testBlocks := newTestBocks("1", "2", "3") testBlocks := newTestBocks("1", "2", "3")
cs := &CacheStore{ cs := newPSFixture(t)
Cache: newTestStore(testBlocks[:1]), defer cs.Finish(t)
Origin: newTestStore(testBlocks), require.NoError(t, cs.cache.Add(ctx, testBlocks))
}
defer cs.Close()
for _, b := range testBlocks { for _, b := range testBlocks {
require.NoError(t, cs.Delete(ctx, b.Cid())) require.NoError(t, cs.Delete(ctx, b.Cid()))
gb, err := cs.Get(ctx, b.Cid()) gb, err := cs.cache.Get(ctx, b.Cid())
assert.Nil(t, gb) assert.Nil(t, gb)
assert.True(t, format.IsNotFound(err)) assert.True(t, format.IsNotFound(err))
} }
@ -146,18 +149,21 @@ func TestCacheStore_Delete(t *testing.T) {
func newTestStore(bs []blocks.Block) *testStore { func newTestStore(bs []blocks.Block) *testStore {
ts := &testStore{ ts := &testStore{
store: make(map[cid.Cid]blocks.Block), store: make(map[string]blocks.Block),
} }
ts.Add(context.Background(), bs) ts.Add(context.Background(), bs)
return ts return ts
} }
type testStore struct { type testStore struct {
store map[cid.Cid]blocks.Block store map[string]blocks.Block
mu sync.Mutex
} }
func (t *testStore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { func (t *testStore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) {
if b, ok := t.store[k]; ok { t.mu.Lock()
defer t.mu.Unlock()
if b, ok := t.store[k.String()]; ok {
return b, nil return b, nil
} }
return nil, &format.ErrNotFound{Cid: k} return nil, &format.ErrNotFound{Cid: k}
@ -182,8 +188,10 @@ func (t *testStore) GetMany(ctx context.Context, ks []cid.Cid) <-chan blocks.Blo
} }
func (t *testStore) ExistsCids(ctx context.Context, ks []cid.Cid) (exists []cid.Cid, err error) { func (t *testStore) ExistsCids(ctx context.Context, ks []cid.Cid) (exists []cid.Cid, err error) {
t.mu.Lock()
defer t.mu.Unlock()
for _, k := range ks { for _, k := range ks {
if _, ok := t.store[k]; ok { if _, ok := t.store[k.String()]; ok {
exists = append(exists, k) exists = append(exists, k)
} }
} }
@ -191,15 +199,19 @@ func (t *testStore) ExistsCids(ctx context.Context, ks []cid.Cid) (exists []cid.
} }
func (t *testStore) Add(ctx context.Context, bs []blocks.Block) error { func (t *testStore) Add(ctx context.Context, bs []blocks.Block) error {
t.mu.Lock()
defer t.mu.Unlock()
for _, b := range bs { for _, b := range bs {
t.store[b.Cid()] = b t.store[b.Cid().String()] = b
} }
return nil return nil
} }
func (t *testStore) Delete(ctx context.Context, c cid.Cid) error { func (t *testStore) Delete(ctx context.Context, c cid.Cid) error {
if _, ok := t.store[c]; ok { t.mu.Lock()
delete(t.store, c) defer t.mu.Unlock()
if _, ok := t.store[c.String()]; ok {
delete(t.store, c.String())
return nil return nil
} }
return &format.ErrNotFound{Cid: c} return &format.ErrNotFound{Cid: c}
@ -209,6 +221,32 @@ func (t *testStore) Close() (err error) {
return nil return nil
} }
type psFixture struct {
*proxyStore
tmpDir string
db *badger.DB
}
func newPSFixture(t *testing.T) *psFixture {
var err error
fx := &psFixture{}
fx.tmpDir, err = os.MkdirTemp("", "proxyStore_*")
require.NoError(t, err)
fx.db, err = badger.Open(badger.DefaultOptions(fx.tmpDir).WithLoggingLevel(badger.ERROR))
require.NoError(t, err)
fx.proxyStore = &proxyStore{
cache: newTestStore(nil),
origin: newTestStore(nil),
index: badgerfilestore.NewFileBadgerIndex(fx.db),
}
return fx
}
func (fx *psFixture) Finish(t *testing.T) {
assert.NoError(t, fx.db.Close())
_ = os.RemoveAll(fx.tmpDir)
}
func newTestBocks(ids ...string) (bs []blocks.Block) { func newTestBocks(ids ...string) (bs []blocks.Block) {
for _, id := range ids { for _, id := range ids {
bs = append(bs, blocks.NewBlock([]byte(id))) bs = append(bs, blocks.NewBlock([]byte(id)))

View File

@ -125,6 +125,7 @@ func (c *client) put(ctx context.Context, t *task) (err error) {
}); err != nil { }); err != nil {
return rpcerr.Unwrap(err) return rpcerr.Unwrap(err)
} }
log.Debug("put cid", zap.String("cid", t.cid.String()))
t.ready <- t t.ready <- t
c.stat.Add(st, len(t.data)) c.stat.Add(st, len(t.data))
return return
@ -164,7 +165,7 @@ func (c *client) get(ctx context.Context, t *task) (err error) {
return return
} }
func (c *client) readStream() { func (c *client) readStream(stream fileproto.DRPCFile_GetBlocksClient) {
var err error var err error
defer func() { defer func() {
log.Info("readStream closed", zap.String("peerId", c.peerId), zap.Error(err)) log.Info("readStream closed", zap.String("peerId", c.peerId), zap.Error(err))
@ -174,7 +175,7 @@ func (c *client) readStream() {
}() }()
for { for {
var resp *fileproto.GetBlockResponse var resp *fileproto.GetBlockResponse
resp, err = c.blocksStream.Recv() resp, err = stream.Recv()
if err != nil { if err != nil {
return return
} }
@ -230,7 +231,7 @@ func (c *client) getStream(ctx context.Context) (fileproto.DRPCFile_GetBlocksCli
if c.blocksStream, err = fileproto.NewDRPCFileClient(peer).GetBlocks(context.Background()); err != nil { if c.blocksStream, err = fileproto.NewDRPCFileClient(peer).GetBlocks(context.Background()); err != nil {
return nil, err return nil, err
} }
go c.readStream() go c.readStream(c.blocksStream)
return c.blocksStream, nil return c.blocksStream, nil
} }

View File

@ -13,7 +13,7 @@ import (
const ( const (
maxConnections = 10 maxConnections = 10
maxTasks = 1000 maxTasks = 100
) )
var ( var (

View File

@ -0,0 +1,133 @@
package filestorage
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/badgerfilestore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
blocks "github.com/ipfs/go-block-format"
"go.uber.org/zap"
"sync"
"time"
)
const syncerOpBatch = 10
type syncer struct {
ps *proxyStore
done chan struct{}
}
func (s *syncer) run(ctx context.Context) {
defer close(s.done)
for {
select {
case <-ctx.Done():
return
case <-time.After(time.Minute):
case <-s.ps.index.HasWorkCh():
}
for s.sync(ctx) > 0 {
}
}
}
func (s *syncer) sync(ctx context.Context) (l int) {
cids, err := s.ps.index.List(syncerOpBatch)
if err != nil {
log.Error("index list error", zap.Error(err))
return
}
defer cids.Release()
l = cids.Len()
log.Debug("remote file sync, got tasks to sync", zap.Int("count", l))
if l == 0 {
return
}
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Minute)
defer cancel()
var wg sync.WaitGroup
for _, sOps := range cids.SpaceOps {
if len(sOps.Load) > 0 {
wg.Add(1)
go func(opt badgerfilestore.SpaceCidOps) {
defer wg.Done()
s.load(ctx, opt)
}(sOps)
}
if len(sOps.Delete) > 0 {
wg.Add(1)
go func(opt badgerfilestore.SpaceCidOps) {
defer wg.Done()
s.delete(ctx, opt)
}(sOps)
}
if len(sOps.Add) > 0 {
wg.Add(1)
go func(opt badgerfilestore.SpaceCidOps) {
defer wg.Done()
s.add(ctx, opt)
}(sOps)
}
}
wg.Wait()
return
}
func (s *syncer) load(ctx context.Context, spaceOps badgerfilestore.SpaceCidOps) {
ctx = fileblockstore.CtxWithSpaceId(ctx, spaceOps.SpaceId)
res := s.ps.origin.GetMany(ctx, spaceOps.Load)
doneCids := badgerfilestore.NewCids()
defer doneCids.Release()
for b := range res {
if err := s.ps.cache.Add(ctx, []blocks.Block{b}); err != nil {
log.Error("syncer: can't add to local store", zap.Error(err))
continue
}
doneCids.Add(spaceOps.SpaceId, badgerfilestore.OpLoad, b.Cid())
}
if err := s.ps.index.Done(doneCids); err != nil {
log.Error("syncer: index.Done error", zap.Error(err))
return
}
log.Info("successfully loaded cids", zap.Int("count", doneCids.Len()))
}
func (s *syncer) add(ctx context.Context, spaceOps badgerfilestore.SpaceCidOps) {
doneCids := badgerfilestore.NewCids()
defer doneCids.Release()
res := s.ps.cache.GetMany(ctx, spaceOps.Add)
var bs []blocks.Block
for b := range res {
bs = append(bs, b)
doneCids.Add(spaceOps.SpaceId, badgerfilestore.OpAdd, b.Cid())
}
ctx = fileblockstore.CtxWithSpaceId(ctx, spaceOps.SpaceId)
if err := s.ps.origin.Add(ctx, bs); err != nil {
log.Debug("syncer: can't add to remote store", zap.Error(err))
return
}
if err := s.ps.index.Done(doneCids); err != nil {
log.Error("syncer: index.Done error", zap.Error(err))
return
}
log.Info("successfully added cids", zap.Int("count", doneCids.Len()), zap.Stringers("cids", doneCids.SpaceOps[0].Add))
}
func (s *syncer) delete(ctx context.Context, spaceOps badgerfilestore.SpaceCidOps) {
doneCids := badgerfilestore.NewCids()
defer doneCids.Release()
ctx = fileblockstore.CtxWithSpaceId(ctx, spaceOps.SpaceId)
for _, c := range spaceOps.Delete {
if err := s.ps.origin.Delete(ctx, c); err != nil {
log.Debug("syncer: can't remove from remote", zap.Error(err))
continue
}
doneCids.Add(spaceOps.SpaceId, badgerfilestore.OpDelete, c)
}
if err := s.ps.index.Done(doneCids); err != nil {
log.Error("syncer: index.Done error", zap.Error(err))
}
log.Info("successfully removed cids", zap.Int("count", doneCids.Len()))
}

View File

@ -0,0 +1,106 @@
package filestorage
import (
"context"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
"time"
)
func TestSyncer_add(t *testing.T) {
t.Log("start test")
fx := newPSFixture(t)
defer fx.Finish(t)
s := &syncer{ps: fx.proxyStore, done: make(chan struct{})}
ctx, cancel := context.WithCancel(ctx)
defer func() {
cancel()
<-s.done
}()
bs := newTestBocks("1", "2")
require.NoError(t, fx.Add(ctx, bs))
go func() {
s.run(ctx)
}()
time.Sleep(time.Millisecond * 10)
bs2 := newTestBocks("3", "4")
require.NoError(t, fx.Add(ctx, bs2))
var done = make(chan struct{})
go func() {
defer close(done)
for _, b := range append(bs, bs2...) {
t.Log("check", b.Cid().String())
for {
select {
case <-ctx.Done():
return
default:
}
ab, err := fx.origin.Get(ctx, b.Cid())
if err == nil {
assert.Equal(t, b.RawData(), ab.RawData())
break
}
time.Sleep(time.Millisecond)
}
}
}()
select {
case <-done:
case <-time.After(time.Second):
t.Errorf("timeout")
}
}
func TestSyncer_delete(t *testing.T) {
fx := newPSFixture(t)
defer fx.Finish(t)
s := &syncer{ps: fx.proxyStore, done: make(chan struct{})}
ctx, cancel := context.WithCancel(ctx)
defer func() {
cancel()
<-s.done
}()
go func() {
s.run(ctx)
}()
bs := newTestBocks("1", "2")
require.NoError(t, fx.cache.Add(ctx, bs))
require.NoError(t, fx.origin.Add(ctx, bs))
for cid := range fx.cache.(*testStore).store {
t.Log("cache", cid)
}
for cid := range fx.origin.(*testStore).store {
t.Log("origin", cid)
}
for _, b := range bs {
require.NoError(t, fx.Delete(ctx, b.Cid()))
}
var done = make(chan struct{})
go func() {
defer close(done)
for _, b := range bs {
for {
select {
case <-ctx.Done():
return
default:
}
_, err := fx.origin.Get(ctx, b.Cid())
if err != nil {
break
}
time.Sleep(time.Millisecond)
}
}
}()
select {
case <-done:
case <-time.After(time.Second):
t.Errorf("timeout")
}
}

View File

@ -1,122 +0,0 @@
package cachestore
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format"
"go.uber.org/zap"
"io"
)
type CacheStore struct {
Cache fileblockstore.BlockStoreExistsCIDs
Origin fileblockstore.BlockStore
Log *zap.Logger
}
func (c *CacheStore) Get(ctx context.Context, k cid.Cid) (b blocks.Block, err error) {
if b, err = c.Cache.Get(ctx, k); err != nil {
if format.IsNotFound(err) {
err = nil
} else {
return
}
} else {
return
}
if b, err = c.Origin.Get(ctx, k); err != nil {
return
}
if addErr := c.Cache.Add(ctx, []blocks.Block{b}); addErr != nil {
c.Log.Error("block fetched from origin but got error for add to cache", zap.Error(addErr))
}
return
}
func (c *CacheStore) GetMany(ctx context.Context, ks []cid.Cid) <-chan blocks.Block {
cachedCids, localErr := c.Cache.ExistsCids(ctx, ks)
var originCids []cid.Cid
if localErr != nil {
c.Log.Error("hasCIDs error", zap.Error(localErr))
originCids = ks
} else {
if len(cachedCids) != len(ks) {
set := cid.NewSet()
for _, cCid := range cachedCids {
set.Add(cCid)
}
originCids = ks[:0]
for _, k := range ks {
if !set.Has(k) {
originCids = append(originCids, k)
}
}
}
}
if len(originCids) == 0 {
return c.Cache.GetMany(ctx, cachedCids)
}
var results = make(chan blocks.Block)
go func() {
defer close(results)
localResults := c.Cache.GetMany(ctx, cachedCids)
originResults := c.Origin.GetMany(ctx, originCids)
for {
var cb, ob blocks.Block
var cOk, oOk bool
select {
case cb, cOk = <-localResults:
if cOk {
results <- cb
}
case ob, oOk = <-originResults:
if oOk {
if addErr := c.Cache.Add(ctx, []blocks.Block{ob}); addErr != nil {
c.Log.Error("add block to cache error", zap.Error(addErr))
}
results <- ob
}
case <-ctx.Done():
return
}
if !oOk && !cOk {
return
}
}
}()
return results
}
func (c *CacheStore) Add(ctx context.Context, b []blocks.Block) error {
if localErr := c.Cache.Add(ctx, b); localErr != nil {
c.Log.Error("cache add error", zap.Error(localErr))
}
return c.Origin.Add(ctx, b)
}
func (c *CacheStore) Delete(ctx context.Context, k cid.Cid) error {
if localErr := c.Cache.Delete(ctx, k); localErr != nil {
if !format.IsNotFound(localErr) {
c.Log.Error("error while delete block", zap.Error(localErr))
}
}
return c.Origin.Delete(ctx, k)
}
func (c *CacheStore) Close() (err error) {
if closer, ok := c.Cache.(io.Closer); ok {
if localErr := closer.Close(); localErr != nil {
c.Log.Error("error while closing cache store", zap.Error(localErr))
}
}
if closer, ok := c.Origin.(io.Closer); ok {
return closer.Close()
}
return nil
}

View File

@ -30,7 +30,7 @@ type BlockStore interface {
Delete(ctx context.Context, c cid.Cid) error Delete(ctx context.Context, c cid.Cid) error
} }
type BlockStoreExistsCIDs interface { type BlockStoreLocal interface {
BlockStore BlockStore
ExistsCids(ctx context.Context, ks []cid.Cid) (exists []cid.Cid, err error) ExistsCids(ctx context.Context, ks []cid.Cid) (exists []cid.Cid, err error)
} }

View File

@ -22,7 +22,7 @@ func (r *rpcHandler) GetBlocks(stream fileproto.DRPCFile_GetBlocksStream) error
resp := &fileproto.GetBlockResponse{ resp := &fileproto.GetBlockResponse{
Cid: req.Cid, Cid: req.Cid,
} }
_, c, err := cid.CidFromBytes(req.Cid) c, err := cid.Cast(req.Cid)
if err != nil { if err != nil {
resp.Code = fileproto.CIDError_CIDErrorUnexpected resp.Code = fileproto.CIDError_CIDErrorUnexpected
} else { } else {
@ -44,9 +44,15 @@ func (r *rpcHandler) GetBlocks(stream fileproto.DRPCFile_GetBlocksStream) error
} }
func (r *rpcHandler) PushBlock(ctx context.Context, req *fileproto.PushBlockRequest) (*fileproto.PushBlockResponse, error) { func (r *rpcHandler) PushBlock(ctx context.Context, req *fileproto.PushBlockRequest) (*fileproto.PushBlockResponse, error) {
if err := r.store.Add(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), []blocks.Block{ c, err := cid.Cast(req.Cid)
blocks.NewBlock(req.Data), if err != nil {
}); err != nil { return nil, err
}
b, err := blocks.NewBlockWithCid(req.Data, c)
if err != nil {
return nil, err
}
if err = r.store.Add(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), []blocks.Block{b}); err != nil {
return nil, fileprotoerr.ErrUnexpected return nil, fileprotoerr.ErrUnexpected
} }
return &fileproto.PushBlockResponse{}, nil return &fileproto.PushBlockResponse{}, nil
@ -54,7 +60,7 @@ func (r *rpcHandler) PushBlock(ctx context.Context, req *fileproto.PushBlockRequ
func (r *rpcHandler) DeleteBlocks(ctx context.Context, req *fileproto.DeleteBlocksRequest) (*fileproto.DeleteBlocksResponse, error) { func (r *rpcHandler) DeleteBlocks(ctx context.Context, req *fileproto.DeleteBlocksRequest) (*fileproto.DeleteBlocksResponse, error) {
for _, cd := range req.Cid { for _, cd := range req.Cid {
_, c, err := cid.CidFromBytes(cd) c, err := cid.Cast(cd)
if err == nil { if err == nil {
if err = r.store.Delete(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), c); err != nil { if err = r.store.Delete(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), c); err != nil {
// TODO: log // TODO: log

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
chunker "github.com/ipfs/go-ipfs-chunker" chunker "github.com/ipfs/go-ipfs-chunker"
@ -13,11 +14,14 @@ import (
"github.com/ipfs/go-unixfs/importer/helpers" "github.com/ipfs/go-unixfs/importer/helpers"
ufsio "github.com/ipfs/go-unixfs/io" ufsio "github.com/ipfs/go-unixfs/io"
"github.com/multiformats/go-multihash" "github.com/multiformats/go-multihash"
"go.uber.org/zap"
"io" "io"
) )
const CName = "common.commonfile.fileservice" const CName = "common.commonfile.fileservice"
var log = logger.NewNamed(CName)
func New() FileService { func New() FileService {
return &fileService{} return &fileService{}
} }
@ -66,10 +70,16 @@ func (fs *fileService) AddFile(ctx context.Context, r io.Reader) (ipld.Node, err
if err != nil { if err != nil {
return nil, err return nil, err
} }
return balanced.Layout(dbh) n, err := balanced.Layout(dbh)
if err != nil {
return nil, err
}
log.Debug("add file", zap.String("cid", n.Cid().String()))
return n, nil
} }
func (fs *fileService) GetFile(ctx context.Context, c cid.Cid) (ufsio.ReadSeekCloser, error) { func (fs *fileService) GetFile(ctx context.Context, c cid.Cid) (ufsio.ReadSeekCloser, error) {
log.Debug("get file", zap.String("cid", c.String()))
n, err := fs.merkledag.Get(ctx, c) n, err := fs.merkledag.Get(ctx, c)
if err != nil { if err != nil {
return nil, err return nil, err

64
debug.json Normal file
View File

@ -0,0 +1,64 @@
{"level":"debug","ts":"2022-12-15T15:13:18.511+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:13:31.837+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:13:39.610+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:04.659+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:07.447+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:10.704+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:13.893+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:18.286+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:24.064+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:34.095+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:46.708+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:15:55.627+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:16:12.023+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:18:29.361+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:26:53.897+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"fatal","ts":"2022-12-15T15:27:40.336+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --path","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"fatal","ts":"2022-12-15T15:29:16.006+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --path","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"fatal","ts":"2022-12-15T15:29:23.018+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --path","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"debug","ts":"2022-12-15T15:29:30.862+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:32:12.137+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:32:48.922+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"info","ts":"2022-12-15T15:34:00.976+0300","logger":"debug.drpcclient","caller":"ocache/ocache.go:386","msg":"GC: removed 0; cache size: 1"}
{"level":"info","ts":"2022-12-15T15:35:00.921+0300","logger":"debug.drpcclient","caller":"ocache/ocache.go:386","msg":"GC: removed 0; cache size: 1"}
{"level":"debug","ts":"2022-12-15T15:35:20.899+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:39:29.678+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:39:51.228+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:40:45.462+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"fatal","ts":"2022-12-15T15:43:26.123+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --hash","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"debug","ts":"2022-12-15T15:44:13.688+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:46:59.113+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:49:53.064+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:51:27.476+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:55:07.937+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-15T15:57:54.861+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:01:50.865+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:01:57.057+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"fatal","ts":"2022-12-21T20:02:20.880+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --path","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"fatal","ts":"2022-12-21T20:03:06.554+0300","logger":"main","caller":"debug/debug.go:46","msg":"can't start app","error":"can't run service 'debug.commands': unknown flag: --path","stacktrace":"main.main\n\t/home/che/projects/go-anytype-infrastructure-experiments/util/cmd/debug/debug.go:46\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250"}
{"level":"debug","ts":"2022-12-21T20:03:25.197+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:05:33.936+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:05:39.936+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:06:29.434+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:06:46.064+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:10:43.822+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:12:47.419+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:13:54.671+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:18:50.319+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:19:00.083+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:23:20.406+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:27:26.865+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:38:02.101+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:38:45.284+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:39:02.077+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:52:39.255+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T20:53:53.551+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:01:28.892+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:08:07.054+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:10:22.401+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:17:50.135+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:18:33.961+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:19:26.619+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:20:03.619+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:22:33.831+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}
{"level":"debug","ts":"2022-12-21T21:23:11.575+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}

View File

@ -5,27 +5,36 @@ grpcServer:
- 127.0.0.1:4630 - 127.0.0.1:4630
tls: false tls: false
account: account:
peerId: 12D3KooWDPdgoAcpvHcED4FsU3iz1mX4D2XBi4KN8NXaSt82sn7j peerId: 12D3KooWPSPh4BL6TMzttZciuxCNxovDMd9MmVHYjmLfeDzW85JY
peerKey: ZOaSbsUfam6r9KYA9jlkbDjQ+hZ6wpPXvDNRyjVyn7k1GMYeRlDTNSniNutKr32daIDQuowdjwaCeQ+hoij/Wg== peerKey: jyf2O72bAAPZ0gtfv0GM04vzftA+61XYr2+4tDnKxhXKYo+Ppdp9INRSlTZ6tlm6wotuArL4sahipmHE/ZWukQ==
signingKey: OYgzXHbYZDouketIP3AJJ3MwmdQ/7ZepdkE1kUCnc6CLc02ua64saYnkFcoROcSgrVjrL9k8aaetWCLEXgM+kw== signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g==
encryptionKey: MIIEpAIBAAKCAQEA0/0eVsifbPXKWxGj/Upfnc7Sgv2i0f4Nd6h2ahHurxZt4+H+3MZ5fcmdBo2mrk8XArvIAl6CHxM0KnE8ZQPU7xKi8o45jibIipCaB1CfTgOtmJ8a9wZ2fwheEtbiy39Twb7Hyg71IeACmTmS3YPYX3nGAkR5/vln25r1G9K9dX5JIybhEsylvyS+w3L6noY0t7zyDQOuzX2S6VDwE4UrNJvTxM5f1ezs4z9LlbkTqPEN61K2Ji2UHyg1b2BONfIA+20hZsWwzmUdXdguMIaN0D1eTE+PSxHXU/myMBdfXeGFhNVsSaYhAm/KcPVt6oOd0gDRfuIOyT/QAeQA0VoWfwIDAQABAoIBAAZ97urrc+5rTIojbSk5mNoFVm8Kg2z44cKzVwUCjZOxFSZwalSqg1f1z6g+uEcIRwUfaQ2hhUycUvGlzBqv1lqH8JOLBXoz99o+eWkV7/r8o9lTrgi4mvJi+DaNfB6NRKxfQlEOyjUCXjIBEF1WR08NNKInJLFJRAP2p+D1QDYT3LUpVknIfrxCciBbisysx9QlS7sP9rAncUWUgn1bvYlyRmMg88EASanViQzdvrjIp6LTu2MqO5Q8mfRRcz3oK2qAuArE25KuyF/BRnMlFGDT0n4stgxCMDYw2vdJcvCsMXkfngbOsYeDBB4755vVi6NDGekDRBmI0S0//WCCqkkCgYEA8BgwhIgn//QE47Rx15F9H36msV3WPcxpSga9BBFQzKPXVij3oBxlyxTKnf/iFTIIeCvefne21R1MwOWuXavDr2tCQs322HI87DjrMKQStaf2wyn7E2So+7mW9psD5QGcQfXP0s/LoehinoChKTitWfqD1P0RX6YNQjaKYq80QG0CgYEA4ghHLE+dDkqG/08UH1L9B1Q9bWjvOiQjyrtRtnPz99xuSSH7XywxdXdPs8jCgquKRPHrEfBUd4Ry9uhqcCzjBVPx6T/J07L5wVa3ZE2g7n22DAT3eBPJ3bkeFsPV1zQzpJYnQSed/j8Zl2899242w0rUd1OeST9lvVz+uDfTlxsCgYEAokKGz5rBBa7hew4g/eHaYOWUPDxBpQQ3iArjxRL6u0JjLlyDdZabiNLlWEBth4uHw8dKF8hKLN8fVyIiZDXICw5++mz9zSvvVmnlMLtB1bjNAPqnL2UQ+wZjKwh6alNbSgyZRkyevy4xMBOYVyZxqWSvocrh6fVr8nqvrZ/gvUUCgYEAiA9nmHrMFcAzBxh5CmoQOgsxdtzFtH/ws6aSh3vBDiC4mnlEMYQOuaD6b0SYIcRU1S+yyveaQN+PvKUm/SNn/NsNMdTeDvsbcJBckJpSF33AyfdrZ/KxfzBhtl5oKMUZmSdxtby9VEBzjT6/VGQZvvEaeEHzdDAfdB+4jPe9/KUCgYBf7IhDH3+9Rrl6xQtIyErtaAWm+wQlucbMMoJgjXL6F9V6HqUer3+7OvNJQdrZiYcxHRlXynT7cN8iw59rOHQxEaNOXPwz9TS+wlvUerUHibgS1GOnLVke/NFoEi8M+B2pdo1M2x+YBdX3hi0kMYB0VtZM75uPKS9I1ZSFfLmZgQ== encryptionKey: MIIEoAIBAAKCAQEAn4Yfcri3RetiOo6rc3wzUUciBMWS/v2cKJc563ralqhtUTdgTiNv82pFP8A4zPmOyLcn2qNkidPlRMGXHtuABbqBNGjViwIYykKkZaPsP9ogrPvd5zKDaXXJaLZODZC3LVmco37FxWBctaQvUcWwvhBRFyu6writC3k27hdZXfgheGjd461wPFUibAvpyrlQVA0i57O2yobkTsStITID88MTCHdKJuNXmSJg/hI1ABAzLIOb+lm2kuseCBJtu9d6DoJwDXS9+H51sQQhHYSph9YGYMpyX2MmbbR0HMQjOEy/1wlX8l/R9m59A7wFQsjdb1Ug9OI3BYrA5k8nO8zlLQIDAQABAoH/eEOlcdfQU+YhKARnPallBuGZw/8v0w1frTpVcDIumWZhA9m7wSz2OYzkqCtCp0V9X9S1Nx/3q/ET58ILLDhPTAJPZjOiyinKhrG3PulWMs0/1SoNIT/z0o36Sfcm4RM5BfeJH7lzYFpFiqs9AWkI1kF24QEWy7ZuvzejMdxog25dDMqFW3bDJYYS8IzDI+gNmgrNLxh32ST5Ugrjeq4SgUjfKWMGARWPzQk+x9fxzhDJkIXtRqL3SDQmlN9Jy+/p3NuCC5gKTIYcoNEsrTnKqDQQL+Hr8KY8MaywmK1CRWcp1lguheAQqmcqyWdl11dAdIe+sSG0jtYeN4RD+dV9AoGBAMaRFki8e0FprmKk/sT6xGtLimptBh2YPO3Rfooow7aCcCP0ZRDxGUs56aCla4Cg7BBoWldHaPPdgG0rxe/Tocu5AUjohH+s8OOAP0trZzE6gavJV1Uv9XPKUs+EDpATbjFJTFeBN4Im/3uBnOx1CLE0tEOkAvW+NI8zKRUYj+8nAoGBAM2qGh2T+6QQnSvuBEEUCy/3JAJ1gkmvfJpZcE4M5kaQr0iu64L4oYE/68HqcK+IPzSAGgafn4cgodOh59syMMJ+7W2S5YS84JdLZER15SOQ+9q8qVpvqnsi1oW6tcRKdTFinnf/AmRQzWdkLsTp88ew+CSl7VGbgmVcFtcfIH2LAoGARrOMUrPB00W00OzcxfhgDbAlBcXyAoGdWDRasQjYvths43B2t/SQxAdH12pu/6rMwv7VA/SqOwKoYrbOUJlzJ52lBne8DdXfI7IbV1hTsuSZHTigfvWHmQX2PGtR4Bz7BFOL+jBJOm92UlyRKmR1hts0QE1avHNQNZjKzPck8MsCgYBwc8PXzGRZbuQhcwFMfCMp1N4RoiLdG2DsHF81rgPzLYVKHqqTcFMOkt7bps56i+rTT//rAzh88DDLwMk/pw/WKQS1Vw68J3I+B3EJpdTmP44WKfYHhusWbRQTBuYAMB4oJJ41SnAKXcwR7ktMTAeJdpAXqco7RuZjeZjbgx+GxQKBgDycT84wvDxoSz90iY+6pzzBQkbh6sDgy2IPV+nSXKIfvuhefZP4tawwHjwg7oscHv81J0/tkucf1k2VN3NyiqnYlT5Q5EgUxmyOiKw+jkrXBAjQtUgSzPAth0j/mMeQSCw+VrFLNJVGrc6g9s5gNrUFJLa2YnQT1c3PzeyVwlOQ
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8090 - 127.0.0.1:8090
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab - peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
- peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb types:
- tree
- file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
- peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK types:
- tree
- file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
types:
- tree
- file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 11

View File

@ -5,27 +5,36 @@ grpcServer:
- 127.0.0.1:4631 - 127.0.0.1:4631
tls: false tls: false
account: account:
peerId: 12D3KooWJ8avwNEYgR14WMWoPaeNvfEAqyNnCCP8Doimfb6JhorD peerId: 12D3KooWQpz99Dc9Z2sCsXBjUzRbWtiXJ6oV3rZDccqUwTjop89Q
peerKey: fcg/sg0QzcK+1JUSslS7pbLu1CHCBK4lciqdAnjUG5R7iGFFpfjlYvk9Kvt6FXCP1QFDD+ALbsEw/e6SJXBpjg== peerKey: jac8YPezUIiHZ5leof47XxiwwBWpPLnAg9fIVkvkPqTfB/pd44QRIgBwilG9/PLspWjEe2PifvwU7Gjsz/nI2w==
signingKey: OYgzXHbYZDouketIP3AJJ3MwmdQ/7ZepdkE1kUCnc6CLc02ua64saYnkFcoROcSgrVjrL9k8aaetWCLEXgM+kw== signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g==
encryptionKey: MIIEpAIBAAKCAQEA0/0eVsifbPXKWxGj/Upfnc7Sgv2i0f4Nd6h2ahHurxZt4+H+3MZ5fcmdBo2mrk8XArvIAl6CHxM0KnE8ZQPU7xKi8o45jibIipCaB1CfTgOtmJ8a9wZ2fwheEtbiy39Twb7Hyg71IeACmTmS3YPYX3nGAkR5/vln25r1G9K9dX5JIybhEsylvyS+w3L6noY0t7zyDQOuzX2S6VDwE4UrNJvTxM5f1ezs4z9LlbkTqPEN61K2Ji2UHyg1b2BONfIA+20hZsWwzmUdXdguMIaN0D1eTE+PSxHXU/myMBdfXeGFhNVsSaYhAm/KcPVt6oOd0gDRfuIOyT/QAeQA0VoWfwIDAQABAoIBAAZ97urrc+5rTIojbSk5mNoFVm8Kg2z44cKzVwUCjZOxFSZwalSqg1f1z6g+uEcIRwUfaQ2hhUycUvGlzBqv1lqH8JOLBXoz99o+eWkV7/r8o9lTrgi4mvJi+DaNfB6NRKxfQlEOyjUCXjIBEF1WR08NNKInJLFJRAP2p+D1QDYT3LUpVknIfrxCciBbisysx9QlS7sP9rAncUWUgn1bvYlyRmMg88EASanViQzdvrjIp6LTu2MqO5Q8mfRRcz3oK2qAuArE25KuyF/BRnMlFGDT0n4stgxCMDYw2vdJcvCsMXkfngbOsYeDBB4755vVi6NDGekDRBmI0S0//WCCqkkCgYEA8BgwhIgn//QE47Rx15F9H36msV3WPcxpSga9BBFQzKPXVij3oBxlyxTKnf/iFTIIeCvefne21R1MwOWuXavDr2tCQs322HI87DjrMKQStaf2wyn7E2So+7mW9psD5QGcQfXP0s/LoehinoChKTitWfqD1P0RX6YNQjaKYq80QG0CgYEA4ghHLE+dDkqG/08UH1L9B1Q9bWjvOiQjyrtRtnPz99xuSSH7XywxdXdPs8jCgquKRPHrEfBUd4Ry9uhqcCzjBVPx6T/J07L5wVa3ZE2g7n22DAT3eBPJ3bkeFsPV1zQzpJYnQSed/j8Zl2899242w0rUd1OeST9lvVz+uDfTlxsCgYEAokKGz5rBBa7hew4g/eHaYOWUPDxBpQQ3iArjxRL6u0JjLlyDdZabiNLlWEBth4uHw8dKF8hKLN8fVyIiZDXICw5++mz9zSvvVmnlMLtB1bjNAPqnL2UQ+wZjKwh6alNbSgyZRkyevy4xMBOYVyZxqWSvocrh6fVr8nqvrZ/gvUUCgYEAiA9nmHrMFcAzBxh5CmoQOgsxdtzFtH/ws6aSh3vBDiC4mnlEMYQOuaD6b0SYIcRU1S+yyveaQN+PvKUm/SNn/NsNMdTeDvsbcJBckJpSF33AyfdrZ/KxfzBhtl5oKMUZmSdxtby9VEBzjT6/VGQZvvEaeEHzdDAfdB+4jPe9/KUCgYBf7IhDH3+9Rrl6xQtIyErtaAWm+wQlucbMMoJgjXL6F9V6HqUer3+7OvNJQdrZiYcxHRlXynT7cN8iw59rOHQxEaNOXPwz9TS+wlvUerUHibgS1GOnLVke/NFoEi8M+B2pdo1M2x+YBdX3hi0kMYB0VtZM75uPKS9I1ZSFfLmZgQ== encryptionKey: MIIEoAIBAAKCAQEAn4Yfcri3RetiOo6rc3wzUUciBMWS/v2cKJc563ralqhtUTdgTiNv82pFP8A4zPmOyLcn2qNkidPlRMGXHtuABbqBNGjViwIYykKkZaPsP9ogrPvd5zKDaXXJaLZODZC3LVmco37FxWBctaQvUcWwvhBRFyu6writC3k27hdZXfgheGjd461wPFUibAvpyrlQVA0i57O2yobkTsStITID88MTCHdKJuNXmSJg/hI1ABAzLIOb+lm2kuseCBJtu9d6DoJwDXS9+H51sQQhHYSph9YGYMpyX2MmbbR0HMQjOEy/1wlX8l/R9m59A7wFQsjdb1Ug9OI3BYrA5k8nO8zlLQIDAQABAoH/eEOlcdfQU+YhKARnPallBuGZw/8v0w1frTpVcDIumWZhA9m7wSz2OYzkqCtCp0V9X9S1Nx/3q/ET58ILLDhPTAJPZjOiyinKhrG3PulWMs0/1SoNIT/z0o36Sfcm4RM5BfeJH7lzYFpFiqs9AWkI1kF24QEWy7ZuvzejMdxog25dDMqFW3bDJYYS8IzDI+gNmgrNLxh32ST5Ugrjeq4SgUjfKWMGARWPzQk+x9fxzhDJkIXtRqL3SDQmlN9Jy+/p3NuCC5gKTIYcoNEsrTnKqDQQL+Hr8KY8MaywmK1CRWcp1lguheAQqmcqyWdl11dAdIe+sSG0jtYeN4RD+dV9AoGBAMaRFki8e0FprmKk/sT6xGtLimptBh2YPO3Rfooow7aCcCP0ZRDxGUs56aCla4Cg7BBoWldHaPPdgG0rxe/Tocu5AUjohH+s8OOAP0trZzE6gavJV1Uv9XPKUs+EDpATbjFJTFeBN4Im/3uBnOx1CLE0tEOkAvW+NI8zKRUYj+8nAoGBAM2qGh2T+6QQnSvuBEEUCy/3JAJ1gkmvfJpZcE4M5kaQr0iu64L4oYE/68HqcK+IPzSAGgafn4cgodOh59syMMJ+7W2S5YS84JdLZER15SOQ+9q8qVpvqnsi1oW6tcRKdTFinnf/AmRQzWdkLsTp88ew+CSl7VGbgmVcFtcfIH2LAoGARrOMUrPB00W00OzcxfhgDbAlBcXyAoGdWDRasQjYvths43B2t/SQxAdH12pu/6rMwv7VA/SqOwKoYrbOUJlzJ52lBne8DdXfI7IbV1hTsuSZHTigfvWHmQX2PGtR4Bz7BFOL+jBJOm92UlyRKmR1hts0QE1avHNQNZjKzPck8MsCgYBwc8PXzGRZbuQhcwFMfCMp1N4RoiLdG2DsHF81rgPzLYVKHqqTcFMOkt7bps56i+rTT//rAzh88DDLwMk/pw/WKQS1Vw68J3I+B3EJpdTmP44WKfYHhusWbRQTBuYAMB4oJJ41SnAKXcwR7ktMTAeJdpAXqco7RuZjeZjbgx+GxQKBgDycT84wvDxoSz90iY+6pzzBQkbh6sDgy2IPV+nSXKIfvuhefZP4tawwHjwg7oscHv81J0/tkucf1k2VN3NyiqnYlT5Q5EgUxmyOiKw+jkrXBAjQtUgSzPAth0j/mMeQSCw+VrFLNJVGrc6g9s5gNrUFJLa2YnQT1c3PzeyVwlOQ
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8091 - 127.0.0.1:8091
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab - peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
- peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb types:
- tree
- file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
- peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK types:
- tree
- file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
types:
- tree
- file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 11

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4530 - 127.0.0.1:4530
tls: false tls: false
account: account:
peerId: 12D3KooWNMsLYe7L5vArsgeXouWZoR3yyyPB7mvWbVhPp6psTjyq peerId: 12D3KooWJdzYSrwqKT6zWeS7UDGBwASSkagX6tfWjHP4PoKA6p7R
peerKey: 3tPwUjvQHSkMuJ22kP4BdmTDYznn/32ijYEQ/+ALvoW6XjrM4KV2Y+tDC0Rb77Htrsn3alVNo/E/dhyZd2tlGA== peerKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA==
signingKey: 3tPwUjvQHSkMuJ22kP4BdmTDYznn/32ijYEQ/+ALvoW6XjrM4KV2Y+tDC0Rb77Htrsn3alVNo/E/dhyZd2tlGA== signingKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA==
encryptionKey: MIIEowIBAAKCAQEA3KtHqztTQ5yvWF3onxT2+NVhLUErwi+TT1jXiZF4jIPXRnLZBIf3g/6RvN5uS6EzDfoSnm+oAcXFlVSsEu9aWtcR5iinVvIjdulkruzMqMM72zbXVB5QtPFxpC4/ySMjcZRyYml2b4aZ+RMl7fK03ciiyvC4Cm1PoY3Guy/95mq0Z7Kc/y5+Lvcpx+g3sgfHnspBYaPGbQdiUymZGyr0MqfmrKiwcZSLqRKOcWiIzPz72PZyTXgM2pds1FBwHpkJZTIUrHjy+CCoMKA4NzhjML2+ao5VQOhmJsWIa5PtdatqycxxYpzyTMOIV1FcigmdIQpSqhoAVKIO80l0rdhstQIDAQABAoIBAQDKXnGdgQx9JwZPXd/ldE6CKP2ziN7eeM75p5oS2UvaYVZdjxmi5CaD8EQrFznDNhQiL0I/9ln3Ni5bIomj28nbIP2TO5krTWhktunU2eleo50TDpou1JZjOkFjtd5dUVJB6Ud1JQ6ufJxcJclVDI3+Du/seRHuzgyHNgQYyoxob6IlMn8TPC9E9wJhdHGswo3k9wNstBE3KXW3XAruahqstELl5CPAjjDxwskpKMn3EMluk1cA8gKq7PnjyO8HJU4LV+JBuJ7Kgb2lVQyZzVcyM7SDPcHuCQICyRST90444iYDFK2Lzfx2qJ7wCOQoIp2sYaMS7bAydbthlIkD/JnBAoGBAN7WRiyBmxL0oJEJG+0mbvo9lJnCaWufth6T3BLY5rXf2IiPcbYsQBaDC14FhHLkt4qbFUnHeCvW8pli0Vyqiyad9EcwCAcsQg486GAD+jNfRH+wnRgOrfZ/quG9H5NkpoXhHEcRQx1JLt1K39cuJp+dGje+b+yks4OzTFQd0GN9AoGBAP2CaR/aK59+ofloH6s81tEUNlw0r1GhaI0q8rQoDuTNz0rrpc0GNJlnrO2Q1DOfJpfttJBbxpmQCTnEv2PNhI6REgJLz891Nqj7tLOMZsZdhziutG9dVpLe3SXP9arMgBtmF1n6i7nRrmNm+4aHuK2PzJEb06K1qCLlnwRUNIOZAoGAT2aaapFj6EUyUXulb8MaGCCJKqCTX73w7sRQzoZq7rNsPHygUAFEdMEM89uTbj0BCWppE3j34OceWnlTkGlUW9Y8jIEY2zVx9BDP3CaOqG9xwO31i/TvF7417WmuLp7Wly23HbuQ5oaFJGThjZLsQEOCbAp3ZyLotCzXLcHR1yECgYAIpzPpZ2wHxK3IspoqISh/+H2mhhHZ6nWEJAwmxBtGChRiTUrahbSz68sGTORBYtRRaUa5irhrs3PtKd8SjAhTSXZg56+POEQGXpkba9ZyPO0JrUTxbDExUDQiP0f2bYaN6N0xMBEm5ZZbRD+fpvBR1E+6QEXoDuVPU6Eq56jnOQKBgHfK9Y4DjjBJgSGyw0N3BfjhfevqHM4Qs0hoodI3z/90SPWG66+wfIqAC5jshSMvaH5UGB4E2DAnHcyGyK0dQ4i5OmxlLAfqAfVD9CAvVWgEhY4fQ+Io3WTzEq92fgmyIG+nVZiNFEICkHHVJIYuIwxgeY7qswIeP0oAbnUNrjTW encryptionKey: MIIEpAIBAAKCAQEAy0oPQJI47puSNmKiTZFitSLTGf3NPZw7l7ee+1P2BU0ZGsRIdJ4U/vebpNpnnpgQa2qV8Z/gALON3YUSUSYg15qfjFGfGvm31TOTd29RptonfCOczkNN7qteZwmNt0BYx9rKakJhYl8nNF4no9vIqk7FVZAOIHSHNnHIlSUpdXSCakrJxx60/JQrPtLnUSKwwlBNLAPo4sKl8Y7sDjDiQ8dyWsj4KDbDj0PLjv4Zr9xk4rm+OAv7lI139T2e3pJ42QUWNw1iC42kgGzfKpGg5xbYdjfb6iO0y82hu6qo08sfP86n9h55s2FwPf1QBJimbVtklKccpu5bmFEkHGkZowIDAQABAoIBAQCR8cdlahSpaNLdbI5s9bVRqYC4pjdUxfcagt8GPE7hm2osh0IlRuB387ev8IR3nWAcXdbsMwUUO9Pbdw+hZqgpYX6ttGNvcFwEGhUCp86M5Q131/FZO4SVlj4d5wPwzadvQ6oSAzn676krtXTr9HvpmMefF96sejwgYCvKt3U+Nm9c2OSsJ/q4nr1dq957kt9+9r6xiGCw/CtVCiO3MhXdAJGjDiGs9qDao7Q92eJ9nEEOxDXBZ42kcieVsT8q5tjU/JW7FeEsoIVvVEkoe8cmQ3HgyfpFQ56Vo/ANTmG+yOiopQchpxLRR2gHp1pNL0ReQnITTg4KfYFflMR5dpWxAoGBAP71t1b87L30AY2pzUIBeGEhk0vq+agQVx9ewjowoZ+rVqbP2CNYo2wBoQ/ZhUSnquW7DvQDMpOV3seupCcs1i649g0TH4fbHMr2VZLFOKpg3aS9dR9S0iR6FyKJjN/OOrQAwLk22B3Wr4wqoScqZNVtDPHUPcp2KCVYBSh/2C81AoGBAMweYMBn3IwMg9OyPpczQXqBBtdmdSKpEEct0S9Zkopuyu10BkEJo/W6SuN8Mvp9oNaNz1nGefnWAaRngJNd0vKJXg6jN+zIq9zb+BB23M0H5sfbj+79bOZ3J7ccnzitDpPT7u5O5Re0uVO9yXhMmMWDKJZ6jEnicqN6qtSWW4h3AoGAZmGrbs4AD0NFwGpYV1IZ0f9Wk9zWxgtRwPIfUpimvmRiVngOFhuI/F0nHSM/JdOih7/3ADuseqFrJYpWtriFhZuWiqeMONTfGg2TTW3PFHPzbSz7NEngwu8YDTFpFZJN9mx696UzYcANHF8d+YlHloDE+vM8oOmTs3NGFv5HhKUCgYA7SE9dUkzxt+jJoSkgjNhllffAs5ctm+CIa7wnfmJbJlZ1pI70cLJX+eUqMLY1nisKZWFld4mRkCAl+ZGUO1m66z6QDcN+V8HigViIn5z9R2A1h4VEKgJo5Q551ixAL7LeKF1qhStwOSLiOWq8L7LnGnK9UZZRFx2ocUYQPCMVfQKBgQCBM0YutMekCc0VUUlJvN6jq5S093xeXrjJFQ8qRwnRJL8mF8+XLPS0jxGlV4f/2NkrxrFIhXL0J6MsADwqXf84iuwyMHPBP3vFDoOhtTgw8CBq/JG5PwXOhiRIRrtd30HrEIktEMVMWbOJ1uQHfTO93sjySZR8J1oTJvImmuT69Q==
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4531 - 127.0.0.1:4531
tls: false tls: false
account: account:
peerId: 12D3KooWSNzU7m619iEC6PVnRPUqzM5XtiFX3VZekyowTAzRW4yF peerId: 12D3KooWHrxbA48bJ23sK2T5cYWDFsoFtG4NPmcQQykXfjQhEKam
peerKey: hEvfnX4IwcbH2Mqw1hI4q4xBHrlbZufPXBFq4ztz6hz2Fp7n1RsiG7MFgk6mqxLmXuB1drhlqfLZPCDYWRkoEg== peerKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg==
signingKey: hEvfnX4IwcbH2Mqw1hI4q4xBHrlbZufPXBFq4ztz6hz2Fp7n1RsiG7MFgk6mqxLmXuB1drhlqfLZPCDYWRkoEg== signingKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg==
encryptionKey: MIIEpQIBAAKCAQEA0nsJzf+y8waYqOu2jvH78q2typXTIKluz+RJ6CdRNH9CGwq2Ag7hwkYxxtr0Cq5EeI24+OAdHuJIeFQ+LLm1YE+RG+Hv/tP06kv3lk6b1jCaUVzu7y0Z+V/O4MclILMAF3gn+8K3+TFHdTfM8u3J3Hdbs2gA9y81Y/B+HXBpqnJ64E5fFFCTip+WUW+3HMyH+XC0c2JrCGdsuPQqdjIAO7HRb8us54kKP299BfKRe5FlAN4d8NliFGQVKnJiJP7RXH15Tlv3pUxMNefZFJCLFkU3oocHjs5/ykXC8PVTY7kkSpqa384ZN16ip+JWKcg+AqhWYDkiPy0mh5lFSZkO0wIDAQABAoIBAEzOXy6Pz1JFpvGFSlHxVbohzJhvgeKaUXiFWr7fkg9xHMNXbkFkAtfs238wKPu4yf2f4c7XoWjCtCVMwH97qQcjIdWl5fj8iZPx8sAjoVRQ2g80tXAL6j2Iy6pUoWTETRVDYHvLe2zwoZ3RpfVD9nSADbNzEV8iF/6HJM5DVhu/D1PQW7x/3jmI+GwnLDpDQ1UCv/xSiXqbqjZeL/+pU1L9NrSs2nPBsn1V4D6YCwRp84VgYLxaxl90wwDMhg1VBuakHLff7ZWl/BYiowCNZQQEvYRqWoeFopI7T8LjWoifIJxLWOL6ma3wgTkXPd4OQt319m5rWekUMZfUWH7bbyECgYEA6PGPuddpSC8faaP3jnKAEaBYZ6Jej6UB+PDsETB0YUruxbA/0/eSLo63mLJjgQ1BEZpuQmtj2x9qGQ6pkjwTcF9pEp1o7Hizemd1EClX6MLAATnKFlkqmCjlnVIAP5dgz0lfHMFaw1OEB7Re7UKwCYzTwuHx97lZ+Mq7ti1pOLECgYEA51BMhJ9hD9iqz7JCNuMPT7ZXdQWnky8wQ109DOOLTH2Nr9RGaojVtBVAdyU3NIWYuLcpR/Cub4WrOe6jOCGT87sCyctZxURjG1h55uO+xF+DGRZukxihC7IN982eC2qzlgqT9A76KdBDOCm6Hw8xSV0rObs19ddGYoWTtGRY4MMCgYEArdO85fhaJzSK42EpFdJZwU1/Su5+VADVRPg7oOQgpI2vOjQ4nSuMmVOEq9zKpf3HBaTRDJ1oqZZ6rPIlFevgsaVxGiP+rR+xBvF3CLVhVV8muoNuS1kEkQFLvyb26n1DD8v3vtSGr2V+C+XMRI7UIHxHdZD36F0XR7G5e8vNTjECgYEA5riAajRy4xRxY9NhGlAm4JJ274FhYXzK/hZNI8L/GZ+OKNhqGC8+QW6FK5JSWy/6YhxHr7sQsqo4XQN7iCxt38kkAdW0SABrfkYk6Tk2+bZvFCH8zvndAMZsCkTspGSclkccxm399qEFu0pbnElSFuQ4jk/+haVhTjoAVwlUYXMCgYEAyFjuNKLBDvOI3YNjKXmja8kDAi8xJSue4W2RmQoHuPXfH9VWec1cxsWMzOb20Y/9FhdhIXBumrFFaywIMh2CNEgEYpuE/cw89Nf6wMAt9p/hv1RtgwfWT2MV/VADm1teNvHjGweOS2ylvKfd01uGH63eWcmXrFP90RbGMl7zmv8= encryptionKey: MIIEowIBAAKCAQEAusKaR2QZwH/v2cdbuLiSmgiJ0f3b4/NqKpyq3Bc2r0rrxrvRHHagywRwwNAy+TsyHRzVys3pgZTL2iWBzxGn1gvAhPv/EFSm24KJObx/GIG+fzefvK7SRJz4AWt8x2ijSLZFA5kqXLE2Gkl7GqsG1vK9SzPIvsKPr/Nt7sj1DO0DFu0taRxS7lmK1kGt3dw4rkkb0iVWQ3QDoYnABdKnKVqiaJc0mFrjndqvozC/qWte/VggSpJQ79I/Dklm+TQcT6bLByQe/iB0zVWnrCq6JRFxrqVsBBO47bDW94BuH1lfnLrrn5m46rT+TOwHRwPfZ1WxnPl1OJGAIAYPRTUU8wIDAQABAoIBAHDjPFo22ZIQQyzCYmDPwF23F4eFCStKcTv8oxKSPY3LnaTs1kN8OUk+D+Gcd5NLAsmyKlCCEsku5eGglkxSAb9SLzazE8QNRyacStJJbBGmKz2+o6FrktHCh+5jyHLIfxpuglzgckjBHVDaZb0C8AlxhJY2YPtdo3jZjfOuKOF8Qb8Y1SpJRBQJ4v/7NduPQ1SZ9Pm+yZmJ/UQ9M4m+Sav/pwtxnEEFS8rNUODCMTFlgYd6g53SyAo1/X1zlD0b7tr3Veq7OKqa5hB37sWgY65qiTQo/PC3wGbH0Ao+IMM0yhg6Lfp9lZ6qApMV/azDHqP3RUsD0ytkpxK4TyhzaFECgYEA0mkXXel0E6w55d8uhRp36kQzye8A8v6rP86b/lmt0CVA7mQ4X5/Z29h8UcaVlJ6IygI4afk8IY4OwdMB9E21otS5RdcKfz21vOGZoAqj3HFaXFozqNfSTRNlmh9YyIWY2TQHPvacrJIvg3p04uT0TKI7EQG+1CNPYpiqQHcsr9cCgYEA4zmwnIrLqJLMykrnOqi1PDRO4FvB10q0171Nen1ow1sMpHl21cfo8+r/jY2xmxOhb3RBDQcK837HiVvKcSc79tF/EqK43ErKsW/MoUu86KTgTX8HtTqflWb6ZrG6hFYvOtThSNNBUN7+HHOewGEtQ+jAP+OJHrDIWTgbs7Wt0EUCgYEAncyO57FzimV5rnnoq44kLJ8lr+X88kAoMlxDBUhAYH/v6FllJeH+QzBiW/nwqFsU/1sW7/MpM4kUbCxRpOS6ufmLUWNqze5748HVsv8H0QV53RUQ9SmW4JMRebrUnN4EubCZVpEhAxNHavVlv9wxk19/qMuEUBiDKtCPrnUyIFUCgYBGmec5TJro/uvoswtTm5XsZehYJ8p75Xd5TRVkyNCjWof8Fs2IsTu9hjfvOKaFo7zWT43iyVxqueqv0Dh/ngwwrXlJRgwgTpDaPv2a5FiHBKu5CI5RjiyFlGCbRf/JHKpCImD5asJxqUfVeUtLRSZ2YjxR3ZX+Vjl6F0fsN7gQ7QKBgHVCnFcLx8HLx9pTsIWxDJuYVwsCHEp9EYExp/68PU8eN4Q0fDhJ6MDzekG3HnrcrVRry7fSiZcepDs12/iWZsFfNnLAtAUzfDpsHOVq+QgSZfsoLdxGYGdl2gW9NvKmS6YYaWsgHrswbeb4Jh4AIrs/Acs4t6/Wf33DWmQEQe5x
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4532 - 127.0.0.1:4532
tls: false tls: false
account: account:
peerId: 12D3KooWMrYk1QLiE46aJBnLCfAawXJ6fVgppWp1DUNfXSiH5MxE peerId: 12D3KooWN2qtMAhoDpXL49iYQE5BTxbDwfAeZbwEAo6UBUXXdG3x
peerKey: 7nBRbL4urB+itm7SJ40gjPYe/N5Irunyr6qkpKqlg1Cy21w4WpuKN/TSgaDoVqxvTbReLbu27hhxEzdTrLNO0w== peerKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw==
signingKey: 7nBRbL4urB+itm7SJ40gjPYe/N5Irunyr6qkpKqlg1Cy21w4WpuKN/TSgaDoVqxvTbReLbu27hhxEzdTrLNO0w== signingKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw==
encryptionKey: MIIEpQIBAAKCAQEAvBXWnAyZ/CGX4ROQjg4xrKd2CQw8uOHJjJaB66UDawAz5TLcL2WDfHHp7Mxua6+Fy/a62xp3OBwywyYGelGzNIWPd8oR5X1SUYzKqCR/p0ThybRKeUkYnj/UvjF1UzC8NUYNWBCjaZkO4HalYpjlbf0vVDryMWow4YE/0cb+rsxdxJx2t/ThKS808rz0WsKNcZObOM8Vt7RNkIfOKsdwP8GUKx7JMPa6bkobW7FvLkmCgHMPOo2uoAkQIMZLXSB9F9RKDCSBToW0a2r9Wilo99x1t9PZLzQbAKkuM4ZYkp63rfBzRRRPOJaAj9Cb0tan2nyQkRrVJ3yqGwyFjbe/qwIDAQABAoIBAQC7fElhZG5almH/SrFd6Wg64vMWMcyVvvxZ1+3KJ8MwdhNE9V3nIRngguzbzyyCy4RjvJ6mqcsNc45mWRE7/RTV1g0dK6CLUlEsWVvqH/fflRo9JirWm7aeiKJYtJRvSLVTpXDHyE4chSX/OkXB8wdAjJERNXEXMPNo1p33TpWxRu6x8mwAIBK+YFI+SjQNuAteOT+qKAKZsyLbv+kr0tBRyHfEVdYq6RHzbtMCJ2h2P6t1vywLGTPw9rUAYSFOnsYfl+RPAmmZDF4hH4teIJIWNlfESpppAFAIrIg5+RjKVM5Bm3Ez7vx3sXDPd+aabxKoqC3nakHcRwRYJD2Pc1cBAoGBAMYkxYj1C7FkJ16R9msptdiV+aILzGkpP7WLYSX6dtQbrwe8FK7UrCwfkm9Zbyr9HOik1SEem8ePgmZktCdzGyi7mci2BEvQTzDnN3T6aTG8808jP7X3Apgxw7ENhuNbxtygJdNZC3Szrvz7NS7bcD/SYsSJ7dNEn7StUZjGrf4zAoGBAPMBNOwvFQCALNPQFIY2tTStL6TlIJgcIfhUhF9pcwv6V9syOxepWe3v6d5aL0ooXU+59/V3pytNzc2SGeiKB0EuRye2Z7b79riBw+EqOMj6jG1DX8n8FfNhX++8mH7LMsxbcAN9jucIZHCUQm6WYedHwq6vvc5CYbCmsJ6z6VCpAoGABzhHylnDd09C7/s5k2YNrjqowfLUG/DY1XCitZOOyOPJWOrNhiFRtLnhyBTmLBbU+tUmvvIyku7zvW9l8RoMn0tWqy2WsnyApjOGnciSFLHh27xZEfRSL+GAU+8+PwKVGGztc+oGtNXnRmiQ44gzat/roWW1OMGDYD4AfySeKmkCgYEA4c62Qd7CUlPI1A6gc9M0cT2Zb03nCtHhkyPeWdbgLDo2F57GoIci5OIyXQdKuEtn4iT6UCQeuDO1URg5cQeKFDyPrExodfYO3obe4UXdvIxtnz6jLUtNjnpmrpx+zBvAGXvCS8wJ1Y/L3X03ehHN6h+Zvb/azWaL5p4Os3qVDPkCgYEAkwlmHO1BjozslDlY+GqhxOTWZ3lKR/B3C/QttmK9iBdRDc0A8Yj/TJteOgBkGxGKRz+1Z9JS+CTIY6/TVvib4NDLIZiomO+zIMrn4m5O77YnupIWwxoOf9MHPmQJaMQuPyxoon7eUL29rEmz0sYZMI8/QrACqPqTDyEcl4YJreQ= encryptionKey: MIIEpAIBAAKCAQEAvVOwhYbGUYrdOeje7ODF/RAkr9pXsO20tkimaW+q5LFdNiUgdSugG7e1lZWPghcBARrBsIPNVe4m412q3gbV8cB0ObNbONOJ3cnKV5o5x8MG2GB5TYRvdCLznqRP7ySzAconHRhZ9s6Ff7IT/Vex3bKr7Q8vRscIUMqNUWPnnvCZHwUcbhAgjwPpmcK5xfja2EPw8JupcBntg/cP/h6Zy/60G6YOgRiwnfWMV+Fhip3ALSMh8vA9bLXImJ3LUHE1hAYlQEPw2dPa+J+3lK4Ou/5qKMdygp2/YiwmJrseXbf/6qcySumuezK3NtDoR/AqA2bGEdfOdtl2G5xbUaN1sQIDAQABAoIBAQCais30sOcBeNDMjIIr6e6ze5H22cvq6J4yjWsJddWRiBYGNJgiDNJMzdCzobna/twbArRIWc4q7pNf1P287ueExwwYbYdxA3vuRuGcUJAJt/DGfzmFRS2VJ1KllIqLMvHL7C+xWEdXZ40hh0M58XOG/GnKwDJfG+h1ymFApsRSv7ri+LToTEm905JPESou8RzvsMxiaPtkzxNY0W4RbMchPU/RiR21I/iRYozaV+ylaRh9RAbvfSAg92NrN+rW7i9uJQSm65Y9dBlvxRHMiaOR/gpCeUr9QYOvoSzvM23K3X/Tj60HcsDUBeKi1fEd700JQjtU3YC2xXQV31IEgCYBAoGBAOdNvPB+LvedoWZKPhCOw5uavOYC+f34cWkV7eM8FJVnW6Y+MmoIKmK8nMyzWch9bESzwEHx2uv/TbmcFYJdf0v2voyTG/LxfoS3yRi9zbA0M9mMJcuejR6l4H9bWQev5TpIF7kdm1NpBm7WBRnOhWIueIgdrJgtlIuey58bubvpAoGBANGKmAfyK7nVuAl7EWJaVhNTXBuQ7BCLtPVnd2+WOr/CwRAq5O0aoZh3+e3xJlz/dd3BTH9cSvRogi9ckaxz4MTusHDXzXcvEc+EG/GjaEY0BRRhWhzZNZESfHDaAXAUGbKuAm9hcuo3xfVDAk2OWyWVsLLp1A1+fd4k+jJLzPaJAoGAErEFg6muwfPLBykYut3OkNSAT1YOPafGAmfzQVmpkCk6DsUX7dmbEz+KrEASEVGRXjvoXWvd9RQ8g7NJSa+kic72twVsTMWXI8J2TbmI1aRiTEI3C61UWhWtfp0zJJviOkN5J0xtMOBb1LkW0G8P+E8pDlbXi7SjPGUor0LeT4ECgYEAvE093jYkUTXb0rlDoAzqOSe6KBON8Dh7/+RhEmgAl37enDbPzrsV6Lw4XzlMblorg4JHylQYD5czFnireDwSCycsa9uiiq5D5SYlLnrYI+5veicaIb6YQqxII+nlTODjTwzMp2b9K7m/LW5wTV3WTuo8BivXIeFAHzc/l59Cq3ECgYBlW+VPH1CX0lXmO7A8Q7Ih2oIbASTMdoJUHg8tdo0PlDUKxjRP7ECUBaKLiCSaz01RKgonnUZTFh26iAqPs6aSLhcIxabq5jLDy2G9VbK0trEOYhn70cZ7j7Oev/8gAy1z4fGQLZEboA0S49LvQAT2iY01pHO84H7f4BVpIVzO5A==
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus

View File

@ -5,27 +5,36 @@ grpcServer:
- 127.0.0.1:4430 - 127.0.0.1:4430
tls: false tls: false
account: account:
peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
peerKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== peerKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8080 - 127.0.0.1:8080
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab - peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
- peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb types:
- tree
- file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
- peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK types:
- tree
- file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
types:
- tree
- file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 11

View File

@ -5,27 +5,36 @@ grpcServer:
- 127.0.0.1:4431 - 127.0.0.1:4431
tls: false tls: false
account: account:
peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
peerKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== peerKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8081 - 127.0.0.1:8081
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab - peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
- peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb types:
- tree
- file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
- peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK types:
- tree
- file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
types:
- tree
- file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 11

View File

@ -5,27 +5,36 @@ grpcServer:
- 127.0.0.1:4432 - 127.0.0.1:4432
tls: false tls: false
account: account:
peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
peerKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== peerKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8082 - 127.0.0.1:8082
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWCi7waUGMExFaEMgtKmTaanYaPGNhWmEx2nf7jFEXgQab - peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: QQwIKP+YwFY9WzeluVGFwlLj3EJ36RNtGH7QY4rJsAgq+X1I47HaHoFUg2UNZIMtq8mggHYZA4a1B/xntR1RcA== signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
encryptionKey: MIIEpQIBAAKCAQEAxn9H+w/uFvOd8rW5KCpCvisG6JmDQa1pp1gPdWhdTpqj3yI/3pYK5kgnZhpUF83bQ6zKsNSVcxRqRvW8ZBGA179fHwTwe/KkMuAhgoOCMNG0+EKmRYQJdul2MFvgOniVJxBNaywoCWA0HI24sk4Dp7pj2Dn9yhcj49J+j12STlY2/+oAmhA8a7nxZ2XOMZyZIR9jQ+9MgQdTEa65LSTMTwQ7/A0g3yY+t8+BxhYT5hEdFKIgAV3iapbpP8kT/EvVHZYFz0RUBa2NC1xJAjfFCliGBqD9k7kUNOmP1al4EXheueZDtg1WvwY3PRRcDuSvxLCh1TAuHMMOd7XbR9CrvQIDAQABAoIBAQCiui/pe8rFWBzRn/bWHacvvZhhUZCQZDjsbr3lk5SC3zWetLZFpR30YYyjIMx141Zw6ZQVWYHXoRHrcINsSgklVgcGKAd6pZXE+4edNnCh0xmYOROUg8U6jfRNetSdOsOUDcJaLQ35ebve+LREwL4wYBaAajJL3aKXn7YPlDdgLc02OeQ7t3hIGX/nxYQy2X6+GGsNZvZvmiEoO5cCKPo3lvHIA8nnjB/0J9Cd8ffqiTNrw0NO/ErHxPxTu4II+3VtJ3xWZKlVAOI7Q2uccexdqkJjFcJHmqRWLf8zQzxZxo1TxgDZmZcQHG4sQt/XBL6A2xoisi0kwo5yz4f5WflBAoGBAPKtjMdC92cZLtHlBYvqrQqxJdCpQyidVEa60o+IH2q7VDepLW9QAx0gIwZIAKk/kcTHCtNu1pxVaX7YhVmdtRj8cr1j7g+CWtYaAeMrlpDhUghBEindtVV0gOEkIMbn+Fpzp6/km8LCjqzD2SlVex4aJV8qCRi5WpK3W0Z9RHTtAoGBANFk13fgLry6es7roQvig4Bkg8Qtpy5HYvAyTPk/2q6FfNOZSSYw5y65FzJUZyTEWTn8EjBA+bngmAc6xEA4gr1diYduEm6bab3unXCGzBVWqih+cTAh9lPgmAAHJD3i89SFDE9s+Gox/1n7vVz/k5P5ac+1XyqWXCHI7j1S44gRAoGBANMIZtbU/k4SkSuHzIX64tXcbPUCbFuCTUpgpkCY8DEhjEAHB3K4Eq0eSDbrIGAN3tZO/LQWu9whTmc3JOdkhJqg1aqqntev1QxAe4mwWvPMbUiuRXxQx6LzeCvQ/gvap5cI4jbMR0NbazUD7vHJ2xG3TO5voI92iDPz7RTkVEaVAoGACHkoLvWnboOtTIpEbhKwd5WZr2qZhUnmOwoOC1gGJWHJd1aQmzcHY+Chi6vWsKoxYiNNKR63/EmWXVSHdIHU6IzMb+qIXGl1kfYB8PfDcmmbYSAcvHHjYemIvReM4+Q3MbZglSY3tzRmvOFu/EBrXGWPXpRcUYDcIZHb8idUhcECgYEArvEvxIFHIIX3bhMgXhMvM9TJ5/t/e2YHm2Qz4COeU6Y19CklAjvZ6CpZ9lGUWVbGVflI+ivayAT540HCT1kwmK8WDYrggb64Ksir0TZsv7aKjp5pfZDc9IakisBEsNkjSkOF7xbUGQe5CSiK5khFQx5X8jZHqsczlBntJuquQgw= encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ==
- peerId: 12D3KooWG2nD7XFggVFw48xk8JyHwn8iCZ9W73gmzJTkgfVjAxpb types:
- tree
- file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: Hdpa1ee8nBVeIxYVcWjTSaVAfqvkBcqfhWRjlKi9fQ9cVEY6sy+MxMOa4CRQgM3eJCJhaLw2Hvux4rqMUJVtDA== signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
encryptionKey: MIIEowIBAAKCAQEAqJI1jTWuzef1hEdbE6Xth1GFXkJbLvn1LWmtyErrrQYtJd6zOsdncf522tcpxRs6LWANNe5HHzuP4VYiYnGe0CuBlMbnWLvH/vEh9Em0Bt7P3MrQTOFt/ESPN5AWaE3jeYc4M9WvZvLVpxCqJYE0xu8AkXi/5SqO3dfXKMyQ/kJoAn0FkAe44l3A7B/otqiYKp5oB+4/Fh1R0sFo3djSCS08KW9mbCQffQa0BA56f9cKF+/tVFqoW9YximwsVvecM8lr92NN3/kvO3a4xLnTZJNYBnaULsDbNS+Mdf0V+mkmcigaFumDHI6Z+Ca/y/tGGlTfExC4mRLOXgAnNIcXAwIDAQABAoIBAGf9UjXbcQuq1aWVk1TKnn5Exv5/9tpC7oHmWINf3IVvcviSqoRPMLx82vtjkmv6wOfvAhdL9+oHh1neFfYe23bV7+lEzsDJjrXyMR0PPpSibR5qqxdSVdQywxrmszwDGJoG1Z/8aWkb0rtuJ1hdnZ4/IF2dXNvVZi7qkNulXqjKc5pU16S2QPIjZ5YDatsl6Z7TZ48yyTxlmJKh50qmLO7S4+0jbVyDFyX8aAy8R/yDuZpZ1+aUHJkUqfvUpzngS2R61M/iAeGkNDP9mg59CwhJsOLsWSw5rA2MTwfmRIZjczG4WCfkhBhzQWztN8ded09xLySY/gmMYsKwpX9zwikCgYEAwlzJ0kC3ATNOQPhIwaVDY4eI8SRYTZIgp+aek/z/Jek+kf6/VY6eVWimEEjyMVGLTzjyrUOQyhxkJ2QqUNVJYongj/3yF8WE2+d+G50QA3J0K0b8FQFLGlLndgJ++AZmNxxMyD/XZ5aSqWc58SzA3UgbjTdDJwv6KYIc+r6om10CgYEA3geQ4XOPkm3/AagGvTRbM88nr4tyeyEzfLdXqSBdUBM+cB0t3l+mh0aMqPd1o8TcrvJ+33Kp3vmM2wq6Rj/jChx0pqQZeBX+/i3fSQUYiCnDeo2CsJ1pix3ju6xKIlssi7Lqf50AUH3TgPfeOEgl0c0skc7Iiw6uBbbN2jMbtd8CgYB8UNkN0DK9Y9GDoMr4gPoPaRtgEb0hMHwOqGV5hnK0DvHkc6px0NzZCCxfcijm/p86NtSRmgu8Gli9EUY3mZRsoH+v2d/E8KM//Fse0mDxs302SRrnXIJq/efqBUKs5XrvePxrgNoH+bko/UuERPm/D2X/9v7OtMx3TC+4+cXiSQKBgQDAbuxKCp93+S/YXqogmF0nhTbPNdwuDbOTN1CZu/xEJ7mo8BFON7acbjABTiC+pSPj2TbPMZE7OSy0uBKESmDb5ZfQyk9svhu4b0ekAO+nLBNJh5aqvnO4aFp10TibmEv+dD48BnY8TSHgGHSYcSeeM+aaJQ+5PirjtvGpWTx+HwKBgD+mqVa627FOJHKJ022L6eH61S466rvxiQqQdOKaLkRLNTsf0frcsZIEoPGXQmAsx79n5ezK0ndPsY2oWDu87teHaElqTp0oMzayuP1ognyFp5CjlUmUgLZ4ijw5ZoAinGVpBxYvHZ/KxRMxMhMYnXPYrx95nNT3GDMGV/4xG2cH encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3
- peerId: 12D3KooWLNu2jz93Bmw5AFjoWUWVqewjMDX9X6LDnD3B5vcDPMtK types:
- tree
- file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: eFgkHOqqWUE2i3HChsYuER37d8Z5Izd1ENfLmpMsgSSc6lnYW+35sm7b5J7sK1G+xK0OPhtz8uxYkT0f5gJuwA== signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
encryptionKey: MIIEpAIBAAKCAQEAzc5cRGNf5G25G5Lh1hKEhV3lgxxB5RL3R0bjLhtS6W4/xhMvSaZR2girvzLBK1ydXk95Oc0EUNfCE/QKddUy16ycC4DHaObMjf96cVHhiIfKhLTO5gg2mqisQ39+oTtn85/T1imYMlkHGIt1MvHqXoPQa8guDXB/DCDz+UeCzPBGUiS4ZORJHrdd9QP/edyowUsfvwIayJhd4BUKOhgWvIAHohOTls1Xa16fkpojDy3b1L5pFvQdMw0DFY3m2LtIYVmlw1YyE/vqbhR/DMAkGGGD2nHfSQ/zApGAeYgqNSyAAMwjAaXtXnW/SYPr0IHRAnm4Ojk0qKcUfaTFKSSakQIDAQABAoIBAAksPm6J41dCELMK6+fnsWJkWftrAgDcxIq3vR5r91kSIeOJLV1h/Vnzcvw1neh520W90xBhc+TKiQrsoJ653uc/+UCF/91MFCfsECAG3z9/leYuTN5x1UU1aWAkyZcUF8EDCaUM+4ya7TcJ2DJqF+EYjOyQ4oSU1ATNXzJoHotVwcZ79uPNRTMMTUQ/sZjE3OJGkoPzOoacjmAsg3Xg2M8uCC3HAqf5kO146CX4/x9z8EnKr8XHWm8oRT0mWLR3N2WFIJ6sDuyL7MPy4Sm2xSbqS5pJ3kC/rwuLcR4KlL+HyVvpTPHQlysiwWfKz1YycKNaWfeAVQFQDKfe9fpTK4UCgYEA5rXvM0eGTljFUYg5Eb47LNl/YKcQoPGL9zIrTuyYl0skr364iIXFQHG3cv3G461jP6/eBBs0sMZe47SpNv9zP+hYthaReVLzPqqxrCQF4rJo2oCWb774BnkxWQjbiPLSJi2cc+5ZqMQI8u5XxdqO9oJ4pCCxs5nCasAcLGedrrcCgYEA5F2Rgq5mN75dSzco5MDC594HGQ4mXpj9xCDocvbhrvEm0NY2/BTH23ak11EnSYJNCvI43NX2nmxEkVzl7TbNLBP+u6IxK1XzFXg4ki2IIu1ACzHwbBE95APxZ7n4BRKhFkew96HX4cSWSvMfmrK/Vb3hPJpV8UUjaru6CiN/OPcCgYB4B09bLmsBd82wjV6jjITc4IsUjdZo5UIcaU1+0jjQ/ZcodpUq8e2diYwXl1BSQ3LPP4ASQtU24v2bGfKvWldreEYu9a7Zn/5NLCEjndoyBv/mLeAWYxRGyeaSm7kblrkeg7xR1D9xPgwp1zZzCTI3rcl2GkxZVDWBtFD0CTRQIQKBgQDe2lzMrYp87Z23b+3NRjst8OL2VXOmLyC9y+trfXeBtD3P4Kwp1dGvXpnAsaZoOusaOoS5JWgU88z6GjEbC7avRBf7XW0kQC0HD5oNNLe8ddBg3Gwl2bGPGTX0pmvd728aAf41uk+lN6X/IEEAQ10qvDDYZjhmSbUlTGthx4A4wwKBgQCQYGnHr5fvqlmLga+xkPXMFnJE1D+Ya/fkA/HTGZfLoMiqFv2q8uqque0xb5Kaim7eyQ2SpE/yolaeS8L7o6zMKT6du5QONhKdQN9ccdW/3yUQXzWcjYjAyB+zdYn9vKlMa6VnuXjR5gA8RrnHGJMZAeNLOWzH1B0eJSi/Q8w9Rg== encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA==
types:
- tree
- file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 11

View File

@ -16,6 +16,7 @@ require (
require ( require (
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.2 // indirect

View File

@ -50,6 +50,8 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c h1:+bD75daSbsxyTzkKpNplC4xls+7/tGwty+zruzOnOmk=
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
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=

View File

@ -4,14 +4,18 @@ import (
"context" "context"
"github.com/akrylysov/pogreb" "github.com/akrylysov/pogreb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
blocks "github.com/ipfs/go-block-format" blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
"go.uber.org/zap"
) )
const CName = fileblockstore.CName const CName = fileblockstore.CName
var log = logger.NewNamed(CName)
func New() Store { func New() Store {
return &store{} return &store{}
} }
@ -75,6 +79,7 @@ func (s *store) GetMany(ctx context.Context, ks []cid.Cid) <-chan blocks.Block {
func (s *store) Add(ctx context.Context, bs []blocks.Block) error { func (s *store) Add(ctx context.Context, bs []blocks.Block) error {
for _, b := range bs { for _, b := range bs {
log.Debug("put cid", zap.String("cid", b.Cid().String()))
if err := s.db.Put(b.Cid().Bytes(), b.RawData()); err != nil { if err := s.db.Put(b.Cid().Bytes(), b.RawData()); err != nil {
return err return err
} }

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/Users/mikhailrakhmanov/go/go1.19.2/bin
export GOPRIVATE=github.com/anytypeio export GOPRIVATE=github.com/anytypeio

View File

@ -24,6 +24,9 @@ type Service interface {
AllTrees(ctx context.Context, ip string, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error) AllTrees(ctx context.Context, ip string, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error)
AllSpaces(ctx context.Context, ip string, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error) AllSpaces(ctx context.Context, ip string, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error)
LoadSpace(ctx context.Context, ip string, request *apiproto.LoadSpaceRequest) (res *apiproto.LoadSpaceResponse, err error) LoadSpace(ctx context.Context, ip string, request *apiproto.LoadSpaceRequest) (res *apiproto.LoadSpaceResponse, err error)
PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error)
GetFile(ctx context.Context, ip string, request *apiproto.GetFileRequest) (resp *apiproto.GetFileResponse, err error)
DeleteFile(ctx context.Context, ip string, request *apiproto.DeleteFileRequest) (resp *apiproto.DeleteFileResponse, err error)
} }
type service struct { type service struct {
@ -122,3 +125,27 @@ func (s *service) LoadSpace(ctx context.Context, ip string, request *apiproto.Lo
} }
return cl.LoadSpace(ctx, request) return cl.LoadSpace(ctx, request)
} }
func (s *service) PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error) {
cl, err := s.client.GetClient(ctx, ip)
if err != nil {
return
}
return cl.PutFile(ctx, request)
}
func (s *service) GetFile(ctx context.Context, ip string, request *apiproto.GetFileRequest) (resp *apiproto.GetFileResponse, err error) {
cl, err := s.client.GetClient(ctx, ip)
if err != nil {
return
}
return cl.GetFile(ctx, request)
}
func (s *service) DeleteFile(ctx context.Context, ip string, request *apiproto.DeleteFileRequest) (resp *apiproto.DeleteFileResponse, err error) {
cl, err := s.client.GetClient(ctx, ip)
if err != nil {
return
}
return cl.DeleteFile(ctx, request)
}

View File

@ -290,4 +290,58 @@ func (s *service) registerClientCommands() {
}, },
} }
s.clientCommands = append(s.clientCommands, cmdAllSpaces) s.clientCommands = append(s.clientCommands, cmdAllSpaces)
cmdPutFile := &cobra.Command{
Use: "put-file",
Short: "put new file by path",
Run: func(cmd *cobra.Command, args []string) {
cli, _ := cmd.Flags().GetString("client")
addr, ok := s.peers[cli]
if !ok {
fmt.Println("no such client")
return
}
path, _ := cmd.Flags().GetString("path")
spaceId, _ := cmd.Flags().GetString("spaceId")
resp, err := s.client.PutFile(context.Background(), addr, &clientproto.PutFileRequest{
Path: path,
SpaceId: spaceId,
})
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("hash:", resp.Hash)
},
}
cmdPutFile.Flags().String("path", "", "path to file")
cmdPutFile.Flags().String("spaceId", "", "spaceId")
s.clientCommands = append(s.clientCommands, cmdPutFile)
cmdGetFile := &cobra.Command{
Use: "get-file",
Short: "get file by hash and save",
Run: func(cmd *cobra.Command, args []string) {
cli, _ := cmd.Flags().GetString("client")
addr, ok := s.peers[cli]
if !ok {
fmt.Println("no such client")
return
}
hash, _ := cmd.Flags().GetString("hash")
path, _ := cmd.Flags().GetString("path")
resp, err := s.client.GetFile(context.Background(), addr, &clientproto.GetFileRequest{
Hash: hash,
Path: path,
})
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("path:", resp.Path)
},
}
cmdGetFile.Flags().String("path", "", "path to file")
cmdGetFile.Flags().String("hash", "", "CID")
s.clientCommands = append(s.clientCommands, cmdGetFile)
} }

View File

@ -60,6 +60,7 @@ func main() {
Address: cfg.GrpcServer.ListenAddrs[0], Address: cfg.GrpcServer.ListenAddrs[0],
SigningKey: cfg.Account.SigningKey, SigningKey: cfg.Account.SigningKey,
EncryptionKey: cfg.Account.EncryptionKey, EncryptionKey: cfg.Account.EncryptionKey,
Types: []config.NodeType{config.NodeTypeTree, config.NodeTypeFile},
} }
nodes = append(nodes, node) nodes = append(nodes, node)
} }

1
util/debug.json Normal file
View File

@ -0,0 +1 @@
{"level":"debug","ts":"2022-12-15T15:11:29.023+0300","logger":"app","caller":"app/app.go:178","msg":"all components started"}