ceremonyclient/protobufs/global.go
2025-11-13 04:57:52 -06:00

5205 lines
139 KiB
Go

package protobufs
import (
"bytes"
"encoding/binary"
"slices"
"time"
"github.com/iden3/go-iden3-crypto/poseidon"
"github.com/multiformats/go-multiaddr"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
"source.quilibrium.com/quilibrium/monorepo/consensus/models"
)
// Source implements models.QuorumCertificate.
func (g *QuorumCertificate) Equals(other models.QuorumCertificate) bool {
return bytes.Equal(g.Filter, other.GetFilter()) &&
g.Rank == other.GetRank() &&
g.FrameNumber == other.GetFrameNumber() &&
g.Identity() == other.Identity()
}
func (
g *QuorumCertificate,
) GetAggregatedSignature() models.AggregatedSignature {
return g.AggregateSignature
}
// Source implements models.Unique.
func (g *QuorumCertificate) Clone() models.Unique {
return proto.Clone(g).(*QuorumCertificate)
}
// GetSignature implements models.Unique.
func (g *QuorumCertificate) GetSignature() []byte {
return g.AggregateSignature.Signature
}
// Source implements models.Unique.
func (g *QuorumCertificate) Source() models.Identity {
return g.AggregateSignature.Identity()
}
// Source implements models.Unique.
func (g *QuorumCertificate) Identity() models.Identity {
return models.Identity(g.Selector)
}
// Source implements models.TimeoutCertificate.
func (g *TimeoutCertificate) Equals(other models.TimeoutCertificate) bool {
return bytes.Equal(g.Filter, other.GetFilter()) &&
g.Rank == other.GetRank() &&
slices.Equal(g.LatestRanks, other.GetLatestRanks()) &&
g.LatestQuorumCertificate.Equals(other.GetLatestQuorumCert())
}
func (
g *TimeoutCertificate,
) GetAggregatedSignature() models.AggregatedSignature {
return g.AggregateSignature
}
func (
g *TimeoutCertificate,
) GetLatestQuorumCert() models.QuorumCertificate {
return g.LatestQuorumCertificate
}
// Source implements models.Unique.
func (g *TimeoutCertificate) Clone() models.Unique {
return proto.Clone(g).(*TimeoutCertificate)
}
// GetSignature implements models.Unique.
func (g *TimeoutCertificate) GetSignature() []byte {
return g.AggregateSignature.Signature
}
// Source implements models.Unique.
func (g *TimeoutCertificate) Source() models.Identity {
return models.Identity(
binary.BigEndian.AppendUint64(slices.Clone(g.Filter), g.Rank),
)
}
// Source implements models.Unique.
func (g *TimeoutCertificate) Identity() models.Identity {
return models.Identity(
binary.BigEndian.AppendUint64(slices.Clone(g.Filter), g.Rank),
)
}
// GetSignature implements models.Unique.
func (f *ProposalVote) Clone() models.Unique {
return proto.Clone(f).(*ProposalVote)
}
// GetSignature implements models.Unique.
func (f *ProposalVote) GetSignature() []byte {
return f.PublicKeySignatureBls48581.Signature
}
// Source implements models.Unique.
func (f *ProposalVote) Source() models.Identity {
return models.Identity(f.Selector)
}
// GetSignature implements models.Unique.
func (f *ProposalVote) Identity() models.Identity {
return models.Identity(f.PublicKeySignatureBls48581.Address)
}
func (g *GlobalFrame) Clone() models.Unique {
return proto.Clone(g).(*GlobalFrame)
}
// GetRank implements models.Unique.
func (g *GlobalFrame) GetRank() uint64 {
return g.Header.Rank
}
// GetSignature implements models.Unique.
func (g *GlobalFrame) GetSignature() []byte {
return g.Header.PublicKeySignatureBls48581.Signature
}
// GetTimestamp implements models.Unique.
func (g *GlobalFrame) GetTimestamp() uint64 {
return uint64(g.Header.Timestamp)
}
// Identity implements models.Unique.
func (g *GlobalFrame) Identity() models.Identity {
selectorBI, err := poseidon.HashBytes(g.Header.Output)
if err != nil {
return ""
}
return models.Identity(selectorBI.FillBytes(make([]byte, 32)))
}
// Source implements models.Unique.
func (g *GlobalFrame) Source() models.Identity {
return models.Identity(g.Header.Prover)
}
func (a *AppShardFrame) Clone() models.Unique {
return proto.Clone(a).(*AppShardFrame)
}
// GetRank implements models.Unique.
func (a *AppShardFrame) GetRank() uint64 {
return a.Header.Rank
}
// GetSignature implements models.Unique.
func (a *AppShardFrame) GetSignature() []byte {
return a.Header.PublicKeySignatureBls48581.Signature
}
// GetTimestamp implements models.Unique.
func (a *AppShardFrame) GetTimestamp() uint64 {
return uint64(a.Header.Timestamp)
}
// Identity implements models.Unique.
func (a *AppShardFrame) Identity() models.Identity {
selectorBI, err := poseidon.HashBytes(a.Header.Output)
if err != nil {
return ""
}
return models.Identity(selectorBI.FillBytes(make([]byte, 32)))
}
// Source implements models.Unique.
func (a *AppShardFrame) Source() models.Identity {
return models.Identity(a.Header.Prover)
}
func (s *AppShardProposal) GetRank() uint64 {
rank := uint64(0)
if s.State != nil && s.State.GetRank() > rank {
rank = s.State.GetRank()
}
if s.ParentQuorumCertificate != nil &&
s.ParentQuorumCertificate.GetRank() > rank {
rank = s.ParentQuorumCertificate.GetRank()
}
if s.PriorRankTimeoutCertificate != nil &&
s.PriorRankTimeoutCertificate.GetRank() > rank {
rank = s.PriorRankTimeoutCertificate.GetRank()
}
return rank
}
func (s *AppShardProposal) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
AppShardProposalType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write state
stateBytes, err := s.State.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(stateBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(stateBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write parent_quorum_certificate
parentQCBytes, err := s.ParentQuorumCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(parentQCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(parentQCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write prior_rank_timeout_certificate
if s.PriorRankTimeoutCertificate == nil {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(0),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
priorTCBytes, err := s.PriorRankTimeoutCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(priorTCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(priorTCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write vote
voteBytes, err := s.Vote.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(voteBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(voteBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (s *AppShardProposal) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != AppShardProposalType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read state
var stateLen uint32
if err := binary.Read(buf, binary.BigEndian, &stateLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
stateBytes := make([]byte, stateLen)
if _, err := buf.Read(stateBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.State = &AppShardFrame{}
if err := s.State.FromCanonicalBytes(stateBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read parent_quorum_certificate
var parentQCLen uint32
if err := binary.Read(buf, binary.BigEndian, &parentQCLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
parentQCBytes := make([]byte, parentQCLen)
if _, err := buf.Read(parentQCBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.ParentQuorumCertificate = &QuorumCertificate{}
if err := s.ParentQuorumCertificate.FromCanonicalBytes(
parentQCBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read prior_rank_timeout_certificate
var priorRankTCLen uint32
if err := binary.Read(buf, binary.BigEndian, &priorRankTCLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if priorRankTCLen != 0 {
priorRankTCBytes := make([]byte, priorRankTCLen)
if _, err := buf.Read(priorRankTCBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.PriorRankTimeoutCertificate = &TimeoutCertificate{}
if err := s.PriorRankTimeoutCertificate.FromCanonicalBytes(
priorRankTCBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read vote
var voteLen uint32
if err := binary.Read(buf, binary.BigEndian, &voteLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
voteBytes := make([]byte, voteLen)
if _, err := buf.Read(voteBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.Vote = &ProposalVote{}
if err := s.Vote.FromCanonicalBytes(
voteBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (s *GlobalProposal) GetRank() uint64 {
rank := uint64(0)
if s.State != nil && s.State.GetRank() > rank {
rank = s.State.GetRank()
}
if s.ParentQuorumCertificate != nil &&
s.ParentQuorumCertificate.GetRank() > rank {
rank = s.ParentQuorumCertificate.GetRank()
}
if s.PriorRankTimeoutCertificate != nil &&
s.PriorRankTimeoutCertificate.GetRank() > rank {
rank = s.PriorRankTimeoutCertificate.GetRank()
}
return rank
}
func (s *GlobalProposal) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
GlobalProposalType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write state
stateBytes, err := s.State.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(stateBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(stateBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write parent_quorum_certificate
parentQCBytes, err := s.ParentQuorumCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(parentQCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(parentQCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write prior_rank_timeout_certificate
if s.PriorRankTimeoutCertificate == nil {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(0),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
priorTCBytes, err := s.PriorRankTimeoutCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(priorTCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(priorTCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write vote
voteBytes, err := s.Vote.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(voteBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(voteBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (s *GlobalProposal) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != GlobalProposalType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read state
var stateLen uint32
if err := binary.Read(buf, binary.BigEndian, &stateLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
stateBytes := make([]byte, stateLen)
if _, err := buf.Read(stateBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.State = &GlobalFrame{}
if err := s.State.FromCanonicalBytes(stateBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read parent_quorum_certificate
var parentQCLen uint32
if err := binary.Read(buf, binary.BigEndian, &parentQCLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
parentQCBytes := make([]byte, parentQCLen)
if _, err := buf.Read(parentQCBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.ParentQuorumCertificate = &QuorumCertificate{}
if err := s.ParentQuorumCertificate.FromCanonicalBytes(
parentQCBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read prior_rank_timeout_certificate
var priorRankTCLen uint32
if err := binary.Read(buf, binary.BigEndian, &priorRankTCLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if priorRankTCLen != 0 {
priorRankTCBytes := make([]byte, priorRankTCLen)
if _, err := buf.Read(priorRankTCBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.PriorRankTimeoutCertificate = &TimeoutCertificate{}
if err := s.PriorRankTimeoutCertificate.FromCanonicalBytes(
priorRankTCBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read vote
var voteLen uint32
if err := binary.Read(buf, binary.BigEndian, &voteLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
voteBytes := make([]byte, voteLen)
if _, err := buf.Read(voteBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.Vote = &ProposalVote{}
if err := s.Vote.FromCanonicalBytes(
voteBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (s *SeniorityMerge) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
SeniorityMergeType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write signature
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(s.Signature)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(s.Signature); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write key_type
if err := binary.Write(buf, binary.BigEndian, s.KeyType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write prover_public_key
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(s.ProverPublicKey)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(s.ProverPublicKey); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (s *SeniorityMerge) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != SeniorityMergeType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read signature
var commitmentLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitmentLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.Signature = make([]byte, commitmentLen)
if _, err := buf.Read(s.Signature); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read key_type
if err := binary.Read(buf, binary.BigEndian, &s.KeyType); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read prover_public_key
var keyLen uint32
if err := binary.Read(buf, binary.BigEndian, &keyLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
s.ProverPublicKey = make([]byte, keyLen)
if _, err := buf.Read(s.ProverPublicKey); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (l *LegacyProverRequest) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
LegacyProverRequestType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signatures_ed448 count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(l.PublicKeySignaturesEd448)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, sig := range l.PublicKeySignaturesEd448 {
sigBytes, err := sig.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (l *LegacyProverRequest) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != LegacyProverRequestType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read public_key_signatures_ed448
var sigCount uint32
if err := binary.Read(buf, binary.BigEndian, &sigCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
l.PublicKeySignaturesEd448 = make([]*Ed448Signature, sigCount)
for i := uint32(0); i < sigCount; i++ {
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
l.PublicKeySignaturesEd448[i] = &Ed448Signature{}
if err := l.PublicKeySignaturesEd448[i].FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverJoin) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverJoinType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filters count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filters)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each filter
for _, filter := range p.Filters {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write delegate_address
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.DelegateAddress)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if len(p.DelegateAddress) != 0 {
if _, err := buf.Write(p.DelegateAddress); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write merge_targets count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.MergeTargets)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each merge target
for _, target := range p.MergeTargets {
targetBytes, err := target.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(targetBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(targetBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write proof
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Proof)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Proof); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (p *ProverJoin) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverJoinType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filters count
var filtersCount uint32
if err := binary.Read(buf, binary.BigEndian, &filtersCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filters = make([][]byte, filtersCount)
// Read each filter
for i := uint32(0); i < filtersCount; i++ {
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filters[i] = make([]byte, filterLen)
if _, err := buf.Read(p.Filters[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581SignatureWithProofOfPossession{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read delegate_address
var delegateAddressLen uint32
if err := binary.Read(buf, binary.BigEndian, &delegateAddressLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.DelegateAddress = make([]byte, delegateAddressLen)
if _, err := buf.Read(p.DelegateAddress); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read merge_targets count
var mergeTargetsCount uint32
if err := binary.Read(buf, binary.BigEndian, &mergeTargetsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.MergeTargets = make([]*SeniorityMerge, mergeTargetsCount)
// Read each merge target
for i := uint32(0); i < mergeTargetsCount; i++ {
var targetLen uint32
if err := binary.Read(buf, binary.BigEndian, &targetLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
targetBytes := make([]byte, targetLen)
if _, err := buf.Read(targetBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.MergeTargets[i] = &SeniorityMerge{}
if err := p.MergeTargets[i].FromCanonicalBytes(
targetBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read proof
var proofLen uint32
if err := binary.Read(buf, binary.BigEndian, &proofLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Proof = make([]byte, proofLen)
if _, err := buf.Read(p.Proof); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (p *ProverLeave) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverLeaveType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filters count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filters)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each filter
for _, filter := range p.Filters {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverLeave) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverLeaveType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filters count
var filtersCount uint32
if err := binary.Read(buf, binary.BigEndian, &filtersCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filters = make([][]byte, filtersCount)
// Read each filter
for i := uint32(0); i < filtersCount; i++ {
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filters[i] = make([]byte, filterLen)
if _, err := buf.Read(p.Filters[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverPause) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverPauseType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverPause) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverPauseType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filter = make([]byte, filterLen)
if _, err := buf.Read(p.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverResume) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverResumeType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverResume) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverResumeType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filter = make([]byte, filterLen)
if _, err := buf.Read(p.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverConfirm) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverConfirmType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverConfirm) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverConfirmType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filter = make([]byte, filterLen)
if _, err := buf.Read(p.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverReject) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverRejectType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverReject) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverRejectType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filter = make([]byte, filterLen)
if _, err := buf.Read(p.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverUpdate) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverUpdateType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write delegate_address
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.DelegateAddress)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.DelegateAddress); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverUpdate) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverUpdateType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read delegate_address
var addressLen uint32
if err := binary.Read(buf, binary.BigEndian, &addressLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.DelegateAddress = make([]byte, addressLen)
if _, err := buf.Read(p.DelegateAddress); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (m *MessageRequest) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, MessageRequestType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Serialize the inner message (which already contains its own type discriminator)
var innerBytes []byte
var err error
switch request := m.Request.(type) {
case *MessageRequest_Join:
innerBytes, err = request.Join.ToCanonicalBytes()
case *MessageRequest_Leave:
innerBytes, err = request.Leave.ToCanonicalBytes()
case *MessageRequest_Pause:
innerBytes, err = request.Pause.ToCanonicalBytes()
case *MessageRequest_Resume:
innerBytes, err = request.Resume.ToCanonicalBytes()
case *MessageRequest_Confirm:
innerBytes, err = request.Confirm.ToCanonicalBytes()
case *MessageRequest_Reject:
innerBytes, err = request.Reject.ToCanonicalBytes()
case *MessageRequest_Kick:
innerBytes, err = request.Kick.ToCanonicalBytes()
case *MessageRequest_Update:
innerBytes, err = request.Update.ToCanonicalBytes()
case *MessageRequest_TokenDeploy:
innerBytes, err = request.TokenDeploy.ToCanonicalBytes()
case *MessageRequest_TokenUpdate:
innerBytes, err = request.TokenUpdate.ToCanonicalBytes()
case *MessageRequest_Transaction:
innerBytes, err = request.Transaction.ToCanonicalBytes()
case *MessageRequest_PendingTransaction:
innerBytes, err = request.PendingTransaction.ToCanonicalBytes()
case *MessageRequest_MintTransaction:
innerBytes, err = request.MintTransaction.ToCanonicalBytes()
case *MessageRequest_HypergraphDeploy:
innerBytes, err = request.HypergraphDeploy.ToCanonicalBytes()
case *MessageRequest_HypergraphUpdate:
innerBytes, err = request.HypergraphUpdate.ToCanonicalBytes()
case *MessageRequest_VertexAdd:
innerBytes, err = request.VertexAdd.ToCanonicalBytes()
case *MessageRequest_VertexRemove:
innerBytes, err = request.VertexRemove.ToCanonicalBytes()
case *MessageRequest_HyperedgeAdd:
innerBytes, err = request.HyperedgeAdd.ToCanonicalBytes()
case *MessageRequest_HyperedgeRemove:
innerBytes, err = request.HyperedgeRemove.ToCanonicalBytes()
case *MessageRequest_ComputeDeploy:
innerBytes, err = request.ComputeDeploy.ToCanonicalBytes()
case *MessageRequest_ComputeUpdate:
innerBytes, err = request.ComputeUpdate.ToCanonicalBytes()
case *MessageRequest_CodeDeploy:
innerBytes, err = request.CodeDeploy.ToCanonicalBytes()
case *MessageRequest_CodeExecute:
innerBytes, err = request.CodeExecute.ToCanonicalBytes()
case *MessageRequest_CodeFinalize:
innerBytes, err = request.CodeFinalize.ToCanonicalBytes()
case *MessageRequest_Shard:
innerBytes, err = request.Shard.ToCanonicalBytes()
default:
return nil, errors.New("unknown request type")
}
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write length-prefixed inner message
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(innerBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(innerBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (m *MessageRequest) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != MessageRequestType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read length of inner message
var dataLen uint32
if err := binary.Read(buf, binary.BigEndian, &dataLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if dataLen == 0 {
return errors.New("empty message request")
}
// Read the inner message bytes
dataBytes := make([]byte, dataLen)
if _, err := buf.Read(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Peek at the type discriminator (first 4 bytes)
if len(dataBytes) < 4 {
return errors.New("message too short to contain type discriminator")
}
innerTypeBuf := bytes.NewBuffer(dataBytes[:4])
var innerType uint32
if err := binary.Read(
innerTypeBuf,
binary.BigEndian,
&innerType,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Route based on the embedded type discriminator
switch innerType {
case ProverJoinType:
join := &ProverJoin{}
if err := join.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Join{Join: join}
case ProverLeaveType:
leave := &ProverLeave{}
if err := leave.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Leave{Leave: leave}
case ProverPauseType:
pause := &ProverPause{}
if err := pause.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Pause{Pause: pause}
case ProverResumeType:
resume := &ProverResume{}
if err := resume.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Resume{Resume: resume}
case ProverConfirmType:
confirm := &ProverConfirm{}
if err := confirm.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Confirm{Confirm: confirm}
case ProverRejectType:
reject := &ProverReject{}
if err := reject.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Reject{Reject: reject}
case ProverKickType:
kick := &ProverKick{}
if err := kick.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Kick{Kick: kick}
case ProverUpdateType:
update := &ProverUpdate{}
if err := update.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Update{Update: update}
case TokenDeploymentType:
tokenDeploy := &TokenDeploy{}
if err := tokenDeploy.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_TokenDeploy{TokenDeploy: tokenDeploy}
case TokenUpdateType:
tokenUpdate := &TokenUpdate{}
if err := tokenUpdate.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_TokenUpdate{TokenUpdate: tokenUpdate}
case TransactionType:
transaction := &Transaction{}
if err := transaction.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Transaction{Transaction: transaction}
case PendingTransactionType:
pendingTransaction := &PendingTransaction{}
if err := pendingTransaction.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_PendingTransaction{
PendingTransaction: pendingTransaction,
}
case MintTransactionType:
mintTransaction := &MintTransaction{}
if err := mintTransaction.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_MintTransaction{
MintTransaction: mintTransaction,
}
case HypergraphDeploymentType:
hypergraphDeploy := &HypergraphDeploy{}
if err := hypergraphDeploy.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_HypergraphDeploy{
HypergraphDeploy: hypergraphDeploy,
}
case HypergraphUpdateType:
hypergraphUpdate := &HypergraphUpdate{}
if err := hypergraphUpdate.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_HypergraphUpdate{
HypergraphUpdate: hypergraphUpdate,
}
case VertexAddType:
vertexAdd := &VertexAdd{}
if err := vertexAdd.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_VertexAdd{VertexAdd: vertexAdd}
case VertexRemoveType:
vertexRemove := &VertexRemove{}
if err := vertexRemove.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_VertexRemove{VertexRemove: vertexRemove}
case HyperedgeAddType:
hyperedgeAdd := &HyperedgeAdd{}
if err := hyperedgeAdd.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_HyperedgeAdd{HyperedgeAdd: hyperedgeAdd}
case HyperedgeRemoveType:
hyperedgeRemove := &HyperedgeRemove{}
if err := hyperedgeRemove.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_HyperedgeRemove{
HyperedgeRemove: hyperedgeRemove,
}
case ComputeDeploymentType:
computeDeploy := &ComputeDeploy{}
if err := computeDeploy.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_ComputeDeploy{ComputeDeploy: computeDeploy}
case ComputeUpdateType:
computeUpdate := &ComputeUpdate{}
if err := computeUpdate.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_ComputeUpdate{ComputeUpdate: computeUpdate}
case CodeDeploymentType:
codeDeploy := &CodeDeployment{}
if err := codeDeploy.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_CodeDeploy{CodeDeploy: codeDeploy}
case CodeExecuteType:
codeExecute := &CodeExecute{}
if err := codeExecute.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_CodeExecute{CodeExecute: codeExecute}
case CodeFinalizeType:
codeFinalize := &CodeFinalize{}
if err := codeFinalize.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_CodeFinalize{CodeFinalize: codeFinalize}
case FrameHeaderType:
frameHeader := &FrameHeader{}
if err := frameHeader.FromCanonicalBytes(dataBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Request = &MessageRequest_Shard{Shard: frameHeader}
default:
return errors.Errorf("unknown message type: 0x%08X", innerType)
}
return nil
}
func (m *MessageBundle) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, MessageBundleType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write number of requests
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(m.Requests)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each request
for _, request := range m.Requests {
if request != nil {
requestBytes, err := request.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(requestBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(requestBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, m.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (m *MessageBundle) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != MessageBundleType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read number of requests
var numRequests uint32
if err := binary.Read(buf, binary.BigEndian, &numRequests); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read each request
m.Requests = make([]*MessageRequest, 0, numRequests)
for i := uint32(0); i < numRequests; i++ {
var requestLen uint32
if err := binary.Read(buf, binary.BigEndian, &requestLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if requestLen > 0 {
requestBytes := make([]byte, requestLen)
if _, err := buf.Read(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
request := &MessageRequest{}
if err := request.FromCanonicalBytes(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Requests = append(m.Requests, request)
} else {
m.Requests = append(m.Requests, nil)
}
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &m.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (g *GlobalFrameHeader) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
GlobalFrameHeaderType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, g.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write rank
if err := binary.Write(buf, binary.BigEndian, g.Rank); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, g.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write difficulty
if err := binary.Write(buf, binary.BigEndian, g.Difficulty); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write output
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.Output)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.Output); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write parent_selector
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.ParentSelector)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.ParentSelector); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write global_commitments count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.GlobalCommitments)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, commitment := range g.GlobalCommitments {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(commitment)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(commitment); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write prover_tree_commitment
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.ProverTreeCommitment)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.ProverTreeCommitment); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write requests_root
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.RequestsRoot)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.RequestsRoot); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write prover
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.Prover)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.Prover); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if g.PublicKeySignatureBls48581 != nil {
sigBytes, err := g.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (g *GlobalFrameHeader) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != GlobalFrameHeaderType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &g.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read rank
if err := binary.Read(buf, binary.BigEndian, &g.Rank); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &g.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read difficulty
if err := binary.Read(buf, binary.BigEndian, &g.Difficulty); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read output
var outputLen uint32
if err := binary.Read(buf, binary.BigEndian, &outputLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Output = make([]byte, outputLen)
if _, err := buf.Read(g.Output); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read parent_selector
var parentSelectorLen uint32
if err := binary.Read(buf, binary.BigEndian, &parentSelectorLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.ParentSelector = make([]byte, parentSelectorLen)
if _, err := buf.Read(g.ParentSelector); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read global_commitments
var commitmentsCount uint32
if err := binary.Read(buf, binary.BigEndian, &commitmentsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.GlobalCommitments = make([][]byte, commitmentsCount)
for i := uint32(0); i < commitmentsCount; i++ {
var commitmentLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitmentLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.GlobalCommitments[i] = make([]byte, commitmentLen)
if _, err := buf.Read(g.GlobalCommitments[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read prover_tree_commitment
var proverTreeCommitmentLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&proverTreeCommitmentLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.ProverTreeCommitment = make([]byte, proverTreeCommitmentLen)
if _, err := buf.Read(g.ProverTreeCommitment); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read requests_root
var requestsRootLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&requestsRootLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.RequestsRoot = make([]byte, requestsRootLen)
if _, err := buf.Read(g.RequestsRoot); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read prover
var proverLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&proverLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Prover = make([]byte, proverLen)
if _, err := buf.Read(g.Prover); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.PublicKeySignatureBls48581 = &BLS48581AggregateSignature{}
if err := g.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (f *FrameHeader) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, FrameHeaderType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write address
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Address)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Address); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, f.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, f.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write difficulty
if err := binary.Write(buf, binary.BigEndian, f.Difficulty); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write output
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Output)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Output); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write parent_selector
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.ParentSelector)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.ParentSelector); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write requests_root
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.RequestsRoot)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.RequestsRoot); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write state_roots count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.StateRoots)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, root := range f.StateRoots {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(root)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(root); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write prover
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Prover)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Prover); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write fee_multiplier_vote
if err := binary.Write(
buf,
binary.BigEndian,
f.FeeMultiplierVote,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if f.PublicKeySignatureBls48581 != nil {
sigBytes, err := f.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (f *FrameHeader) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != FrameHeaderType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read address
var addressLen uint32
if err := binary.Read(buf, binary.BigEndian, &addressLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Address = make([]byte, addressLen)
if _, err := buf.Read(f.Address); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &f.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &f.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read difficulty
if err := binary.Read(buf, binary.BigEndian, &f.Difficulty); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read output
var outputLen uint32
if err := binary.Read(buf, binary.BigEndian, &outputLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Output = make([]byte, outputLen)
if _, err := buf.Read(f.Output); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read parent_selector
var parentSelectorLen uint32
if err := binary.Read(buf, binary.BigEndian, &parentSelectorLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.ParentSelector = make([]byte, parentSelectorLen)
if _, err := buf.Read(f.ParentSelector); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read requests_root
var requestsRootLen uint32
if err := binary.Read(buf, binary.BigEndian, &requestsRootLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.RequestsRoot = make([]byte, requestsRootLen)
if _, err := buf.Read(f.RequestsRoot); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read state_roots
var stateRootsCount uint32
if err := binary.Read(buf, binary.BigEndian, &stateRootsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.StateRoots = make([][]byte, stateRootsCount)
for i := uint32(0); i < stateRootsCount; i++ {
var rootLen uint32
if err := binary.Read(buf, binary.BigEndian, &rootLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.StateRoots[i] = make([]byte, rootLen)
if _, err := buf.Read(f.StateRoots[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read prover
var proverLen uint32
if err := binary.Read(buf, binary.BigEndian, &proverLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Prover = make([]byte, proverLen)
if _, err := buf.Read(f.Prover); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read fee_multiplier_vote
if err := binary.Read(
buf,
binary.BigEndian,
&f.FeeMultiplierVote,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.PublicKeySignatureBls48581 = &BLS48581AggregateSignature{}
if err := f.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (p *ProverLivenessCheck) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
ProverLivenessCheckType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, p.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write commitment_hash
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.CommitmentHash)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.CommitmentHash); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if p.PublicKeySignatureBls48581 != nil {
sigBytes, err := p.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverLivenessCheck) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverLivenessCheckType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Filter = make([]byte, filterLen)
if _, err := buf.Read(p.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &p.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read commitment_hash
var commitmentHashLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitmentHashLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.CommitmentHash = make([]byte, commitmentHashLen)
if _, err := buf.Read(p.CommitmentHash); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen == 0 {
return errors.Wrap(errors.New("invalid signature"), "from canonical bytes")
}
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := p.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (f *ProposalVote) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProposalVoteType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write rank
if err := binary.Write(buf, binary.BigEndian, f.Rank); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, f.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write selector
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Selector)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Selector); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, f.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write public_key_signature_bls48581
if f.PublicKeySignatureBls48581 != nil {
sigBytes, err := f.PublicKeySignatureBls48581.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (f *ProposalVote) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProposalVoteType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Filter = make([]byte, filterLen)
if _, err := buf.Read(f.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read rank
if err := binary.Read(buf, binary.BigEndian, &f.Rank); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &f.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read selector
var selectorLen uint32
if err := binary.Read(buf, binary.BigEndian, &selectorLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Selector = make([]byte, selectorLen)
if _, err := buf.Read(f.Selector); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &f.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read public_key_signature_bls48581
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.PublicKeySignatureBls48581 = &BLS48581AddressedSignature{}
if err := f.PublicKeySignatureBls48581.FromCanonicalBytes(
sigBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (f *TimeoutState) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, TimeoutStateType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write latest_quorum_certificate
latestQCBytes, err := f.LatestQuorumCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(latestQCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(latestQCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write prior_rank_timeout_certificate
if f.PriorRankTimeoutCertificate != nil {
priorTCBytes, err := f.PriorRankTimeoutCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(priorTCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(priorTCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write vote
if f.Vote != nil {
voteBytes, err := f.Vote.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(voteBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(voteBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write timeout_tick
if err := binary.Write(buf, binary.BigEndian, f.TimeoutTick); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, f.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (f *TimeoutState) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != TimeoutStateType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read latest_quorum_certificate
var latestQuorumCertLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&latestQuorumCertLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if latestQuorumCertLen > 0 {
latestQuorumCertBytes := make([]byte, latestQuorumCertLen)
if _, err := buf.Read(latestQuorumCertBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.LatestQuorumCertificate = &QuorumCertificate{}
if err := f.LatestQuorumCertificate.FromCanonicalBytes(
latestQuorumCertBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read prior_rank_timeout_certificate
var priorRankTimeoutCertLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&priorRankTimeoutCertLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if priorRankTimeoutCertLen > 0 {
priorRankTimeoutBytes := make([]byte, priorRankTimeoutCertLen)
if _, err := buf.Read(priorRankTimeoutBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.PriorRankTimeoutCertificate = &TimeoutCertificate{}
if err := f.PriorRankTimeoutCertificate.FromCanonicalBytes(
priorRankTimeoutBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read vote
var voteLen uint32
if err := binary.Read(buf, binary.BigEndian, &voteLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if voteLen > 0 {
voteBytes := make([]byte, voteLen)
if _, err := buf.Read(voteBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Vote = &ProposalVote{}
if err := f.Vote.FromCanonicalBytes(voteBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read timeout_tick
if err := binary.Read(buf, binary.BigEndian, &f.TimeoutTick); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &f.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
func (f *QuorumCertificate) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
QuorumCertificateType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write rank
if err := binary.Write(buf, binary.BigEndian, f.Rank); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, f.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write selector
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(f.Selector)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(f.Selector); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(buf, binary.BigEndian, f.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write aggregate_signature
if f.AggregateSignature != nil {
sigBytes, err := f.AggregateSignature.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (f *QuorumCertificate) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != QuorumCertificateType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Filter = make([]byte, filterLen)
if _, err := buf.Read(f.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read rank
if err := binary.Read(buf, binary.BigEndian, &f.Rank); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &f.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read selector
var selectorLen uint32
if err := binary.Read(buf, binary.BigEndian, &selectorLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.Selector = make([]byte, selectorLen)
if _, err := buf.Read(f.Selector); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &f.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read aggregate_signature
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
f.AggregateSignature = &BLS48581AggregateSignature{}
if err := f.AggregateSignature.FromCanonicalBytes(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (t *TimeoutCertificate) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(
buf,
binary.BigEndian,
TimeoutCertificateType,
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write filter
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.Filter)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(t.Filter); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write rank
if err := binary.Write(buf, binary.BigEndian, t.Rank); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write latest_ranks
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.LatestRanks)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, r := range t.LatestRanks {
if err := binary.Write(buf, binary.BigEndian, r); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write latest_quorum_certificate
if t.LatestQuorumCertificate != nil {
latestQCBytes, err := t.LatestQuorumCertificate.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(latestQCBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(latestQCBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write timestamp
if err := binary.Write(buf, binary.BigEndian, t.Timestamp); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write aggregate_signature
if t.AggregateSignature != nil {
sigBytes, err := t.AggregateSignature.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(sigBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(sigBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (t *TimeoutCertificate) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != TimeoutCertificateType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read filter
var filterLen uint32
if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Filter = make([]byte, filterLen)
if _, err := buf.Read(t.Filter); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read rank
if err := binary.Read(buf, binary.BigEndian, &t.Rank); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read latest_ranks
var latestRanksCount uint32
if err := binary.Read(buf, binary.BigEndian, &latestRanksCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.LatestRanks = make([]uint64, latestRanksCount)
if err := binary.Read(buf, binary.BigEndian, &t.LatestRanks); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read latest_quorum_certificate
var latestQuorumCertLen uint32
if err := binary.Read(
buf,
binary.BigEndian,
&latestQuorumCertLen,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if latestQuorumCertLen > 0 {
latestQuorumCertBytes := make([]byte, latestQuorumCertLen)
if _, err := buf.Read(latestQuorumCertBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.LatestQuorumCertificate = &QuorumCertificate{}
if err := t.LatestQuorumCertificate.FromCanonicalBytes(
latestQuorumCertBytes,
); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read timestamp
if err := binary.Read(buf, binary.BigEndian, &t.Timestamp); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read aggregate_signature
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if sigLen > 0 {
sigBytes := make([]byte, sigLen)
if _, err := buf.Read(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.AggregateSignature = &BLS48581AggregateSignature{}
if err := t.AggregateSignature.FromCanonicalBytes(sigBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (g *GlobalFrame) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, GlobalFrameType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write header
if g.Header != nil {
headerBytes, err := g.Header.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(headerBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(headerBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write requests count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.Requests)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, request := range g.Requests {
requestBytes, err := request.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(requestBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(requestBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (g *GlobalFrame) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != GlobalFrameType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read header
var headerLen uint32
if err := binary.Read(buf, binary.BigEndian, &headerLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if headerLen > 0 {
headerBytes := make([]byte, headerLen)
if _, err := buf.Read(headerBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Header = &GlobalFrameHeader{}
if err := g.Header.FromCanonicalBytes(headerBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read requests
var requestsCount uint32
if err := binary.Read(buf, binary.BigEndian, &requestsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Requests = make([]*MessageBundle, requestsCount)
for i := uint32(0); i < requestsCount; i++ {
var requestLen uint32
if err := binary.Read(buf, binary.BigEndian, &requestLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
requestBytes := make([]byte, requestLen)
if _, err := buf.Read(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Requests[i] = &MessageBundle{}
if err := g.Requests[i].FromCanonicalBytes(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (a *AppShardFrame) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, AppShardFrameType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write header
if a.Header != nil {
headerBytes, err := a.Header.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(headerBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(headerBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write requests count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(a.Requests)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
for _, request := range a.Requests {
requestBytes, err := request.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(requestBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(requestBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (a *AppShardFrame) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != AppShardFrameType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read header
var headerLen uint32
if err := binary.Read(buf, binary.BigEndian, &headerLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if headerLen > 0 {
headerBytes := make([]byte, headerLen)
if _, err := buf.Read(headerBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
a.Header = &FrameHeader{}
if err := a.Header.FromCanonicalBytes(headerBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read requests
var requestsCount uint32
if err := binary.Read(buf, binary.BigEndian, &requestsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
a.Requests = make([]*MessageBundle, requestsCount)
for i := uint32(0); i < requestsCount; i++ {
var requestLen uint32
if err := binary.Read(buf, binary.BigEndian, &requestLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
requestBytes := make([]byte, requestLen)
if _, err := buf.Read(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
a.Requests[i] = &MessageBundle{}
if err := a.Requests[i].FromCanonicalBytes(requestBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
// Multiproof serialization methods
func (m *Multiproof) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, MultiproofType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write multicommitment
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(m.Multicommitment)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(m.Multicommitment); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write proof
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(m.Proof)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(m.Proof); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (m *Multiproof) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != MultiproofType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read multicommitment
var commitLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Multicommitment = make([]byte, commitLen)
if _, err := buf.Read(m.Multicommitment); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read proof
var proofLen uint32
if err := binary.Read(buf, binary.BigEndian, &proofLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
m.Proof = make([]byte, proofLen)
if _, err := buf.Read(m.Proof); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
// Path serialization methods
func (p *Path) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, PathType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write indices count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Indices)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each index
for _, index := range p.Indices {
if err := binary.Write(buf, binary.BigEndian, index); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *Path) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != PathType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read indices count
var indicesCount uint32
if err := binary.Read(buf, binary.BigEndian, &indicesCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Indices = make([]uint64, indicesCount)
// Read each index
for i := uint32(0); i < indicesCount; i++ {
if err := binary.Read(buf, binary.BigEndian, &p.Indices[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
// TraversalSubProof serialization methods
func (t *TraversalSubProof) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, TraversalSubProofType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write commits count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.Commits)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each commit
for _, commit := range t.Commits {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(commit)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(commit); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write ys count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.Ys)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each y
for _, y := range t.Ys {
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(y)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(y); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write paths count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.Paths)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each path
for _, path := range t.Paths {
pathBytes, err := path.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(pathBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(pathBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (t *TraversalSubProof) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != TraversalSubProofType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read commits count
var commitsCount uint32
if err := binary.Read(buf, binary.BigEndian, &commitsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Commits = make([][]byte, commitsCount)
// Read each commit
for i := uint32(0); i < commitsCount; i++ {
var commitLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Commits[i] = make([]byte, commitLen)
if _, err := buf.Read(t.Commits[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read ys count
var ysCount uint32
if err := binary.Read(buf, binary.BigEndian, &ysCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Ys = make([][]byte, ysCount)
// Read each y
for i := uint32(0); i < ysCount; i++ {
var yLen uint32
if err := binary.Read(buf, binary.BigEndian, &yLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Ys[i] = make([]byte, yLen)
if _, err := buf.Read(t.Ys[i]); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read paths count
var pathsCount uint32
if err := binary.Read(buf, binary.BigEndian, &pathsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Paths = make([]*Path, pathsCount)
// Read each path
for i := uint32(0); i < pathsCount; i++ {
var pathLen uint32
if err := binary.Read(buf, binary.BigEndian, &pathLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
pathBytes := make([]byte, pathLen)
if _, err := buf.Read(pathBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Paths[i] = &Path{}
if err := t.Paths[i].FromCanonicalBytes(pathBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
// TraversalProof serialization methods
func (t *TraversalProof) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, TraversalProofType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write multiproof
if t.Multiproof != nil {
multiproofBytes, err := t.Multiproof.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(multiproofBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(multiproofBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
// Write sub_proofs count
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(t.SubProofs)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write each sub proof
for _, subProof := range t.SubProofs {
subProofBytes, err := subProof.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(subProofBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(subProofBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (t *TraversalProof) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != TraversalProofType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read multiproof
var multiproofLen uint32
if err := binary.Read(buf, binary.BigEndian, &multiproofLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if multiproofLen > 0 {
multiproofBytes := make([]byte, multiproofLen)
if _, err := buf.Read(multiproofBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.Multiproof = &Multiproof{}
if err := t.Multiproof.FromCanonicalBytes(multiproofBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
// Read sub_proofs count
var subProofsCount uint32
if err := binary.Read(buf, binary.BigEndian, &subProofsCount); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.SubProofs = make([]*TraversalSubProof, subProofsCount)
// Read each sub proof
for i := uint32(0); i < subProofsCount; i++ {
var subProofLen uint32
if err := binary.Read(buf, binary.BigEndian, &subProofLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
subProofBytes := make([]byte, subProofLen)
if _, err := buf.Read(subProofBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
t.SubProofs[i] = &TraversalSubProof{}
if err := t.SubProofs[i].FromCanonicalBytes(subProofBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
// ProverKick serialization methods
func (p *ProverKick) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, ProverKickType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write frame_number
if err := binary.Write(buf, binary.BigEndian, p.FrameNumber); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write kicked_prover_public_key
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.KickedProverPublicKey)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.KickedProverPublicKey); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write conflicting_frame_1
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.ConflictingFrame_1)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.ConflictingFrame_1); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write conflicting_frame_2
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.ConflictingFrame_2)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.ConflictingFrame_2); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write commitment
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Commitment)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Commitment); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write proof
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(p.Proof)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(p.Proof); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write traversal_proof
if p.TraversalProof != nil {
traversalBytes, err := p.TraversalProof.ToCanonicalBytes()
if err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(traversalBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(traversalBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
} else {
if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
}
return buf.Bytes(), nil
}
func (p *ProverKick) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != ProverKickType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read frame_number
if err := binary.Read(buf, binary.BigEndian, &p.FrameNumber); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read kicked_prover_public_key
var keyLen uint32
if err := binary.Read(buf, binary.BigEndian, &keyLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.KickedProverPublicKey = make([]byte, keyLen)
if _, err := buf.Read(p.KickedProverPublicKey); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read conflicting_frame_1
var frame1Len uint32
if err := binary.Read(buf, binary.BigEndian, &frame1Len); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.ConflictingFrame_1 = make([]byte, frame1Len)
if _, err := buf.Read(p.ConflictingFrame_1); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read conflicting_frame_2
var frame2Len uint32
if err := binary.Read(buf, binary.BigEndian, &frame2Len); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.ConflictingFrame_2 = make([]byte, frame2Len)
if _, err := buf.Read(p.ConflictingFrame_2); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read commitment
var commitmentLen uint32
if err := binary.Read(buf, binary.BigEndian, &commitmentLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Commitment = make([]byte, commitmentLen)
if _, err := buf.Read(p.Commitment); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read proof
var proofLen uint32
if err := binary.Read(buf, binary.BigEndian, &proofLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.Proof = make([]byte, proofLen)
if _, err := buf.Read(p.Proof); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
// Read traversal_proof
var traversalLen uint32
if err := binary.Read(buf, binary.BigEndian, &traversalLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if traversalLen > 0 {
traversalBytes := make([]byte, traversalLen)
if _, err := buf.Read(traversalBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
p.TraversalProof = &TraversalProof{}
if err := p.TraversalProof.FromCanonicalBytes(traversalBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
}
return nil
}
func (g *GlobalAlert) ToCanonicalBytes() ([]byte, error) {
buf := new(bytes.Buffer)
// Write type prefix
if err := binary.Write(buf, binary.BigEndian, GlobalAlertType); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write message
msgBytes := []byte(g.Message)
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(msgBytes)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(msgBytes); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
// Write signature
if err := binary.Write(
buf,
binary.BigEndian,
uint32(len(g.Signature)),
); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
if _, err := buf.Write(g.Signature); err != nil {
return nil, errors.Wrap(err, "to canonical bytes")
}
return buf.Bytes(), nil
}
func (g *GlobalAlert) FromCanonicalBytes(data []byte) error {
buf := bytes.NewBuffer(data)
// Read and verify type prefix
var typePrefix uint32
if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
if typePrefix != GlobalAlertType {
return errors.Wrap(
errors.New("invalid type prefix"),
"from canonical bytes",
)
}
// Read message
var msgLen uint32
if err := binary.Read(buf, binary.BigEndian, &msgLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
msgBytes := make([]byte, msgLen)
if _, err := buf.Read(msgBytes); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Message = string(msgBytes)
// Read signature
var sigLen uint32
if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
g.Signature = make([]byte, sigLen)
if _, err := buf.Read(g.Signature); err != nil {
return errors.Wrap(err, "from canonical bytes")
}
return nil
}
var _ SignedMessage = (*LegacyProverRequest)(nil)
// ValidateSignature checks the signature of the announce prover request.
func (t *LegacyProverRequest) ValidateSignature() error {
payload := []byte{}
primary := t.PublicKeySignaturesEd448[0]
for _, p := range t.PublicKeySignaturesEd448[1:] {
payload = append(payload, p.PublicKey.KeyValue...)
if err := p.verifyUnsafe(primary.PublicKey.KeyValue, []byte{}); err != nil {
return errors.Wrap(err, "validate signature")
}
}
if err := primary.verifyUnsafe(payload, []byte{}); err != nil {
return errors.Wrap(err, "validate signature")
}
return nil
}
var _ ValidatableMessage = (*MessageRequest)(nil)
// Validate checks the message request.
func (m *MessageRequest) Validate() error {
if m == nil {
return errors.Wrap(errors.New("nil message request"), "validate")
}
switch {
case m.GetJoin() != nil:
return m.GetJoin().Validate()
case m.GetLeave() != nil:
return m.GetLeave().Validate()
case m.GetPause() != nil:
return m.GetPause().Validate()
case m.GetResume() != nil:
return m.GetResume().Validate()
case m.GetConfirm() != nil:
return m.GetConfirm().Validate()
case m.GetReject() != nil:
return m.GetReject().Validate()
case m.GetKick() != nil:
return m.GetKick().Validate()
case m.GetUpdate() != nil:
return m.GetUpdate().Validate()
case m.GetTokenDeploy() != nil:
return m.GetTokenDeploy().Validate()
case m.GetTokenUpdate() != nil:
return m.GetTokenUpdate().Validate()
case m.GetTransaction() != nil:
return m.GetTransaction().Validate()
case m.GetPendingTransaction() != nil:
return m.GetPendingTransaction().Validate()
case m.GetMintTransaction() != nil:
return m.GetMintTransaction().Validate()
case m.GetHypergraphDeploy() != nil:
return m.GetHypergraphDeploy().Validate()
case m.GetHypergraphUpdate() != nil:
return m.GetHypergraphUpdate().Validate()
case m.GetVertexAdd() != nil:
return m.GetVertexAdd().Validate()
case m.GetVertexRemove() != nil:
return m.GetVertexRemove().Validate()
case m.GetHyperedgeAdd() != nil:
return m.GetHyperedgeAdd().Validate()
case m.GetHyperedgeRemove() != nil:
return m.GetHyperedgeRemove().Validate()
case m.GetComputeDeploy() != nil:
return m.GetComputeDeploy().Validate()
case m.GetComputeUpdate() != nil:
return m.GetComputeUpdate().Validate()
case m.GetCodeDeploy() != nil:
return m.GetCodeDeploy().Validate()
case m.GetCodeExecute() != nil:
return m.GetCodeExecute().Validate()
case m.GetCodeFinalize() != nil:
return m.GetCodeFinalize().Validate()
case m.GetShard() != nil:
return m.GetShard().Validate()
default:
return nil
}
}
var _ ValidatableMessage = (*MessageBundle)(nil)
// Validate checks the message bundle.
func (m *MessageBundle) Validate() error {
if m == nil {
return errors.Wrap(errors.New("nil message bundle"), "validate")
}
for i, request := range m.Requests {
if request != nil {
if err := request.Validate(); err != nil {
return errors.Wrapf(err, "validate request at index %d", i)
}
}
}
if m.Timestamp == 0 {
return errors.Wrap(errors.New("timestamp required"), "validate")
}
return nil
}
var _ ValidatableMessage = (*LegacyProverRequest)(nil)
// Validate checks the announce prover request.
func (t *LegacyProverRequest) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil announce prover request"), "validate")
}
if len(t.PublicKeySignaturesEd448) == 0 {
return errors.Wrap(errors.New("invalid public key signatures"), "validate")
}
for _, p := range t.PublicKeySignaturesEd448 {
if err := p.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
}
if err := t.ValidateSignature(); err != nil {
return errors.Wrap(err, "validate")
}
return nil
}
var _ ValidatableMessage = (*ProverJoin)(nil)
// Validate checks the announce prover join.
func (t *ProverJoin) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil announce prover join"), "validate")
}
if len(t.Filters) == 0 {
return errors.Wrap(errors.New("no filters provided"), "validate")
}
for _, filter := range t.Filters {
if len(filter) < 32 || len(filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
}
if t.PublicKeySignatureBls48581 != nil {
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
}
return nil
}
var _ ValidatableMessage = (*ProverLeave)(nil)
// Validate checks the announce prover leave.
func (t *ProverLeave) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil announce prover leave"), "validate")
}
if len(t.Filters) == 0 {
return errors.Wrap(errors.New("no filters provided"), "validate")
}
for _, filter := range t.Filters {
if len(filter) < 32 || len(filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
}
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
return nil
}
var _ ValidatableMessage = (*ProverPause)(nil)
// Validate checks the announce prover pause.
func (t *ProverPause) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil announce prover pause"), "validate")
}
if len(t.Filter) < 32 || len(t.Filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "public key signature")
}
return nil
}
var _ ValidatableMessage = (*ProverResume)(nil)
// Validate checks the announce prover resume.
func (t *ProverResume) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil announce prover resume"), "validate")
}
if len(t.Filter) < 32 || len(t.Filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "public key signature")
}
return nil
}
// SignableED448Message is a message that can be signed.
type SignableED448Message interface {
// SignED448 signs the message with the given key, modifying the message.
// The message contents are expected to be valid - message contents must be
// validated, or correctly constructed, before signing.
SignED448(publicKey []byte, sign func([]byte) ([]byte, error)) error
}
func newED448Signature(publicKey, signature []byte) *Ed448Signature {
return &Ed448Signature{
PublicKey: &Ed448PublicKey{
KeyValue: publicKey,
},
Signature: signature,
}
}
type ED448SignHelper struct {
PublicKey []byte
Sign func([]byte) ([]byte, error)
}
type BLS48581SignHelper struct {
PublicKey []byte
Sign func([]byte) ([]byte, error)
}
// SignED448 signs the announce prover request with the given keys.
func (t *LegacyProverRequest) SignED448(helpers []ED448SignHelper) error {
if len(helpers) == 0 {
return errors.Wrap(errors.New("no keys"), "sign ed448")
}
payload := []byte{}
primary := helpers[0]
signatures := make([]*Ed448Signature, len(helpers))
for i, k := range helpers[1:] {
payload = append(payload, k.PublicKey...)
signature, err := k.Sign(primary.PublicKey)
if err != nil {
return errors.Wrap(err, "sign ed448")
}
signatures[i+1] = newED448Signature(k.PublicKey, signature)
}
signature, err := primary.Sign(payload)
if err != nil {
return errors.Wrap(err, "sign ed448")
}
signatures[0] = newED448Signature(primary.PublicKey, signature)
t.PublicKeySignaturesEd448 = signatures
return nil
}
var _ ValidatableMessage = (*ProverConfirm)(nil)
// Validate checks the prover confirm.
func (t *ProverConfirm) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil prover confirm"), "validate")
}
if len(t.Filter) < 32 || len(t.Filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "public key signature")
}
return nil
}
var _ ValidatableMessage = (*ProverReject)(nil)
// Validate checks the prover reject.
func (t *ProverReject) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil prover reject"), "validate")
}
if len(t.Filter) < 32 || len(t.Filter) > 64 {
return errors.Wrap(errors.New("invalid filter"), "validate")
}
if err := t.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "public key signature")
}
return nil
}
var _ ValidatableMessage = (*ProverUpdate)(nil)
// Validate checks the prover update.
func (p *ProverUpdate) Validate() error {
if p == nil {
return errors.Wrap(errors.New("nil prover update"), "validate")
}
if len(p.DelegateAddress) == 0 {
return errors.Wrap(errors.New("delegate address is empty"), "validate")
}
if p.PublicKeySignatureBls48581 == nil {
return errors.Wrap(errors.New("public key signature is nil"), "validate")
}
if err := p.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "validate signature")
}
return nil
}
var _ ValidatableMessage = (*ProverKick)(nil)
// Validate checks the prover kick.
func (t *ProverKick) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil prover kick"), "validate")
}
if len(t.KickedProverPublicKey) == 0 {
return errors.Wrap(
errors.New("kicked prover public key is empty"),
"validate",
)
}
if len(t.ConflictingFrame_1) == 0 {
return errors.Wrap(errors.New("conflicting frame 1 is empty"), "validate")
}
if len(t.ConflictingFrame_2) == 0 {
return errors.Wrap(errors.New("conflicting frame 2 is empty"), "validate")
}
if len(t.Commitment) == 0 {
return errors.Wrap(errors.New("commitment is empty"), "validate")
}
if len(t.Proof) == 0 {
return errors.Wrap(errors.New("proof is empty"), "validate")
}
// TraversalProof is optional
if t.TraversalProof != nil {
if err := t.TraversalProof.Validate(); err != nil {
return errors.Wrap(err, "traversal proof")
}
}
return nil
}
var _ ValidatableMessage = (*SeniorityMerge)(nil)
// Validate checks the seniority merge.
func (t *SeniorityMerge) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil seniority merge"), "validate")
}
if len(t.Signature) != 74 {
return errors.Wrap(errors.New("invalid signature length"), "validate")
}
if len(t.ProverPublicKey) == 0 {
return errors.Wrap(errors.New("prover public key is empty"), "validate")
}
return nil
}
var _ ValidatableMessage = (*Multiproof)(nil)
// Validate checks the multiproof.
func (t *Multiproof) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil multiproof"), "validate")
}
if len(t.Multicommitment) == 0 {
return errors.Wrap(errors.New("multicommitment is empty"), "validate")
}
if len(t.Proof) == 0 {
return errors.Wrap(errors.New("proof is empty"), "validate")
}
return nil
}
var _ ValidatableMessage = (*Path)(nil)
// Validate checks the path.
func (t *Path) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil path"), "validate")
}
// Path can have empty indices
return nil
}
var _ ValidatableMessage = (*TraversalSubProof)(nil)
// Validate checks the traversal sub proof.
func (t *TraversalSubProof) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil traversal sub proof"), "validate")
}
if len(t.Commits) == 0 {
return errors.Wrap(errors.New("no commits in sub proof"), "validate")
}
if len(t.Ys) == 0 {
return errors.Wrap(errors.New("no ys in sub proof"), "validate")
}
if len(t.Paths) == 0 {
return errors.Wrap(errors.New("no paths in sub proof"), "validate")
}
// All arrays should have the same length
if len(t.Commits) != len(t.Ys) || len(t.Commits) != len(t.Paths) {
return errors.Wrap(
errors.New("mismatched array lengths in sub proof"),
"validate",
)
}
for _, path := range t.Paths {
if err := path.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
}
return nil
}
var _ ValidatableMessage = (*TraversalProof)(nil)
// Validate checks the traversal proof.
func (t *TraversalProof) Validate() error {
if t == nil {
return errors.Wrap(errors.New("nil traversal proof"), "validate")
}
if t.Multiproof == nil {
return errors.Wrap(errors.New("nil multiproof"), "validate")
}
if err := t.Multiproof.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
if len(t.SubProofs) == 0 {
return errors.Wrap(errors.New("no sub proofs"), "validate")
}
for _, subProof := range t.SubProofs {
if err := subProof.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
}
return nil
}
var _ ValidatableMessage = (*GlobalFrameHeader)(nil)
func (h *GlobalFrameHeader) Validate() error {
if h == nil {
return errors.Wrap(errors.New("nil global frame header"), "validate")
}
// Frame number is uint64, any value is valid
// Timestamp should be reasonable (not 0, not too far in future)
if h.Timestamp == 0 {
return errors.Wrap(errors.New("invalid timestamp"), "validate")
}
// Difficulty should be non-zero
if h.Difficulty == 0 {
return errors.Wrap(errors.New("invalid difficulty"), "validate")
}
// Output should be 516 bytes (258 byte Y + 258 byte proof)
if len(h.Output) != 516 {
return errors.Wrap(errors.New("invalid output length"), "validate")
}
// Parent selector should be 32 bytes
if len(h.ParentSelector) != 32 {
return errors.Wrap(errors.New("invalid parent selector length"), "validate")
}
// Global commitments should be exactly 256 entries
if len(h.GlobalCommitments) != 256 {
return errors.Wrap(
errors.New("invalid global commitments count"),
"validate",
)
}
// Each commitment should be 64 or 74 bytes
for i, commitment := range h.GlobalCommitments {
if len(commitment) != 64 && len(commitment) != 74 {
return errors.Wrapf(
errors.New("invalid commitment length"),
"validate: commitment %d",
i,
)
}
}
// Prover tree commitment should be 64 or 74 bytes
if len(h.ProverTreeCommitment) != 64 && len(h.ProverTreeCommitment) != 74 {
return errors.Wrap(
errors.New("invalid prover tree commitment length"),
"validate",
)
}
// Requests root commitment should be 64 or 74 bytes
if len(h.RequestsRoot) != 64 && len(h.RequestsRoot) != 74 {
return errors.Wrap(
errors.New("invalid request root commitment length"),
"validate",
)
}
// Prover must be set
if len(h.Prover) != 32 {
return errors.Wrap(
errors.New("invalid prover length"),
"validate",
)
}
// Signature must be present
if h.PublicKeySignatureBls48581 == nil {
return errors.Wrap(errors.New("missing signature"), "validate")
}
return nil
}
var _ ValidatableMessage = (*FrameHeader)(nil)
func (h *FrameHeader) Validate() error {
if h == nil {
return errors.Wrap(errors.New("nil frame header"), "validate")
}
// Address should be 32 to 64 bytes
if len(h.Address) < 32 || len(h.Address) > 64 {
return errors.Wrap(errors.New("invalid address length"), "validate")
}
// Frame number is uint64, any value is valid
// Timestamp should be reasonable (not 0)
if h.Timestamp == 0 {
return errors.Wrap(errors.New("invalid timestamp"), "validate")
}
// Difficulty should be non-zero
if h.Difficulty == 0 {
return errors.Wrap(errors.New("invalid difficulty"), "validate")
}
// Output should be 516 bytes
if len(h.Output) != 516 {
return errors.Wrap(errors.New("invalid output length"), "validate")
}
// Parent selector should be 32 bytes
if len(h.ParentSelector) != 32 {
return errors.Wrap(errors.New("invalid parent selector length"), "validate")
}
// Requests root should be 64 or 74 bytes
if len(h.RequestsRoot) != 64 && len(h.RequestsRoot) != 74 {
return errors.Wrap(errors.New("invalid requests root length"), "validate")
}
// State roots should be exactly 4 entries
if len(h.StateRoots) != 4 {
return errors.Wrap(errors.New("invalid state roots count"), "validate")
}
// Each state root should be 64 or 74 bytes
for i, root := range h.StateRoots {
if len(root) != 64 && len(root) != 74 {
return errors.Wrapf(
errors.New("invalid state root length"),
"validate: state root %d",
i,
)
}
}
// Prover should be 32 bytes
if len(h.Prover) != 32 {
return errors.Wrap(errors.New("invalid prover length"), "validate")
}
// Fee multiplier vote is uint64, any value is valid
return nil
}
var _ ValidatableMessage = (*ProverLivenessCheck)(nil)
func (p *ProverLivenessCheck) Validate() error {
if p == nil {
return errors.Wrap(errors.New("nil prover liveness check"), "validate")
}
// Filter should be 64 bytes or fewer
if len(p.Filter) < 32 || len(p.Filter) > 64 {
return errors.Wrap(errors.New("invalid filter length"), "validate")
}
// Commitment hash should be at least 32 bytes
if len(p.Filter) != 0 && len(p.CommitmentHash) < 32 {
return errors.Wrap(errors.New("invalid commitment hash length"), "validate")
}
// Signature must be present
if p.PublicKeySignatureBls48581 == nil {
return errors.Wrap(errors.New("missing signature"), "validate")
}
// Validate the signature payload (not the signature itself)
if err := p.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
return nil
}
func (p *ProverLivenessCheck) ConstructSignaturePayload() ([]byte, error) {
clone := proto.Clone(p).(*ProverLivenessCheck)
clone.PublicKeySignatureBls48581 = nil
cloneBytes, err := clone.ToCanonicalBytes()
return cloneBytes, errors.Wrap(err, "construct signature payload")
}
func (p *ProverLivenessCheck) GetSignatureDomain() []byte {
return slices.Concat([]byte("PROVER_LIVENESS"), p.Filter)
}
var _ ValidatableMessage = (*ProposalVote)(nil)
func (f *ProposalVote) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil frame vote"), "validate")
}
// Rank and frame number is uint64, any value is valid
// Selector should be 32 bytes (proposal) or zero (timeout)
if len(f.Selector) != 32 && len(f.Selector) != 0 {
return errors.Wrap(
errors.Errorf("invalid selector length: %d", len(f.Selector)),
"validate",
)
}
// Signature must be present
if f.PublicKeySignatureBls48581 == nil {
return errors.Wrap(errors.New("missing signature"), "validate")
}
// Validate the signature
if len(f.Filter) == 0 {
if err := f.PublicKeySignatureBls48581.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
} else {
if len(f.PublicKeySignatureBls48581.Address) != 32 {
return errors.Wrap(errors.New("invalid address"), "validate")
}
// handle extended sig
if len(f.PublicKeySignatureBls48581.Signature) != 74 &&
len(f.PublicKeySignatureBls48581.Signature) != 590 {
return errors.Wrap(errors.New("invalid bls48581 signature"), "validate")
}
}
return nil
}
var _ ValidatableMessage = (*AppShardProposal)(nil)
func (f *AppShardProposal) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil proposal"), "validate")
}
if f.State == nil {
return errors.Wrap(
errors.New("missing state"),
"validate",
)
}
if err := f.State.Validate(); err != nil {
return err
}
if f.ParentQuorumCertificate == nil {
return errors.Wrap(
errors.New("missing parent quorum certificate"),
"validate",
)
}
if err := f.ParentQuorumCertificate.Validate(); err != nil {
return err
}
if f.PriorRankTimeoutCertificate != nil {
if err := f.PriorRankTimeoutCertificate.Validate(); err != nil {
return err
}
}
if f.Vote == nil {
return errors.Wrap(errors.New("missing vote"), "validate")
}
if err := f.Vote.Validate(); err != nil {
return err
}
return nil
}
var _ ValidatableMessage = (*GlobalProposal)(nil)
func (f *GlobalProposal) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil proposal"), "validate")
}
if f.State == nil {
return errors.Wrap(
errors.New("missing state"),
"validate",
)
}
if err := f.State.Validate(); err != nil {
return err
}
if f.ParentQuorumCertificate == nil {
return errors.Wrap(
errors.New("missing parent quorum certificate"),
"validate",
)
}
if err := f.ParentQuorumCertificate.Validate(); err != nil {
return err
}
if f.PriorRankTimeoutCertificate != nil {
if err := f.PriorRankTimeoutCertificate.Validate(); err != nil {
return err
}
}
if f.Vote == nil {
return errors.Wrap(errors.New("missing vote"), "validate")
}
if err := f.Vote.Validate(); err != nil {
return err
}
return nil
}
var _ ValidatableMessage = (*TimeoutState)(nil)
func (f *TimeoutState) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil timeout state"), "validate")
}
if f.LatestQuorumCertificate == nil {
return errors.Wrap(errors.New("nil latest quorum certificate"), "validate")
}
if err := f.LatestQuorumCertificate.Validate(); err != nil {
return err
}
if f.PriorRankTimeoutCertificate != nil {
if err := f.PriorRankTimeoutCertificate.Validate(); err != nil {
return err
}
}
if f.Vote == nil {
return errors.Wrap(errors.New("missing vote"), "validate")
}
if err := f.Vote.Validate(); err != nil {
return err
}
return nil
}
var _ ValidatableMessage = (*QuorumCertificate)(nil)
func (f *QuorumCertificate) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil frame confirmation"), "validate")
}
// Rank and frame number is uint64, any value is valid
// Selector should be 32 bytes
if len(f.Selector) != 32 {
return errors.Wrap(
errors.Errorf("invalid selector length: %d", len(f.Selector)),
"validate",
)
}
// Aggregate signature must be present
if f.AggregateSignature == nil {
return errors.Wrap(errors.New("missing aggregate signature"), "validate")
}
return f.AggregateSignature.Validate()
}
var _ ValidatableMessage = (*TimeoutCertificate)(nil)
func (f *TimeoutCertificate) Validate() error {
if f == nil {
return errors.Wrap(errors.New("nil frame confirmation"), "validate")
}
// Rank and frame number is uint64, any value is valid
// Aggregate signature must be present
if f.AggregateSignature == nil {
return errors.Wrap(errors.New("missing aggregate signature"), "validate")
}
return f.AggregateSignature.Validate()
}
var _ ValidatableMessage = (*GlobalFrame)(nil)
func (g *GlobalFrame) Validate() error {
if g == nil {
return errors.Wrap(errors.New("nil global frame"), "validate")
}
// Header must be present and valid
if g.Header == nil {
return errors.Wrap(errors.New("missing header"), "validate")
}
if err := g.Header.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
// Validate each request
for i, request := range g.Requests {
if request == nil {
return errors.Wrapf(
errors.New("nil request"),
"validate: request %d",
i,
)
}
if err := request.Validate(); err != nil {
return errors.Wrapf(err, "validate: request %d", i)
}
}
return nil
}
var _ ValidatableMessage = (*AppShardFrame)(nil)
func (a *AppShardFrame) Validate() error {
if a == nil {
return errors.Wrap(errors.New("nil app shard frame"), "validate")
}
// Header must be present and valid
if a.Header == nil {
return errors.Wrap(errors.New("missing header"), "validate")
}
if err := a.Header.Validate(); err != nil {
return errors.Wrap(err, "validate")
}
// Validate each request
for i, request := range a.Requests {
if request == nil {
return errors.Wrapf(
errors.New("nil request"),
"validate: request %d",
i,
)
}
if err := request.Validate(); err != nil {
return errors.Wrapf(err, "validate: request %d", i)
}
}
return nil
}
var _ ValidatableMessage = (*PeerInfo)(nil)
// Validate checks the PeerInfo message.
func (p *PeerInfo) Validate() error {
if p == nil {
return errors.Wrap(errors.New("nil peer info"), "validate")
}
// Validate peer_id
if len(p.PeerId) == 0 {
return errors.Wrap(errors.New("missing peer id"), "validate")
}
// Validate reachability entries
for _, reach := range p.Reachability {
if reach == nil {
return errors.Wrap(errors.New("nil reachability entry"), "validate")
}
// Validate filter in reachability
if len(reach.Filter) > 64 {
return errors.Wrap(
errors.New("invalid filter size in reachability"),
"validate",
)
}
// Validate pubsub multiaddrs
for _, addr := range reach.PubsubMultiaddrs {
if addr == "" {
return errors.Wrap(errors.New("empty pubsub multiaddr"), "validate")
}
if _, err := multiaddr.StringCast(addr); err != nil {
return errors.Wrap(err, "validate pubsub multiaddr")
}
}
// Validate stream multiaddrs
for _, addr := range reach.StreamMultiaddrs {
if addr == "" {
return errors.Wrap(errors.New("empty stream multiaddr"), "validate")
}
if _, err := multiaddr.StringCast(addr); err != nil {
return errors.Wrap(err, "validate stream multiaddr")
}
}
}
now := time.Now().UnixMilli()
// Timestamp is int64
if p.Timestamp < now-5000 || p.Timestamp > now+5000 {
return errors.Wrap(errors.New("invalid timestamp"), "validate")
}
// Validate version
if len(p.Version) == 0 {
return errors.Wrap(errors.New("missing version"), "validate")
}
// Validate patch version
if len(p.PatchVersion) == 0 {
return errors.Wrap(errors.New("missing patch version"), "validate")
}
// Validate capabilities
if len(p.Capabilities) == 0 {
return errors.Wrap(errors.New("missing capabilities"), "validate")
}
for _, cap := range p.Capabilities {
if cap == nil {
return errors.Wrap(errors.New("nil capability"), "validate")
}
// Protocol identifier should be non-zero
if cap.ProtocolIdentifier == 0 {
return errors.Wrap(errors.New("invalid protocol identifier"), "validate")
}
}
// Validate signature
if len(p.Signature) != 114 {
return errors.Wrap(errors.New("invalid signature length"), "validate")
}
// Validate public key (Ed448 public key should be 57 bytes)
if len(p.PublicKey) != 57 {
return errors.Wrap(errors.New("invalid public key length"), "validate")
}
return nil
}
var _ ValidatableMessage = (*GlobalAlert)(nil)
// Validate checks the GlobalAlert message.
func (g *GlobalAlert) Validate() error {
if g == nil {
return errors.Wrap(errors.New("nil global alert"), "validate")
}
// Validate message content
if g.Message == "" {
return errors.Wrap(errors.New("empty alert message"), "validate")
}
// Validate signature
if len(g.Signature) != 114 {
return errors.Wrap(errors.New("invalid signature"), "validate")
}
return nil
}