mirror of
https://github.com/QuilibriumNetwork/ceremonyclient.git
synced 2026-02-23 11:27:25 +08:00
commit d05a4d5f688dbd09900ceccdcc5f8109dd0671c2
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Wed Jun 12 00:50:16 2024 -0500
merge
commit db57ff1f191f9dedc87ca77da1c71244dd2325bd
Merge: 7b43494 2e3279a
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Wed Jun 12 00:49:32 2024 -0500
Merge branch 'v1.4.19' into not-release
commit 7b43494246e28152b46710c8c9821429d4231f7e
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Wed Jun 12 00:49:13 2024 -0500
pull from release site
commit 2e3279ac930ac630d9ca2b26cf4f3232abe79823
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 06:31:02 2024 -0500
remove binaries
commit 2768a8778b3860c5736352c8aa950e3496a46e56
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 06:24:44 2024 -0500
signatory #8 added
commit 6a944628575ccadd17c9f9f4a11a49c032fa0c1d
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 06:08:26 2024 -0500
signatory #6 added
commit b401fb65e5ddbe0340fe85aab1182d6120a4e161
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 05:39:03 2024 -0500
signatory #3 added
commit e5700913c0f6246fb607bcd3e219c257cb4a80e9
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 05:31:24 2024 -0500
signatory #15 added
commit 9b1da6c03e517135bfcd59226f900adab42f3687
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 05:23:02 2024 -0500
signatories #4 and #16 added
commit 9c97d1bbc399a070ac21b35ed9b1af127fa4c7ea
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 04:59:27 2024 -0500
signatories #1 and #2 added
commit 905e3f78a8121eade1c331ae910ed25dd534f27a
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 04:40:32 2024 -0500
build, binaries, signatory #13
commit ebfb57bc29d9ed1fb25d0dd100e38709354b3d84
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Sat Jun 8 03:38:53 2024 -0500
tests pass, let's go
commit 5d4612c6c624c3dc18f9a5657936034ac9d9d8dd
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 03:53:15 2024 -0500
update version info + readme
commit 6b0dd69e930d01b98acb8d7b56bb5d572e1a4324
Merge: 090d630 859221b
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 08:25:16 2024 +0000
Merge branch 'feat-data-worker-direct-config' into 'v1.4.19'
feat: support detached configuration mode for data workers
See merge request quilibrium/ceremonyclient!7
commit 859221b179ab2631fa474be2494259afaaa6bd51
Author: Cassandra Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 03:24:22 2024 -0500
feat: support detached configuration mode for data workers
commit 090d6301d44a2aa88886120783cd5a6e537aa6d1
Merge: 62db30c d1cae94
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 06:25:43 2024 +0000
Merge branch 'feat-go-1-22' into 'v1.4.19'
feat: go 1.22 support
See merge request quilibrium/ceremonyclient!6
commit d1cae942165f4871f8051e266722c0ca717780cb
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 06:25:43 2024 +0000
feat: go 1.22 support
commit 62db30c54f9258c92113c6664ce817670a339083
Merge: 0cbc0d0 f36cea3
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 03:52:17 2024 +0000
Merge branch 'rust-vdf' into 'v1.4.19'
Switch to Rust VDF
See merge request quilibrium/ceremonyclient!2
commit f36cea323bfe5e56f519f59f9a0cce35f0f8b6ab
Author: Agost Biro <agostbiro@gmail.com>
Date: Fri Jun 7 03:52:16 2024 +0000
Switch to Rust VDF
commit 0cbc0d0d319713e20ca7f48588c4153833e58429
Merge: 986e12c 0c48a83
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Fri Jun 7 00:50:15 2024 +0000
Merge branch 'release_image' into 'v1.4.19'
create docker image based on release binaries
See merge request quilibrium/ceremonyclient!4
commit 0c48a83bb5751abf7c8c0ff188bfdc2130631e78
Author: Marius Scurtescu <marius.scurtescu@gmail.com>
Date: Fri Jun 7 00:50:15 2024 +0000
create docker image based on release binaries
commit 986e12c88bb2d2b412b59f7db1ae39f828304dbe
Merge: 58456c1 a3ef5c6
Author: Cassie Heart <cassandra@quilibrium.com>
Date: Wed Jun 5 22:01:37 2024 +0000
Merge branch 'signature_check' into 'v1.4.19'
add default of signature check from QUILIBRIUM_SIGNATURE_CHECK env var
See merge request quilibrium/ceremonyclient!1
commit a3ef5c6af2d5de107d01c45a62d7324165e2551b
Author: Marius Scurtescu <marius.scurtescu@gmail.com>
Date: Wed Jun 5 14:37:50 2024 -0700
add default of signature check from QUILIBRIUM_SIGNATURE_CHECK env var
309 lines
7.8 KiB
Go
309 lines
7.8 KiB
Go
package master
|
||
|
||
import (
|
||
"bytes"
|
||
"context"
|
||
"encoding/binary"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/iden3/go-iden3-crypto/poseidon"
|
||
"github.com/libp2p/go-libp2p/core/peer"
|
||
"github.com/mr-tron/base58"
|
||
"github.com/pkg/errors"
|
||
"go.uber.org/zap"
|
||
"google.golang.org/protobuf/proto"
|
||
"google.golang.org/protobuf/types/known/anypb"
|
||
"source.quilibrium.com/quilibrium/monorepo/go-libp2p-blossomsub/pb"
|
||
"source.quilibrium.com/quilibrium/monorepo/node/consensus"
|
||
"source.quilibrium.com/quilibrium/monorepo/node/protobufs"
|
||
)
|
||
|
||
func (e *MasterClockConsensusEngine) handleMessage(message *pb.Message) error {
|
||
e.logger.Debug(
|
||
"received message",
|
||
zap.Binary("data", message.Data),
|
||
zap.Binary("from", message.From),
|
||
zap.Binary("signature", message.Signature),
|
||
)
|
||
msg := &protobufs.Message{}
|
||
if err := proto.Unmarshal(message.Data, msg); err != nil {
|
||
return errors.Wrap(err, "handle message")
|
||
}
|
||
|
||
any := &anypb.Any{}
|
||
if err := proto.Unmarshal(msg.Payload, any); err != nil {
|
||
return errors.Wrap(err, "handle message")
|
||
}
|
||
|
||
switch any.TypeUrl {
|
||
case protobufs.ClockFrameType:
|
||
if err := e.handleClockFrameData(
|
||
message.From,
|
||
any,
|
||
); err != nil {
|
||
return errors.Wrap(err, "handle message")
|
||
}
|
||
return nil
|
||
case protobufs.SelfTestReportType:
|
||
if err := e.handleSelfTestReport(
|
||
message.From,
|
||
any,
|
||
); err != nil {
|
||
return errors.Wrap(err, "handle message")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
return errors.Wrap(errors.New("invalid message"), "handle message")
|
||
}
|
||
|
||
func (e *MasterClockConsensusEngine) handleClockFrameData(
|
||
peerID []byte,
|
||
any *anypb.Any,
|
||
) error {
|
||
frame := &protobufs.ClockFrame{}
|
||
if err := any.UnmarshalTo(frame); err != nil {
|
||
return errors.Wrap(err, "handle clock frame data")
|
||
}
|
||
|
||
head, err := e.masterTimeReel.Head()
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
if frame.FrameNumber < head.FrameNumber {
|
||
return nil
|
||
}
|
||
|
||
if e.difficulty != frame.Difficulty {
|
||
e.logger.Debug(
|
||
"frame difficulty mismatched",
|
||
zap.Uint32("difficulty", frame.Difficulty),
|
||
)
|
||
return errors.Wrap(
|
||
errors.New("frame difficulty"),
|
||
"handle clock frame data",
|
||
)
|
||
}
|
||
|
||
e.logger.Debug(
|
||
"got clock frame",
|
||
zap.Binary("sender", peerID),
|
||
zap.Binary("filter", frame.Filter),
|
||
zap.Uint64("frame_number", frame.FrameNumber),
|
||
zap.Int("proof_count", len(frame.AggregateProofs)),
|
||
)
|
||
|
||
go func() {
|
||
select {
|
||
case e.frameValidationCh <- frame:
|
||
default:
|
||
e.logger.Debug(
|
||
"dropped frame due to overwhelmed queue",
|
||
zap.Binary("sender", peerID),
|
||
zap.Binary("filter", frame.Filter),
|
||
zap.Uint64("frame_number", frame.FrameNumber),
|
||
zap.Int("proof_count", len(frame.AggregateProofs)),
|
||
)
|
||
}
|
||
}()
|
||
|
||
return nil
|
||
}
|
||
|
||
func (e *MasterClockConsensusEngine) handleSelfTestReport(
|
||
peerID []byte,
|
||
any *anypb.Any,
|
||
) error {
|
||
report := &protobufs.SelfTestReport{}
|
||
if err := any.UnmarshalTo(report); err != nil {
|
||
return errors.Wrap(err, "handle self test report")
|
||
}
|
||
|
||
if bytes.Equal(peerID, e.pubSub.GetPeerID()) {
|
||
info := e.peerInfoManager.GetPeerInfo(peerID)
|
||
info.LastSeen = time.Now().UnixMilli()
|
||
info.DifficultyMetric = report.DifficultyMetric
|
||
info.MasterHeadFrame = report.MasterHeadFrame
|
||
return nil
|
||
}
|
||
|
||
if len(report.Proof) != 520 {
|
||
e.logger.Warn(
|
||
"received invalid proof from peer",
|
||
zap.String("peer_id", peer.ID(peerID).String()),
|
||
zap.Int("proof_size", len(report.Proof)),
|
||
zap.Uint32("cores", report.Cores),
|
||
)
|
||
e.pubSub.SetPeerScore(peerID, -1000)
|
||
return errors.Wrap(errors.New("invalid report"), "handle self test report")
|
||
}
|
||
|
||
e.logger.Debug(
|
||
"received proof from peer",
|
||
zap.String("peer_id", peer.ID(peerID).String()),
|
||
)
|
||
|
||
info := e.peerInfoManager.GetPeerInfo(peerID)
|
||
if info != nil {
|
||
if (time.Now().UnixMilli() - info.LastSeen) < (270 * 1000) {
|
||
return nil
|
||
}
|
||
|
||
info.DifficultyMetric = report.DifficultyMetric
|
||
info.MasterHeadFrame = report.MasterHeadFrame
|
||
|
||
if info.Bandwidth <= 1048576 {
|
||
go func() {
|
||
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute)
|
||
defer cancel()
|
||
ch := e.pubSub.GetMultiaddrOfPeerStream(ctx, peerID)
|
||
select {
|
||
case <-ch:
|
||
go func() {
|
||
e.bandwidthTestCh <- peerID
|
||
}()
|
||
case <-ctx.Done():
|
||
}
|
||
}()
|
||
}
|
||
|
||
proof := report.Proof
|
||
challenge := []byte{}
|
||
challenge = append(challenge, peerID...)
|
||
challenge = append(challenge, report.Challenge...)
|
||
|
||
proofs := make([][]byte, (len(report.Proof)-8)/516)
|
||
for i := 0; i < len(proofs); i++ {
|
||
proofs[i] = proof[i*516 : (i+1)*516]
|
||
}
|
||
go func() {
|
||
e.verifyTestCh <- verifyChallenge{
|
||
peerID: peerID,
|
||
challenge: challenge,
|
||
cores: report.Cores,
|
||
increment: report.Increment,
|
||
proof: proof,
|
||
}
|
||
}()
|
||
|
||
return nil
|
||
}
|
||
|
||
e.addPeerManifestReport(peerID, report)
|
||
|
||
memory := binary.BigEndian.Uint64(report.Memory)
|
||
e.logger.Debug(
|
||
"received self test report",
|
||
zap.String("peer_id", base58.Encode(peerID)),
|
||
zap.Uint32("difficulty", report.Difficulty),
|
||
zap.Int64("difficulty_metric", report.DifficultyMetric),
|
||
zap.Int64("commit_16_metric", report.Commit_16Metric),
|
||
zap.Int64("commit_128_metric", report.Commit_128Metric),
|
||
zap.Int64("commit_1024_metric", report.Commit_1024Metric),
|
||
zap.Int64("commit_65536_metric", report.Commit_65536Metric),
|
||
zap.Int64("proof_16_metric", report.Proof_16Metric),
|
||
zap.Int64("proof_128_metric", report.Proof_128Metric),
|
||
zap.Int64("proof_1024_metric", report.Proof_1024Metric),
|
||
zap.Int64("proof_65536_metric", report.Proof_65536Metric),
|
||
zap.Uint32("cores", report.Cores),
|
||
zap.Uint64("memory", memory),
|
||
zap.Uint64("storage", binary.BigEndian.Uint64(report.Storage)),
|
||
)
|
||
|
||
if report.Cores < 3 || memory < 16000000000 {
|
||
e.logger.Debug(
|
||
"peer reported invalid configuration",
|
||
zap.String("peer_id", base58.Encode(peerID)),
|
||
zap.Uint32("difficulty", report.Difficulty),
|
||
zap.Int64("difficulty_metric", report.DifficultyMetric),
|
||
zap.Int64("commit_16_metric", report.Commit_16Metric),
|
||
zap.Int64("commit_128_metric", report.Commit_128Metric),
|
||
zap.Int64("commit_1024_metric", report.Commit_1024Metric),
|
||
zap.Int64("commit_65536_metric", report.Commit_65536Metric),
|
||
zap.Int64("proof_16_metric", report.Proof_16Metric),
|
||
zap.Int64("proof_128_metric", report.Proof_128Metric),
|
||
zap.Int64("proof_1024_metric", report.Proof_1024Metric),
|
||
zap.Int64("proof_65536_metric", report.Proof_65536Metric),
|
||
zap.Uint32("cores", report.Cores),
|
||
zap.Uint64("memory", memory),
|
||
zap.Uint64("storage", binary.BigEndian.Uint64(report.Storage)),
|
||
)
|
||
|
||
// tag: dusk – nuke this peer for now
|
||
e.pubSub.SetPeerScore(peerID, -1000)
|
||
return nil
|
||
}
|
||
|
||
go func() {
|
||
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute)
|
||
defer cancel()
|
||
ch := e.pubSub.GetMultiaddrOfPeerStream(ctx, peerID)
|
||
select {
|
||
case <-ch:
|
||
go func() {
|
||
e.bandwidthTestCh <- peerID
|
||
}()
|
||
case <-ctx.Done():
|
||
}
|
||
}()
|
||
|
||
return nil
|
||
}
|
||
|
||
// This does not publish any longer, frames strictly are picked up from sync
|
||
func (e *MasterClockConsensusEngine) publishProof(
|
||
frame *protobufs.ClockFrame,
|
||
) error {
|
||
e.logger.Debug(
|
||
"publishing frame",
|
||
zap.Uint64("frame_number", frame.FrameNumber),
|
||
)
|
||
|
||
e.masterTimeReel.Insert(frame, false)
|
||
|
||
e.state = consensus.EngineStateCollecting
|
||
|
||
return nil
|
||
}
|
||
|
||
func (e *MasterClockConsensusEngine) publishMessage(
|
||
filter []byte,
|
||
message proto.Message,
|
||
) error {
|
||
any := &anypb.Any{}
|
||
if err := any.MarshalFrom(message); err != nil {
|
||
return errors.Wrap(err, "publish message")
|
||
}
|
||
|
||
// annoying protobuf any hack
|
||
any.TypeUrl = strings.Replace(
|
||
any.TypeUrl,
|
||
"type.googleapis.com",
|
||
"types.quilibrium.com",
|
||
1,
|
||
)
|
||
|
||
payload, err := proto.Marshal(any)
|
||
if err != nil {
|
||
return errors.Wrap(err, "publish message")
|
||
}
|
||
|
||
h, err := poseidon.HashBytes(payload)
|
||
if err != nil {
|
||
return errors.Wrap(err, "publish message")
|
||
}
|
||
|
||
msg := &protobufs.Message{
|
||
Hash: h.Bytes(),
|
||
Address: e.filter,
|
||
Payload: payload,
|
||
}
|
||
data, err := proto.Marshal(msg)
|
||
if err != nil {
|
||
return errors.Wrap(err, "publish message")
|
||
}
|
||
return e.pubSub.PublishToBitmask(filter, data)
|
||
}
|