Merge remote-tracking branch 'origin/consensus-node' into sync-tests
# Conflicts: # Makefile # go.mod # go.sum
This commit is contained in:
commit
afc9141a7c
8
Makefile
8
Makefile
@ -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
|
||||
|
||||
95
cmd/consensusnode/consensusnode.go
Normal file
95
cmd/consensusnode/consensusnode.go
Normal 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())
|
||||
}
|
||||
260
cmd/consensusnode/testclient/consensustestclient.go
Normal file
260
cmd/consensusnode/testclient/consensustestclient.go
Normal 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...)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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"`
|
||||
}
|
||||
|
||||
48
consensus/config/config.go
Normal file
48
consensus/config/config.go
Normal 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
|
||||
}
|
||||
7
consensus/config/mongo.go
Normal file
7
consensus/config/mongo.go
Normal 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
22
consensus/consensus.go
Normal 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
|
||||
}
|
||||
97
consensus/consensusclient/client.go
Normal file
97
consensus/consensusclient/client.go
Normal 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
|
||||
}
|
||||
1718
consensus/consensusproto/consensus.pb.go
Normal file
1718
consensus/consensusproto/consensus.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
217
consensus/consensusproto/consensus_drpc.pb.go
Normal file
217
consensus/consensusproto/consensus_drpc.pb.go
Normal 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{})
|
||||
}
|
||||
16
consensus/consensusproto/consensuserrs/errors.go
Normal file
16
consensus/consensusproto/consensuserrs/errors.go
Normal 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))
|
||||
)
|
||||
55
consensus/consensusproto/protos/consensus.proto
Normal file
55
consensus/consensusproto/protos/consensus.proto
Normal 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;
|
||||
}
|
||||
115
consensus/consensusrpc/consensrpc.go
Normal file
115
consensus/consensusrpc/consensrpc.go
Normal 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
181
consensus/db/db.go
Normal 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
218
consensus/db/db_test.go
Normal 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
|
||||
}
|
||||
}
|
||||
68
consensus/stream/object.go
Normal file
68
consensus/stream/object.go
Normal 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
127
consensus/stream/service.go
Normal 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
|
||||
}
|
||||
169
consensus/stream/service_test.go
Normal file
169
consensus/stream/service_test.go
Normal 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
|
||||
}
|
||||
34
consensus/stream/stream.go
Normal file
34
consensus/stream/stream.go
Normal 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)
|
||||
}
|
||||
@ -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
|
||||
@ -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
12
etc/configs/cons1.yml
Executable 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
12
etc/configs/cons2.yml
Executable 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
12
etc/configs/cons3.yml
Executable 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
43
etc/configs/node1.yml
Executable 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
43
etc/configs/node2.yml
Executable 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
43
etc/configs/node3.yml
Executable 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
11
etc/consensus-node.yml
Normal 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
20
go.mod
@ -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
37
go.sum
@ -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=
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"`
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user