Package convex.core
Class Belief
- All Implemented Interfaces:
IAssociative<Keyword,,ACell> IValidated,IWriteable,Map<Keyword,ACell>
Class representing a Peer's view of the overall network consensus state.
Belief is immutable, and is designed to be independent of any particular Peer
so that it can be efficiently merged towards consensus.
Belief can be merged with other Beliefs from the perspective of a Peer. This
property is fundamental to the Convex consensus algorithm.
"Sorry to be a wet blanket. Writing a description for this thing for general
audiences is bloody hard. There's nothing to relate it to." – Satoshi
Nakamoto
-
Nested Class Summary
-
Field Summary
Fields inherited from class convex.core.data.ARecord
DEFAULT_VALUEFields inherited from class convex.core.data.ADataStructure
countFields inherited from class convex.core.data.ACell
cachedRef, EMPTY_ARRAY -
Method Summary
Modifier and TypeMethodDescriptionstatic booleancompareOrders(Order oldOrder, Order newOrder) Checks if a new Order should replace the current order when collecting Peer ordersstatic <V> doublecomputeVote(HashMap<V, Double> m) Computes the total vote for all entries in a HashMapstatic AVector<SignedData<Block>>computeWinningOrder(HashMap<Order, Double> stakedOrders, long consensusPoint, double initialTotalStake) Compute the new winning Order for this Peer, including any new blocks encounteredstatic BeliefCreate a Belief with a single order signed by the given key pair, using initial timestamp.static Beliefcreate(SignedData<Order>... orders) static Beliefcreate(HashMap<AccountKey, SignedData<Order>> orderMap) static BeliefCreate a Belief with a single empty order.intencode(byte[] bs, int pos) Writes this Cell's encoding to a byte array, including a tag byte which will be written first.booleanTests if this Belief is equal to anotherbooleanChecks for equality with another Cell.intEstimate the encoded data size for this Cell.static Collection<SignedData<Order>>extractOrders(ACell payload) Extract a collection of Orders from a Cell, suitable for Belief mergeGets the record field content for a given key, or null if not found.Gets the RecordFormat instance that describes this Record's layoutgetOrder(AccountKey address) Gets the current Order for a given Address within this Belief.Get the map of orders for this BeliefGets a new HashMap containing all OrdersgetRef(int i) Gets a numbered child Ref from within this Cell.intGets the number of Refs contained within this Cell.bytegetTag()Gets the tag byte for this record type.static Beliefinitial()Gets an empty Beliefmerge(MergeContext mc, Belief... beliefs) The Belief merge functionmergeOrders(MergeContext mc, Belief b) static doubleprepareStakedOrders(AMap<AccountKey, SignedData<Order>> peerOrders, HashMap<AccountKey, Double> peerStakes, HashMap<Order, Double> dest) Compute the total stake for every distinct Order seen.proposeBlock(AKeyPair kp, SignedData<Block> signedBlock) static Beliefstatic Beliefread(ByteBuffer bb) Read a Belief from a ByteBuffer.updateRefs(IRefFunction func) Updates all Refs in this object using the given function.voidValidates the local structure and invariants of this cell.withOrders(BlobMap<AccountKey, SignedData<Order>> newOrders) Updates this Belief with a new set of Chains for each peer addressMethods inherited from class convex.core.data.ARecord
accumulateEntrySet, accumulateKeySet, accumulateValues, assoc, assocEntry, containsKey, containsValue, dissoc, dissoc, empty, encodeRaw, entryAt, entrySet, forEach, get, getEntry, getEntryByHash, getKeyRefEntry, getKeys, getType, getValuesArray, isCanonical, isCVMValue, keySet, reduceEntries, reduceValues, toCanonical, toHashMap, valuesMethods inherited from class convex.core.data.AMap
clear, conj, containsKey, containsKeyRef, containsValue, entryVector, filterValues, get, get, getElementRef, merge, print, put, putAll, remove, slice, sliceMethods inherited from class convex.core.data.ADataStructure
conjAll, count, isEmpty, size, toCVMStringMethods inherited from class convex.core.data.ACell
announce, announce, attachMemorySize, attachRef, cachedEncoding, cachedHash, calcMemorySize, createAnnounced, createEncoding, createPersisted, createPersisted, createRef, equals, getCanonical, getChildRefs, getEncoding, getEncodingLength, getHash, getMemorySize, getRef, hashCode, isCompletelyEncoded, isEmbedded, mark, mark, toString, validate, writeMethods inherited from class convex.core.data.AObject
attachEncoding, print, printMethods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.Map
compute, computeIfAbsent, computeIfPresent, equals, getOrDefault, hashCode, isEmpty, merge, putIfAbsent, remove, replace, replace, replaceAll, size
-
Method Details
-
get
Description copied from class:ARecordGets the record field content for a given key, or null if not found. -
updateRefs
Description copied from class:ACellUpdates all Refs in this object using the given function. The function *must not* change the hash value of Refs, in order to ensure structural integrity of modified data structures. The implementation *should* re-attach any original encoding in order to prevent re-encoding or surplus hashing This is a building block for a very sneaky trick that enables use to do a lot of efficient operations on large trees of smart references. Must return the same object if no Refs are altered.- Overrides:
updateRefsin classACell- Parameters:
func- Ref update function- Returns:
- Cell with updated Refs
-
initial
Gets an empty Belief- Returns:
- Empty Belief
-
create
Create a Belief with a single order signed by the given key pair, using initial timestamp.- Parameters:
kp- Peer Key pair with which to sign the order.order- Order of blocks that the Peer is proposing- Returns:
- new Belief representing the isolated belief of a single Peer.
-
create
-
create
-
createSingleOrder
Create a Belief with a single empty order. USeful for Peer startup.- Parameters:
kp- Keypair for Peer- Returns:
- New Belief
-
merge
The Belief merge function- Parameters:
mc- MergeContext for Belief Mergebeliefs- An array of Beliefs. May contain nulls, which will be ignored.- Returns:
- The updated merged belief with latest timestamp, or the same Belief if there is no change to Orders.
- Throws:
InvalidDataException- In case of invalid data
-
mergeOrders
-
compareOrders
Checks if a new Order should replace the current order when collecting Peer orders- Parameters:
oldOrder- Current OrdernewOrder- Potential new ORder- Returns:
-
computeWinningOrder
public static AVector<SignedData<Block>> computeWinningOrder(HashMap<Order, Double> stakedOrders, long consensusPoint, double initialTotalStake) Compute the new winning Order for this Peer, including any new blocks encountered- Parameters:
stakedOrders- Amount of stake on each distinct OrderconsensusPoint- Current consensus pointinitialTotalStake- Total stake under consideration- Returns:
- Vector of Blocks in winning Order
-
computeVote
Computes the total vote for all entries in a HashMap- Type Parameters:
V- The type of values used as keys in the HashMap- Parameters:
m- A map of values to votes- Returns:
- The total voting stake
-
prepareStakedOrders
public static double prepareStakedOrders(AMap<AccountKey, SignedData<Order>> peerOrders, HashMap<AccountKey, Double> peerStakes, HashMap<Order, Double> dest) Compute the total stake for every distinct Order seen. Stores results in a map of Orders to staked value.- Parameters:
peerOrders- A map of peer addresses to signed proposed OrderspeerStakes- A map of peers addresses to weighted stakes for each peerdest- Destination hashmap to store the stakes for each Order- Returns:
- The total stake of all chains among peers under consideration
-
withOrders
Updates this Belief with a new set of Chains for each peer address- Parameters:
newOrders- New map of peer keys to Orders- Returns:
- The updated belief, or the same Belief if no change.
-
encode
public int encode(byte[] bs, int pos) Description copied from class:ACellWrites this Cell's encoding to a byte array, including a tag byte which will be written first. Cell must be canonical, or else an error may occur.- Specified by:
encodein interfaceIWriteable- Specified by:
encodein classACell- Parameters:
bs- A byte array to which to write the encodingpos- The offset into the byte array- Returns:
- New position after writing
-
estimatedEncodingSize
public int estimatedEncodingSize()Description copied from interface:IWriteableEstimate the encoded data size for this Cell. Used for quickly sizing buffers. Implementations should try to return a size that is highly likely to contain the entire object when encoded, including the tag byte. Should not traverse soft Refs, i.e. must be usable on arbitrary partial data structures- Specified by:
estimatedEncodingSizein interfaceIWriteable- Overrides:
estimatedEncodingSizein classARecord- Returns:
- The estimated size for the binary representation of this object.
-
read
Read a Belief from a ByteBuffer. Assumes tag already read.- Parameters:
bb- ByteBuffer to read from- Returns:
- Belief instance
- Throws:
BadFormatException- If encoding is invalid
-
read
- Throws:
BadFormatException
-
getTag
public byte getTag()Description copied from class:ARecordGets the tag byte for this record type. The Tag is the byte used to identify the record in the binary encoding. -
getOrder
Gets the current Order for a given Address within this Belief.- Parameters:
address- Address of peer- Returns:
- The chain for the peer within this Belief, or null if noy found.
-
getOrders
Get the map of orders for this Belief- Returns:
- Orders map
-
validateCell
Description copied from class:ACellValidates the local structure and invariants of this cell. Called by validate() super implementation. Should validate directly contained data, but should not validate all other structure of this cell. In particular, should not traverse potentially missing child Refs.- Specified by:
validateCellin classACell- Throws:
InvalidDataException- If the Cell is invalid
-
equals
Description copied from class:ACellChecks for equality with another Cell. In general, Cells are considered equal if they have the same canonical representation, i.e. an identical encoding with the same hash value. Subclasses SHOULD override this if they have a more efficient equals implementation. MUST NOT require reads from Store. -
equals
Tests if this Belief is equal to another- Parameters:
a- Belief to compare with- Returns:
- true if equal, false otherwise
-
getRefCount
public int getRefCount()Description copied from class:ACellGets the number of Refs contained within this Cell. This number is final / immutable for any given instance and is defined by the Cell encoding rules. WARNING: may not be valid id Cell is not canonical Contained Refs may be either external or embedded.- Specified by:
getRefCountin classACell- Returns:
- The number of Refs in this Cell
-
getRef
Description copied from class:ACellGets a numbered child Ref from within this Cell. WARNING: May be unreliable is cell is not canonical -
getOrdersHashMap
Gets a new HashMap containing all Orders- Returns:
- HashMap of current orders
-
getFormat
Description copied from class:ARecordGets the RecordFormat instance that describes this Record's layout -
extractOrders
Extract a collection of Orders from a Cell, suitable for Belief merge- Parameters:
payload- Cell to extra orders from- Returns:
- Collection of signed orders
-
proposeBlock
-