files: ref, proxyStore, index
This commit is contained in:
parent
185f4aeb59
commit
41e2b26116
File diff suppressed because it is too large
Load Diff
@ -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()
|
||||||
|
}
|
||||||
|
|||||||
@ -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 {}
|
||||||
@ -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")
|
||||||
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
255
client/filestorage/badgerfilestore/badgerfileindex.go
Normal file
255
client/filestorage/badgerfilestore/badgerfileindex.go
Normal 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)
|
||||||
|
}
|
||||||
104
client/filestorage/badgerfilestore/badgerfileindex_test.go
Normal file
104
client/filestorage/badgerfilestore/badgerfileindex_test.go
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
101
client/filestorage/badgerfilestore/badgerfilestore_test.go
Normal file
101
client/filestorage/badgerfilestore/badgerfilestore_test.go
Normal 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)
|
||||||
|
}
|
||||||
@ -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()
|
||||||
}
|
}
|
||||||
130
client/filestorage/proxystore.go
Normal file
130
client/filestorage/proxystore.go
Normal 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
|
||||||
|
}
|
||||||
@ -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)))
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
maxConnections = 10
|
maxConnections = 10
|
||||||
maxTasks = 1000
|
maxTasks = 100
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
133
client/filestorage/syncer.go
Normal file
133
client/filestorage/syncer.go
Normal 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()))
|
||||||
|
}
|
||||||
106
client/filestorage/syncer_test.go
Normal file
106
client/filestorage/syncer_test.go
Normal 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")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
64
debug.json
Normal 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"}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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=
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
1
util/debug.json
Normal 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"}
|
||||||
Loading…
x
Reference in New Issue
Block a user