Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-sign and re-share using proofs and EIP1271 signature #100

Merged
merged 39 commits into from
Sep 3, 2024
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
2fe1d0f
initial resigning
pavelkrolevets Apr 8, 2024
f329be8
add routes + flow
pavelkrolevets Apr 22, 2024
6a8f698
working resigning with result validation
pavelkrolevets Apr 23, 2024
c71c54b
fix tests
pavelkrolevets Apr 23, 2024
49ee5e9
add integration tests for resiging
pavelkrolevets Apr 24, 2024
192e714
update integration tests to use cli commands
pavelkrolevets Apr 25, 2024
798333c
initial spec alignment + reshare module
pavelkrolevets Jun 7, 2024
db83ed4
working resharing
pavelkrolevets Jun 11, 2024
323a9de
add EIP1271 owner signature verification
pavelkrolevets Jun 13, 2024
b07da73
update resharing + add docker demo for resharing
pavelkrolevets Jun 14, 2024
2b994c0
add reshare threshold + integration tests
pavelkrolevets Jun 19, 2024
94c75d9
add threshold integration tests
pavelkrolevets Jun 20, 2024
49a58fb
fix logic at message processing
pavelkrolevets Jun 21, 2024
7cf7e54
add eip1271 sig integration tests
pavelkrolevets Jun 21, 2024
01449eb
add eip1271 sig verification to resign + integration/docker tests
pavelkrolevets Jun 24, 2024
d160313
add eip1271 sig resign test + bulk tests
pavelkrolevets Jun 24, 2024
cf71c67
fix/update unit + integration tests
pavelkrolevets Jun 25, 2024
2ab1d07
Merge branch 'unstable' into re-sharing
pavelkrolevets Jun 25, 2024
e3599e9
update tests + fix bls set
pavelkrolevets Jun 26, 2024
a805153
PR comments resolved #1
pavelkrolevets Aug 21, 2024
66aa776
PR comments resolved #2
pavelkrolevets Aug 21, 2024
69a6564
PR comments resolved #3
pavelkrolevets Aug 21, 2024
2588104
PR comments resolved #4
pavelkrolevets Aug 21, 2024
67f0d5d
Merge branch 're-sign' into re-sharing
pavelkrolevets Aug 22, 2024
9de0d2e
PR comments resolved #5
pavelkrolevets Aug 22, 2024
48e52ed
PR comments resolved #6
pavelkrolevets Aug 23, 2024
a6600b4
fix tests + docker build update
pavelkrolevets Aug 23, 2024
30421ef
update CI
pavelkrolevets Aug 26, 2024
b596736
fix test
pavelkrolevets Aug 26, 2024
b7507a8
lint
pavelkrolevets Aug 26, 2024
7b5def5
add more reshare integration tests
pavelkrolevets Aug 26, 2024
07857e5
go 1.23
pavelkrolevets Aug 26, 2024
94936c0
add unit tests for join/disjoin sets of operators
pavelkrolevets Sep 1, 2024
cd66782
lint
pavelkrolevets Sep 1, 2024
f28b9cd
add proofs validation before sending + more reshare threshold integra…
pavelkrolevets Sep 1, 2024
928a72f
fix unit tests
pavelkrolevets Sep 2, 2024
0f675a5
lint
pavelkrolevets Sep 2, 2024
9af8315
fix review comments
MatusKysel Sep 2, 2024
2c789e9
remove typo and unused struct
MatusKysel Sep 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ docker-demo-initiator:
@echo "Running initiator in docker demo"
docker-compose up --build initiator

docker-demo-resign:
@echo "Running resigning in docker demo"
docker-compose up --build resign

docker-demo-ping:
@echo "Running ping operators in docker demo"
docker-compose up --build ping
Expand Down
2 changes: 2 additions & 0 deletions cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ func init() {
RootCmd.AddCommand(operator.StartDKGOperator)
RootCmd.AddCommand(initiator.HealthCheck)
RootCmd.AddCommand(verify.Verify)
RootCmd.AddCommand(initiator.StartResigning)
}

