Documentation ¶
Index ¶
- Variables
- func Add(vs ReaderWriter, vsOther Iterable) error
- func AddPower(vs ReaderWriter, id *crypto.PublicKey, power *big.Int) error
- func Subtract(vs ReaderWriter, vsOther Iterable) error
- func SubtractPower(vs ReaderWriter, id *crypto.PublicKey, power *big.Int) error
- func Write(vs Writer, vsOther Iterable) error
- type Bucket
- type Cache
- type History
- type Iterable
- type IterableReader
- type IterableReaderWriter
- type Reader
- type ReaderWriter
- type Ring
- func (vc *Ring) CumulativePower() *Set
- func (vc *Ring) CurrentSet() *Set
- func (vc *Ring) Equal(vcOther *Ring) error
- func (vc *Ring) GetPower(id crypto.Address) *big.Int
- func (vc *Ring) Head() *Bucket
- func (vc *Ring) Next() *Bucket
- func (vc *Ring) OrderedBuckets() []*Bucket
- func (vc *Ring) Power(id crypto.Address) (*big.Int, error)
- func (vc *Ring) PreviousDelta(delay int) *Set
- func (vc *Ring) PreviousSet(delay int) *Set
- func (vc *Ring) ReIndex(newHead int)
- func (vc *Ring) Rotate() (totalPowerChange *big.Int, totalFlow *big.Int, err error)
- func (vc *Ring) SetPower(id *crypto.PublicKey, power *big.Int) (*big.Int, error)
- func (vc *Ring) Size() int
- func (vc *Ring) String() string
- func (vc *Ring) ValidatorChanges(blocksAgo int) IterableReader
- func (vc *Ring) Validators(blocksAgo int) IterableReader
- type Set
- func (vs *Set) ChangePower(id *crypto.PublicKey, power *big.Int) *big.Int
- func (vs *Set) CountNonZero() int
- func (vs *Set) Equal(vsOther *Set) error
- func (vs *Set) Flow(id *crypto.PublicKey, power *big.Int) *big.Int
- func (vs *Set) Flush(output Writer, backend Reader) error
- func (vs *Set) GetPower(id crypto.Address) *big.Int
- func (vs *Set) IterateValidators(iter func(id crypto.Addressable, power *big.Int) error) error
- func (vs *Set) MaxFlow() *big.Int
- func (vs *Set) MaybePower(id crypto.Address) *big.Int
- func (vs *Set) Power(id crypto.Address) (*big.Int, error)
- func (vs *Set) SetPower(id *crypto.PublicKey, power *big.Int) (*big.Int, error)
- func (vs *Set) Size() int
- func (vs *Set) String() string
- func (vs *Set) Strings() string
- func (vs *Set) TotalPower() *big.Int
- func (vs *Set) Validators() []*Validator
- type Validator
- func (v *Validator) BigPower() *big.Int
- func (*Validator) Descriptor() ([]byte, []int)
- func (v *Validator) FillAddress()
- func (v *Validator) GetAddress() crypto.Address
- func (m *Validator) GetPower() uint64
- func (m *Validator) GetPublicKey() *crypto.PublicKey
- func (m *Validator) Marshal() (dAtA []byte, err error)
- func (m *Validator) MarshalTo(dAtA []byte) (int, error)
- func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error)
- func (*Validator) ProtoMessage()
- func (m *Validator) Reset()
- func (m *Validator) Size() (n int)
- func (v *Validator) String() string
- func (m *Validator) Unmarshal(dAtA []byte) error
- func (m *Validator) XXX_DiscardUnknown()
- func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *Validator) XXX_Merge(src proto.Message)
- func (*Validator) XXX_MessageName() string
- func (m *Validator) XXX_Size() int
- func (m *Validator) XXX_Unmarshal(b []byte) error
- type Writer
Constants ¶
This section is empty.
Variables ¶
Functions ¶
func SubtractPower ¶
Types ¶
type Bucket ¶ added in v0.24.0
type Bucket struct { // Delta tracks the changes to validator power made since the previous rotation Delta *Set // Previous the value for all validator powers at the point of the last rotation // (the sum of all the deltas over all rotations) - these are the history of the complete validator sets at each rotation Previous *Set // Tracks the current working version of the next set; Previous + Delta Next *Set // Flow tracks the absolute value of all flows (difference between previous cum bucket and current delta) towards and away from each validator (tracking each validator separately to avoid double counting flows made against the same validator Flow *Set }
func (*Bucket) CurrentSet ¶ added in v0.24.0
type History ¶ added in v0.24.0
type History interface { ValidatorChanges(blocksAgo int) IterableReader Validators(blocksAgo int) IterableReader }
type IterableReader ¶
type IterableReaderWriter ¶
type IterableReaderWriter interface { ReaderWriter Iterable }
type ReaderWriter ¶
type Ring ¶
type Ring struct {
// contains filtered or unexported fields
}
Ring stores the validator power history in buckets as a ring buffer. The primary storage is a the difference between each rotation (commit - i.e. block) in 'delta' and the cumulative result of each delta in cum, where the result of the delta at i is stored in the cum at i+1. For example suppose we have 4 buckets then graphically:
delta [d1| d2 | d3 | d4 ] cum [v0|v0+d1|v0+d1+d2 |v0+d1+d2+d3 ]
After the fourth rotation we loop back to the 0th bucket (with [pwer
delta [d5 | d6| d7 | d8 ] cum [v0+d1+d2+d3+d4|...| | ]
func NewRing ¶
NewRing provides a sliding window over the last size buckets of validator power changes
func (*Ring) CumulativePower ¶ added in v0.24.0
CumulativePower gets the sum of all powers added in any bucket
func (*Ring) CurrentSet ¶
func (*Ring) OrderedBuckets ¶
Returns buckets in order head, previous, ...
func (*Ring) Power ¶
Power gets the balance at index from the delta bucket then falling through to the cumulative
func (*Ring) PreviousDelta ¶ added in v0.24.0
func (*Ring) PreviousSet ¶
func (*Ring) Rotate ¶
Rotate the current head bucket to the next bucket and returns the change in total power between the previous bucket and the current head, and the total flow which is the sum of absolute values of all changes each validator's power after rotation the next head is a copy of the current head
func (*Ring) Size ¶
Get the number of buckets in the ring (use Current().Count() to get the current number of validators)
func (*Ring) ValidatorChanges ¶ added in v0.24.0
func (vc *Ring) ValidatorChanges(blocksAgo int) IterableReader
func (*Ring) Validators ¶ added in v0.24.0
func (vc *Ring) Validators(blocksAgo int) IterableReader
type Set ¶
type Set struct {
// contains filtered or unexported fields
}
A Validator multiset - can be used to capture the global state of validators or as an accumulator each block
func Copy ¶
Copy each of iterable in vss into a new Set - note any iterations errors thrown by the iterable itself will be swallowed Use Write instead if source iterables may error
func Diff ¶ added in v0.24.0
func Diff(before, after IterableReader) (*Set, error)
Returns the asymmetric difference, diff, between two Sets such that applying diff to before results in after
func NewSet ¶
func NewSet() *Set
Create a new Validators which can act as an accumulator for validator power changes
func NewTrimSet ¶
func NewTrimSet() *Set
Like Set but removes entries when power is set to 0 this make Count() == CountNonZero() and prevents a set from leaking but does mean that a zero will not be iterated over when performing an update which is necessary in Ring
func UnpersistSet ¶
func (*Set) ChangePower ¶
Add the power of a validator and returns the flow into that validator
func (*Set) CountNonZero ¶
func (*Set) Equal ¶
Returns an error if the Sets are not equal describing which part of their structures differ
func (*Set) Flow ¶ added in v0.24.0
Returns the flow that would be induced by a validator power change
func (*Set) IterateValidators ¶ added in v0.24.0
Iterates over validators sorted by address
func (*Set) MaxFlow ¶ added in v0.24.0
Returns the maximum allowable flow whilst ensuring the majority of validators are non-byzantine after the transition So need at most ceiling((Total Power)/3) - 1, in integer division we have ceiling(X*p/q) = (p(X+1)-1)/q For p = 1 just X/q so we want (Total Power)/3 - 1
func (*Set) MaybePower ¶
Returns the power of id but only if it is set
func (*Set) TotalPower ¶
func (*Set) Validators ¶
type Validator ¶
type Validator struct { Address *github_com_hyperledger_burrow_crypto.Address `protobuf:"bytes,1,opt,name=Address,proto3,customtype=github.com/hyperledger/burrow/crypto.Address" json:"Address,omitempty"` PublicKey *crypto.PublicKey `protobuf:"bytes,2,opt,name=PublicKey,proto3" json:"PublicKey,omitempty"` Power uint64 `protobuf:"varint,3,opt,name=Power,proto3" json:"Power,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*Validator) Descriptor ¶
func (*Validator) FillAddress ¶
func (v *Validator) FillAddress()
func (*Validator) GetAddress ¶ added in v0.24.0
func (*Validator) GetPublicKey ¶
func (*Validator) MarshalToSizedBuffer ¶ added in v0.31.0
func (*Validator) ProtoMessage ¶
func (*Validator) ProtoMessage()
func (*Validator) XXX_DiscardUnknown ¶ added in v0.23.0
func (m *Validator) XXX_DiscardUnknown()