hashgraph

package
v0.4.0 Latest Latest
Warning

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

Go to latest
Published: Oct 14, 2018 License: MIT Imports: 16 Imported by: 6

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BadgerStore

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

func LoadBadgerStore

func LoadBadgerStore(cacheSize int, path string) (*BadgerStore, error)

LoadBadgerStore creates a Store from an existing database

func LoadOrCreateBadgerStore

func LoadOrCreateBadgerStore(participants *peers.Peers, cacheSize int, path string) (*BadgerStore, error)

func NewBadgerStore

func NewBadgerStore(participants *peers.Peers, cacheSize int, path string) (*BadgerStore, error)

NewBadgerStore creates a brand new Store with a new database

func (*BadgerStore) AddConsensusEvent

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

func (*BadgerStore) CacheSize

func (s *BadgerStore) CacheSize() int

func (*BadgerStore) Close

func (s *BadgerStore) Close() error

func (*BadgerStore) ConsensusEvents

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

func (*BadgerStore) ConsensusEventsCount

func (s *BadgerStore) ConsensusEventsCount() int

func (*BadgerStore) GetBlock

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

func (*BadgerStore) GetEvent

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

func (*BadgerStore) GetFrame

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

func (*BadgerStore) GetRoot

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

func (*BadgerStore) GetRound

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

func (*BadgerStore) KnownEvents

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

func (*BadgerStore) LastBlockIndex

func (s *BadgerStore) LastBlockIndex() int

func (*BadgerStore) LastConsensusEventFrom

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

func (*BadgerStore) LastEventFrom

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

func (*BadgerStore) LastRound

func (s *BadgerStore) LastRound() int

func (*BadgerStore) NeedBoostrap

func (s *BadgerStore) NeedBoostrap() bool

func (*BadgerStore) ParticipantEvent

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

func (*BadgerStore) ParticipantEvents

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

func (*BadgerStore) Participants

func (s *BadgerStore) Participants() (*peers.Peers, error)

func (*BadgerStore) Reset

func (s *BadgerStore) Reset(roots map[string]Root) error

func (*BadgerStore) RootsBySelfParent

func (s *BadgerStore) RootsBySelfParent() (map[string]Root, error)

func (*BadgerStore) RoundEvents

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

func (*BadgerStore) RoundWitnesses

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

func (*BadgerStore) SetBlock

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

func (*BadgerStore) SetEvent

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

func (*BadgerStore) SetFrame

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

func (*BadgerStore) SetRound

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

func (*BadgerStore) StorePath

func (s *BadgerStore) StorePath() string

type Block

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

func NewBlock

func NewBlock(blockIndex, roundReceived int, frameHash []byte, txs [][]byte) Block

func NewBlockFromFrame

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

func (*Block) AppendTransactions

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

func (*Block) FrameHash

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

func (*Block) GetSignature

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

func (*Block) GetSignatures

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

func (*Block) Hash

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

func (*Block) Hex

func (b *Block) Hex() string

func (*Block) Index

func (b *Block) Index() int

func (*Block) Marshal

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

func (*Block) RoundReceived

func (b *Block) RoundReceived() int

func (*Block) SetSignature

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

func (*Block) Sign

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

func (*Block) StateHash

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

func (*Block) Transactions

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

func (*Block) Unmarshal

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

func (*Block) Verify

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

type BlockBody

type BlockBody struct {
	Index         int
	RoundReceived int
	StateHash     []byte
	FrameHash     []byte
	Transactions  [][]byte
}

func (*BlockBody) Hash

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

func (*BlockBody) Marshal

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

json encoding of body only

func (*BlockBody) Unmarshal

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

type BlockSignature

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

func (*BlockSignature) Marshal

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

func (*BlockSignature) ToWire

func (bs *BlockSignature) ToWire() WireBlockSignature

func (*BlockSignature) Unmarshal

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

func (*BlockSignature) ValidatorHex

func (bs *BlockSignature) ValidatorHex() string

type ByLamportTimestamp

type ByLamportTimestamp []Event

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

func (ByLamportTimestamp) Len

func (a ByLamportTimestamp) Len() int

func (ByLamportTimestamp) Less

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

func (ByLamportTimestamp) Swap

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

type ByTopologicalOrder

type ByTopologicalOrder []Event

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

func (ByTopologicalOrder) Len

func (a ByTopologicalOrder) Len() int

func (ByTopologicalOrder) Less

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

func (ByTopologicalOrder) Swap

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

type Event

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

func NewEvent

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

func (*Event) BlockSignatures

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

func (*Event) Creator

func (e *Event) Creator() string

func (*Event) Hash

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

sha256 hash of body

func (*Event) Hex

func (e *Event) Hex() string

func (*Event) Index

func (e *Event) Index() int

func (*Event) IsLoaded

func (e *Event) IsLoaded() bool

True if Event contains a payload or is the initial Event of its creator

func (*Event) Marshal

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

json encoding of body and signature

func (*Event) OtherParent

func (e *Event) OtherParent() string

