diff --git a/config.default.json b/config.default.json index 25816877fa7f7861cec47e6db5a2be922f4076e8..de416ecb1feb1c4d3cae756a132cf36bde034e43 100644 --- a/config.default.json +++ b/config.default.json @@ -28,6 +28,12 @@ "database": { "directory": "mainnetdb" }, + "drng": { + "instanceId": 1, + "threshold": 3, + "distributedPubKey": "", + "committeeMembers": [] + }, "gossip": { "port": 14666 }, diff --git a/plugins/drng/drng.go b/plugins/drng/drng.go new file mode 100644 index 0000000000000000000000000000000000000000..a1fb2c489b4b24ea7a6a1822057e5dbe3ce5f38a --- /dev/null +++ b/plugins/drng/drng.go @@ -0,0 +1,36 @@ +package drng + +import ( + "encoding/base64" + "errors" + "fmt" + + "github.com/iotaledger/goshimmer/plugins/config" + "github.com/iotaledger/hive.go/crypto/ed25519" +) + +var ( + // ErrParsingCommitteeMember is returned for an invalid committee member + ErrParsingCommitteeMember = errors.New("cannot parse committee member") +) + +func parseCommitteeMembers() (result []ed25519.PublicKey, err error) { + for _, committeeMember := range config.Node.GetStringSlice(CFG_COMMITTEE_MEMBERS) { + if committeeMember == "" { + continue + } + + pubKey, err := base64.StdEncoding.DecodeString(committeeMember) + if err != nil { + return nil, fmt.Errorf("%w: invalid public key: %s", ErrParsingCommitteeMember, err) + } + publicKey, err, _ := ed25519.PublicKeyFromBytes(pubKey) + if err != nil { + return nil, err + } + + result = append(result, publicKey) + } + + return result, nil +} diff --git a/plugins/drng/parameters.go b/plugins/drng/parameters.go new file mode 100644 index 0000000000000000000000000000000000000000..310e21eeb077de1b1de5002fdb143021410f1d19 --- /dev/null +++ b/plugins/drng/parameters.go @@ -0,0 +1,19 @@ +package drng + +import ( + flag "github.com/spf13/pflag" +) + +const ( + CFG_INSTANCE_ID = "drng.instanceId" + CFG_THRESHOLD = "drng.threshold" + CFG_DISTRIBUTED_PUB_KEY = "drng.distributedPubKey" + CFG_COMMITTEE_MEMBERS = "drng.committeeMembers" +) + +func init() { + flag.Uint32(CFG_INSTANCE_ID, 1, "instance ID of the drng instance") + flag.Uint32(CFG_THRESHOLD, 3, "BLS threshold of the drng") + flag.String(CFG_DISTRIBUTED_PUB_KEY, "", "distributed public key of the committee (hex encoded)") + flag.StringSlice(CFG_COMMITTEE_MEMBERS, []string{}, "list of committee members of the drng") +} diff --git a/plugins/drng/plugin.go b/plugins/drng/plugin.go index 7f009d48a0653fa3cc108d6de4956ecb46adbe52..597d038d48313addbeb41c527ed06dd6ffa67ce8 100644 --- a/plugins/drng/plugin.go +++ b/plugins/drng/plugin.go @@ -1,10 +1,15 @@ package drng import ( + "encoding/hex" + "github.com/iotaledger/goshimmer/packages/binary/drng" "github.com/iotaledger/goshimmer/packages/binary/drng/payload" + "github.com/iotaledger/goshimmer/packages/binary/drng/state" + cbPayload "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/payload" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/tangle" + "github.com/iotaledger/goshimmer/plugins/config" "github.com/iotaledger/goshimmer/plugins/messagelayer" "github.com/iotaledger/hive.go/events" "github.com/iotaledger/hive.go/logger" @@ -23,7 +28,36 @@ var ( func configure(*node.Plugin) { log = logger.NewLogger(name) - Instance = drng.New() + + // parse identities of the committee members + committeeMembers, err := parseCommitteeMembers() + if err != nil { + log.Fatalf("Invalid %s: %s", CFG_COMMITTEE_MEMBERS, err) + } + + // parse distributed public key of the committee + var dpk []byte + if str := config.Node.GetString(CFG_DISTRIBUTED_PUB_KEY); str != "" { + bytes, err := hex.DecodeString(str) + if err != nil { + log.Fatalf("Invalid %s: %s", CFG_DISTRIBUTED_PUB_KEY, err) + } + if l := len(bytes); l != cbPayload.PublicKeySize { + log.Fatalf("Invalid %s length: %d, need %d", CFG_DISTRIBUTED_PUB_KEY, l, cbPayload.PublicKeySize) + } + dpk = append(dpk, bytes...) + } + + // configure committee + committeeConf := &state.Committee{ + InstanceID: config.Node.GetUint32(CFG_INSTANCE_ID), + Threshold: uint8(config.Node.GetUint32(CFG_THRESHOLD)), + DistributedPK: dpk, + Identities: committeeMembers, + } + + Instance = drng.New(state.SetCommittee(committeeConf)) + configureEvents() }