hashgraph

package
v0.6.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 7, 2020 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const (

	// ROOT_DEPTH determines how many FrameEvents are included in the Root. It
	// is preferable not to make ROOT_DEPTH configurable because if peers use
	// diffent values, they will produce different Roots, different Frames, and
	// different Blocks. Perhaps this parameter should be tied to the number of
	// Peers rather than hard-coded.
	ROOT_DEPTH = 10

	// COIN_ROUND_FREQ defines the frequency of coin rounds
	COIN_ROUND_FREQ = float64(4)
)

Variables

This section is empty.

Functions

func DummyInternalCommitCallback added in v0.4.1

func DummyInternalCommitCallback(b *Block) error

DummyInternalCommitCallback is used for testing

func IsNormalSelfParentError added in v0.5.5

func IsNormalSelfParentError(err error) bool

IsNormalSelfParentError checks that an error is of type SelfParentError and that it is normal.

Types

type BadgerStore

type BadgerStore struct {
	// contains filtered or unexported fields
}

BadgerStore contains references to the Badger database and inmem store. If maintenanceMode is activated, data is not written to the Badger database, but only to the caches.

func NewBadgerStore

func NewBadgerStore(cacheSize int, path string, maintenanceMode bool, logger *logrus.Entry) (*BadgerStore, error)

NewBadgerStore opens an existing database or creates a new one if nothing is found in path. The maintenanceMode option deactivates writing to the persistant database, but adding/updating the inmem-store is preserved.

func (*BadgerStore) AddConsensusEvent

func (s *BadgerStore) AddConsensusEvent(event *Event) error

AddConsensusEvent adds a consensus event.

func (*BadgerStore) CacheSize

func (s *BadgerStore) CacheSize() int

CacheSize gets the inmem cache size

func (*BadgerStore) Close

func (s *BadgerStore) Close() error

Close closes the InmemStore and the underlying Badger database.

func (*BadgerStore) ConsensusEvents

func (s *BadgerStore) ConsensusEvents() []string

ConsensusEvents returns the entire list of hashes of consensus-events.

func (*BadgerStore) ConsensusEventsCount

func (s *BadgerStore) ConsensusEventsCount() int

ConsensusEventsCount returns number of consensus events.

func (*BadgerStore) FirstRound added in v0.5.0

func (s *BadgerStore) FirstRound(id uint32) (int, bool)

FirstRound returns the first round in which a given participant (identified by id) was a member of the corresponding peer-set.

func (*BadgerStore) GetAllPeerSets added in v0.5.0

func (s *BadgerStore) GetAllPeerSets() (map[int][]*peers.Peer, error)

GetAllPeerSets returns the entire history of peer-sets.

func (*BadgerStore) GetBlock

func (s *BadgerStore) GetBlock(rr int) (*Block, error)

GetBlock returns a Block by index.

func (*BadgerStore) GetEvent

func (s *BadgerStore) GetEvent(key string) (*Event, error)

GetEvent returns the event identified by its hash.

func (*BadgerStore) GetFrame

func (s *BadgerStore) GetFrame(rr int) (*Frame, error)

GetFrame return the Frame corresponding to round-received rr.

func (*BadgerStore) GetMaintenanceMode added in v0.5.11

func (s *BadgerStore) GetMaintenanceMode() bool

GetMaintenanceMode is a getter

func (*BadgerStore) GetPeerSet added in v0.4.1

func (s *BadgerStore) GetPeerSet(round int) (peerSet *peers.PeerSet, err error)

GetPeerSet returns the peer-set effective at a given round.

func (*BadgerStore) GetRoot

func (s *BadgerStore) GetRoot(participant string) (*Root, error)

GetRoot returns the Root for a given participant.

func (*BadgerStore) GetRound

func (s *BadgerStore) GetRound(r int) (*RoundInfo, error)

GetRound returns the round with round-number r.

func (*BadgerStore) KnownEvents

func (s *BadgerStore) KnownEvents() map[uint32]int

KnownEvents returns a map of participant-ID to index of last known Event.

func (*BadgerStore) LastBlockIndex

func (s *BadgerStore) LastBlockIndex() int

LastBlockIndex returns the index of the last known block.

func (*BadgerStore) LastConsensusEventFrom

func (s *BadgerStore) LastConsensusEventFrom(participant string) (last string, err error)

LastConsensusEventFrom returns the hash of the last consensus-event from a given participant.

func (*BadgerStore) LastEventFrom

func (s *BadgerStore) LastEventFrom(participant string) (last string, err error)

LastEventFrom returns the hash of the last Event from a given participant.

func (*BadgerStore) LastRound

func (s *BadgerStore) LastRound() int

LastRound returns the number of the last known round.

func (*BadgerStore) ParticipantEvent

func (s *BadgerStore) ParticipantEvent(participant string, index int) (string, error)

ParticipantEvent returns a participant's Event for a given index.

func (*BadgerStore) ParticipantEvents

func (s *BadgerStore) ParticipantEvents(participant string, skip int) ([]string, error)

ParticipantEvents returns a participant's Event hashes, ordered by index, starting at index "skip".

func (*BadgerStore) RepertoireByID added in v0.4.1

func (s *BadgerStore) RepertoireByID() map[uint32]*peers.Peer

RepertoireByID returns a map of peers by id.

func (*BadgerStore) RepertoireByPubKey added in v0.4.1