// RootCmd represents the root command of DKG-tool CLI
Expand All @@ -32,6 +33,7 @@ func Execute(appName, version string) {
RootCmd.Version = version
initiator.HealthCheck.Version = version
initiator.StartDKG.Version = version
initiator.StartResigning.Version = version
operator.StartDKGOperator.Version = version
if err := RootCmd.Execute(); err != nil {
log.Fatal("failed to execute root command", zap.Error(err))
Expand Down
6 changes: 6 additions & 0 deletions cli/flags/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const (
clientCACertPath = "clientCACertPath"
serverTLSCertPath = "serverTLSCertPath"
serverTLSKeyPath = "serverTLSKeyPath"
proofsFilePath = "proofsFilePath"
)

// WithdrawAddressFlag adds withdraw address flag to the command
Expand Down Expand Up @@ -136,6 +137,11 @@ func OperatorIDFlag(c *cobra.Command) {
AddPersistentIntFlag(c, operatorID, 0, "Operator ID", false)
}

// ProofsFilePath add file path to proofs flag to the command
func ProofsFilePath(c *cobra.Command){
AddPersistentStringFlag(c, proofsFilePath, "proofs.json", "Path to proofs file", false)
}

// AddPersistentStringFlag adds a string flag to the command
func AddPersistentStringFlag(c *cobra.Command, flag, value, description string, isRequired bool) {
req := ""
Expand Down
15 changes: 5 additions & 10 deletions cli/initiator/initiator.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@ import (
"fmt"
"log"

"github.com/sourcegraph/conc/pool"
"github.com/spf13/cobra"
"go.uber.org/zap"

e2m_core "github.com/bloxapp/eth2-key-manager/core"
cli_utils "github.com/bloxapp/ssv-dkg/cli/utils"
"github.com/bloxapp/ssv-dkg/pkgs/crypto"
"github.com/bloxapp/ssv-dkg/pkgs/initiator"
"github.com/bloxapp/ssv-dkg/pkgs/wire"
"github.com/sourcegraph/conc/pool"
"github.com/spf13/cobra"
"go.uber.org/zap"
)

const (
Expand Down Expand Up @@ -62,11 +61,7 @@ var StartDKG = &cobra.Command{
if err != nil {
logger.Fatal("😥 Failed to load operators: ", zap.Error(err))
}
logger.Info("🔑 opening initiator RSA private key file")
ethnetwork := e2m_core.MainNetwork
if cli_utils.Network != "now_test_network" {
ethnetwork = e2m_core.NetworkFromString(cli_utils.Network)
}
ethNetwork := e2m_core.NetworkFromString(cli_utils.Network)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should make this fail on invalid input (now it fails silently with unknown outcomes)

// start the ceremony
ctx := context.Background()
pool := pool.NewWithResults[*Result]().WithContext(ctx).WithFirstError().WithMaxGoroutines(maxConcurrency)
Expand All @@ -82,7 +77,7 @@ var StartDKG = &cobra.Command{
id := crypto.NewID()
nonce := cli_utils.Nonce + uint64(i)
// Perform the ceremony.
depositData, keyShares, proofs, err := dkgInitiator.StartDKG(id, cli_utils.WithdrawAddress.Bytes(), operatorIDs, ethnetwork, cli_utils.OwnerAddress, nonce)
depositData, keyShares, proofs, err := dkgInitiator.StartDKG(id, cli_utils.WithdrawAddress.Bytes(), operatorIDs, ethNetwork, cli_utils.OwnerAddress, nonce)
if err != nil {
return nil, err
}
Expand Down
130 changes: 130 additions & 0 deletions cli/initiator/resigning.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package initiator

import (
"context"
"encoding/hex"
"fmt"
"log"

e2m_core "github.com/bloxapp/eth2-key-manager/core"
cli_utils "github.com/bloxapp/ssv-dkg/cli/utils"
"github.com/bloxapp/ssv-dkg/pkgs/crypto"
"github.com/bloxapp/ssv-dkg/pkgs/initiator"
"github.com/bloxapp/ssv-dkg/pkgs/wire"
"github.com/sourcegraph/conc/pool"
"github.com/spf13/cobra"
"go.uber.org/zap"
)

func init() {
cli_utils.SetResigningFlags(StartResigning)
}

var StartResigning = &cobra.Command{
Use: "resign",
Short: "Resigning DKG results",
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Println(`
██████╗ ██╗ ██╗ ██████╗ ██████╗ ███████╗███████╗██╗ ██████╗ ███╗ ██╗
██╔══██╗██║ ██╔╝██╔════╝ ██╔══██╗██╔════╝██╔════╝██║██╔════╝ ████╗ ██║
██║ ██║█████╔╝ ██║ ███╗ ██████╔╝█████╗ ███████╗██║██║ ███╗██╔██╗ ██║
██║ ██║██╔═██╗ ██║ ██║ ██╔══██╗██╔══╝ ╚════██║██║██║ ██║██║╚██╗██║
██████╔╝██║ ██╗╚██████╔╝ ██║ ██║███████╗███████║██║╚██████╔╝██║ ╚████║
╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝
`)

if err := cli_utils.SetViperConfig(cmd); err != nil {
return err
}
if err := cli_utils.BindResigningFlags(cmd); err != nil {
return err
}
logger, err := cli_utils.SetGlobalLogger(cmd, "dkg-initiator")
if err != nil {
return err
}
defer func() {
if err := cli_utils.Sync(logger); err != nil {
log.Printf("Failed to sync logger: %v", err)
}
}()
logger.Info("🪛 Initiator`s", zap.String("Version", cmd.Version))
// Load operators
opMap, err := cli_utils.LoadOperators(logger)
if err != nil {
logger.Fatal("😥 Failed to load operators: ", zap.Error(err))
}
operatorIDs, err := cli_utils.StingSliceToUintArray(cli_utils.OperatorIDs)
if err != nil {
logger.Fatal("😥 Failed to load participants: ", zap.Error(err))
}
ethNetwork := e2m_core.NetworkFromString(cli_utils.Network)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here as in initiator.go

arrayOfSignedProofs, err := wire.LoadProofs(cli_utils.ProofsFilePath)
if err != nil {
logger.Fatal("😥 Failed to read proofs json file:", zap.Error(err))
}
// start the ceremony
ctx := context.Background()
pool := pool.NewWithResults[*Result]().WithContext(ctx).WithFirstError().WithMaxGoroutines(maxConcurrency)
for i := 0; i < len(arrayOfSignedProofs); i++ {
i := i
pool.Go(func(ctx context.Context) (*Result, error) {
// Create new DKG initiator
dkgInitiator, err := initiator.New(opMap.Clone(), logger, cmd.Version, cli_utils.ClientCACertPath)
if err != nil {
return nil, err
}
// Create a new ID
id := crypto.NewID()
nonce := cli_utils.Nonce + uint64(i)
// Perform the resigning ceremony
depositData, keyShares, proofs, err := dkgInitiator.StartResigning(id, operatorIDs, arrayOfSignedProofs[i], ethNetwork, cli_utils.WithdrawAddress.Bytes(), cli_utils.OwnerAddress, nonce)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remind me if i'm wrong: wasn't the point of proofs to be able to verify the RSA signatures of operators as a confirmation that they approved that file to be used for resiging/resharing? @MatusKysel @pavelkrolevets

the spec has a ValidateSignedProofs func, maybe we can use it here right after loading the proofs?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have this check when we write result files to disk: https://github.com/ssvlabs/ssv-dkg/blob/re-sharing/pkgs/validator/validator.go#L135

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, but this is a different check on the new proofs right?

i think we should also validate the proofs before resigning and resharing, so that we wont start a process that we know is gonna be invalid because the proofs are, and we can let the user know of this issue early

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, agree, added initial proofs validation at initiator before sending messages

if err != nil {
return nil, err
}
logger.Debug("Resigning ceremony completed",
zap.String("id", hex.EncodeToString(id[:])),
zap.Uint64("nonce", nonce),
zap.String("pubkey", keyShares.Shares[0].ShareData.PublicKey),
)
return &Result{
id: id,
depositData: depositData,
keyShares: keyShares,
nonce: nonce,
proof: proofs,
}, nil
})
}
results, err := pool.Wait()
if err != nil {
logger.Fatal("😥 Failed to initiate Resigning ceremony: ", zap.Error(err))
}
var depositDataArr []*wire.DepositDataCLI
var keySharesArr []*wire.KeySharesCLI
var proofs [][]*wire.SignedProof
for _, res := range results {
depositDataArr = append(depositDataArr, res.depositData)
keySharesArr = append(keySharesArr, res.keyShares)
proofs = append(proofs, res.proof)
}
// Save results
logger.Info("🎯 All data is validated.")
if err := cli_utils.WriteResults(
logger,
depositDataArr,
keySharesArr,
proofs,
false,
len(arrayOfSignedProofs),
cli_utils.OwnerAddress,
cli_utils.Nonce,
cli_utils.WithdrawAddress,
cli_utils.OutputPath,
); err != nil {
logger.Fatal("Could not save results", zap.Error(err))
}
logger.Info("🚀 Resigning ceremony completed")
return nil
},
}
103 changes: 103 additions & 0 deletions cli/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@ var (
CeremonyDir string
)

// resigning flags
var (
ProofsFilePath string
)

// SetViperConfig reads a yaml config file if provided
func SetViperConfig(cmd *cobra.Command) error {
if err := viper.BindPFlag("configPath", cmd.PersistentFlags().Lookup("configPath")); err != nil {
Expand Down Expand Up @@ -191,6 +196,19 @@ func SetVerifyFlags(cmd *cobra.Command) {
flags.AddPersistentStringFlag(cmd, "owner", "", "Owner address", true)
}

func SetResigningFlags(cmd *cobra.Command) {
SetBaseFlags(cmd)
flags.OperatorsInfoFlag(cmd)
flags.OperatorsInfoPathFlag(cmd)
flags.OperatorIDsFlag(cmd)
flags.OwnerAddressFlag(cmd)
flags.NonceFlag(cmd)
flags.NetworkFlag(cmd)
flags.WithdrawAddressFlag(cmd)
flags.ProofsFilePath(cmd)
flags.ClientCACertPathFlag(cmd)
}

func SetHealthCheckFlags(cmd *cobra.Command) {
flags.AddPersistentStringSliceFlag(cmd, "ip", []string{}, "Operator ip:port", true)
}
Expand Down Expand Up @@ -323,6 +341,91 @@ func BindInitFlags(cmd *cobra.Command) error {
return nil
}

// BindResigningFlags binds flags to yaml config parameters for the resigning of previous DKG result
func BindResigningFlags(cmd *cobra.Command) error {
if err := BindBaseFlags(cmd); err != nil {
return err
}
if err := viper.BindPFlag("operatorsInfo", cmd.PersistentFlags().Lookup("operatorsInfo")); err != nil {
return err
}
if err := viper.BindPFlag("operatorsInfoPath", cmd.PersistentFlags().Lookup("operatorsInfoPath")); err != nil {
return err
}
if err := viper.BindPFlag("owner", cmd.PersistentFlags().Lookup("owner")); err != nil {
return err
}
if err := viper.BindPFlag("nonce", cmd.PersistentFlags().Lookup("nonce")); err != nil {
return err
}
if err := viper.BindPFlag("clientCACertPath", cmd.PersistentFlags().Lookup("clientCACertPath")); err != nil {
return err
}
if err := viper.BindPFlag("proofsFilePath", cmd.PersistentFlags().Lookup("proofsFilePath")); err != nil {
return err
}
if err := viper.BindPFlag("operatorIDs", cmd.PersistentFlags().Lookup("operatorIDs")); err != nil {
return err
}
if err := viper.BindPFlag("withdrawAddress", cmd.PersistentFlags().Lookup("withdrawAddress")); err != nil {
return err
}
if err := viper.BindPFlag("network", cmd.Flags().Lookup("network")); err != nil {
return err
}
OperatorIDs = viper.GetStringSlice("operatorIDs")
if len(OperatorIDs) == 0 {
return fmt.Errorf("😥 Operator IDs flag cant be empty")
}
OperatorsInfoPath = viper.GetString("operatorsInfoPath")
if strings.Contains(OperatorsInfoPath, "../") {
return fmt.Errorf("😥 operatorsInfoPath flag should not contain traversal")
}
OperatorsInfo = viper.GetString("operatorsInfo")
if OperatorsInfoPath != "" && OperatorsInfo != "" {
return fmt.Errorf("😥 operators info can be provided either as a raw JSON string, or path to a file, not both")
}
if OperatorsInfoPath == "" && OperatorsInfo == "" {
return fmt.Errorf("😥 operators info should be provided either as a raw JSON string, or path to a file")
}
owner := viper.GetString("owner")
if owner == "" {
return fmt.Errorf("😥 Failed to get owner address flag value")
}
Nonce = viper.GetUint64("nonce")
ClientCACertPath = viper.GetStringSlice("clientCACertPath")
for _, certPath := range ClientCACertPath {
if strings.Contains(certPath, "../") {
return fmt.Errorf("😥 clientCACertPath flag should not contain traversal")
}
}
ProofsFilePath = viper.GetString("proofsFilePath")
if ProofsFilePath == "" {
return fmt.Errorf("😥 Failed to get path to proofs flag value")
}
if strings.Contains(ProofsFilePath, "../") {
return fmt.Errorf("😥 proofsFilePath flag should not contain traversal")
}
withdrawAddr := viper.GetString("withdrawAddress")
if withdrawAddr == "" {
return fmt.Errorf("😥 Failed to get withdrawal address flag value")
}
var err error
WithdrawAddress, err = utils.HexToAddress(withdrawAddr)
if err != nil {
return fmt.Errorf("😥 Failed to parse withdraw address: %s", err.Error())
}
Network = viper.GetString("network")
if Network == "" {
return fmt.Errorf("😥 Failed to get fork version flag value")
}
OwnerAddress, err = utils.HexToAddress(owner)
if err != nil {
return fmt.Errorf("😥 Failed to parse owner address: %s", err)
}
return nil
}

// BindOperatorFlags binds flags to yaml config parameters for the operator
func BindOperatorFlags(cmd *cobra.Command) error {
if err := BindBaseFlags(cmd); err != nil {
Expand Down
13 changes: 13 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,19 @@ services:
volumes:
- ./examples:/data

resign:
image: ssv-dkg:latest
depends_on:
- operator1
- operator2
- operator3
- operator4
networks:
- shared_network
command: ["resign", "--configPath", "/data/config/resign.example.yaml"]
volumes:
- ./examples:/data

ping:
image: ssv-dkg:latest
depends_on:
Expand Down
33 changes: 33 additions & 0 deletions examples/config/resign.example.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
operatorIDs: [1, 22, 44, 55]
withdrawAddress: "0x81592c3de184a3e2c0dcb5a261bc107bfa91f494"
owner: "0x81592c3de184a3e2c0dcb5a261bc107bfa91f494"
nonce: 10
network: "holesky"
# operatorsInfo: '[{
# "id": 1,
# "public_key": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdkFXRFppc1d4TUV5MGNwdjhoanAKQThDMWNYZ3VseHkyK0tDNldpWGo3NThuMjl4b1NsNHV1SjgwQ2NqQXJqbGQrWkNEWmxvSlhtMk51L0FFOFRaMgpQRW1UZFcxcGp5TmV1N2RDUWtGTHF3b3JGZ1AzVWdxczdQSEpqSE1mOUtTb1Y0eUxlbkxwYlR0L2tEczJ1Y1c3CnUrY3hvZFJ4d01RZHZiN29mT0FhbVhxR1haZ0NhNHNvdHZmSW9RS1dDaW9MczcvUkM3dHJrUGJONW4rbHQyZWEKd1J1SFRTTlNZcEdmbi9ud0FROHVDaW55SnNQV0Q0NUhldG9GekNKSlBnNjYzVzE1K1VsWU9tQVJCcWtaSVBISAp5V25ORjZTS2tRalI2MDJwQ3RXTkZRMi9wUVFqblJXbUkrU2FjMHhXRVQ3UUlsVmYxSGZ2NWRnWE9OT05hTTlFClN3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K",
# "ip": "http://operator1:3030"
# },
# {
# "id": 2,
# "public_key": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdnRVRWFlallqY3pBUWhnSTQ0S3cKcGZYZjhCNk1ZUjhOMzFmRVFLRGRDVmo5dUNPcHVybzYzSDdxWXNzMzVGaVdxNmRwMjR3M0dCRTAzR1llU1BSZgowTEVBVEJkYlhCVkY3WGR6ei9sV2UrblJNRG1Xdm1DTUZjRlRPRU5FYmhuTXVjOEQ1K3ZFTmo5cTQzbE4vejhqCmE2T2M4S2tEL2E4SW02Nm54ZkRhMjFyMzNaSW9GL1g5d0g2K25EN3Jockx5bzJub1lxaVJpT1NTTkp2R25UY08KazBmckk4b2xFNjR1clhxWXFLN2ZicXNaN082NnphN2ROTmc3MW1EWHlpdDlSTUlyR3lSME5xN0FUSkxwbytoTApEcldoY0h4M0NWb1dQZzNuR2phN0duVFhXU2FWb1JPSnBRVU9oYXgxNVJnZ2FBOHpodGgyOUorNnNNY2R6ZitQCkZ3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K",
# "ip": "http://operator2:3030"
# },
# {
# "id": 3,
# "public_key": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdlFhZlo0ODJQYXRsYnRrOVdIb2MKZDBWdWNWWDk4QUlzenAvazlFTlYyQU82SVhQUXVqU1BtdUZrQTlibThsSllnWTJPb0lQU0RmK1JHWGNMc2R0VApzdEJhQ2JPL0pMOFlSejk4NURKejhBRlhDU0J3bW5mbzROSFptUjJGMVdMTE5CS2wzdVQ5Q1VLbC9RUnpKRFF1CjNNYVJ6eE5FVmdONWtvU1Nid0NxVDNDSCtjam5QU0pIeGhiaTNTaldOSnJFb3ZRUmN3ZUlpYXRrZEdVNWJOUkoKUW1LVldhYzhzVklYN2NDNE54V2RDNG1VM1RPK2Vlei90N2xVcnhSNjdnb21TbGdwaU5weFJ1M2dFajRkSWpINwpsZDlTYW1ObEJPeHV5N0lFMEJpdm5nSUdIKzVwcXZVTXhoM0N5WkVtMjFHd3JTRFhqcVpwWG92OEUwQkQ5eGY4ClN3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K",
# "ip": "http://operator3:3030"
# },
# {
# "id": 4,
# "public_key": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeFRWM2I5OHU4NmtzcEhQcWgrS2QKKzRHd0lSeEhwRHpEZjVlc3hjZytxaTlvbDRERmplUXMrbGloeUp5cGdOMXJwdTlQVnR5cXp2K3k5cEVNa0VXTgovYjBUQmdRMEp5TzdmNGliY1d5UUcrNGhVUS9XY3h1ZW5aUDA3S0VwTjh4Tk8xN3BzbmhRMXRqQVhybDNGN1lYCmlZdXl5Z0Rta2w0YjYrUDR6MjNhR01VSEtnTnJ5aFlZTFV4dWdycDVRTnJTV3lXNXFtb2EvYnJDenQ2RFJYb1UKU25JSkpSUVpPS2NnckdKMHVBYjJDRmtsL0xuaElxT2RZZ21aUG9oRmprVEorRnZNdkZsMjAwZ1BHbVpxUS9MMgpsM2ZBdmhZYlZRMlRVeUtmU2orYXZ1WUFZZnhKeG5OcWlmdkNkVGNmQzc3c0N0eFFERWVjY0pTVnVDbGZWeTFZCll3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K",
# "ip": "http://operator4:3030"
# }]'
operatorsInfoPath: /data/initiator/operators_info.json
outputPath: /data/initiator/output
logLevel: info
logFormat: json
logLevelFormat: capitalColor
logFilePath: /data/initiator/output/initiator_debug.log
# clientCACertPath: /data/initiator/rootCA.crt
proofsFilePath: /data/initiator/output/ceremony-2024-04-22--16-36-19.354/proofs.json
Loading
Loading