package blocks
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
. "github.com/tendermint/tendermint/binary"
|
|
. "github.com/tendermint/tendermint/common"
|
|
)
|
|
|
|
type Signable interface {
|
|
Binary
|
|
GetSignature() Signature
|
|
SetSignature(Signature)
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
type Signature struct {
|
|
SignerId uint64
|
|
Bytes []byte
|
|
}
|
|
|
|
func ReadSignature(r io.Reader, n *int64, err *error) Signature {
|
|
return Signature{
|
|
SignerId: ReadUInt64(r, n, err),
|
|
Bytes: ReadByteSlice(r, n, err),
|
|
}
|
|
}
|
|
|
|
func (sig Signature) IsZero() bool {
|
|
return len(sig.Bytes) == 0
|
|
}
|
|
|
|
func (sig Signature) WriteTo(w io.Writer) (n int64, err error) {
|
|
WriteUInt64(w, sig.SignerId, &n, &err)
|
|
WriteByteSlice(w, sig.Bytes, &n, &err)
|
|
return
|
|
}
|
|
|
|
func (sig Signature) String() string {
|
|
return fmt.Sprintf("Signature{Id:%v %X}", sig.SignerId, Fingerprint(sig.Bytes))
|
|
}
|
|
|
|
//-------------------------------------
|
|
|
|
func ReadSignatures(r io.Reader, n *int64, err *error) (sigs []Signature) {
|
|
length := ReadUInt32(r, n, err)
|
|
for i := uint32(0); i < length; i++ {
|
|
sigs = append(sigs, ReadSignature(r, n, err))
|
|
}
|
|
return
|
|
}
|
|
|
|
func WriteSignatures(w io.Writer, sigs []Signature, n *int64, err *error) {
|
|
WriteUInt32(w, uint32(len(sigs)), n, err)
|
|
for _, sig := range sigs {
|
|
WriteBinary(w, sig, n, err)
|
|
if *err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
type RoundSignature struct {
|
|
Round uint16
|
|
Signature
|
|
}
|
|
|
|
func ReadRoundSignature(r io.Reader, n *int64, err *error) RoundSignature {
|
|
return RoundSignature{
|
|
ReadUInt16(r, n, err),
|
|
ReadSignature(r, n, err),
|
|
}
|
|
}
|
|
|
|
func (rsig RoundSignature) WriteTo(w io.Writer) (n int64, err error) {
|
|
WriteUInt16(w, rsig.Round, &n, &err)
|
|
WriteBinary(w, rsig.Signature, &n, &err)
|
|
return
|
|
}
|
|
|
|
func (rsig RoundSignature) IsZero() bool {
|
|
return rsig.Round == 0 && rsig.SignerId == 0 && len(rsig.Bytes) == 0
|
|
}
|
|
|
|
func (rsig RoundSignature) String() string {
|
|
return fmt.Sprintf("RoundSignature{R:%v Id:%v %X}", rsig.Round, rsig.SignerId, Fingerprint(rsig.Bytes))
|
|
}
|
|
|
|
//-------------------------------------
|
|
|
|
func ReadRoundSignatures(r io.Reader, n *int64, err *error) (rsigs []RoundSignature) {
|
|
length := ReadUInt32(r, n, err)
|
|
for i := uint32(0); i < length; i++ {
|
|
rsigs = append(rsigs, ReadRoundSignature(r, n, err))
|
|
}
|
|
return
|
|
}
|
|
|
|
func WriteRoundSignatures(w io.Writer, rsigs []RoundSignature, n *int64, err *error) {
|
|
WriteUInt32(w, uint32(len(rsigs)), n, err)
|
|
for _, rsig := range rsigs {
|
|
WriteBinary(w, rsig, n, err)
|
|
if *err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|