func (s *BadgerStore) RepertoireByPubKey() map[string]*peers.Peer

RepertoireByPubKey returns map of peers by public-key.

func (*BadgerStore) Reset

func (s *BadgerStore) Reset(frame *Frame) error

Reset resets the Store from a given Frame.

func (*BadgerStore) RoundEvents

func (s *BadgerStore) RoundEvents(r int) int

RoundEvents returns the number of Events in round r.

func (*BadgerStore) RoundWitnesses

func (s *BadgerStore) RoundWitnesses(r int) []string

RoundWitnesses returns a round's witnesses.

func (*BadgerStore) SetBlock

func (s *BadgerStore) SetBlock(block *Block) error

SetBlock creates or updates a Block in the Store.

func (*BadgerStore) SetEvent

func (s *BadgerStore) SetEvent(event *Event) error

SetEvent creates or updates an Event in the store

func (*BadgerStore) SetFrame

func (s *BadgerStore) SetFrame(frame *Frame) error

SetFrame creates or updates a Frame in the Store.

func (*BadgerStore) SetMaintenanceMode added in v0.5.11

func (s *BadgerStore) SetMaintenanceMode(val bool)

SetMaintenanceMode is a setter

func (*BadgerStore) SetPeerSet added in v0.4.1

func (s *BadgerStore) SetPeerSet(round int, peerSet *peers.PeerSet) error

SetPeerSet saves a peer-set effective at a given round.

func (*BadgerStore) SetRound

func (s *BadgerStore) SetRound(r int, round *RoundInfo) error

SetRound creates or updates a round in the store.

func (*BadgerStore) StorePath

func (s *BadgerStore) StorePath() string

StorePath returns the full path of the underlying Badger database directory.

type Block

type Block struct {
	Body       BlockBody
	Signatures map[string]string // [validator hex] => signature
	// contains filtered or unexported fields
}

Block ...

func NewBlock

func NewBlock(blockIndex,
	roundReceived int,
	frameHash []byte,
	peerSlice []*peers.Peer,
	txs [][]byte,
	itxs []InternalTransaction) *Block

NewBlock ...

func NewBlockFromFrame

func NewBlockFromFrame(blockIndex int, frame *Frame) (*Block, error)

NewBlockFromFrame ...

func (*Block) AppendTransactions

func (b *Block) AppendTransactions(txs [][]byte)

AppendTransactions ...

func (*Block) FrameHash

func (b *Block) FrameHash() []byte

FrameHash ...

func (*Block) GetSignature

func (b *Block) GetSignature(validator string) (res BlockSignature, err error)

GetSignature ...

func (*Block) GetSignatures

func (b *Block) GetSignatures() []BlockSignature

GetSignatures ...

func (*Block) Hash

func (b *Block) Hash() ([]byte, error)

Hash ...

func (*Block) Hex

func (b *Block) Hex() string

Hex ...

func (*Block) Index

func (b *Block) Index() int

Index ...

func (*Block) InternalTransactionReceipts added in v0.5.0

func (b *Block) InternalTransactionReceipts() []InternalTransactionReceipt

InternalTransactionReceipts ...

func (*Block) InternalTransactions added in v0.5.0

func (b *Block) InternalTransactions() []InternalTransaction

InternalTransactions ...

func (*Block) Marshal

func (b *Block) Marshal() ([]byte, error)

Marshal ...

func (*Block) PeersHash added in v0.4.1

func (b *Block) PeersHash() []byte

PeersHash ...

func (*Block) RoundReceived

func (b *Block) RoundReceived() int

RoundReceived ...

func (*Block) SetSignature

func (b *Block) SetSignature(bs BlockSignature) error

SetSignature ...

func (*Block) Sign

func (b *Block) Sign(privKey *ecdsa.PrivateKey) (bs BlockSignature, err error)

Sign ...

func (*Block) StateHash

func (b *Block) StateHash() []byte

StateHash ...

func (*Block) Transactions

func (b *Block) Transactions() [][]byte

Transactions ...

func (*Block) Unmarshal

func (b *Block) Unmarshal(data []byte) error

Unmarshal ...

func (*Block) Verify

func (b *Block) Verify(sig BlockSignature) (bool, error)

Verify ...

type BlockBody

type BlockBody struct {
	Index                       int
	RoundReceived               int
	StateHash                   []byte
	FrameHash                   []byte
	PeersHash                   []byte
	Transactions                [][]byte
	InternalTransactions        []InternalTransaction
	InternalTransactionReceipts []InternalTransactionReceipt
}

BlockBody ...

func (*BlockBody) Hash

func (bb *BlockBody) Hash() ([]byte, error)

Hash ...

func (*BlockBody) Marshal

func (bb *BlockBody) Marshal() ([]byte, error)

Marshal - json encoding of body only

func (*BlockBody) Unmarshal

func (bb *BlockBody) Unmarshal(data []byte) error

Unmarshal ...

type BlockSignature

type BlockSignature struct {
	Validator []byte
	Index     int //Block Index
	Signature string
}

BlockSignature ...

func (*BlockSignature) Key added in v0.4.1

func (bs *BlockSignature) Key() string

Key ...

func (*BlockSignature) Marshal

func (bs *BlockSignature) Marshal() ([]byte, error)

Marshal ...

func (*BlockSignature) ToWire

func (bs *BlockSignature) ToWire() WireBlockSignature

ToWire ...

func (*BlockSignature) Unmarshal

