From adb9a4d124662501a7928601f0bed35c8aaad0c6 Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Thu, 9 Jan 2025 22:31:54 -0600 Subject: [PATCH 1/6] final parameters --- node/config/version.go | 2 +- .../token/application/token_handle_mint.go | 2 +- .../token_handle_prover_join_test.go | 60 ++++++------------- 3 files changed, 21 insertions(+), 43 deletions(-) diff --git a/node/config/version.go b/node/config/version.go index 9349bf0..74f6c11 100644 --- a/node/config/version.go +++ b/node/config/version.go @@ -17,7 +17,7 @@ func GetMinimumPatchVersion() byte { } func GetMinimumVersion() []byte { - return []byte{0x02, 0x00, 0x06} + return []byte{0x02, 0x00, 0x05} } func GetVersion() []byte { diff --git a/node/execution/intrinsics/token/application/token_handle_mint.go b/node/execution/intrinsics/token/application/token_handle_mint.go index a60543b..24b98dc 100644 --- a/node/execution/intrinsics/token/application/token_handle_mint.go +++ b/node/execution/intrinsics/token/application/token_handle_mint.go @@ -22,7 +22,7 @@ import ( var PROOF_FRAME_CUTOFF = uint64(46500) var PROOF_FRAME_RING_RESET = uint64(52000) var PROOF_FRAME_RING_RESET_2 = uint64(53028) -var PROOF_FRAME_COMBINE_CUTOFF = uint64(99000) +var PROOF_FRAME_COMBINE_CUTOFF = uint64(99900) const PROOF_FRAME_SENIORITY_REPAIR = 59029 diff --git a/node/execution/intrinsics/token/application/token_handle_prover_join_test.go b/node/execution/intrinsics/token/application/token_handle_prover_join_test.go index b94a8b8..706c412 100644 --- a/node/execution/intrinsics/token/application/token_handle_prover_join_test.go +++ b/node/execution/intrinsics/token/application/token_handle_prover_join_test.go @@ -181,50 +181,28 @@ func (p *prover) generateProof( challenge, frame.FrameNumber, ) - individualChallenge := append([]byte{}, challenge...) - individualChallenge = binary.BigEndian.AppendUint32( - individualChallenge, - uint32(0), - ) - individualChallenge = append(individualChallenge, frame.Output...) - if proofTree != nil { - individualChallenge = append(individualChallenge, proofTree.Root...) - } - out1, _ := wprover.CalculateChallengeProof(individualChallenge, 10000) - if breakWesoProof { - out1[4] ^= 0xff - } - individualChallenge = append([]byte{}, challenge...) - individualChallenge = binary.BigEndian.AppendUint32( - individualChallenge, - uint32(1), - ) - individualChallenge = append(individualChallenge, frame.Output...) - if proofTree != nil { - individualChallenge = append(individualChallenge, proofTree.Root...) - } - out2, _ := wprover.CalculateChallengeProof(individualChallenge, 10000) - if breakWesoProof { - out2[4] ^= 0xff - } + outs := []merkletree.DataBlock{} + for i := 0; i < 64; i++ { + individualChallenge := append([]byte{}, challenge...) + individualChallenge = binary.BigEndian.AppendUint32( + individualChallenge, + uint32(i), + ) + individualChallenge = append(individualChallenge, frame.Output...) + if proofTree != nil { + individualChallenge = append(individualChallenge, proofTree.Root...) + } + out, _ := wprover.CalculateChallengeProof(individualChallenge, 10000) + if breakWesoProof { + out[0] ^= 0xff + } - individualChallenge = append([]byte{}, challenge...) - individualChallenge = binary.BigEndian.AppendUint32( - individualChallenge, - uint32(2), - ) - individualChallenge = append(individualChallenge, frame.Output...) - if proofTree != nil { - individualChallenge = append(individualChallenge, proofTree.Root...) - } - out3, _ := wprover.CalculateChallengeProof(individualChallenge, 10000) - if breakWesoProof { - out3[4] ^= 0xff + outs = append(outs, tries.NewProofLeaf(out)) } proofTree, output, _ := tries.PackOutputIntoMultiPayloadAndProof( - []merkletree.DataBlock{tries.NewProofLeaf(out1), tries.NewProofLeaf(out2), tries.NewProofLeaf(out3)}, - 3, + outs, + len(outs), frame, proofTree, ) @@ -237,7 +215,7 @@ func (p *prover) generateProof( } mint.SignED448([]byte(p.pubKey), p.privKey.Sign) - return proofTree, [][]byte{out1, out2}, &protobufs.TokenRequest{ + return proofTree, [][]byte{}, &protobufs.TokenRequest{ Request: &protobufs.TokenRequest_Mint{ Mint: mint, }, From b764b46ac09c0210c1258594bc04291e0b72904b Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Thu, 9 Jan 2025 22:35:38 -0600 Subject: [PATCH 2/6] remove patch number --- node/config/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/config/version.go b/node/config/version.go index 74f6c11..4430859 100644 --- a/node/config/version.go +++ b/node/config/version.go @@ -43,7 +43,7 @@ func FormatVersion(version []byte) string { } func GetPatchNumber() byte { - return 0x01 + return 0x00 } func GetRCNumber() byte { From 04452e28ffc2776c96289263abf2b12bc9841481 Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Fri, 10 Jan 2025 12:15:56 -0600 Subject: [PATCH 3/6] handle worker failure condition by allowing tree production to continue --- node/config/version.go | 2 +- node/consensus/data/main_data_loop.go | 2 +- .../token_handle_prover_join_test.go | 17 ++++--- node/tries/proof_leaf.go | 14 +----- node/tries/proof_leaf_test.go | 48 +++++++++++++++++++ 5 files changed, 63 insertions(+), 20 deletions(-) diff --git a/node/config/version.go b/node/config/version.go index 4430859..74f6c11 100644 --- a/node/config/version.go +++ b/node/config/version.go @@ -43,7 +43,7 @@ func FormatVersion(version []byte) string { } func GetPatchNumber() byte { - return 0x00 + return 0x01 } func GetRCNumber() byte { diff --git a/node/consensus/data/main_data_loop.go b/node/consensus/data/main_data_loop.go index f3616d5..c56f611 100644 --- a/node/consensus/data/main_data_loop.go +++ b/node/consensus/data/main_data_loop.go @@ -233,7 +233,7 @@ func (e *DataClockConsensusEngine) processFrame( latestFrame *protobufs.ClockFrame, dataFrame *protobufs.ClockFrame, ) *protobufs.ClockFrame { - + e.logger.Info( "current frame head", zap.Uint64("frame_number", dataFrame.FrameNumber), diff --git a/node/execution/intrinsics/token/application/token_handle_prover_join_test.go b/node/execution/intrinsics/token/application/token_handle_prover_join_test.go index 706c412..85d6134 100644 --- a/node/execution/intrinsics/token/application/token_handle_prover_join_test.go +++ b/node/execution/intrinsics/token/application/token_handle_prover_join_test.go @@ -109,7 +109,7 @@ func (p *prover) generateTransfer(coin []byte) *protobufs.TokenRequest { func (p *prover) generateSplit(addr []byte) *protobufs.TokenRequest { payload := []byte("split") payload = append(payload, addr...) - bi1, _ := new(big.Int).SetString("2047999999999", 10) + bi1, _ := new(big.Int).SetString("2048000000000", 10) bi2, _ := new(big.Int).SetString("2048000000000", 10) payload = append(payload, bi1.FillBytes(make([]byte, 32))...) payload = append(payload, bi2.FillBytes(make([]byte, 32))...) @@ -174,6 +174,7 @@ func (p *prover) generateProof( proofTree *merkletree.MerkleTree, breakWesoProof bool, breakTreeProof bool, + treeRecovery bool, ) (*merkletree.MerkleTree, [][]byte, *protobufs.TokenRequest) { challenge := []byte{} challenge = append(challenge, []byte(p.peerId)...) @@ -182,7 +183,11 @@ func (p *prover) generateProof( frame.FrameNumber, ) outs := []merkletree.DataBlock{} - for i := 0; i < 64; i++ { + target := 8 + if treeRecovery { + target = 4 + } + for i := 0; i < target; i++ { individualChallenge := append([]byte{}, challenge...) individualChallenge = binary.BigEndian.AppendUint32( individualChallenge, @@ -314,7 +319,7 @@ func TestHandleProverJoin(t *testing.T) { proofTrees := []*merkletree.MerkleTree{} reqs := []*protobufs.TokenRequest{} for _, prover := range provers { - proofTree, _, req := prover.generateProof(frame2, wprover, nil, false, false) + proofTree, _, req := prover.generateProof(frame2, wprover, nil, false, false, false) proofTrees = append(proofTrees, proofTree) reqs = append(reqs, req) } @@ -363,7 +368,7 @@ func TestHandleProverJoin(t *testing.T) { txn.Commit() for i, prover := range provers { - proofTree, _, req := prover.generateProof(frame3, wprover, proofTrees[i], false, false) + proofTree, _, req := prover.generateProof(frame3, wprover, proofTrees[i], false, false, true) proofTrees[i] = proofTree reqs[i] = req } @@ -407,7 +412,7 @@ func TestHandleProverJoin(t *testing.T) { err = txn.Commit() assert.NoError(t, err) assert.Len(t, success.Requests, 1) - assert.Len(t, app.TokenOutputs.Outputs, 3) + assert.Len(t, app.TokenOutputs.Outputs, 2) txn, _ = app.ClockStore.NewTransaction(false) frame4, _ := wprover.ProveDataClockFrame(frame3, [][]byte{}, []*protobufs.InclusionAggregateProof{}, bprivKey, time.Now().UnixMilli(), 10000) @@ -417,7 +422,7 @@ func TestHandleProverJoin(t *testing.T) { txn.Commit() for i, prover := range provers { - proofTree, _, req := prover.generateProof(frame4, wprover, proofTrees[i], false, false) + proofTree, _, req := prover.generateProof(frame4, wprover, proofTrees[i], false, false, true) proofTrees[i] = proofTree reqs[i] = req } diff --git a/node/tries/proof_leaf.go b/node/tries/proof_leaf.go index fb1f137..476d912 100644 --- a/node/tries/proof_leaf.go +++ b/node/tries/proof_leaf.go @@ -59,12 +59,7 @@ func PackOutputIntoPayloadAndProof( binary.BigEndian.AppendUint64([]byte{}, frame.FrameNumber), } - if previousTree != nil { - // don't let node produce invalid proofs that would otherwise fail - if len(previousTree.Proofs) != modulo { - return nil, nil, errors.Wrap(errors.New("invalid tree size"), "pack output into payload and proof") - } - + if previousTree != nil && len(previousTree.Proofs) == modulo { hash := sha3.Sum256(frame.Output) pick := BytesToUnbiasedMod(hash, uint64(modulo)) if uint64(modulo) < pick { @@ -119,12 +114,7 @@ func PackOutputIntoMultiPayloadAndProof( binary.BigEndian.AppendUint64([]byte{}, frame.FrameNumber), } - if previousTree != nil { - // don't let node produce invalid proofs that would otherwise fail - if len(previousTree.Proofs) != modulo { - return nil, nil, errors.Wrap(errors.New("invalid tree size"), "pack output into payload and proof") - } - + if previousTree != nil && len(previousTree.Proofs) == modulo { hash := sha3.Sum256(append(append([]byte{}, frame.Output...), previousTree.Root...)) pick := BytesToUnbiasedMod(hash, uint64(modulo)) if uint64(modulo) < pick { diff --git a/node/tries/proof_leaf_test.go b/node/tries/proof_leaf_test.go index 6dc1bc2..ce3b9c0 100644 --- a/node/tries/proof_leaf_test.go +++ b/node/tries/proof_leaf_test.go @@ -298,3 +298,51 @@ func TestPackAndVerifyMultiOutput(t *testing.T) { }) } } + +func TestPackAndVerifyOutputFailover(t *testing.T) { + outputs := make([]mt.DataBlock, 3) + for i := range outputs { + data := make([]byte, 32) + binary.BigEndian.PutUint32(data, uint32(i)) + outputs[i] = tries.NewProofLeaf(data) + } + + frame := &protobufs.ClockFrame{ + FrameNumber: 1, + Output: make([]byte, 516), + } + rand.Read(frame.Output) + + var previousTree *mt.MerkleTree + prevOutputs := make([]mt.DataBlock, 4) + for i := range prevOutputs { + data := make([]byte, 32) + binary.BigEndian.PutUint32(data, uint32(i)) + prevOutputs[i] = tries.NewProofLeaf(data) + } + + var err error + previousTree, err = mt.New( + &mt.Config{ + HashFunc: func(data []byte) ([]byte, error) { + hash := sha3.Sum256(data) + return hash[:], nil + }, + Mode: mt.ModeProofGen, + DisableLeafHashing: true, + }, + prevOutputs, + ) + require.NoError(t, err) + + tree, output, err := tries.PackOutputIntoMultiPayloadAndProof( + outputs, + 3, + frame, + previousTree, + ) + require.NoError(t, err) + require.NotNil(t, tree) + require.NotEmpty(t, output) + require.Len(t, output, 3) +} From 91262ec3ac410b28d15367e7cdf830fa1de1405d Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Fri, 10 Jan 2025 12:32:01 -0600 Subject: [PATCH 4/6] Add release signatory #17 --- node/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/config/config.go b/node/config/config.go index feb5d9e..18da56e 100644 --- a/node/config/config.go +++ b/node/config/config.go @@ -157,7 +157,7 @@ var Signatories = []string{ "9ab76d775487c85c8e5aa0c5b3f961772967899a14644651031ae5f98ac197bee3f8880492c4fdba268716fc4b7c38ffcac370b663ac10b600", "81d63a45f068629f568de812f18be5807bfe828a830097f09cf02330d6acd35e3607401df3fda08b03b68ea6e68afd506b23506b11e87a0f80", "6e2872f73c4868c4286bef7bfe2f5479a41c42f4e07505efa4883c7950c740252e0eea78eef10c584b19b1dcda01f7767d3135d07c33244100", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0ca6f5a9d7f86c1111be5edf31e26979918aa4fa3daae6de1120e05c2a09bdb8d2feeb084286a3347e06ced25530358cbc74c204d2a1753a00", } var unlock *SignedGenesisUnlock From 061b93730868d98f1e50bb15331f7fe1386b43b1 Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Fri, 10 Jan 2025 12:49:37 -0600 Subject: [PATCH 5/6] update old pems list to match current signatories --- signers/pems/10.pem | 4 ++-- signers/pems/11.pem | 4 ++-- signers/pems/14.pem | 4 ++-- signers/pems/17.pem | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/signers/pems/10.pem b/signers/pems/10.pem index 4cf82b3..337ac0b 100644 --- a/signers/pems/10.pem +++ b/signers/pems/10.pem @@ -1,4 +1,4 @@ -----BEGIN PUBLIC KEY----- -MEMwBQYDK2VxAzoARQdib3Fk59jDBMB/+NLiPBE/4QiyIdLmBnL00HdQNFgV4rSz -zD3000Zr8vZpw1wxcuBlEScGEqsA +MEMwBQYDK2VxAzoAtt8OurbqIMwutxjbWHPAe7UM8jmha7Ywa74PJCgGZPmfcyxA +SbjtoSJgZ+cP+4GViDTUhpQqEiEA -----END PUBLIC KEY----- diff --git a/signers/pems/11.pem b/signers/pems/11.pem index 4cabb8b..fcf9451 100644 --- a/signers/pems/11.pem +++ b/signers/pems/11.pem @@ -1,4 +1,4 @@ -----BEGIN PUBLIC KEY----- -MEMwBQYDK2VxAzoAT7JTc0Xka+PV+WNAwUQQB1AXAt1b+vbb9pQ7vvzsqPsrlOwK -ihovSYUPvh0QJEiJpPQKv6ngyeAA +MEMwBQYDK2VxAzoAPgh3ccNgmMstNxcR/YgtMJtMrrvQbe0wd6l1IxNE8CetMccG +nna6UHBFHY61q/Kb/rNPzfm6kGSA -----END PUBLIC KEY----- diff --git a/signers/pems/14.pem b/signers/pems/14.pem index 4a09da4..9b04eec 100644 --- a/signers/pems/14.pem +++ b/signers/pems/14.pem @@ -1,4 +1,4 @@ -----BEGIN PUBLIC KEY----- -MEMwBQYDK2VxAzoAVUevxxsCgh4vW/3TD74TdMOFOJje/yChtcxym46BZw+7udHp -F/hdFT6ksmu/b5xUbcG2S5kWYI2A +MEMwBQYDK2VxAzoAmrdtd1SHyFyOWqDFs/lhdylniZoUZEZRAxrl+YrBl77j+IgE +ksT9uiaHFvxLfDj/ysNwtmOsELYA -----END PUBLIC KEY----- diff --git a/signers/pems/17.pem b/signers/pems/17.pem index 0683f45..e0962ba 100644 --- a/signers/pems/17.pem +++ b/signers/pems/17.pem @@ -1,4 +1,4 @@ -----BEGIN PUBLIC KEY----- -MEMwBQYDK2VxAzoAoRSwYfjTXj80l8jEPYO6a0r2eqezm3Q7Gwo18tZhELUFHdPY -b2m1cSKjW2TmJLgYC+5jthUvzkKA +MEMwBQYDK2VxAzoADKb1qdf4bBERvl7fMeJpeZGKpPo9qubeESDgXCoJvbjS/usI +QoajNH4GztJVMDWMvHTCBNKhdToA -----END PUBLIC KEY----- From 6dab41ca499a2f1c719ac2936833f654d19de14d Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Wed, 15 Jan 2025 19:02:38 -0600 Subject: [PATCH 6/6] v2.0.6-p2 --- node/config/version.go | 6 +- node/consensus/data/consensus_frames.go | 146 ++++++++++++++++++++++++ node/consensus/data/main_data_loop.go | 140 ----------------------- node/consensus/data/message_handler.go | 2 + 4 files changed, 151 insertions(+), 143 deletions(-) diff --git a/node/config/version.go b/node/config/version.go index 74f6c11..eda59b8 100644 --- a/node/config/version.go +++ b/node/config/version.go @@ -6,7 +6,7 @@ import ( ) func GetMinimumVersionCutoff() time.Time { - return time.Date(2024, time.November, 24, 0, 0, 0, 0, time.UTC) + return time.Date(2025, time.January, 13, 0, 0, 0, 0, time.UTC) } // Gets the minimum patch version – This should only be set in a release series @@ -17,7 +17,7 @@ func GetMinimumPatchVersion() byte { } func GetMinimumVersion() []byte { - return []byte{0x02, 0x00, 0x05} + return []byte{0x02, 0x00, 0x06} } func GetVersion() []byte { @@ -43,7 +43,7 @@ func FormatVersion(version []byte) string { } func GetPatchNumber() byte { - return 0x01 + return 0x02 } func GetRCNumber() byte { diff --git a/node/consensus/data/consensus_frames.go b/node/consensus/data/consensus_frames.go index 52509a4..873374c 100644 --- a/node/consensus/data/consensus_frames.go +++ b/node/consensus/data/consensus_frames.go @@ -10,9 +10,12 @@ import ( "source.quilibrium.com/quilibrium/monorepo/node/config" "source.quilibrium.com/quilibrium/monorepo/node/consensus/data/internal" "source.quilibrium.com/quilibrium/monorepo/node/internal/frametime" + "source.quilibrium.com/quilibrium/monorepo/node/tries" + "github.com/iden3/go-iden3-crypto/poseidon" "github.com/libp2p/go-libp2p/core/peer" "github.com/pkg/errors" + mt "github.com/txaty/go-merkletree" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/protobuf/proto" @@ -428,3 +431,146 @@ func (e *DataClockConsensusEngine) syncWithPeer( } } } + +func (e *DataClockConsensusEngine) initiateProvers( + latestFrame *protobufs.ClockFrame, +) { + if latestFrame.Timestamp > time.Now().UnixMilli()-60000 { + if !e.IsInProverTrie(e.pubSub.GetPeerID()) { + e.logger.Info("announcing prover join") + for _, eng := range e.executionEngines { + eng.AnnounceProverJoin() + break + } + } else { + if e.previousFrameProven != nil && + e.previousFrameProven.FrameNumber == latestFrame.FrameNumber { + return + } + + h, err := poseidon.HashBytes(e.pubSub.GetPeerID()) + if err != nil { + panic(err) + } + peerProvingKeyAddress := h.FillBytes(make([]byte, 32)) + + ring := -1 + if tries := e.GetFrameProverTries(); len(tries) > 1 { + for i, tries := range tries[1:] { + i := i + if tries.Contains(peerProvingKeyAddress) { + ring = i + } + } + } + + e.clientReconnectTest++ + if e.clientReconnectTest >= 10 { + e.tryReconnectDataWorkerClients() + e.clientReconnectTest = 0 + } + + previousTreeRoot := []byte{} + if e.previousTree != nil { + previousTreeRoot = e.previousTree.Root + } + outputs := e.PerformTimeProof(latestFrame, previousTreeRoot, latestFrame.Difficulty, ring) + if outputs == nil || len(outputs) < 3 { + e.logger.Info("workers not yet available for proving") + return + } + modulo := len(outputs) + var proofTree *mt.MerkleTree + var output [][]byte + if latestFrame.FrameNumber >= application.PROOF_FRAME_COMBINE_CUTOFF { + proofTree, output, err = tries.PackOutputIntoMultiPayloadAndProof( + outputs, + modulo, + latestFrame, + e.previousTree, + ) + } else { + proofTree, output, err = tries.PackOutputIntoPayloadAndProof( + outputs, + modulo, + latestFrame, + e.previousTree, + ) + } + if err != nil { + e.logger.Error( + "could not successfully pack proof, reattempting", + zap.Error(err), + ) + return + } + e.previousFrameProven = latestFrame + e.previousTree = proofTree + + mint := &protobufs.MintCoinRequest{ + Proofs: output, + } + if err := mint.SignED448(e.pubSub.GetPublicKey(), e.pubSub.SignMessage); err != nil { + e.logger.Error("could not sign mint", zap.Error(err)) + return + } + if err := mint.Validate(); err != nil { + e.logger.Error("mint validation failed", zap.Error(err)) + return + } + + e.logger.Info( + "submitting data proof", + zap.Int("ring", ring), + zap.Int("active_workers", len(outputs)), + zap.Uint64("frame_number", latestFrame.FrameNumber), + zap.Duration("frame_age", frametime.Since(latestFrame)), + ) + + if err := e.publishMessage(e.txFilter, mint.TokenRequest()); err != nil { + e.logger.Error("could not publish mint", zap.Error(err)) + } + + if e.config.Engine.AutoMergeCoins { + _, addrs, _, err := e.coinStore.GetCoinsForOwner( + peerProvingKeyAddress, + ) + if err != nil { + e.logger.Error( + "received error while iterating coins", + zap.Error(err), + ) + return + } + + if len(addrs) > 25 { + refs := []*protobufs.CoinRef{} + for _, addr := range addrs { + refs = append(refs, &protobufs.CoinRef{ + Address: addr, + }) + } + + merge := &protobufs.MergeCoinRequest{ + Coins: refs, + } + if err := merge.SignED448( + e.pubSub.GetPublicKey(), + e.pubSub.SignMessage, + ); err != nil { + e.logger.Error("could not sign merge", zap.Error(err)) + return + } + if err := merge.Validate(); err != nil { + e.logger.Error("merge validation failed", zap.Error(err)) + return + } + + if err := e.publishMessage(e.txFilter, merge.TokenRequest()); err != nil { + e.logger.Warn("could not publish merge", zap.Error(err)) + } + } + } + } + } +} diff --git a/node/consensus/data/main_data_loop.go b/node/consensus/data/main_data_loop.go index c56f611..15f8158 100644 --- a/node/consensus/data/main_data_loop.go +++ b/node/consensus/data/main_data_loop.go @@ -4,8 +4,6 @@ import ( "bytes" "time" - "github.com/iden3/go-iden3-crypto/poseidon" - mt "github.com/txaty/go-merkletree" "go.uber.org/zap" "source.quilibrium.com/quilibrium/monorepo/node/consensus" "source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/token/application" @@ -282,144 +280,6 @@ func (e *DataClockConsensusEngine) processFrame( return nextFrame } else { - if latestFrame.Timestamp > time.Now().UnixMilli()-120000 { - if !e.IsInProverTrie(e.pubSub.GetPeerID()) { - e.logger.Info("announcing prover join") - for _, eng := range e.executionEngines { - eng.AnnounceProverJoin() - break - } - } else { - if e.previousFrameProven != nil && - e.previousFrameProven.FrameNumber == latestFrame.FrameNumber { - return latestFrame - } - - h, err := poseidon.HashBytes(e.pubSub.GetPeerID()) - if err != nil { - panic(err) - } - peerProvingKeyAddress := h.FillBytes(make([]byte, 32)) - - ring := -1 - if tries := e.GetFrameProverTries(); len(tries) > 1 { - for i, tries := range tries[1:] { - i := i - if tries.Contains(peerProvingKeyAddress) { - ring = i - } - } - } - - e.clientReconnectTest++ - if e.clientReconnectTest >= 10 { - e.tryReconnectDataWorkerClients() - e.clientReconnectTest = 0 - } - - previousTreeRoot := []byte{} - if e.previousTree != nil { - previousTreeRoot = e.previousTree.Root - } - outputs := e.PerformTimeProof(latestFrame, previousTreeRoot, latestFrame.Difficulty, ring) - if outputs == nil || len(outputs) < 3 { - e.logger.Info("workers not yet available for proving") - return latestFrame - } - modulo := len(outputs) - var proofTree *mt.MerkleTree - var output [][]byte - if latestFrame.FrameNumber >= application.PROOF_FRAME_COMBINE_CUTOFF { - proofTree, output, err = tries.PackOutputIntoMultiPayloadAndProof( - outputs, - modulo, - latestFrame, - e.previousTree, - ) - } else { - proofTree, output, err = tries.PackOutputIntoPayloadAndProof( - outputs, - modulo, - latestFrame, - e.previousTree, - ) - } - if err != nil { - e.logger.Error( - "could not successfully pack proof, reattempting", - zap.Error(err), - ) - return latestFrame - } - e.previousFrameProven = latestFrame - e.previousTree = proofTree - - mint := &protobufs.MintCoinRequest{ - Proofs: output, - } - if err := mint.SignED448(e.pubSub.GetPublicKey(), e.pubSub.SignMessage); err != nil { - e.logger.Error("could not sign mint", zap.Error(err)) - return latestFrame - } - if err := mint.Validate(); err != nil { - e.logger.Error("mint validation failed", zap.Error(err)) - return latestFrame - } - - e.logger.Info( - "submitting data proof", - zap.Int("ring", ring), - zap.Int("active_workers", len(outputs)), - zap.Uint64("frame_number", latestFrame.FrameNumber), - zap.Duration("frame_age", frametime.Since(latestFrame)), - ) - - if err := e.publishMessage(e.txFilter, mint.TokenRequest()); err != nil { - e.logger.Error("could not publish mint", zap.Error(err)) - } - - if e.config.Engine.AutoMergeCoins { - _, addrs, _, err := e.coinStore.GetCoinsForOwner( - peerProvingKeyAddress, - ) - if err != nil { - e.logger.Error( - "received error while iterating coins", - zap.Error(err), - ) - return latestFrame - } - - if len(addrs) > 25 { - refs := []*protobufs.CoinRef{} - for _, addr := range addrs { - refs = append(refs, &protobufs.CoinRef{ - Address: addr, - }) - } - - merge := &protobufs.MergeCoinRequest{ - Coins: refs, - } - if err := merge.SignED448( - e.pubSub.GetPublicKey(), - e.pubSub.SignMessage, - ); err != nil { - e.logger.Error("could not sign merge", zap.Error(err)) - return latestFrame - } - if err := merge.Validate(); err != nil { - e.logger.Error("merge validation failed", zap.Error(err)) - return latestFrame - } - - if err := e.publishMessage(e.txFilter, merge.TokenRequest()); err != nil { - e.logger.Warn("could not publish merge", zap.Error(err)) - } - } - } - } - } return latestFrame } } diff --git a/node/consensus/data/message_handler.go b/node/consensus/data/message_handler.go index e4e2d0d..4dfa8cf 100644 --- a/node/consensus/data/message_handler.go +++ b/node/consensus/data/message_handler.go @@ -253,6 +253,8 @@ func (e *DataClockConsensusEngine) handleClockFrame( } if frame.FrameNumber > head.FrameNumber { + go e.initiateProvers(frame) + if _, err := e.dataTimeReel.Insert(e.ctx, frame); err != nil { e.logger.Debug("could not insert frame", zap.Error(err)) }