|
@ -454,6 +454,44 @@ func (voteSet *VoteSet) StringIndented(indent string) string { |
|
|
func (voteSet *VoteSet) MarshalJSON() ([]byte, error) { |
|
|
func (voteSet *VoteSet) MarshalJSON() ([]byte, error) { |
|
|
voteSet.mtx.Lock() |
|
|
voteSet.mtx.Lock() |
|
|
defer voteSet.mtx.Unlock() |
|
|
defer voteSet.mtx.Unlock() |
|
|
|
|
|
return cdc.MarshalJSON(VoteSetJSON{ |
|
|
|
|
|
voteSet.voteStrings(), |
|
|
|
|
|
voteSet.bitArrayString(), |
|
|
|
|
|
voteSet.peerMaj23s, |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// More human readable JSON of the vote set
|
|
|
|
|
|
// NOTE: insufficient for unmarshalling from (compressed votes)
|
|
|
|
|
|
// TODO: make the peerMaj23s nicer to read (eg just the block hash)
|
|
|
|
|
|
type VoteSetJSON struct { |
|
|
|
|
|
Votes []string `json:"votes"` |
|
|
|
|
|
VotesBitArray string `json:"votes_bit_array"` |
|
|
|
|
|
PeerMaj23s map[P2PID]BlockID `json:"peer_maj_23s"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Return the bit-array of votes including the fraction of power
|
|
|
|
|
|
// that has voted eg. "__x_xxx_:6/20 = 0.3".
|
|
|
|
|
|
func (voteSet *VoteSet) BitArrayString() string { |
|
|
|
|
|
voteSet.mtx.Lock() |
|
|
|
|
|
defer voteSet.mtx.Unlock() |
|
|
|
|
|
return voteSet.bitArrayString() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (voteSet *VoteSet) bitArrayString() string { |
|
|
|
|
|
bAString := voteSet.votesBitArray.String() |
|
|
|
|
|
voted, total, fracVoted := voteSet.sumTotalFrac() |
|
|
|
|
|
return fmt.Sprintf("%s %d/%d = %.2f", bAString, voted, total, fracVoted) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Returns a list of votes compressed to more readable strings.
|
|
|
|
|
|
func (voteSet *VoteSet) VoteStrings() []string { |
|
|
|
|
|
voteSet.mtx.Lock() |
|
|
|
|
|
defer voteSet.mtx.Unlock() |
|
|
|
|
|
return voteSet.voteStrings() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (voteSet *VoteSet) voteStrings() []string { |
|
|
voteStrings := make([]string, len(voteSet.votes)) |
|
|
voteStrings := make([]string, len(voteSet.votes)) |
|
|
for i, vote := range voteSet.votes { |
|
|
for i, vote := range voteSet.votes { |
|
|
if vote == nil { |
|
|
if vote == nil { |
|
@ -462,13 +500,7 @@ func (voteSet *VoteSet) MarshalJSON() ([]byte, error) { |
|
|
voteStrings[i] = vote.String() |
|
|
voteStrings[i] = vote.String() |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return cdc.MarshalJSON(struct { |
|
|
|
|
|
Votes []string `json:"votes"` |
|
|
|
|
|
VotesBitArray *cmn.BitArray `json:"votes_bit_array"` |
|
|
|
|
|
PeerMaj23s map[P2PID]BlockID `json:"peer_maj_23s"` |
|
|
|
|
|
}{ |
|
|
|
|
|
voteStrings, voteSet.votesBitArray, voteSet.peerMaj23s, |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
return voteStrings |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (voteSet *VoteSet) StringShort() string { |
|
|
func (voteSet *VoteSet) StringShort() string { |
|
@ -477,8 +509,16 @@ func (voteSet *VoteSet) StringShort() string { |
|
|
} |
|
|
} |
|
|
voteSet.mtx.Lock() |
|
|
voteSet.mtx.Lock() |
|
|
defer voteSet.mtx.Unlock() |
|
|
defer voteSet.mtx.Unlock() |
|
|
return fmt.Sprintf(`VoteSet{H:%v R:%v T:%v +2/3:%v %v %v}`, |
|
|
|
|
|
voteSet.height, voteSet.round, voteSet.type_, voteSet.maj23, voteSet.votesBitArray, voteSet.peerMaj23s) |
|
|
|
|
|
|
|
|
_, _, frac := voteSet.sumTotalFrac() |
|
|
|
|
|
return fmt.Sprintf(`VoteSet{H:%v R:%v T:%v +2/3:%v(%v) %v %v}`, |
|
|
|
|
|
voteSet.height, voteSet.round, voteSet.type_, voteSet.maj23, frac, voteSet.votesBitArray, voteSet.peerMaj23s) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// return the power voted, the total, and the fraction
|
|
|
|
|
|
func (voteSet *VoteSet) sumTotalFrac() (int64, int64, float64) { |
|
|
|
|
|
voted, total := voteSet.sum, voteSet.valSet.TotalVotingPower() |
|
|
|
|
|
fracVoted := float64(voted) / float64(total) |
|
|
|
|
|
return voted, total, fracVoted |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
//--------------------------------------------------------------------------------
|
|
|