func (bs *BlockSignature) Unmarshal(data []byte) error

Unmarshal ...

func (*BlockSignature) ValidatorHex

func (bs *BlockSignature) ValidatorHex() string

ValidatorHex ...

type ByTopologicalOrder

type ByTopologicalOrder []*Event

ByTopologicalOrder implements sort.Interface for []Event based on the private topologicalIndex field. THIS IS A PARTIAL ORDER.

func (ByTopologicalOrder) Len

func (a ByTopologicalOrder) Len() int

Len implements the sort.Interface

func (ByTopologicalOrder) Less

func (a ByTopologicalOrder) Less(i, j int) bool

Less implements the sort.Interface

func (ByTopologicalOrder) Swap

func (a ByTopologicalOrder) Swap(i, j int)

Swap implements the sort.Interface

type CoordinatesMap added in v0.4.1

type CoordinatesMap map[string]EventCoordinates

CoordinatesMap is used by the Hashgraph consensus methods to efficiently calculate the StronglySee predicate.

func NewCoordinatesMap added in v0.4.1

func NewCoordinatesMap() CoordinatesMap

NewCoordinatesMap creates an empty CoordinateMap

func (CoordinatesMap) Copy added in v0.4.1

func (c CoordinatesMap) Copy() CoordinatesMap

Copy creates a clone of a CoordinateMap

type Event

type Event struct {
	Body      EventBody
	Signature string //creator's digital signature of body
	// contains filtered or unexported fields
}

Event is the fundamental unit of a Hashgraph. It contains an EventBody and a a signature of the EventBody from the Event's creator (whose public key is set in the EventBody.Creator byte slice). It also contains some private fields which are useful for local computations and ordering.

func NewEvent

func NewEvent(transactions [][]byte,
	internalTransactions []InternalTransaction,
	blockSignatures []BlockSignature,
	parents []string,
	creator []byte,
	index int) *Event

NewEvent instantiates a new Event

func (*Event) BlockSignatures

func (e *Event) BlockSignatures() []BlockSignature

BlockSignatures returns the Event's BlockSignatures

func (*Event) Creator

func (e *Event) Creator() string

Creator returns the string representation of the creator's public key.

func (*Event) GetRound added in v0.4.1

func (e *Event) GetRound() *int

GetRound gets the Event's round number

func (*Event) Hash

func (e *Event) Hash() ([]byte, error)

Hash returns the SHA256 hash of the JSON-encoded body

func (*Event) Hex

func (e *Event) Hex() string

Hex returns a hex string representation of the Event's hash

func (*Event) Index

func (e *Event) Index() int

Index returns the Event's index

func (*Event) InternalTransactions added in v0.5.0

func (e *Event) InternalTransactions() []InternalTransaction

InternalTransactions returns the Event's InternalTransactions

func (*Event) IsLoaded

func (e *Event) IsLoaded() bool

IsLoaded returns true if the Event contains a payload or is its creator's first Event.

func (*Event) MarshalDB added in v0.5.10

func (e *Event) MarshalDB() ([]byte, error)

MarshalDB returns the JSON encoding of the Event along with some of the private fields which would not be exported by the default JSON marshalling method. These private fiels are necessary when converting to WireEvent and ordering in topological order. We use MarshalDB to save items to the database because otherwise the private fields would be lost after a write/read operation on the DB.

func (*Event) OtherParent

func (e *Event) OtherParent() string

OtherParent returns the Event's other-parent

func (*Event) SelfParent

func (e *Event) SelfParent() string

SelfParent returns the Event's self-parent

func (*Event) SetLamportTimestamp

func (e *Event) SetLamportTimestamp(t int)

SetLamportTimestamp sets the Event's Lamport Timestamp

func (*Event) SetRound

func (e *Event) SetRound(r int)

SetRound sets the Events round number

func (*Event) SetRoundReceived

func (e *Event) SetRoundReceived(rr int)

SetRoundReceived sets the Event's round-received (different from round)

func (*Event) SetWireInfo

func (e *Event) SetWireInfo(selfParentIndex int,
	otherParentCreatorID uint32,
	otherParentIndex int,
	creatorID uint32)

SetWireInfo sets the private fields in the Event's body which are used by the wire representation.

func (*Event) Sign

func (e *Event) Sign(privKey *ecdsa.PrivateKey) error

Sign signs the hash of the Event's body with an ecdsa sig

func (*Event) ToWire

func (e *Event) ToWire() WireEvent

ToWire convert an Event to its WireEvent representation

func (*Event) Transactions

func (e *Event) Transactions() [][]byte

Transactions returns the Event's transactions

func (*Event) UnmarshalDB added in v0.5.10

func (e *Event) UnmarshalDB(data []byte) error

UnmarshalDB unmarshals a JSON encoded eventWrapper and converts it to an Event with some private fields set.

func (*Event) Verify

func (e *Event) Verify() (bool, error)

Verify verifies the Event's signature, and the signatures of the InternalTransactions in its payload.

func (*Event) WireBlockSignatures

func (e *Event) WireBlockSignatures() []WireBlockSignature

WireBlockSignatures returns the Event's BlockSignatures (from its payload) in Wire format.

type EventBody