func (*Event) SelfParent

func (e *Event) SelfParent() string

func (*Event) SetLamportTimestamp

func (e *Event) SetLamportTimestamp(t int)

func (*Event) SetRound

func (e *Event) SetRound(r int)

func (*Event) SetRoundReceived

func (e *Event) SetRoundReceived(rr int)

func (*Event) SetWireInfo

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

func (*Event) Sign

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

ecdsa sig

func (*Event) ToWire

func (e *Event) ToWire() WireEvent

func (*Event) Transactions

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

func (*Event) Unmarshal

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

func (*Event) Verify

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

func (*Event) WireBlockSignatures

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

type EventBody

type EventBody struct {
	Transactions    [][]byte         //the payload
	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
}

func (*EventBody) Hash

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

func (*EventBody) Marshal

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

json encoding of body only

func (*EventBody) Unmarshal

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

type EventCoordinates

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

type Frame

type Frame struct {
	Round  int     //RoundReceived
	Roots  []Root  // [participant ID] => Root
	Events []Event //Event with RoundReceived = Round
}

func (*Frame) Hash

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

func (*Frame) Marshal

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

json encoding of Frame

func (*Frame) Unmarshal

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

type Hashgraph

type Hashgraph struct {
	Participants            *peers.Peers     //[public key] => id
	Store                   Store            //store of Events, Rounds, and Blocks
	UndeterminedEvents      []string         //[index] => hash . FIFO queue of Events whose consensus order is not yet determined
	PendingRounds           []*pendingRound  //FIFO queue of Rounds which have not attained consensus yet
	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
	SigPool                 []BlockSignature //Pool of Block signatures that need to be processed
	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(participants *peers.Peers, store Store, commitCh chan Block, logger *logrus.Entry) *Hashgraph

NewHashgraph instantiates a Hashgraph from a list of participants, underlying data store and commit channel

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 (in topological order) for consensus ordering. After this method call, the Hashgraph should be in a state coherent with the 'tip' of the Hashgraph

func (*Hashgraph) CheckBlock

func (h *Hashgraph) CheckBlock(block Block) 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) 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) 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 found to be valid for a known Block, it is appended to the block and removed from the SignaturePool

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.

type Index

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

type InmemStore

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

func NewInmemStore

func NewInmemStore(participants *peers.Peers, cacheSize int) *InmemStore

func (*InmemStore) AddConsensusEvent

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

func (*InmemStore) CacheSize

func (s *InmemStore) CacheSize() int

func (*InmemStore) Close

func (s *InmemStore) Close() error

func (*InmemStore) ConsensusEvents

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

func (*InmemStore) ConsensusEventsCount

func (s *InmemStore) ConsensusEventsCount() int

func (*InmemStore) GetBlock

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

func (*InmemStore) GetEvent

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

func (*InmemStore) GetFrame

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

func (*InmemStore) GetRoot

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

func (*InmemStore) GetRound

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

func (*InmemStore) KnownEvents

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

func (*InmemStore) LastBlockIndex

func (s *InmemStore) LastBlockIndex() int

func (*InmemStore) LastConsensusEventFrom

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

func (*InmemStore) LastEventFrom

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

func (*InmemStore) LastRound

func (s *InmemStore) LastRound() int

func (*InmemStore) NeedBoostrap

func (s *InmemStore) NeedBoostrap() bool

func (*InmemStore) ParticipantEvent

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

func (*InmemStore) ParticipantEvents

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

func (*InmemStore) Participants

func (s *InmemStore) Participants() (*peers.Peers, error)

func (*InmemStore) Reset

func (s *InmemStore) Reset(roots map[string]Root) error

func (*InmemStore) RootsBySelfParent

func (s *InmemStore) RootsBySelfParent() (map[string]Root, error)

func (*InmemStore) RoundEvents

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

func (*InmemStore) RoundWitnesses

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

func (*InmemStore) SetBlock

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

func (*InmemStore) SetEvent

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

func (*InmemStore) SetFrame

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

func (*InmemStore) SetRound

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

func (*InmemStore) StorePath

func (s *InmemStore) StorePath() string

type Key

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

func (Key) ToString

func (k Key) ToString() string

type OrderedEventCoordinates

type OrderedEventCoordinates []Index

func (*OrderedEventCoordinates) Add

func (o *OrderedEventCoordinates) Add(id int, event EventCoordinates)

func (OrderedEventCoordinates) GetByID

func (o OrderedEventCoordinates) GetByID(id int) (Index, bool)

func (OrderedEventCoordinates) GetIDIndex

func (o OrderedEventCoordinates) GetIDIndex(id int) int

type ParentRoundInfo

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

func NewBaseParentRoundInfo

func NewBaseParentRoundInfo() ParentRoundInfo

type ParticipantBlockSignaturesCache

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

func NewParticipantBlockSignaturesCache

func NewParticipantBlockSignaturesCache(size int, participants *peers.Peers) *ParticipantBlockSignaturesCache

func (*ParticipantBlockSignaturesCache) Get

