Merge remote-tracking branch 'origin/consensus-node' into sync-tests

# Conflicts:
#	Makefile
#	go.mod
#	go.sum
This commit is contained in:
mcrakhman 2022-10-07 16:02:43 +02:00
commit afc9141a7c
No known key found for this signature in database
GPG Key ID: DED12CFEF5B8396B
41 changed files with 3833 additions and 79 deletions

View File

@ -29,7 +29,7 @@ proto:
$(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto
$(eval PKGMAP := $$(P_TREE_CHANGES),$$(P_ACL_RECORDS))
$(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto
$(GOGO_START) protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. consensus/consensusproto/protos/*.proto
build:
@$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app))
@ -38,4 +38,8 @@ build:
test-deps:
@echo 'Generating test mocks...'
@go install github.com/golang/mock/mockgen
@go generate ./...
@go generate ./...
build-consensus:
@$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app))
go build -v -o bin/consensus-node -ldflags "$(FLAGS)" cmd/consensusnode/consensusnode.go

View File

@ -0,0 +1,95 @@
package main
import (
"context"
"flag"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusrpc"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream"
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
"go.uber.org/zap"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"time"
)
var log = logger.NewNamed("main")
var (
flagConfigFile = flag.String("c", "etc/consensus-config.yml", "path to config file")
flagVersion = flag.Bool("v", false, "show version and exit")
flagHelp = flag.Bool("h", false, "show help and exit")
)
func main() {
flag.Parse()
if *flagVersion {
fmt.Println(app.VersionDescription())
return
}
if *flagHelp {
flag.PrintDefaults()
return
}
if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" {
go func() {
http.ListenAndServe(debug, nil)
}()
}
// create app
ctx := context.Background()
a := new(app.App)
// open config file
conf, err := config.NewFromFile(*flagConfigFile)
if err != nil {
log.Fatal("can't open config file", zap.Error(err))
}
// bootstrap components
a.Register(conf)
Bootstrap(a)
// start app
if err := a.Start(ctx); err != nil {
log.Fatal("can't start app", zap.Error(err))
}
log.Info("app started", zap.String("version", a.Version()))
// wait exit signal
exit := make(chan os.Signal, 1)
signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)
sig := <-exit
log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig)))
// close app
ctx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()
if err := a.Close(ctx); err != nil {
log.Fatal("close error", zap.Error(err))
} else {
log.Info("goodbye!")
}
time.Sleep(time.Second / 3)
}
func Bootstrap(a *app.App) {
a.Register(account.New()).
Register(secure.New()).
Register(server.New()).
Register(db.New()).
Register(stream.New()).
Register(consensusrpc.New())
}

View File

@ -0,0 +1,260 @@
package main
import (
"context"
"flag"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs"
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
"go.uber.org/zap"
"gopkg.in/mgo.v2/bson"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"time"
)
var log = logger.NewNamed("main")
var (
flagConfigFile = flag.String("c", "etc/consensus-config.yml", "path to config file")
flagVersion = flag.Bool("v", false, "show version and exit")
flagHelp = flag.Bool("h", false, "show help and exit")
)
func main() {
flag.Parse()
if *flagVersion {
fmt.Println(app.VersionDescription())
return
}
if *flagHelp {
flag.PrintDefaults()
return
}
if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" {
go func() {
http.ListenAndServe(debug, nil)
}()
}
// create app
ctx := context.Background()
a := new(app.App)
// open config file
conf, err := config.NewFromFile(*flagConfigFile)
if err != nil {
log.Fatal("can't open config file", zap.Error(err))
}
// bootstrap components
a.Register(conf)
Bootstrap(a)
// start app
if err := a.Start(ctx); err != nil {
log.Fatal("can't start app", zap.Error(err))
}
log.Info("app started", zap.String("version", a.Version()))
if err := testClient(a.MustComponent(consensusclient.CName).(consensusclient.Service)); err != nil {
log.Fatal("test error", zap.Error(err))
} else {
log.Info("test success!")
}
// wait exit signal
exit := make(chan os.Signal, 1)
signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)
sig := <-exit
log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig)))
// close app
ctx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()
if err := a.Close(ctx); err != nil {
log.Fatal("close error", zap.Error(err))
} else {
log.Info("goodbye!")
}
time.Sleep(time.Second / 3)
}
func Bootstrap(a *app.App) {
a.Register(account.New()).
Register(secure.New()).
Register(nodeconf.New()).
Register(dialer.New()).
Register(pool.New()).
Register(consensusclient.New())
}
func testClient(service consensusclient.Service) (err error) {
if err = testCreateLogAndRecord(service); err != nil {
return err
}
if err = testStream(service); err != nil {
return err
}
return
}
func testCreateLogAndRecord(service consensusclient.Service) (err error) {
ctx := context.Background()
// create log
newLogId := []byte(bson.NewObjectId())
st := time.Now()
lastRecId := []byte(bson.NewObjectId())
err = service.AddLog(ctx, &consensusproto.Log{
Id: newLogId,
Records: []*consensusproto.Record{
{
Id: lastRecId,
Payload: []byte("test"),
CreatedUnix: uint64(time.Now().Unix()),
},
},
})
if err != nil {
return err
}
log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st)))
// create log with same id
st = time.Now()
err = service.AddLog(ctx, &consensusproto.Log{
Id: newLogId,
Records: []*consensusproto.Record{
{
Id: lastRecId,
Payload: []byte("test"),
CreatedUnix: uint64(time.Now().Unix()),
},
},
})
if err != consensuserrs.ErrLogExists {
return fmt.Errorf("unexpected error: '%v' want LogExists", zap.Error(err))
}
err = nil
log.Info("log duplicate checked", zap.Duration("dur", time.Since(st)))
// create record
st = time.Now()
recId := []byte(bson.NewObjectId())
err = service.AddRecord(ctx, newLogId, &consensusproto.Record{
Id: []byte(bson.NewObjectId()),
PrevId: lastRecId,
CreatedUnix: uint64(time.Now().Unix()),
})
if err != nil {
return err
}
lastRecId = recId
log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st)))
// record conflict
st = time.Now()
err = service.AddRecord(ctx, newLogId, &consensusproto.Record{
Id: []byte(bson.NewObjectId()),
PrevId: []byte(bson.NewObjectId()),
CreatedUnix: uint64(time.Now().Unix()),
})
if err != consensuserrs.ErrConflict {
return fmt.Errorf("unexpected error: '%v' want Conflict", zap.Error(err))
}
err = nil
log.Info("conflict record checked", zap.Duration("dur", time.Since(st)))
return
}
func testStream(service consensusclient.Service) (err error) {
ctx := context.Background()
// create log
newLogId := []byte(bson.NewObjectId())
st := time.Now()
lastRecId := []byte(bson.NewObjectId())
err = service.AddLog(ctx, &consensusproto.Log{
Id: newLogId,
Records: []*consensusproto.Record{
{
Id: lastRecId,
Payload: []byte("test"),
CreatedUnix: uint64(time.Now().Unix()),
},
},
})
if err != nil {
return err
}
log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st)))
stream, err := service.WatchLog(ctx, newLogId)
if err != nil {
return err
}
defer stream.Close()
sr := readStream(stream)
for i := 0; i < 10; i++ {
st = time.Now()
recId := []byte(bson.NewObjectId())
err = service.AddRecord(ctx, newLogId, &consensusproto.Record{
Id: recId,
PrevId: lastRecId,
CreatedUnix: uint64(time.Now().Unix()),
})
if err != nil {
return err
}
lastRecId = recId
log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st)))
}
fmt.Println(sr.log.Records)
return nil
}
func readStream(stream consensusproto.DRPCConsensus_WatchLogClient) *streamReader {
sr := &streamReader{stream: stream}
go sr.read()
return sr
}
type streamReader struct {
stream consensusproto.DRPCConsensus_WatchLogClient
log *consensusproto.Log
}
func (sr *streamReader) read() {
for {
event, err := sr.stream.Recv()
if err != nil {
return
}
fmt.Println("received event", event)
if sr.log == nil {
sr.log = &consensusproto.Log{
Id: event.LogId,
Records: event.Records,
}
} else {
sr.log.Records = append(event.Records, sr.log.Records...)
}
}
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
cconfig "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
@ -23,6 +24,9 @@ type NodesMap struct {
Addresses []string `yaml:"grpcAddresses"`
APIPort string `yaml:"apiPort"`
} `yaml:"nodes"`
Consensus []struct {
Addresses []string `yaml:"grpcAddresses"`
}
}
func main() {
@ -41,7 +45,7 @@ func main() {
var configs []config.Config
var nodes []config.Node
for _, n := range nodesMap.Nodes {
cfg, err := genConfig(n.Addresses, n.APIPort)
cfg, err := genNodeConfig(n.Addresses, n.APIPort)
if err != nil {
panic(fmt.Sprintf("could not generate the config file: %s", err.Error()))
}
@ -55,6 +59,24 @@ func main() {
}
nodes = append(nodes, node)
}
var consConfigs []cconfig.Config
for _, n := range nodesMap.Consensus {
cfg, err := genConsensusConfig(n.Addresses)
if err != nil {
panic(fmt.Sprintf("could not generate the config file: %s", err.Error()))
}
consConfigs = append(consConfigs, cfg)
node := config.Node{
PeerId: cfg.Account.PeerId,
Address: cfg.GrpcServer.ListenAddrs[0],
SigningKey: cfg.Account.SigningKey,
EncryptionKey: cfg.Account.EncryptionKey,
IsConsensus: true,
}
nodes = append(nodes, node)
}
for idx := range configs {
configs[idx].Nodes = nodes
}
@ -77,7 +99,19 @@ func main() {
createDir()
}
for idx, cfg := range configs {
path := fmt.Sprintf("%s/config%d.yml", configsPath, idx+1)
path := fmt.Sprintf("%s/node%d.yml", configsPath, idx+1)
bytes, err := yaml.Marshal(cfg)
if err != nil {
panic(fmt.Sprintf("could not marshal the keys: %v", err))
}
err = os.WriteFile(path, bytes, os.ModePerm)
if err != nil {
panic(fmt.Sprintf("could not write the config to file: %v", err))
}
}
for idx, cfg := range consConfigs {
path := fmt.Sprintf("%s/cons%d.yml", configsPath, idx+1)
bytes, err := yaml.Marshal(cfg)
if err != nil {
panic(fmt.Sprintf("could not marshal the keys: %v", err))
@ -90,7 +124,7 @@ func main() {
}
}
func genConfig(addresses []string, apiPort string) (config.Config, error) {
func genNodeConfig(addresses []string, apiPort string) (config.Config, error) {
encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048)
if err != nil {
return config.Config{}, err
@ -136,3 +170,47 @@ func genConfig(addresses []string, apiPort string) (config.Config, error) {
},
}, nil
}
func genConsensusConfig(addresses []string) (cconfig.Config, error) {
encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048)
if err != nil {
return cconfig.Config{}, err
}
signKey, _, err := signingkey.GenerateRandomEd25519KeyPair()
if err != nil {
return cconfig.Config{}, err
}
encEncKey, err := keys.EncodeKeyToString(encKey)
if err != nil {
return cconfig.Config{}, err
}
encSignKey, err := keys.EncodeKeyToString(signKey)
if err != nil {
return cconfig.Config{}, err
}
peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic())
if err != nil {
return cconfig.Config{}, err
}
return cconfig.Config{
GrpcServer: config.GrpcServer{
ListenAddrs: addresses,
TLS: false,
},
Account: config.Account{
PeerId: peerID.String(),
SigningKey: encSignKey,
EncryptionKey: encEncKey,
},
Mongo: cconfig.Mongo{
Connect: "mongodb://localhost:27017/?w=majority",
Database: "consensus",
LogCollection: "log",
},
}, nil
}

View File

@ -5,3 +5,13 @@ nodes:
- grpcAddresses:
- "127.0.0.1:4431"
apiPort: "8081"
- grpcAddresses:
- "127.0.0.1:4432"
apiPort: "8082"
consensus:
- grpcAddresses:
- "127.0.0.1:4530"
- grpcAddresses:
- "127.0.0.1:4531"
- grpcAddresses:
- "127.0.0.1:4532"

View File

@ -2,6 +2,7 @@ package account
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
)
@ -11,3 +12,7 @@ type Service interface {
app.Component
Account() *account.AccountData
}
type ConfigGetter interface {
GetAccount() config.Account
}

View File

@ -30,21 +30,26 @@ func New() Pool {
type Pool interface {
// Get lookups to peer in existing connections or creates and cache new one
Get(ctx context.Context, id string) (peer.Peer, error)
// Dial creates new connection to peer and not use cache
Dial(ctx context.Context, id string) (peer.Peer, error)
// GetOneOf searches at least one existing connection in cache or creates a new one from a randomly selected id from given list
GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error)
DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error)
app.ComponentRunnable
}
type pool struct {
cache ocache.OCache
cache ocache.OCache
dialer dialer.Dialer
}
func (p *pool) Init(a *app.App) (err error) {
dialer := a.MustComponent(dialer.CName).(dialer.Dialer)
p.dialer = a.MustComponent(dialer.CName).(dialer.Dialer)
p.cache = ocache.New(
func(ctx context.Context, id string) (value ocache.Object, err error) {
return dialer.Dial(ctx, id)
return p.dialer.Dial(ctx, id)
},
ocache.WithLogger(log.Sugar()),
ocache.WithGCPeriod(time.Minute),
@ -77,6 +82,10 @@ func (p *pool) Get(ctx context.Context, id string) (peer.Peer, error) {
return p.Get(ctx, id)
}
func (p *pool) Dial(ctx context.Context, id string) (peer.Peer, error) {
return p.dialer.Dial(ctx, id)
}
func (p *pool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) {
// finding existing connection
for _, peerId := range peerIds {
@ -102,6 +111,20 @@ func (p *pool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error
return nil, ErrUnableToConnect
}
func (p *pool) DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) {
// shuffle ids for better consistency
rand.Shuffle(len(peerIds), func(i, j int) {
peerIds[i], peerIds[j] = peerIds[j], peerIds[i]
})
// connecting
for _, peerId := range peerIds {
if v, err := p.dialer.Dial(ctx, peerId); err == nil {
return v.(peer.Peer), nil
}
}
return nil, ErrUnableToConnect
}
func (p *pool) Close(ctx context.Context) (err error) {
return p.cache.Close()
}

View File

@ -4,7 +4,6 @@ import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/zeebo/errs"
@ -30,20 +29,22 @@ type DRPCServer interface {
drpc.Mux
}
type configGetter interface {
GetGRPCServer() config.GrpcServer
}
type drpcServer struct {
config config.GrpcServer
drpcServer *drpcserver.Server
transport secure2.Service
listeners []secure2.ContextListener
pool pool.Pool
cancel func()
*drpcmux.Mux
}
func (s *drpcServer) Init(a *app.App) (err error) {
s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer
s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer()
s.transport = a.MustComponent(secure2.CName).(secure2.Service)
s.pool = a.MustComponent(pool.CName).(pool.Pool)
return nil
}

View File

@ -4,6 +4,7 @@ import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
"github.com/libp2p/go-libp2p-core/crypto"
@ -34,7 +35,7 @@ type service struct {
}
func (s *service) Init(a *app.App) (err error) {
account := a.MustComponent(config.CName).(*config.Config).Account
account := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount()
pkb, err := keys.DecodeBytesFromString(account.SigningKey)
if err != nil {
return

View File

@ -23,6 +23,7 @@ var log = logger.NewNamed(CName)
type Service interface {
GetLast() Configuration
GetById(id string) Configuration
ConsensusPeers() []string
app.Component
}
@ -30,7 +31,8 @@ type service struct {
accountId string
pool pool.Pool
last Configuration
consensusPeers []string
last Configuration
}
type Node struct {
@ -64,9 +66,10 @@ func (s *service) Init(a *app.App) (err error) {
}); err != nil {
return
}
members := make([]chash.Member, 0, len(conf.Nodes)-1)
members := make([]chash.Member, 0, len(conf.Nodes))
for _, n := range conf.Nodes {
if n.PeerId == conf.Account.PeerId {
if n.IsConsensus {
s.consensusPeers = append(s.consensusPeers, n.PeerId)
continue
}
var member *Node
@ -74,7 +77,6 @@ func (s *service) Init(a *app.App) (err error) {
if err != nil {
return
}
members = append(members, member)
}
if err = config.chash.AddMembers(members...); err != nil {
@ -97,6 +99,10 @@ func (s *service) GetById(id string) Configuration {
panic("implement me")
}
func (s *service) ConsensusPeers() []string {
return s.consensusPeers
}
func nodeFromConfigNode(
n config.Node) (*Node, error) {
decodedSigningKey, err := keys.DecodeKeyFromString(

View File

@ -39,3 +39,15 @@ func (c *Config) Init(a *app.App) (err error) {
func (c Config) Name() (name string) {
return CName
}
func (c Config) GetAnytype() Anytype {
return c.Anytype
}
func (c Config) GetGRPCServer() GrpcServer {
return c.GrpcServer
}
func (c Config) GetAccount() Account {
return c.Account
}

View File

@ -3,6 +3,7 @@ package config
type Node struct {
PeerId string `yaml:"peerId"`
Address string `yaml:"address"`
SigningKey string `yaml:"signingKey"`
EncryptionKey string `yaml:"encryptionKey"`
SigningKey string `yaml:"signingKey,omitempty"`
EncryptionKey string `yaml:"encryptionKey,omitempty"`
IsConsensus bool `yaml:"isConsensus,omitempty"`
}

View File

@ -0,0 +1,48 @@
package config
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"gopkg.in/yaml.v3"
"io/ioutil"
)
const CName = "config"
func NewFromFile(path string) (c *Config, err error) {
c = &Config{}
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
if err = yaml.Unmarshal(data, c); err != nil {
return nil, err
}
return
}
type Config struct {
GrpcServer config.GrpcServer `yaml:"grpcServer"`
Account config.Account `yaml:"account"`
Mongo Mongo `yaml:"mongo"`
}
func (c *Config) Init(a *app.App) (err error) {
return
}
func (c Config) Name() (name string) {
return CName
}
func (c Config) GetMongo() Mongo {
return c.Mongo
}
func (c Config) GetGRPCServer() config.GrpcServer {
return c.GrpcServer
}
func (c Config) GetAccount() config.Account {
return c.Account
}

View File

@ -0,0 +1,7 @@
package config
type Mongo struct {
Connect string `yaml:"connect"`
Database string `yaml:"database"`
LogCollection string `yaml:"logCollection"`
}

22
consensus/consensus.go Normal file
View File

@ -0,0 +1,22 @@
package consensus
import "time"
type Log struct {
Id []byte `bson:"_id"`
Records []Record `bson:"records"`
}
type Record struct {
Id []byte `bson:"id"`
PrevId []byte `bson:"prevId"`
Payload []byte `bson:"payload"`
Created time.Time `bson:"created"'`
}
func (l Log) CopyRecords() Log {
l2 := l
l2.Records = make([]Record, len(l.Records))
copy(l2.Records, l.Records)
return l2
}

View File

@ -0,0 +1,97 @@
package consensusclient
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
)
const CName = "consensus.client"
var log = logger.NewNamed(CName)
func New() Service {
return new(service)
}
type Service interface {
AddLog(ctx context.Context, clog *consensusproto.Log) (err error)
AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error)
WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error)
app.Component
}
type service struct {
pool pool.Pool
nodeconf nodeconf.Service
}
func (s *service) Init(a *app.App) (err error) {
s.pool = a.MustComponent(pool.CName).(pool.Pool)
s.nodeconf = a.MustComponent(nodeconf.CName).(nodeconf.Service)
return nil
}
func (s *service) Name() (name string) {
return CName
}
func (s *service) getClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) {
peer, err := s.pool.GetOneOf(ctx, s.nodeconf.ConsensusPeers())
if err != nil {
return nil, err
}
return consensusproto.NewDRPCConsensusClient(peer), nil
}
func (s *service) dialClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) {
peer, err := s.pool.DialOneOf(ctx, s.nodeconf.ConsensusPeers())
if err != nil {
return nil, err
}
return consensusproto.NewDRPCConsensusClient(peer), nil
}
func (s *service) AddLog(ctx context.Context, clog *consensusproto.Log) (err error) {
cl, err := s.getClient(ctx)
if err != nil {
return
}
if _, err = cl.AddLog(ctx, &consensusproto.AddLogRequest{
Log: clog,
}); err != nil {
return rpcerr.Unwrap(err)
}
return
}
func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error) {
cl, err := s.getClient(ctx)
if err != nil {
return
}
if _, err = cl.AddRecord(ctx, &consensusproto.AddRecordRequest{
LogId: logId,
Record: clog,
}); err != nil {
return rpcerr.Unwrap(err)
}
return
}
func (s *service) WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) {
cl, err := s.dialClient(ctx)
if err != nil {
return
}
if stream, err = cl.WatchLog(ctx, &consensusproto.WatchLogRequest{
LogId: logId,
}); err != nil {
return nil, rpcerr.Unwrap(err)
}
return
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,217 @@
// Code generated by protoc-gen-go-drpc. DO NOT EDIT.
// protoc-gen-go-drpc version: v0.0.32
// source: consensus/consensusproto/protos/consensus.proto
package consensusproto
import (
bytes "bytes"
context "context"
errors "errors"
jsonpb "github.com/gogo/protobuf/jsonpb"
proto "github.com/gogo/protobuf/proto"
drpc "storj.io/drpc"
drpcerr "storj.io/drpc/drpcerr"
)
type drpcEncoding_File_consensus_consensusproto_protos_consensus_proto struct{}
func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Marshal(msg drpc.Message) ([]byte, error) {
return proto.Marshal(msg.(proto.Message))
}
func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Unmarshal(buf []byte, msg drpc.Message) error {
return proto.Unmarshal(buf, msg.(proto.Message))
}
func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONMarshal(msg drpc.Message) ([]byte, error) {
var buf bytes.Buffer
err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message))
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error {
return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message))
}
type DRPCConsensusClient interface {
DRPCConn() drpc.Conn
AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error)
AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error)
WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error)
}
type drpcConsensusClient struct {
cc drpc.Conn
}
func NewDRPCConsensusClient(cc drpc.Conn) DRPCConsensusClient {
return &drpcConsensusClient{cc}
}
func (c *drpcConsensusClient) DRPCConn() drpc.Conn { return c.cc }
func (c *drpcConsensusClient) AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error) {
out := new(Ok)
err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcConsensusClient) AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error) {
out := new(Ok)
err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcConsensusClient) WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error) {
stream, err := c.cc.NewStream(ctx, "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{})
if err != nil {
return nil, err
}
x := &drpcConsensus_WatchLogClient{stream}
if err := x.MsgSend(in, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil {
return nil, err
}
if err := x.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type DRPCConsensus_WatchLogClient interface {
drpc.Stream
Recv() (*WatchLogEvent, error)
}
type drpcConsensus_WatchLogClient struct {
drpc.Stream
}
func (x *drpcConsensus_WatchLogClient) Recv() (*WatchLogEvent, error) {
m := new(WatchLogEvent)
if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil {
return nil, err
}
return m, nil
}
func (x *drpcConsensus_WatchLogClient) RecvMsg(m *WatchLogEvent) error {
return x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{})
}
type DRPCConsensusServer interface {
AddLog(context.Context, *AddLogRequest) (*Ok, error)
AddRecord(context.Context, *AddRecordRequest) (*Ok, error)
WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error
}
type DRPCConsensusUnimplementedServer struct{}
func (s *DRPCConsensusUnimplementedServer) AddLog(context.Context, *AddLogRequest) (*Ok, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCConsensusUnimplementedServer) AddRecord(context.Context, *AddRecordRequest) (*Ok, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCConsensusUnimplementedServer) WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error {
return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
type DRPCConsensusDescription struct{}
func (DRPCConsensusDescription) NumMethods() int { return 3 }
func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) {
switch n {
case 0:
return "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCConsensusServer).
AddLog(
ctx,
in1.(*AddLogRequest),
)
}, DRPCConsensusServer.AddLog, true
case 1:
return "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCConsensusServer).
AddRecord(
ctx,
in1.(*AddRecordRequest),
)
}, DRPCConsensusServer.AddRecord, true
case 2:
return "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return nil, srv.(DRPCConsensusServer).
WatchLog(
in1.(*WatchLogRequest),
&drpcConsensus_WatchLogStream{in2.(drpc.Stream)},
)
}, DRPCConsensusServer.WatchLog, true
default:
return "", nil, nil, nil, false
}
}
func DRPCRegisterConsensus(mux drpc.Mux, impl DRPCConsensusServer) error {
return mux.Register(impl, DRPCConsensusDescription{})
}
type DRPCConsensus_AddLogStream interface {
drpc.Stream
SendAndClose(*Ok) error
}
type drpcConsensus_AddLogStream struct {
drpc.Stream
}
func (x *drpcConsensus_AddLogStream) SendAndClose(m *Ok) error {
if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCConsensus_AddRecordStream interface {
drpc.Stream
SendAndClose(*Ok) error
}
type drpcConsensus_AddRecordStream struct {
drpc.Stream
}
func (x *drpcConsensus_AddRecordStream) SendAndClose(m *Ok) error {
if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCConsensus_WatchLogStream interface {
drpc.Stream
Send(*WatchLogEvent) error
}
type drpcConsensus_WatchLogStream struct {
drpc.Stream
}
func (x *drpcConsensus_WatchLogStream) Send(m *WatchLogEvent) error {
return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{})
}

View File

@ -0,0 +1,16 @@
package consensuserrs
import (
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
)
var (
errGroup = rpcerr.ErrGroup(consensusproto.ErrCodes_ErrorOffset)
ErrUnexpected = errGroup.Register(fmt.Errorf("unexpected consensus error"), uint64(consensusproto.ErrCodes_Unexpected))
ErrConflict = errGroup.Register(fmt.Errorf("records conflict"), uint64(consensusproto.ErrCodes_RecordConflict))
ErrLogExists = errGroup.Register(fmt.Errorf("log exists"), uint64(consensusproto.ErrCodes_LogExists))
ErrLogNotFound = errGroup.Register(fmt.Errorf("log not found"), uint64(consensusproto.ErrCodes_LogNotFound))
)

View File

@ -0,0 +1,55 @@
syntax = "proto3";
package anyConsensus;
option go_package = "consensus/consensusproto";
enum ErrCodes {
Unexpected = 0;
LogExists = 1;
LogNotFound = 2;
RecordConflict = 3;
ErrorOffset = 300;
}
message Log {
bytes id = 1;
repeated Record records = 2;
uint64 createdUnix = 3;
}
message Record {
bytes id = 1;
bytes prevId = 2;
bytes payload = 3;
uint64 createdUnix = 4;
}
service Consensus {
// AddLog adds new log to consensus
rpc AddLog(AddLogRequest) returns (Ok);
// AddRecord adds new record to log
rpc AddRecord(AddRecordRequest) returns (Ok);
// WatchLog fetches log and subscribes for a changes
rpc WatchLog(WatchLogRequest) returns (stream WatchLogEvent);
}
message Ok {}
message AddLogRequest {
Log log = 1;
}
message AddRecordRequest {
bytes logId = 1;
Record record = 2;
}
message WatchLogRequest {
bytes logId = 1;
}
message WatchLogEvent {
bytes logId = 1;
repeated Record records = 2;
}

View File

@ -0,0 +1,115 @@
package consensusrpc
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream"
"time"
)
const CName = "consensus.consensusrpc"
func New() app.Component {
return &consensusRpc{}
}
type consensusRpc struct {
db db.Service
stream stream.Service
}
func (c *consensusRpc) Init(a *app.App) (err error) {
c.db = a.MustComponent(db.CName).(db.Service)
c.stream = a.MustComponent(stream.CName).(stream.Service)
return consensusproto.DRPCRegisterConsensus(a.MustComponent(server.CName).(server.DRPCServer), c)
}
func (c *consensusRpc) Name() (name string) {
return CName
}
func (c *consensusRpc) AddLog(ctx context.Context, req *consensusproto.AddLogRequest) (*consensusproto.Ok, error) {
if err := c.db.AddLog(ctx, logFromProto(req.Log)); err != nil {
return nil, err
}
return &consensusproto.Ok{}, nil
}
func (c *consensusRpc) AddRecord(ctx context.Context, req *consensusproto.AddRecordRequest) (*consensusproto.Ok, error) {
if err := c.db.AddRecord(ctx, req.LogId, recordFromProto(req.Record)); err != nil {
return nil, err
}
return &consensusproto.Ok{}, nil
}
func (c *consensusRpc) WatchLog(req *consensusproto.WatchLogRequest, rpcStream consensusproto.DRPCConsensus_WatchLogStream) error {
stream, err := c.stream.Subscribe(rpcStream.Context(), req.LogId)
if err != nil {
return err
}
defer stream.Close()
var logSent bool
for {
if !logSent {
if err = rpcStream.Send(&consensusproto.WatchLogEvent{
LogId: req.LogId,
Records: recordsToProto(stream.Records()),
}); err != nil {
return err
}
logSent = true
} else {
recs := stream.WaitRecords()
if len(recs) == 0 {
return rpcStream.Close()
}
if err = rpcStream.Send(&consensusproto.WatchLogEvent{
LogId: req.LogId,
Records: recordsToProto(recs),
}); err != nil {
return err
}
}
}
}
func logFromProto(log *consensusproto.Log) consensus.Log {
return consensus.Log{
Id: log.Id,
Records: recordsFromProto(log.Records),
}
}
func recordsFromProto(recs []*consensusproto.Record) []consensus.Record {
res := make([]consensus.Record, len(recs))
for i, rec := range recs {
res[i] = recordFromProto(rec)
}
return res
}
func recordFromProto(rec *consensusproto.Record) consensus.Record {
return consensus.Record{
Id: rec.Id,
PrevId: rec.PrevId,
Payload: rec.Payload,
Created: time.Unix(int64(rec.CreatedUnix), 0),
}
}
func recordsToProto(recs []consensus.Record) []*consensusproto.Record {
res := make([]*consensusproto.Record, len(recs))
for i, rec := range recs {
res[i] = &consensusproto.Record{
Id: rec.Id,
PrevId: rec.PrevId,
Payload: rec.Payload,
CreatedUnix: uint64(rec.Created.Unix()),
}
}
return res
}

181
consensus/db/db.go Normal file
View File

@ -0,0 +1,181 @@
package db
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.uber.org/zap"
)
const CName = "consensus.db"
var log = logger.NewNamed(CName)
func New() Service {
return &service{}
}
type ChangeReceiver func(logId []byte, records []consensus.Record)
type Service interface {
AddLog(ctx context.Context, log consensus.Log) (err error)
AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error)
FetchLog(ctx context.Context, logId []byte) (log consensus.Log, err error)
SetChangeReceiver(receiver ChangeReceiver) (err error)
app.ComponentRunnable
}
type service struct {
conf config.Mongo
logColl *mongo.Collection
running bool
changeReceiver ChangeReceiver
streamCtx context.Context
streamCancel context.CancelFunc
listenerDone chan struct{}
}
func (s *service) Init(a *app.App) (err error) {
s.conf = a.MustComponent(config.CName).(*config.Config).Mongo
return nil
}
func (s *service) Name() (name string) {
return CName
}
func (s *service) Run(ctx context.Context) (err error) {
client, err := mongo.Connect(ctx, options.Client().ApplyURI(s.conf.Connect))
if err != nil {
return err
}
s.logColl = client.Database(s.conf.Database).Collection(s.conf.LogCollection)
s.running = true
if s.changeReceiver != nil {
if err = s.runStreamListener(ctx); err != nil {
return err
}
}
return
}
func (s *service) AddLog(ctx context.Context, l consensus.Log) (err error) {
_, err = s.logColl.InsertOne(ctx, l)
if mongo.IsDuplicateKeyError(err) {
return consensuserrs.ErrLogExists
}
return
}
type findLogQuery struct {
Id []byte `bson:"_id"`
}
type findRecordQuery struct {
Id []byte `bson:"_id"`
LastRecordId []byte `bson:"records.0.id"`
}
type updateOp struct {
Push struct {
Records struct {
Each []consensus.Record `bson:"$each""`
Pos int `bson:"$position"`
} `bson:"records"`
} `bson:"$push"`
}
func (s *service) AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) {
var upd updateOp
upd.Push.Records.Each = []consensus.Record{record}
result, err := s.logColl.UpdateOne(ctx, findRecordQuery{
Id: logId,
LastRecordId: record.PrevId,
}, upd)
if err != nil {
log.Error("addRecord update error", zap.Error(err))
return consensuserrs.ErrUnexpected
}
if result.ModifiedCount == 0 {
return consensuserrs.ErrConflict
}
return
}
func (s *service) FetchLog(ctx context.Context, logId []byte) (l consensus.Log, err error) {
if err = s.logColl.FindOne(ctx, findLogQuery{Id: logId}).Decode(&l); err != nil {
if err == mongo.ErrNoDocuments {
err = consensuserrs.ErrLogNotFound
}
return
}
return
}
func (s *service) SetChangeReceiver(receiver ChangeReceiver) (err error) {
if s.running {
return fmt.Errorf("set receiver must be called before Run")
}
s.changeReceiver = receiver
return
}
type matchPipeline struct {
Match struct {
OT string `bson:"operationType"`
} `bson:"$match"`
}
func (s *service) runStreamListener(ctx context.Context) (err error) {
var mp matchPipeline
mp.Match.OT = "update"
stream, err := s.logColl.Watch(ctx, []matchPipeline{mp})
if err != nil {
return
}
s.listenerDone = make(chan struct{})
s.streamCtx, s.streamCancel = context.WithCancel(context.Background())
go s.streamListener(stream)
return
}
type streamResult struct {
DocumentKey struct {
Id []byte `bson:"_id"`
} `bson:"documentKey"`
UpdateDescription struct {
UpdateFields struct {
Records []consensus.Record `bson:"records"`
} `bson:"updatedFields"`
} `bson:"updateDescription"`
}
func (s *service) streamListener(stream *mongo.ChangeStream) {
defer close(s.listenerDone)
for stream.Next(s.streamCtx) {
var res streamResult
if err := stream.Decode(&res); err != nil {
log.Error("stream decode error:", zap.Error(err))
}
s.changeReceiver(res.DocumentKey.Id, res.UpdateDescription.UpdateFields.Records)
}
}
func (s *service) Close(ctx context.Context) (err error) {
if s.logColl != nil {
err = s.logColl.Database().Client().Disconnect(ctx)
s.logColl = nil
}
if s.listenerDone != nil {
s.streamCancel()
<-s.listenerDone
}
return
}

218
consensus/db/db_test.go Normal file
View File

@ -0,0 +1,218 @@
package db
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
"time"
)
var ctx = context.Background()
func TestService_AddLog(t *testing.T) {
t.Run("success", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
log := consensus.Log{
Id: []byte("logOne"),
Records: []consensus.Record{
{
Id: []byte("recordOne"),
PrevId: nil,
Payload: []byte("payload"),
Created: time.Now().Truncate(time.Second).UTC(),
},
},
}
require.NoError(t, fx.AddLog(ctx, log))
fetched, err := fx.FetchLog(ctx, log.Id)
require.NoError(t, err)
assert.Equal(t, log, fetched)
})
t.Run("duplicate error", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
log := consensus.Log{
Id: []byte("logOne"),
}
require.NoError(t, fx.AddLog(ctx, log))
// TODO: check for specified error
require.Error(t, fx.AddLog(ctx, log))
})
}
func TestService_AddRecord(t *testing.T) {
t.Run("success", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
var records = []consensus.Record{
{
Id: []byte("2"),
PrevId: []byte("1"),
},
{
Id: []byte("3"),
PrevId: []byte("2"),
},
{
Id: []byte("4"),
PrevId: []byte("3"),
},
}
l := consensus.Log{
Id: []byte("logTestRecords"),
Records: []consensus.Record{
{
Id: []byte("1"),
},
},
}
require.NoError(t, fx.AddLog(ctx, l))
for _, rec := range records {
require.NoError(t, fx.AddRecord(ctx, l.Id, rec))
}
fx.assertLogValid(t, l.Id, 4)
})
t.Run("conflict", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
log := consensus.Log{
Id: []byte("logTestRecords"),
Records: []consensus.Record{
{
Id: []byte("1"),
},
},
}
require.NoError(t, fx.AddLog(ctx, log))
assert.Error(t, fx.AddRecord(ctx, log.Id, consensus.Record{Id: []byte("2"), PrevId: []byte("3")}))
})
}
func TestService_FetchLog(t *testing.T) {
t.Run("not found", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
l, err := fx.FetchLog(ctx, []byte("not exists"))
assert.Empty(t, l)
assert.ErrorIs(t, err, consensuserrs.ErrLogNotFound)
})
}
func TestService_ChangeReceive(t *testing.T) {
t.Run("set after run", func(t *testing.T) {
fx := newFixture(t, nil)
defer fx.Finish(t)
assert.Error(t, fx.SetChangeReceiver(func(logId []byte, records []consensus.Record) {}))
})
t.Run("receive changes", func(t *testing.T) {
var logs = make(chan consensus.Log, 10)
var count int
fx := newFixture(t, func(logId []byte, records []consensus.Record) {
logs <- consensus.Log{Id: logId, Records: records}
count++
})
defer fx.Finish(t)
var l = consensus.Log{
Id: []byte("logTestStream"),
Records: []consensus.Record{
{
Id: []byte("1"),
},
},
}
var records = []consensus.Record{
{
Id: []byte("2"),
PrevId: []byte("1"),
},
{
Id: []byte("3"),
PrevId: []byte("2"),
},
{
Id: []byte("4"),
PrevId: []byte("3"),
},
}
require.NoError(t, fx.AddLog(ctx, l))
assert.Empty(t, count)
for _, rec := range records {
require.NoError(t, fx.AddRecord(ctx, l.Id, rec))
}
timeout := time.After(time.Second)
for i := 0; i < len(records); i++ {
select {
case resLog := <-logs:
assertLogValid(t, resLog, i+2)
case <-timeout:
require.False(t, true)
}
}
})
}
func newFixture(t *testing.T, cr ChangeReceiver) *fixture {
ctx, cancel := context.WithTimeout(ctx, time.Second)
fx := &fixture{
Service: New(),
cancel: cancel,
a: new(app.App),
}
fx.a.Register(&config.Config{
Mongo: config.Mongo{
Connect: "mongodb://localhost:27017/?w=majority",
Database: "consensus_test",
LogCollection: "log",
},
})
fx.a.Register(fx.Service)
require.NoError(t, fx.Service.SetChangeReceiver(cr))
err := fx.a.Start(ctx)
if err != nil {
fx.cancel()
}
require.NoError(t, err)
return fx
}
type fixture struct {
Service
a *app.App
cancel context.CancelFunc
}
func (fx *fixture) Finish(t *testing.T) {
if fx.cancel != nil {
fx.cancel()
}
coll := fx.Service.(*service).logColl
t.Log(coll.Drop(ctx))
assert.NoError(t, fx.a.Close(ctx))
}
func (fx *fixture) assertLogValid(t *testing.T, logId []byte, count int) {
log, err := fx.FetchLog(ctx, logId)
require.NoError(t, err)
assertLogValid(t, log, count)
}
func assertLogValid(t *testing.T, log consensus.Log, count int) {
if count >= 0 {
assert.Len(t, log.Records, count)
}
var prevId []byte
for _, rec := range log.Records {
if len(prevId) != 0 {
assert.Equal(t, string(prevId), string(rec.Id))
}
prevId = rec.PrevId
}
}

View File

@ -0,0 +1,68 @@
package stream
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/cheggaaa/mb/v2"
"sync"
)
type object struct {
logId []byte
records []consensus.Record
streams map[uint32]*stream
lastStreamId uint32
mu sync.Mutex
}
func (o *object) AddRecords(recs []consensus.Record) {
o.mu.Lock()
defer o.mu.Unlock()
if len(recs) <= len(o.records) {
return
}
diff := recs[0 : len(recs)-len(o.records)]
o.records = recs
for _, st := range o.streams {
st.AddRecords(diff)
}
}
func (o *object) Records() []consensus.Record {
o.mu.Lock()
defer o.mu.Unlock()
return o.records
}
func (o *object) NewStream() Stream {
o.mu.Lock()
defer o.mu.Unlock()
o.lastStreamId++
st := &stream{
id: o.lastStreamId,
obj: o,
records: o.records,
mb: mb.New(consensus.Record{}, 100),
}
o.streams[st.id] = st
return st
}
func (o *object) Locked() bool {
o.mu.Lock()
defer o.mu.Unlock()
return len(o.streams) > 0
}
func (o *object) removeStream(id uint32) {
o.mu.Lock()
defer o.mu.Unlock()
delete(o.streams, id)
}
func (o *object) Close() (err error) {
return nil
}

127
consensus/stream/service.go Normal file
View File

@ -0,0 +1,127 @@
package stream
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
"github.com/mr-tron/base58"
"go.uber.org/zap"
"time"
)
const CName = "consensus.stream"
var log = logger.NewNamed(CName)
var (
cacheTTL = time.Minute
)
type ctxLog uint
const (
ctxLogKey ctxLog = 1
)
func New() Service {
return &service{}
}
type Stream interface {
LogId() []byte
Records() []consensus.Record
WaitRecords() []consensus.Record
Close()
}
type Service interface {
Subscribe(ctx context.Context, logId []byte) (stream Stream, err error)
app.ComponentRunnable
}
type service struct {
db db.Service
cache ocache.OCache
}
func (s *service) Init(a *app.App) (err error) {
s.db = a.MustComponent(db.CName).(db.Service)
s.cache = ocache.New(s.loadLog,
ocache.WithTTL(cacheTTL),
ocache.WithRefCounter(false),
ocache.WithLogger(log.Named("cache").Sugar()),
)
return s.db.SetChangeReceiver(s.receiveChange)
}
func (s *service) Subscribe(ctx context.Context, logId []byte) (Stream, error) {
obj, err := s.getObject(ctx, logId)
if err != nil {
return nil, err
}
return obj.NewStream(), nil
}
func (s *service) Name() (name string) {
return CName
}
func (s *service) Run(ctx context.Context) (err error) {
return nil
}
func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) {
if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil {
return &object{
logId: ctxLog.(consensus.Log).Id,
records: ctxLog.(consensus.Log).Records,
streams: make(map[uint32]*stream),
}, nil
}
logId := logIdFromString(id)
dbLog, err := s.db.FetchLog(ctx, logId)
if err != nil {
return nil, err
}
return &object{
logId: dbLog.Id,
records: dbLog.Records,
streams: make(map[uint32]*stream),
}, nil
}
func (s *service) receiveChange(logId []byte, records []consensus.Record) {
ctx := context.WithValue(context.Background(), ctxLogKey, consensus.Log{Id: logId, Records: records})
obj, err := s.getObject(ctx, logId)
if err != nil {
log.Error("failed load object from cache", zap.Error(err))
return
}
obj.AddRecords(records)
}
func (s *service) getObject(ctx context.Context, logId []byte) (*object, error) {
id := logIdToString(logId)
cacheObj, err := s.cache.Get(ctx, id)
if err != nil {
return nil, err
}
return cacheObj.(*object), nil
}
func (s *service) Close(ctx context.Context) (err error) {
return s.cache.Close()
}
func logIdToString(logId []byte) string {
return base58.Encode(logId)
}
func logIdFromString(s string) []byte {
logId, _ := base58.Decode(s)
return logId
}

View File

@ -0,0 +1,169 @@
package stream
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
"time"
)
var ctx = context.Background()
func TestService_Subscribe(t *testing.T) {
fx := newFixture(t)
defer fx.Finish(t)
var expLogId = []byte("logId")
fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) {
require.Equal(t, expLogId, logId)
return consensus.Log{
Id: logId,
Records: []consensus.Record{
{
Id: []byte{'1'},
},
},
}, nil
}
st1, err := fx.Subscribe(ctx, expLogId)
require.NoError(t, err)
require.Equal(t, expLogId, st1.LogId())
sr1 := readStream(st1)
assert.Equal(t, uint32(1), sr1.id)
st2, err := fx.Subscribe(ctx, expLogId)
require.NoError(t, err)
require.Equal(t, expLogId, st2.LogId())
sr2 := readStream(st2)
assert.Equal(t, uint32(2), sr2.id)
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver([]byte("other id"), []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
st1.Close()
st2.Close()
for _, sr := range []*streamReader{sr1, sr2} {
select {
case <-time.After(time.Second / 3):
require.False(t, true, "timeout")
case <-sr.finished:
}
}
require.Equal(t, sr1.records, sr2.records)
require.Len(t, sr1.records, 1)
assert.Equal(t, []byte{'2'}, sr1.records[0].Id)
}
func newFixture(t *testing.T) *fixture {
fx := &fixture{
Service: New(),
mockDB: &mockDB{},
a: new(app.App),
}
fx.a.Register(fx.Service).Register(fx.mockDB)
require.NoError(t, fx.a.Start(ctx))
return fx
}
type fixture struct {
Service
mockDB *mockDB
a *app.App
}
func (fx *fixture) Finish(t *testing.T) {
require.NoError(t, fx.a.Close(ctx))
}
func readStream(st Stream) *streamReader {
sr := &streamReader{
id: st.(*stream).id,
stream: st,
finished: make(chan struct{}),
}
go sr.read()
return sr
}
type streamReader struct {
id uint32
stream Stream
records []consensus.Record
finished chan struct{}
}
func (sr *streamReader) read() {
defer close(sr.finished)
for {
records := sr.stream.WaitRecords()
if len(records) == 0 {
return
}
sr.records = append(sr.records, records...)
}
}
type mockDB struct {
receiver db.ChangeReceiver
fetchLog func(ctx context.Context, logId []byte) (log consensus.Log, err error)
}
func (m *mockDB) AddLog(ctx context.Context, log consensus.Log) (err error) { return nil }
func (m *mockDB) AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) {
return nil
}
func (m *mockDB) FetchLog(ctx context.Context, logId []byte) (log consensus.Log, err error) {
return m.fetchLog(ctx, logId)
}
func (m *mockDB) SetChangeReceiver(receiver db.ChangeReceiver) (err error) {
m.receiver = receiver
return nil
}
func (m *mockDB) Init(a *app.App) (err error) {
return nil
}
func (m *mockDB) Name() (name string) {
return db.CName
}
func (m *mockDB) Run(ctx context.Context) (err error) {
return
}
func (m *mockDB) Close(ctx context.Context) (err error) {
return
}

View File

@ -0,0 +1,34 @@
package stream
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/cheggaaa/mb/v2"
)
type stream struct {
id uint32
obj *object
records []consensus.Record
mb *mb.MB[consensus.Record]
}
func (s *stream) LogId() []byte {
return s.obj.logId
}
func (s *stream) AddRecords(records []consensus.Record) {
_ = s.mb.Add(records...)
}
func (s *stream) Records() []consensus.Record {
return s.records
}
func (s *stream) WaitRecords() []consensus.Record {
return s.mb.Wait()
}
func (s *stream) Close() {
_ = s.mb.Close()
s.obj.removeStream(s.id)
}

View File

@ -1,24 +0,0 @@
anytype:
swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec
grpcServer:
listenAddrs:
- 127.0.0.1:4430
tls: false
account:
peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
apiServer:
port: "8080"
nodes:
- peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
address: 127.0.0.1:4430
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
- peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK
address: 127.0.0.1:4431
signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg==
encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w==
space:
gcTTL: 60
syncPeriod: 10

View File

@ -1,24 +0,0 @@
anytype:
swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec
grpcServer:
listenAddrs:
- 127.0.0.1:4431
tls: false
account:
peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK
signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg==
encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w==
apiServer:
port: "8081"
nodes:
- peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
address: 127.0.0.1:4430
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
- peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK
address: 127.0.0.1:4431
signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg==
encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w==
space:
gcTTL: 60
syncPeriod: 10

12
etc/configs/cons1.yml Executable file
View File

@ -0,0 +1,12 @@
grpcServer:
listenAddrs:
- 127.0.0.1:4530
tls: false
account:
peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
mongo:
connect: mongodb://localhost:27017/?w=majority
database: consensus
logCollection: log

12
etc/configs/cons2.yml Executable file
View File

@ -0,0 +1,12 @@
grpcServer:
listenAddrs:
- 127.0.0.1:4531
tls: false
account:
peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
mongo:
connect: mongodb://localhost:27017/?w=majority
database: consensus
logCollection: log

12
etc/configs/cons3.yml Executable file
View File

@ -0,0 +1,12 @@
grpcServer:
listenAddrs:
- 127.0.0.1:4532
tls: false
account:
peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
mongo:
connect: mongodb://localhost:27017/?w=majority
database: consensus
logCollection: log

43
etc/configs/node1.yml Executable file
View File

@ -0,0 +1,43 @@
anytype:
swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec
grpcServer:
listenAddrs:
- 127.0.0.1:4430
tls: false
account:
peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
apiServer:
port: "8080"
nodes:
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
address: 127.0.0.1:4430
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
address: 127.0.0.1:4431
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
address: 127.0.0.1:4432
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
address: 127.0.0.1:4530
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
isConsensus: true
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
address: 127.0.0.1:4531
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
isConsensus: true
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
address: 127.0.0.1:4532
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
isConsensus: true
space:
gcTTL: 60
syncPeriod: 10

43
etc/configs/node2.yml Executable file
View File

@ -0,0 +1,43 @@
anytype:
swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec
grpcServer:
listenAddrs:
- 127.0.0.1:4431
tls: false
account:
peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
apiServer:
port: "8081"
nodes:
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
address: 127.0.0.1:4430
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
address: 127.0.0.1:4431
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
address: 127.0.0.1:4432
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
address: 127.0.0.1:4530
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
isConsensus: true
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
address: 127.0.0.1:4531
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
isConsensus: true
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
address: 127.0.0.1:4532
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
isConsensus: true
space:
gcTTL: 60
syncPeriod: 10

43
etc/configs/node3.yml Executable file
View File

@ -0,0 +1,43 @@
anytype:
swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec
grpcServer:
listenAddrs:
- 127.0.0.1:4432
tls: false
account:
peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
apiServer:
port: "8082"
nodes:
- peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN
address: 127.0.0.1:4430
signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw==
encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ==
- peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT
address: 127.0.0.1:4431
signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA==
encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg==
- peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC
address: 127.0.0.1:4432
signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w==
encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm
- peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo
address: 127.0.0.1:4530
signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg==
encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0=
isConsensus: true
- peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm
address: 127.0.0.1:4531
signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g==
encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi
isConsensus: true
- peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS
address: 127.0.0.1:4532
signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ==
encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP
isConsensus: true
space:
gcTTL: 60
syncPeriod: 10

11
etc/consensus-node.yml Normal file
View File

@ -0,0 +1,11 @@
rpcServer:
listenAddrs:
- 127.0.0.1:4530
account:
peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu
signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA==
encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg==
mongo:
connect: "mongodb://localhost:27017/?w=majority"
database: "consensus"
collection: "log"

20
go.mod
View File

@ -6,18 +6,22 @@ require (
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab
github.com/cespare/xxhash v1.1.0
github.com/cheggaaa/mb/v2 v2.0.1
github.com/goccy/go-graphviz v0.0.9
github.com/gogo/protobuf v1.3.2
github.com/golang/mock v1.6.0
github.com/huandu/skiplist v1.2.0
github.com/ipfs/go-cid v0.1.0
github.com/libp2p/go-libp2p v0.20.3
github.com/libp2p/go-libp2p-core v0.16.1
github.com/minio/sha256-simd v1.0.0
github.com/mr-tron/base58 v1.2.0
github.com/multiformats/go-multibase v0.0.3
github.com/multiformats/go-multihash v0.1.0
github.com/stretchr/testify v1.8.0
github.com/zeebo/blake3 v0.2.3
github.com/zeebo/errs v1.3.0
go.mongodb.org/mongo-driver v1.10.2
go.uber.org/zap v1.21.0
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
gopkg.in/yaml.v3 v3.0.1
@ -33,12 +37,13 @@ require (
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/fogleman/gg v1.3.0 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/klauspost/compress v1.15.1 // indirect
github.com/klauspost/cpuid/v2 v2.0.12 // indirect
github.com/libp2p/go-buffer-pool v0.0.2 // indirect
github.com/libp2p/go-openssl v0.0.7 // indirect
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/multiformats/go-base32 v0.0.3 // indirect
github.com/multiformats/go-base36 v0.1.0 // indirect
github.com/multiformats/go-multiaddr v0.5.0 // indirect
@ -48,14 +53,17 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.1 // indirect
github.com/xdg-go/stringprep v1.0.3 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
golang.org/x/mod v0.4.2 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect
golang.org/x/tools v0.1.5 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
golang.org/x/text v0.3.7 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
lukechampine.com/blake3 v1.1.6 // indirect

37
go.sum
View File

@ -15,6 +15,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cheggaaa/mb/v2 v2.0.1 h1:gn0khbEbKlw3i5VOYi0VnHEHayjZKfUDOyGSpHAybBs=
github.com/cheggaaa/mb/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c=
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -34,6 +36,10 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF0
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c=
github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U=
github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw=
@ -44,6 +50,9 @@ github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXm
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE=
@ -66,6 +75,8 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8Rv
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
@ -104,10 +115,21 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
@ -119,6 +141,8 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k=
go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@ -136,14 +160,13 @@ golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@ -152,9 +175,11 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -164,20 +189,24 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@ -24,8 +24,7 @@ func New() app.Component {
}
func (s *service) Init(a *app.App) (err error) {
cfg := a.MustComponent(config.CName).(*config.Config)
acc := cfg.Account
acc := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount()
decodedEncryptionKey, err := keys.DecodeKeyFromString(
acc.EncryptionKey,

View File

@ -324,6 +324,7 @@ func (m *ACLRoot) GetTimestamp() int64 {
type ACLContentValue struct {
// Types that are valid to be assigned to Value:
//
// *ACLContentValue_UserAdd
// *ACLContentValue_UserRemove
// *ACLContentValue_UserPermissionChange

View File

@ -60,6 +60,7 @@ var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo
type PlainTextChange_Content struct {
// Types that are valid to be assigned to Value:
//
// *PlainTextChange_Content_TextAppend
Value isPlainTextChange_Content_Value `protobuf_oneof:"value"`
}