type EventBody struct {
	Transactions         [][]byte              //the payload
	InternalTransactions []InternalTransaction //peers add and removal internal consensus
	Parents              []string              //hashes of the event's parents, self-parent first
	Creator              []byte                //creator's public key
	Index                int                   //index in the sequence of events created by Creator
	BlockSignatures      []BlockSignature      //list of Block signatures signed by the Event's Creator ONLY
	// contains filtered or unexported fields
}

EventBody contains the payload of an Event as well as the information that ties it to other Events. The private fields are for local computations only.

func (*EventBody) Hash

func (e *EventBody) Hash() ([]byte, error)

Hash returns the SHA256 hash of the JSON encoded EventBody.

func (*EventBody) Marshal

func (e *EventBody) Marshal() ([]byte, error)

Marshal returns the JSON encoding of an EventBody

func (*EventBody) Unmarshal

func (e *EventBody) Unmarshal(data []byte) error

Unmarshal converts a JSON encoded EventBody to an EventBody

type EventCoordinates

type EventCoordinates struct {
	Hash  string
	Index int
}

EventCoordinates combines the index and hash of an Event

type Frame

type Frame struct {
	Round    int //RoundReceived
	Peers    []*peers.Peer
	Roots    map[string]*Root
	Events   []*FrameEvent         //Events with RoundReceived = Round
	PeerSets map[int][]*peers.Peer //[round] => Peers
}

Frame ...

func (*Frame) Hash

func (f *Frame) Hash() ([]byte, error)

Hash ...

func (*Frame) Marshal

func (f *Frame) Marshal() ([]byte, error)

Marshal - json encoding of Frame

func (*Frame) SortedFrameEvents added in v0.5.0

func (f *Frame) SortedFrameEvents() []*FrameEvent

SortedFrameEvents ...

func (*Frame) Unmarshal

func (f *Frame) Unmarshal(data []byte) error

Unmarshal ...

type FrameEvent added in v0.5.0

type FrameEvent struct {
	Core             *Event //EventBody + Signature
	Round            int
	LamportTimestamp int
	Witness          bool
}

FrameEvent is a wrapper around a regular Event. It contains exported fields Round, Witness, and LamportTimestamp.

type Hashgraph

type Hashgraph struct {
	Store               Store               // store of Events, Rounds, and Blocks
	UndeterminedEvents  []string            // [index] => hash . FIFO queue of Events whose consensus order is not yet determined
	PendingRounds       *PendingRoundsCache // FIFO queue of Rounds which have not attained consensus yet
	PendingSignatures   *SigPool            // Pool of Block signatures that need to be processed (matched with Blocks)
	LastConsensusRound  *int                // index of last consensus round
	FirstConsensusRound *int                // index of first consensus round (only used in tests)
	AnchorBlock         *int                // index of last block with enough signatures

	LastCommitedRoundEvents int // number of events in round before LastConsensusRound
	ConsensusTransactions   int // number of consensus transactions
	PendingLoadedEvents     int // number of loaded events that are not yet committed
	// contains filtered or unexported fields
}

Hashgraph is a DAG of Events. It also contains methods to extract a consensus order of Events and map them onto a blockchain.

func NewHashgraph

func NewHashgraph(store Store, commitCallback InternalCommitCallback, logger *logrus.Entry) *Hashgraph

NewHashgraph instantiates a Hashgraph with an underlying data store and a commit callback

func (*Hashgraph) Bootstrap

func (h *Hashgraph) Bootstrap() error

Bootstrap loads all Events from the Store's DB (if there is one) and feeds them to the Hashgraph consensus methods in topological order. It is assumed that no events are skipped/lost when loading from the database - WE CAN ONLY BOOTSTRAP FROM 0. As Events are inserted and processed, Blocks will be created and committed to the App layer (via the commit callback), so it is also assumed that the application state was reset. During the bootstrap process, the badger store is put in maintenance-mode to avoid reinserting items in the database.

func (*Hashgraph) CheckBlock

func (h *Hashgraph) CheckBlock(block *Block, peerSet *peers.PeerSet) error

CheckBlock returns an error if the Block does not contain valid signatures from MORE than 1/3 of participants

func (*Hashgraph) DecideFame

func (h *Hashgraph) DecideFame() error

DecideFame decides if witnesses are famous

func (*Hashgraph) DecideRoundReceived

func (h *Hashgraph) DecideRoundReceived() error

DecideRoundReceived assigns a RoundReceived to undetermined events when they reach consensus

func (*Hashgraph) DivideRounds

func (h *Hashgraph) DivideRounds() error

DivideRounds assigns a Round and LamportTimestamp to Events, and flags them as witnesses if necessary. Pushes Rounds in the PendingRounds queue if necessary.

func (*Hashgraph) GetAnchorBlockWithFrame

func (h *Hashgraph) GetAnchorBlockWithFrame() (*Block, *Frame, error)

GetAnchorBlockWithFrame returns the AnchorBlock and the corresponding Frame. This can be used as a base to Reset a Hashgraph

func (*Hashgraph) GetFrame

func (h *Hashgraph) GetFrame(roundReceived int) (*Frame, error)

GetFrame computes the Frame corresponding to a RoundReceived.

func (*Hashgraph) Init added in v0.4.1

func (h *Hashgraph) Init(peerSet *peers.PeerSet) error

Init sets the initial PeerSet, which also creates the corresponding Roots and updates the Repertoire.

func (*Hashgraph) InsertEvent

func (h *Hashgraph) InsertEvent(event *Event, setWireInfo bool) error