func (psc *ParticipantBlockSignaturesCache) Get(participant string, skipIndex int) ([]BlockSignature, error)

return participant BlockSignatures where index > skip

func (*ParticipantBlockSignaturesCache) GetItem

func (psc *ParticipantBlockSignaturesCache) GetItem(participant string, index int) (BlockSignature, error)

func (*ParticipantBlockSignaturesCache) GetLast

func (psc *ParticipantBlockSignaturesCache) GetLast(participant string) (BlockSignature, error)

func (*ParticipantBlockSignaturesCache) Known

func (psc *ParticipantBlockSignaturesCache) Known() map[int]int

returns [participant id] => last BlockSignature Index

func (*ParticipantBlockSignaturesCache) Reset

func (*ParticipantBlockSignaturesCache) Set

func (psc *ParticipantBlockSignaturesCache) Set(participant string, sig BlockSignature) error

type ParticipantEventsCache

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

func NewParticipantEventsCache

func NewParticipantEventsCache(size int, participants *peers.Peers) *ParticipantEventsCache

func (*ParticipantEventsCache) Get

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

return participant events with index > skip

func (*ParticipantEventsCache) GetItem

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

func (*ParticipantEventsCache) GetLast

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

func (*ParticipantEventsCache) GetLastConsensus

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

func (*ParticipantEventsCache) Known

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

returns [participant id] => lastKnownIndex

func (*ParticipantEventsCache) Reset

func (pec *ParticipantEventsCache) Reset() error

func (*ParticipantEventsCache) Set

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

type Root

type Root struct {
	NextRound  int
	SelfParent RootEvent
	Others     map[string]RootEvent
}

Root forms a base on top of which a participant's Events can be inserted. In contains the SelfParent of the first descendant of the Root, as well as other Events, belonging to a past before the Root, which might be referenced in future Events. NextRound corresponds to a proposed value for the child's Round; it is only used if the child's OtherParent is empty or NOT in the Root's Others.

func NewBaseRoot

func NewBaseRoot(creatorID int) Root

NewBaseRoot initializes a Root object for a fresh Hashgraph.

func (*Root) Marshal

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

The JSON encoding of a Root must be DETERMINISTIC because it is itself included in the JSON encoding of a Frame. The difficulty is that Roots contain go maps for which one should not expect a de facto order of entries; we cannot use the builtin JSON codec within overriding something. Instead, we are using a third party library (ugorji/codec) that enables deterministic encoding of golang maps.

func (*Root) Unmarshal

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

type RootEvent

type RootEvent struct {
	Hash             string
	CreatorID        int
	Index            int
	LamportTimestamp int
	Round            int
}

RootEvent contains enough information about an Event and its direct descendant to allow inserting Events on top of it.

func NewBaseRootEvent

func NewBaseRootEvent(creatorID int) RootEvent

NewBaseRootEvent creates a RootEvent corresponding to the the very beginning of a Hashgraph.

type RoundEvent

type RoundEvent struct {
	Consensus bool
	Witness   bool
	Famous    Trilean
}

type RoundInfo

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

func NewRoundInfo

func NewRoundInfo() *RoundInfo

func (*RoundInfo) AddEvent

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

func (*RoundInfo) ConsensusEvents

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

return consensus events

func (*RoundInfo) FamousWitnesses

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

return famous witnesses

func (*RoundInfo) IsDecided

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

func (*RoundInfo) Marshal

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

func (*RoundInfo) RoundEvents

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

func (*RoundInfo) SetConsensusEvent

func (r *RoundInfo) SetConsensusEvent(x string)

func (*RoundInfo) SetFame

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

func (*RoundInfo) Unmarshal

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

func (*RoundInfo) Witnesses

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

return witnesses

func (*RoundInfo) WitnessesDecided

func (r *RoundInfo) WitnessesDecided() bool

return true if no witnesses' fame is left undefined

type Store

type Store interface {
	CacheSize() int
	Participants() (*peers.Peers, error)
	RootsBySelfParent() (map[string]Root, error)
	GetEvent(string) (Event, error)
	SetEvent(Event) error
	ParticipantEvents(string, int) ([]string, error)
	ParticipantEvent(string, int) (string, error)
	LastEventFrom(string) (string, bool, error)
	LastConsensusEventFrom(string) (string, bool, error)
	KnownEvents() map[int]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(map[string]Root) error
	Close() error
	NeedBoostrap() bool // Was the store loaded from existing db
	StorePath() string
}

type Trilean

type Trilean int
const (
	Undefined Trilean = iota
	True
	False
)

func (Trilean) String

func (t Trilean) String() string

type WireBlockSignature

type WireBlockSignature struct {
	Index     int
	Signature string
}

type WireBody

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

	SelfParentIndex      int
	OtherParentCreatorID int
	OtherParentIndex     int
	CreatorID            int

	Index int
}

type WireEvent

type WireEvent struct {
	Body      WireBody
	Signature string
}

func (*WireEvent) BlockSignatures

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

Jump to

Keyboard shortcuts

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