6 "github.com/bytom/bytom/consensus"
7 "github.com/bytom/bytom/encoding/blockchain"
8 "github.com/bytom/bytom/protocol/bc"
11 // SupLinks is alias of SupLink slice
12 type SupLinks []*SupLink
14 // AddSupLink used to add a supLink by specified validator
15 func (s *SupLinks) AddSupLink(sourceHeight uint64, sourceHash bc.Hash, signature []byte, validatorOrder int) {
16 for _, supLink := range *s {
17 if supLink.SourceHash == sourceHash {
18 supLink.Signatures[validatorOrder] = signature
23 supLink := &SupLink{SourceHeight: sourceHeight, SourceHash: sourceHash}
24 supLink.Signatures[validatorOrder] = signature
25 *s = append(*s, supLink)
28 func (s *SupLinks) readFrom(r *blockchain.Reader) (err error) {
29 size, err := blockchain.ReadVarint31(r)
34 supLinks := make([]*SupLink, size)
35 for i := 0; i < int(size); i++ {
37 if err := supLink.readFrom(r); err != nil {
47 func (s SupLinks) writeTo(w io.Writer) error {
48 if _, err := blockchain.WriteVarint31(w, uint64(len(s))); err != nil {
52 for _, supLink := range s {
53 if err := supLink.writeTo(w); err != nil {
60 // SupLink is an ordered pair of checkpoints (a, b), also written a → b
61 // the validators will sign it once considered as legal
65 Signatures [consensus.MaxNumOfValidators][]byte
68 // IsMajority if at least 2/3 of validators have published votes with sup link
69 func (s *SupLink) IsMajority(numOfValidators int) bool {
71 for _, signature := range s.Signatures {
72 if len(signature) > 0 {
76 return numOfSignatures > numOfValidators*2/3
79 func (s *SupLink) readFrom(r *blockchain.Reader) (err error) {
80 if s.SourceHeight, err = blockchain.ReadVarint63(r); err != nil {
84 if _, err := s.SourceHash.ReadFrom(r); err != nil {
88 for i := 0; i < consensus.MaxNumOfValidators; i++ {
89 if s.Signatures[i], err = blockchain.ReadVarstr31(r); err != nil {
96 func (s *SupLink) writeTo(w io.Writer) error {
97 if _, err := blockchain.WriteVarint63(w, s.SourceHeight); err != nil {
101 if _, err := s.SourceHash.WriteTo(w); err != nil {
105 for _, signature := range s.Signatures {
106 if _, err := blockchain.WriteVarstr31(w, signature); err != nil {