InsertEvent attempts to insert an Event in the DAG. It verifies the signature, checks the ancestors are known, and prevents the introduction of forks.

func (*Hashgraph) InsertEventAndRunConsensus added in v0.4.1

func (h *Hashgraph) InsertEventAndRunConsensus(event *Event, setWireInfo bool) error

InsertEventAndRunConsensus inserts an Event in the Hashgraph and call the consensus methods.

func (*Hashgraph) InsertFrameEvent added in v0.5.0

func (h *Hashgraph) InsertFrameEvent(frameEvent *FrameEvent) error

InsertFrameEvent inserts the FrameEvent's core Event, without checking its parents or signature. It doesnt add the Event to UndeterminedEvents either.

func (*Hashgraph) ProcessDecidedRounds

func (h *Hashgraph) ProcessDecidedRounds() error

ProcessDecidedRounds takes Rounds whose witnesses are decided, computes the corresponding Frames, maps them into Blocks, and commits the Blocks via the commit channel

func (*Hashgraph) ProcessSigPool

func (h *Hashgraph) ProcessSigPool() error

ProcessSigPool runs through the SignaturePool and tries to map a Signature to a known Block. If a Signature is valid, it is appended to the block and removed from the SignaturePool. The function also updates the AnchorBlock if necessary.

func (*Hashgraph) ReadWireInfo

func (h *Hashgraph) ReadWireInfo(wevent WireEvent) (*Event, error)

ReadWireInfo converts a WireEvent to an Event by replacing int IDs with the corresponding public keys.

func (*Hashgraph) Reset

func (h *Hashgraph) Reset(block *Block, frame *Frame) error

Reset clears the Hashgraph and resets it from a new base.

func (*Hashgraph) SetAnchorBlock added in v0.4.1

func (h *Hashgraph) SetAnchorBlock(block *Block) error

SetAnchorBlock sets the AnchorBlock index if the proposed block has collected enough signatures (+1/3) and is above the current AnchorBlock. The AnchorBlock is the latest Block that collected +1/3 signatures from validators. It is used in FastForward responses when a node wants to sync to the top of the hashgraph.

func (*Hashgraph) SetWireInfo added in v0.5.10

func (h *Hashgraph) SetWireInfo(event *Event) error

type InmemStore

type InmemStore struct {
	// contains filtered or unexported fields
}

InmemStore ...

func NewInmemStore

func NewInmemStore(cacheSize int) *InmemStore

NewInmemStore ...

func (*InmemStore) AddConsensusEvent

func (s *InmemStore) AddConsensusEvent(event *Event) error

AddConsensusEvent ...

func (*InmemStore) CacheSize

func (s *InmemStore) CacheSize() int

CacheSize ...

func (*InmemStore) Close

func (s *InmemStore) Close() error

Close ...

func (*InmemStore) ConsensusEvents

func (s *InmemStore) ConsensusEvents() []string

ConsensusEvents ...

func (*InmemStore) ConsensusEventsCount

func (s *InmemStore) ConsensusEventsCount() int

ConsensusEventsCount ...

func (*InmemStore) FirstRound added in v0.5.0

func (s *InmemStore) FirstRound(id uint32) (int, bool)

FirstRound ...

func (*InmemStore) GetAllPeerSets added in v0.5.0

func (s *InmemStore) GetAllPeerSets() (map[int][]*peers.Peer, error)

GetAllPeerSets ...

func (*InmemStore) GetBlock

func (s *InmemStore) GetBlock(index int) (*Block, error)

GetBlock ...

func (*InmemStore) GetEvent

func (s *InmemStore) GetEvent(key string) (*Event, error)

GetEvent ...

func (*InmemStore) GetFrame

func (s *InmemStore) GetFrame(index int) (*Frame, error)

GetFrame ...

func (*InmemStore) GetPeerSet added in v0.4.1

func (s *InmemStore) GetPeerSet(round int) (*peers.PeerSet, error)

GetPeerSet ...

func (*InmemStore) GetRoot

func (s *InmemStore) GetRoot(participant string) (*Root, error)

GetRoot ...

func (*InmemStore) GetRound

func (s *InmemStore) GetRound(r int) (*RoundInfo, error)

GetRound ...

func (*InmemStore) KnownEvents

func (s *InmemStore) KnownEvents() map[uint32]int

KnownEvents ...

func (*InmemStore) LastBlockIndex

func (s *InmemStore) LastBlockIndex() int

LastBlockIndex ...

func (*InmemStore) LastConsensusEventFrom

func (s *InmemStore) LastConsensusEventFrom(participant string) (last string, err error)

LastConsensusEventFrom ...

func (*InmemStore) LastEventFrom

func (s *InmemStore) LastEventFrom(participant string) (last string, err error)

LastEventFrom ...

func (*InmemStore) LastRound

func (s *InmemStore) LastRound() int

LastRound ...

func (*InmemStore) ParticipantEvent

func (s *InmemStore) ParticipantEvent(participant string, index int) (string, error)

ParticipantEvent ...

func (*InmemStore) ParticipantEvents

func (s *InmemStore) ParticipantEvents(participant string, skip int) ([]string, error)

ParticipantEvents ...

func (*InmemStore) RepertoireByID added in v0.4.1

func (s *InmemStore) RepertoireByID() map[uint32]*peers.Peer

RepertoireByID ...

func (*InmemStore) RepertoireByPubKey added in v0.4.1

func (s *InmemStore) RepertoireByPubKey() map[string]*peers.Peer

RepertoireByPubKey ...

func (*InmemStore) Reset

func (s *InmemStore) Reset(frame *Frame) error

Reset ...

func (*InmemStore) RoundEvents

func (s *InmemStore) RoundEvents(r int) int

RoundEvents ...

func (*InmemStore) RoundWitnesses

func (s *InmemStore) RoundWitnesses(r int) []string

RoundWitnesses ...

func (*InmemStore) SetBlock

func (s *InmemStore) SetBlock(block *Block) error

SetBlock ...

func (*InmemStore) SetEvent

func (s *InmemStore) SetEvent(event *Event) error

SetEvent ...

func (*InmemStore) SetFrame

func (s *InmemStore) SetFrame(frame *Frame) error

SetFrame ...

func (*InmemStore) SetPeerSet added in v0.4.1

func (s *InmemStore) SetPeerSet(round int, peerSet *peers.PeerSet) error

SetPeerSet updates the peerSetCache and participantEventsCache

func (*InmemStore) SetRound

func (s *InmemStore) SetRound(r int, round *RoundInfo) error

SetRound ...

func (*InmemStore) StorePath

func (s *InmemStore) StorePath() string

StorePath ...

type InternalCommitCallback added in v0.4.1

type InternalCommitCallback func(*Block) error

InternalCommitCallback is called by the Hashgraph to commit a Block. The InternalCommitCallback will likely itself call the ProxyCommitCallback. We add a layer of indirection because processing the CommitResponse should be handled by the Core object, not the hashgraph; the hashgraph only knows if there was an error or not.

type InternalTransaction added in v0.5.0

type InternalTransaction struct {
	Body      InternalTransactionBody
	Signature string
}

InternalTransaction ...

func NewInternalTransaction added in v0.5.0

func NewInternalTransaction(tType TransactionType, peer peers.Peer) InternalTransaction

NewInternalTransaction ...

func NewInternalTransactionJoin added in v0.5.0

func NewInternalTransactionJoin(peer peers.Peer) InternalTransaction

NewInternalTransactionJoin ...

func NewInternalTransactionLeave added in v0.5.0

func NewInternalTransactionLeave(peer peers.Peer) InternalTransaction

NewInternalTransactionLeave ...

func (*InternalTransaction) AsAccepted added in v0.5.0

AsAccepted returns a receipt to accept an InternalTransaction

func (*InternalTransaction) AsRefused added in v0.5.0

AsRefused return a receipt to refuse an InternalTransaction

func (*InternalTransaction) HashString added in v0.5.0

func (t *InternalTransaction) HashString() string

HashString returns a string representation of the body's hash. It is used in node/core as a key in a map to keep track of InternalTransactions as they are being processed asynchronously by the consensus and application.

func (*InternalTransaction) Marshal added in v0.5.0

func (t *InternalTransaction) Marshal() ([]byte, error)

Marshal ...

func (*InternalTransaction) Sign added in v0.5.0

func (t *InternalTransaction) Sign(privKey *ecdsa.PrivateKey) error

Sign returns the ecdsa signature of the SHA256 hash of the transaction's body

func (*InternalTransaction) Unmarshal added in v0.5.0

func (t *InternalTransaction) Unmarshal(data []byte) error

Unmarshal ...

func (*InternalTransaction) Verify added in v0.5.0

func (t *InternalTransaction) Verify() (bool, error)

Verify ...

type InternalTransactionBody added in v0.5.0

type InternalTransactionBody struct {
	Type TransactionType
	Peer peers.Peer
}

InternalTransactionBody ...

func (*InternalTransactionBody) Hash added in v0.5.0

func (i *InternalTransactionBody) Hash() ([]byte, error)

Hash returns the SHA256 hash of the InternalTransactionBody,

func (*InternalTransactionBody) Marshal added in v0.5.0

func (i *InternalTransactionBody) Marshal() ([]byte, error)

Marshal - json encoding of body

type InternalTransactionReceipt added in v0.5.0

type InternalTransactionReceipt struct {
	InternalTransaction InternalTransaction
	Accepted            bool
}

InternalTransactionReceipt records the decision by the application to accept or refuse and InternalTransaction

type Key

type Key struct {
	// contains filtered or unexported fields
}

Key ...

func (Key) ToString

func (k Key) ToString() string

ToString ...

type OrderedPendingRounds added in v0.4.1

type OrderedPendingRounds []*PendingRound

OrderedPendingRounds ...

func (OrderedPendingRounds) Len added in v0.4.1

func (a OrderedPendingRounds) Len() int

Len returns the length

func (OrderedPendingRounds) Less added in v0.4.1

func (a OrderedPendingRounds) Less(i, j int) bool

Less returns true if element i is less than element j.

func (OrderedPendingRounds) Swap added in v0.4.1

func (a OrderedPendingRounds) Swap(i, j int)

Swap swaps 2 elements

type ParticipantEventsCache

type ParticipantEventsCache struct {
	// contains filtered or unexported fields
}

ParticipantEventsCache ...

func NewParticipantEventsCache

func NewParticipantEventsCache(size int) *ParticipantEventsCache

NewParticipantEventsCache ...

func (*ParticipantEventsCache) AddPeer added in v0.4.1

func (pec *ParticipantEventsCache) AddPeer(peer *peers.Peer) error

AddPeer ...

func (*ParticipantEventsCache) Get

func (pec *ParticipantEventsCache) Get(participant string, skipIndex int) ([]string, error)

Get returns participant events with index > skip

func (*ParticipantEventsCache) GetItem

func (pec *ParticipantEventsCache) GetItem(participant string, index int) (string, error)

GetItem ...

func (*ParticipantEventsCache) GetLast

func (pec *ParticipantEventsCache) GetLast(participant string) (string, error)

GetLast ...

func (*ParticipantEventsCache) Known

func (pec *ParticipantEventsCache) Known() map[uint32]int

Known returns [participant id] => lastKnownIndex

func (*ParticipantEventsCache) Set

func (pec *ParticipantEventsCache) Set(participant string, hash string, index int) error

Set ...

type PeerSetCache added in v0.4.1

type PeerSetCache struct {
	// contains filtered or unexported fields
}

PeerSetCache ...

func NewPeerSetCache added in v0.4.1

func NewPeerSetCache() *PeerSetCache

NewPeerSetCache ...

func (*PeerSetCache) FirstRound added in v0.5.0

func (c *PeerSetCache) FirstRound(id uint32) (int, bool)

FirstRound ...

func (*PeerSetCache) Get added in v0.4.1

func (c *PeerSetCache) Get(round int) (*peers.PeerSet, error)

Get ...

func (*PeerSetCache) GetAll added in v0.5.0

func (c *PeerSetCache) GetAll() (map[int][]*peers.Peer, error)

GetAll ...

func (*PeerSetCache) RepertoireByID added in v0.5.0

func (c *PeerSetCache) RepertoireByID() map[uint32]*peers.Peer

RepertoireByID ...

func (*PeerSetCache) RepertoireByPubKey added in v0.5.0

func (c *PeerSetCache) RepertoireByPubKey() map[string]*peers.Peer

RepertoireByPubKey ...

func (*PeerSetCache) Set added in v0.4.1

func (c *PeerSetCache) Set(round int, peerSet *peers.PeerSet) error

Set ...

type PendingRound added in v0.4.1

type PendingRound struct {
	Index   int
	Decided bool
}

PendingRound ...

type PendingRoundsCache added in v0.4.1

type PendingRoundsCache struct {
	// contains filtered or unexported fields
}

PendingRoundsCache ...

func NewPendingRoundsCache added in v0.4.1

func NewPendingRoundsCache() *PendingRoundsCache

NewPendingRoundsCache ...

func (*PendingRoundsCache) Clean added in v0.4.1

func (c *PendingRoundsCache) Clean(processedRounds []int)

Clean ...

func (*PendingRoundsCache) GetOrderedPendingRounds added in v0.4.1

func (c *PendingRoundsCache) GetOrderedPendingRounds() OrderedPendingRounds

GetOrderedPendingRounds ...

func (*PendingRoundsCache) Queued added in v0.4.1

func (c *PendingRoundsCache) Queued(round int) bool

Queued ...

func (*PendingRoundsCache) Set added in v0.4.1

func (c *PendingRoundsCache) Set(pendingRound *PendingRound)

Set ...

func (*PendingRoundsCache) Update added in v0.4.1

func (c *PendingRoundsCache) Update(decidedRounds []int)

Update ...

type Root

type Root struct {
	Events []*FrameEvent
}

Root forms a base on top of which a participant's Events can be inserted. It contains FrameEvents sorted by Lamport timestamp.

func NewRoot added in v0.4.1

func NewRoot() *Root

NewRoot instantianted an new empty root

func (*Root) Hash added in v0.5.0

func (r *Root) Hash() (string, error)

Hash ...

func (*Root) Insert added in v0.4.1

func (r *Root) Insert(frameEvent *FrameEvent)

Insert appends a FrameEvent to the root's Event slice. It is assumend that items are inserted in topological order.

func (*Root) Marshal

func (r *Root) Marshal() ([]byte, error)

Marshal ...

func (*Root) Unmarshal

func (r *Root) Unmarshal(data []byte) error

Unmarshal decodes data into a Root object

type RoundEvent

type RoundEvent struct {
	Witness bool
	Famous  common.Trilean
}

RoundEvent ...

type RoundInfo

type RoundInfo struct {
	CreatedEvents  map[string]RoundEvent
	ReceivedEvents []string
	// contains filtered or unexported fields
}

RoundInfo ...

func NewRoundInfo

func NewRoundInfo() *RoundInfo

NewRoundInfo ...

func (*RoundInfo) AddCreatedEvent added in v0.4.1

func (r *RoundInfo) AddCreatedEvent(x string, witness bool)

AddCreatedEvent ...

func (*RoundInfo) AddReceivedEvent added in v0.4.1

func (r *RoundInfo) AddReceivedEvent(x string)

AddReceivedEvent ...

func (*RoundInfo) FamousWitnesses

func (r *RoundInfo) FamousWitnesses() []string

FamousWitnesses returns famous witnesses

func (*RoundInfo) IsDecided

func (r *RoundInfo) IsDecided(witness string) bool

IsDecided ...

func (*RoundInfo) IsQueued added in v0.4.1

func (r *RoundInfo) IsQueued() bool

IsQueued ...

func (*RoundInfo) Marshal

func (r *RoundInfo) Marshal() ([]byte, error)

Marshal ...

func (*RoundInfo) SetFame

func (r *RoundInfo) SetFame(x string, f bool)

SetFame ...

func (*RoundInfo) Unmarshal

func (r *RoundInfo) Unmarshal(data []byte) error

Unmarshal ...

func (*RoundInfo) Witnesses

func (r *RoundInfo) Witnesses() []string

Witnesses return witnesses

func (*RoundInfo) WitnessesDecided

func (r *RoundInfo) WitnessesDecided(peerSet *peers.PeerSet) bool

WitnessesDecided returns true if a super-majority of witnesses are decided, and there are no undecided witnesses. Our algorithm relies on the fact that a witness that is not yet known when a super-majority of witnesses are already decided, has no chance of ever being famous. Once a Round is decided it stays decided, even if new witnesses are added after it was first decided.

type SelfParentError added in v0.5.5

type SelfParentError struct {
	// contains filtered or unexported fields
}

SelfParentError is used to differentiate errors that are normal when the hashgraph is being used corrently by multiple go-routines, from errors that should not be occuring event in a concurrent context.

func NewSelfParentError added in v0.5.5

func NewSelfParentError(msg string, normal bool) SelfParentError

NewSelfParentError creates a new SelfParentError

func (SelfParentError) Error added in v0.5.5

func (e SelfParentError) Error() string

Error implements the Error interface

type SigPool added in v0.4.1

type SigPool struct {
	// contains filtered or unexported fields
}

SigPool ...

func NewSigPool added in v0.4.1

func NewSigPool() *SigPool

NewSigPool ...

func (*SigPool) Add added in v0.4.1

func (sp *SigPool) Add(blockSignature BlockSignature)

Add ...

func (*SigPool) Items added in v0.4.1

func (sp *SigPool) Items() map[string]BlockSignature

Items ...

func (*SigPool) Len added in v0.4.1

func (sp *SigPool) Len() int

Len ...

func (*SigPool) Remove added in v0.4.1

func (sp *SigPool) Remove(key string)

Remove ...

func (*SigPool) RemoveSlice added in v0.4.1

func (sp *SigPool) RemoveSlice(sigs []BlockSignature)

RemoveSlice ...

func (*SigPool) Slice added in v0.4.1

func (sp *SigPool) Slice() []BlockSignature

Slice ...

type SortedFrameEvents added in v0.5.0

type SortedFrameEvents []*FrameEvent

SortedFrameEvents implements sort.Interface for []FrameEvent based on the lamportTimestamp field. THIS IS A TOTAL ORDER

func (SortedFrameEvents) Len added in v0.5.0

func (a SortedFrameEvents) Len() int

Len implements the sort.Interface

func (SortedFrameEvents) Less added in v0.5.0

func (a SortedFrameEvents) Less(i, j int) bool

Less implements the sort.Interface

func (SortedFrameEvents) Swap added in v0.5.0

func (a SortedFrameEvents) Swap(i, j int)

Swap implements the sort.Interface

type Store

type Store interface {
	CacheSize() int
	GetPeerSet(int) (*peers.PeerSet, error)
	SetPeerSet(int, *peers.PeerSet) error
	GetAllPeerSets() (map[int][]*peers.Peer, error)
	FirstRound(uint32) (int, bool)
	RepertoireByPubKey() map[string]*peers.Peer
	RepertoireByID() map[uint32]*peers.Peer
	GetEvent(string) (*Event, error)
	SetEvent(*Event) error
	ParticipantEvents(string, int) ([]string, error)
	ParticipantEvent(string, int) (string, error)
	LastEventFrom(string) (string, error)
	LastConsensusEventFrom(string) (string, error)
	KnownEvents() map[uint32]int
	ConsensusEvents() []string
	ConsensusEventsCount() int
	AddConsensusEvent(*Event) error
	GetRound(int) (*RoundInfo, error)
	SetRound(int, *RoundInfo) error
	LastRound() int
	RoundWitnesses(int) []string
	RoundEvents(int) int
	GetRoot(string) (*Root, error)
	GetBlock(int) (*Block, error)
	SetBlock(*Block) error
	LastBlockIndex() int
	GetFrame(int) (*Frame, error)
	SetFrame(*Frame) error
	Reset(*Frame) error
	Close() error
	StorePath() string
}

Store ...

type TransactionType added in v0.5.0

type TransactionType uint8

TransactionType ...

const (
	// PEER_ADD ...
	PEER_ADD TransactionType = iota
	// PEER_REMOVE ...
	PEER_REMOVE
)

func (TransactionType) String added in v0.5.0

func (t TransactionType) String() string

String ...

type TreKey added in v0.4.1

type TreKey struct {
	// contains filtered or unexported fields
}

TreKey ...

func (TreKey) ToString added in v0.4.1

func (k TreKey) ToString() string

ToString ...

type WireBlockSignature

type WireBlockSignature struct {
	Index     int
	Signature string
}

WireBlockSignature ...

type WireBody

type WireBody struct {
	Transactions         [][]byte
	InternalTransactions []InternalTransaction
	BlockSignatures      []WireBlockSignature

	CreatorID            uint32
	OtherParentCreatorID uint32
	Index                int
	SelfParentIndex      int
	OtherParentIndex     int
}

WireBody ...

type WireEvent

type WireEvent struct {
	Body      WireBody
	Signature string
}

WireEvent ...

func (*WireEvent) BlockSignatures

func (we *WireEvent) BlockSignatures(validator []byte) []BlockSignature

BlockSignatures ...

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL