iproto

package
v0.3.2 Latest Latest
Warning

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

Go to latest
Published: Sep 12, 2018 License: Apache-2.0 Imports: 4 Imported by: 0

Documentation

Overview

Package iproto is a generated protocol buffer package.

It is generated from these files:

blockchain.proto

It has these top-level messages:

TransferPb
VotePb
ExecutionPb
LogPb
ReceiptPb
ActionPb
BlockHeaderPb
BlockPb
BlockIndex
BlockSync
BlockContainer
ViewChangeMsg
Candidate
CandidateList
TestPayload

Index

Constants

View Source
const (
	// UnknownProtoMsgType is an unknown message type that is not expected
	UnknownProtoMsgType uint32 = 0
	// MsgTxProtoMsgType is for transactions broadcasted within the network
	MsgTxProtoMsgType uint32 = 1
	// MsgBlockProtoMsgType is for blocks broadcasted within the network
	MsgBlockProtoMsgType uint32 = 2
	// ViewChangeMsgType is for consensus flows within the network
	ViewChangeMsgType uint32 = 3
	// MsgBlockSyncReqType is for requests among peers to sync blocks
	MsgBlockSyncReqType uint32 = 4
	// MsgBlockSyncDataType is the response to messages of type MsgBlockSyncReqType
	MsgBlockSyncDataType uint32 = 5
	// MsgActionType is the action message
	MsgActionType uint32 = 6
	// TestPayloadType is a test payload message type
	TestPayloadType uint32 = 10001
)
View Source
const (
	MagicBroadcastMsgHeader uint32 = 4689
)

Magic header to identify IoTex traffic

Variables

View Source
var ViewChangeMsg_ViewChangeType_name = map[int32]string{
	0: "INVALID_VIEW_CHANGE_TYPE",
	1: "PROPOSE",
	2: "PREVOTE",
	3: "VOTE",
}
View Source
var ViewChangeMsg_ViewChangeType_value = map[string]int32{
	"INVALID_VIEW_CHANGE_TYPE": 0,
	"PROPOSE":                  1,
	"PREVOTE":                  2,
	"VOTE":                     3,
}

Functions

func GetTypeFromProtoMsg

func GetTypeFromProtoMsg(msg proto.Message) (uint32, error)

GetTypeFromProtoMsg retrieves the proto message type

func TypifyProtoMsg

func TypifyProtoMsg(tp uint32, msg []byte) (proto.Message, error)

TypifyProtoMsg unmarshal a proto message based on the given MessageType

Types

type ActionPb

type ActionPb struct {
	Version   uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"`
	Nonce     uint64 `protobuf:"varint,2,opt,name=nonce" json:"nonce,omitempty"`
	Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"`
	// Types that are valid to be assigned to Action:
	//	*ActionPb_Transfer
	//	*ActionPb_Vote
	//	*ActionPb_Execution
	Action isActionPb_Action `protobuf_oneof:"action"`
}

func (*ActionPb) Descriptor

func (*ActionPb) Descriptor() ([]byte, []int)

func (*ActionPb) GetAction

func (m *ActionPb) GetAction() isActionPb_Action

func (*ActionPb) GetExecution

func (m *ActionPb) GetExecution() *ExecutionPb

func (*ActionPb) GetNonce

func (m *ActionPb) GetNonce() uint64

func (*ActionPb) GetSignature

func (m *ActionPb) GetSignature() []byte

func (*ActionPb) GetTransfer

func (m *ActionPb) GetTransfer() *TransferPb

func (*ActionPb) GetVersion

func (m *ActionPb) GetVersion() uint32

func (*ActionPb) GetVote

func (m *ActionPb) GetVote() *VotePb

func (*ActionPb) ProtoMessage

func (*ActionPb) ProtoMessage()

func (*ActionPb) Reset

func (m *ActionPb) Reset()

func (*ActionPb) String

func (m *ActionPb) String() string

func (*ActionPb) XXX_OneofFuncs

func (*ActionPb) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{})

XXX_OneofFuncs is for the internal use of the proto package.

type ActionPb_Execution

type ActionPb_Execution struct {
	Execution *ExecutionPb `protobuf:"bytes,12,opt,name=execution,oneof"`
}

type ActionPb_Transfer

type ActionPb_Transfer struct {
	Transfer *TransferPb `protobuf:"bytes,10,opt,name=transfer,oneof"`
}

type ActionPb_Vote

type ActionPb_Vote struct {
	Vote *VotePb `protobuf:"bytes,11,opt,name=vote,oneof"`
}

type BlockContainer

type BlockContainer struct {
	Block *BlockPb `protobuf:"bytes,1,opt,name=block" json:"block,omitempty"`
}

block container used to send old/existing blocks in block sync

func (*BlockContainer) Descriptor

func (*BlockContainer) Descriptor() ([]byte, []int)

func (*BlockContainer) GetBlock

func (m *BlockContainer) GetBlock() *BlockPb

func (*BlockContainer) ProtoMessage

func (*BlockContainer) ProtoMessage()

func (*BlockContainer) Reset

func (m *BlockContainer) Reset()

func (*BlockContainer) String

func (m *BlockContainer) String() string

type BlockHeaderPb

type BlockHeaderPb struct {
	Version       uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"`
	ChainID       uint32 `protobuf:"varint,2,opt,name=chainID" json:"chainID,omitempty"`
	Height        uint64 `protobuf:"varint,3,opt,name=height" json:"height,omitempty"`
	Timestamp     uint64 `protobuf:"varint,4,opt,name=timestamp" json:"timestamp,omitempty"`
	PrevBlockHash []byte `protobuf:"bytes,5,opt,name=prevBlockHash,proto3" json:"prevBlockHash,omitempty"`
	TxRoot        []byte `protobuf:"bytes,6,opt,name=txRoot,proto3" json:"txRoot,omitempty"`
	StateRoot     []byte `protobuf:"bytes,7,opt,name=stateRoot,proto3" json:"stateRoot,omitempty"`
	ReceiptRoot   []byte `protobuf:"bytes,8,opt,name=receiptRoot,proto3" json:"receiptRoot,omitempty"`
	Reserved      []byte `protobuf:"bytes,9,opt,name=reserved,proto3" json:"reserved,omitempty"`
	Signature     []byte `protobuf:"bytes,10,opt,name=signature,proto3" json:"signature,omitempty"`
	Pubkey        []byte `protobuf:"bytes,11,opt,name=pubkey,proto3" json:"pubkey,omitempty"`
	DkgID         []byte `protobuf:"bytes,12,opt,name=dkgID,proto3" json:"dkgID,omitempty"`
	DkgPubkey     []byte `protobuf:"bytes,13,opt,name=dkgPubkey,proto3" json:"dkgPubkey,omitempty"`
	DkgSignature  []byte `protobuf:"bytes,14,opt,name=dkgSignature,proto3" json:"dkgSignature,omitempty"`
}

header of a block

func (*BlockHeaderPb) Descriptor

func (*BlockHeaderPb) Descriptor() ([]byte, []int)

func (*BlockHeaderPb) GetChainID

func (m *BlockHeaderPb) GetChainID() uint32

func (*BlockHeaderPb) GetDkgID

func (m *BlockHeaderPb) GetDkgID() []byte

func (*BlockHeaderPb) GetDkgPubkey

func (m *BlockHeaderPb) GetDkgPubkey() []byte

func (*BlockHeaderPb) GetDkgSignature

func (m *BlockHeaderPb) GetDkgSignature() []byte

func (*BlockHeaderPb) GetHeight

func (m *BlockHeaderPb) GetHeight() uint64

func (*BlockHeaderPb) GetPrevBlockHash

func (m *BlockHeaderPb) GetPrevBlockHash() []byte

func (*BlockHeaderPb) GetPubkey

func (m *BlockHeaderPb) GetPubkey() []byte

func (*BlockHeaderPb) GetReceiptRoot

func (m *BlockHeaderPb) GetReceiptRoot() []byte

func (*BlockHeaderPb) GetReserved

func (m *BlockHeaderPb) GetReserved() []byte

func (*BlockHeaderPb) GetSignature

func (m *BlockHeaderPb) GetSignature() []byte

func (*BlockHeaderPb) GetStateRoot

func (m *BlockHeaderPb) GetStateRoot() []byte

func (*BlockHeaderPb) GetTimestamp

func (m *BlockHeaderPb) GetTimestamp() uint64

func (*BlockHeaderPb) GetTxRoot

func (m *BlockHeaderPb) GetTxRoot() []byte

func (*BlockHeaderPb) GetVersion

func (m *BlockHeaderPb) GetVersion() uint32

func (*BlockHeaderPb) ProtoMessage

func (*BlockHeaderPb) ProtoMessage()

func (*BlockHeaderPb) Reset

func (m *BlockHeaderPb) Reset()

func (*BlockHeaderPb) String

func (m *BlockHeaderPb) String() string

type BlockIndex

type BlockIndex struct {
	Start  uint64   `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End    uint64   `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	Offset []uint32 `protobuf:"varint,3,rep,packed,name=offset" json:"offset,omitempty"`
}

index of block raw data file

func (*BlockIndex) Descriptor

func (*BlockIndex) Descriptor() ([]byte, []int)

func (*BlockIndex) GetEnd

func (m *BlockIndex) GetEnd() uint64

func (*BlockIndex) GetOffset

func (m *BlockIndex) GetOffset() []uint32

func (*BlockIndex) GetStart

func (m *BlockIndex) GetStart() uint64

func (*BlockIndex) ProtoMessage

func (*BlockIndex) ProtoMessage()

func (*BlockIndex) Reset

func (m *BlockIndex) Reset()

func (*BlockIndex) String

func (m *BlockIndex) String() string

type BlockPb

type BlockPb struct {
	Header  *BlockHeaderPb `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
	Actions []*ActionPb    `protobuf:"bytes,2,rep,name=actions" json:"actions,omitempty"`
}

block consists of header followed by transactions hash of current block can be computed from header hence not stored

func (*BlockPb) Descriptor

func (*BlockPb) Descriptor() ([]byte, []int)

func (*BlockPb) GetActions

func (m *BlockPb) GetActions() []*ActionPb

func (*BlockPb) GetHeader

func (m *BlockPb) GetHeader() *BlockHeaderPb

func (*BlockPb) ProtoMessage

func (*BlockPb) ProtoMessage()

func (*BlockPb) Reset

func (m *BlockPb) Reset()

func (*BlockPb) String

func (m *BlockPb) String() string

type BlockSync

type BlockSync struct {
	Start uint64 `protobuf:"varint,2,opt,name=start" json:"start,omitempty"`
	End   uint64 `protobuf:"varint,3,opt,name=end" json:"end,omitempty"`
}

func (*BlockSync) Descriptor

func (*BlockSync) Descriptor() ([]byte, []int)

func (*BlockSync) GetEnd

func (m *BlockSync) GetEnd() uint64

func (*BlockSync) GetStart

func (m *BlockSync) GetStart() uint64

func (*BlockSync) ProtoMessage

func (*BlockSync) ProtoMessage()

func (*BlockSync) Reset

func (m *BlockSync) Reset()

func (*BlockSync) String

func (m *BlockSync) String() string

type Candidate

type Candidate struct {
	Address          string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"`
	Votes            []byte `protobuf:"bytes,2,opt,name=votes,proto3" json:"votes,omitempty"`
	PubKey           []byte `protobuf:"bytes,3,opt,name=pubKey,proto3" json:"pubKey,omitempty"`
	CreationHeight   uint64 `protobuf:"varint,4,opt,name=creationHeight" json:"creationHeight,omitempty"`
	LastUpdateHeight uint64 `protobuf:"varint,5,opt,name=lastUpdateHeight" json:"lastUpdateHeight,omitempty"`
}

Candidates and list of candidates

func (*Candidate) Descriptor

func (*Candidate) Descriptor() ([]byte, []int)

func (*Candidate) GetAddress

func (m *Candidate) GetAddress() string

func (*Candidate) GetCreationHeight

func (m *Candidate) GetCreationHeight() uint64

func (*Candidate) GetLastUpdateHeight

func (m *Candidate) GetLastUpdateHeight() uint64

func (*Candidate) GetPubKey

func (m *Candidate) GetPubKey() []byte

func (*Candidate) GetVotes

func (m *Candidate) GetVotes() []byte

func (*Candidate) ProtoMessage

func (*Candidate) ProtoMessage()

func (*Candidate) Reset

func (m *Candidate) Reset()

func (*Candidate) String

func (m *Candidate) String() string

type CandidateList

type CandidateList struct {
	Candidates []*Candidate `protobuf:"bytes,1,rep,name=candidates" json:"candidates,omitempty"`
}

func (*CandidateList) Descriptor

func (*CandidateList) Descriptor() ([]byte, []int)

func (*CandidateList) GetCandidates

func (m *CandidateList) GetCandidates() []*Candidate

func (*CandidateList) ProtoMessage

func (*CandidateList) ProtoMessage()

func (*CandidateList) Reset

func (m *CandidateList) Reset()

func (*CandidateList) String

func (m *CandidateList) String() string

type ExecutionPb

type ExecutionPb struct {
	Amount         []byte `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"`
	Executor       string `protobuf:"bytes,2,opt,name=executor" json:"executor,omitempty"`
	Contract       string `protobuf:"bytes,3,opt,name=contract" json:"contract,omitempty"`
	ExecutorPubKey []byte `protobuf:"bytes,4,opt,name=executorPubKey,proto3" json:"executorPubKey,omitempty"`
	Gas            uint64 `protobuf:"varint,5,opt,name=gas" json:"gas,omitempty"`
	GasPrice       uint64 `protobuf:"varint,6,opt,name=gasPrice" json:"gasPrice,omitempty"`
	Data           []byte `protobuf:"bytes,7,opt,name=data,proto3" json:"data,omitempty"`
}

func (*ExecutionPb) Descriptor

func (*ExecutionPb) Descriptor() ([]byte, []int)

func (*ExecutionPb) GetAmount

func (m *ExecutionPb) GetAmount() []byte

func (*ExecutionPb) GetContract

func (m *ExecutionPb) GetContract() string

func (*ExecutionPb) GetData

func (m *ExecutionPb) GetData() []byte

func (*ExecutionPb) GetExecutor

func (m *ExecutionPb) GetExecutor() string

func (*ExecutionPb) GetExecutorPubKey

func (m *ExecutionPb) GetExecutorPubKey() []byte

func (*ExecutionPb) GetGas

func (m *ExecutionPb) GetGas() uint64

func (*ExecutionPb) GetGasPrice

func (m *ExecutionPb) GetGasPrice() uint64

func (*ExecutionPb) ProtoMessage

func (*ExecutionPb) ProtoMessage()

func (*ExecutionPb) Reset

func (m *ExecutionPb) Reset()

func (*ExecutionPb) String

func (m *ExecutionPb) String() string

type LogPb

type LogPb struct {
	Address     string   `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"`
	Topics      [][]byte `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"`
	Data        []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	BlockNumber uint64   `protobuf:"varint,4,opt,name=blockNumber" json:"blockNumber,omitempty"`
	TxnHash     []byte   `protobuf:"bytes,5,opt,name=txnHash,proto3" json:"txnHash,omitempty"`
	BlockHash   []byte   `protobuf:"bytes,6,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
	Index       uint32   `protobuf:"varint,7,opt,name=index" json:"index,omitempty"`
}

func (*LogPb) Descriptor

func (*LogPb) Descriptor() ([]byte, []int)

func (*LogPb) GetAddress

func (m *LogPb) GetAddress() string

func (*LogPb) GetBlockHash

func (m *LogPb) GetBlockHash() []byte

func (*LogPb) GetBlockNumber

func (m *LogPb) GetBlockNumber() uint64

func (*LogPb) GetData

func (m *LogPb) GetData() []byte

func (*LogPb) GetIndex

func (m *LogPb) GetIndex() uint32

func (*LogPb) GetTopics

func (m *LogPb) GetTopics() [][]byte

func (*LogPb) GetTxnHash

func (m *LogPb) GetTxnHash() []byte

func (*LogPb) ProtoMessage

func (*LogPb) ProtoMessage()

func (*LogPb) Reset

func (m *LogPb) Reset()

func (*LogPb) String

func (m *LogPb) String() string

type ReceiptPb

type ReceiptPb struct {
	ReturnValue     []byte   `protobuf:"bytes,1,opt,name=returnValue,proto3" json:"returnValue,omitempty"`
	Status          uint64   `protobuf:"varint,2,opt,name=status" json:"status,omitempty"`
	Hash            []byte   `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"`
	GasConsumed     uint64   `protobuf:"varint,4,opt,name=gasConsumed" json:"gasConsumed,omitempty"`
	ContractAddress string   `protobuf:"bytes,5,opt,name=contractAddress" json:"contractAddress,omitempty"`
	Logs            []*LogPb `protobuf:"bytes,6,rep,name=logs" json:"logs,omitempty"`
}

func (*ReceiptPb) Descriptor

func (*ReceiptPb) Descriptor() ([]byte, []int)

func (*ReceiptPb) GetContractAddress

func (m *ReceiptPb) GetContractAddress() string

func (*ReceiptPb) GetGasConsumed

func (m *ReceiptPb) GetGasConsumed() uint64

func (*ReceiptPb) GetHash

func (m *ReceiptPb) GetHash() []byte

func (*ReceiptPb) GetLogs

func (m *ReceiptPb) GetLogs() []*LogPb

func (*ReceiptPb) GetReturnValue

func (m *ReceiptPb) GetReturnValue() []byte

func (*ReceiptPb) GetStatus

func (m *ReceiptPb) GetStatus() uint64

func (*ReceiptPb) ProtoMessage

func (*ReceiptPb) ProtoMessage()

func (*ReceiptPb) Reset

func (m *ReceiptPb) Reset()

func (*ReceiptPb) String

func (m *ReceiptPb) String() string

type TestPayload

type TestPayload struct {
	MsgBody []byte `protobuf:"bytes,1,opt,name=msg_body,json=msgBody,proto3" json:"msg_body,omitempty"`
}

////////////////////////////////////////////////////////////////////////////////////////////////// BELOW ARE DEFINITIONS FOR TEST-ONLY MESSAGES! //////////////////////////////////////////////////////////////////////////////////////////////////

func (*TestPayload) Descriptor

func (*TestPayload) Descriptor() ([]byte, []int)

func (*TestPayload) GetMsgBody

func (m *TestPayload) GetMsgBody() []byte

func (*TestPayload) ProtoMessage

func (*TestPayload) ProtoMessage()

func (*TestPayload) Reset

func (m *TestPayload) Reset()

func (*TestPayload) String

func (m *TestPayload) String() string

type TransferPb

type TransferPb struct {
	// used by state-based model
	Amount       []byte `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"`
	Sender       string `protobuf:"bytes,2,opt,name=sender" json:"sender,omitempty"`
	Recipient    string `protobuf:"bytes,3,opt,name=recipient" json:"recipient,omitempty"`
	Payload      []byte `protobuf:"bytes,4,opt,name=payload,proto3" json:"payload,omitempty"`
	SenderPubKey []byte `protobuf:"bytes,5,opt,name=senderPubKey,proto3" json:"senderPubKey,omitempty"`
	IsCoinbase   bool   `protobuf:"varint,6,opt,name=isCoinbase" json:"isCoinbase,omitempty"`
}

func (*TransferPb) Descriptor

func (*TransferPb) Descriptor() ([]byte, []int)

func (*TransferPb) GetAmount

func (m *TransferPb) GetAmount() []byte

func (*TransferPb) GetIsCoinbase

func (m *TransferPb) GetIsCoinbase() bool

func (*TransferPb) GetPayload

func (m *TransferPb) GetPayload() []byte

func (*TransferPb) GetRecipient

func (m *TransferPb) GetRecipient() string

func (*TransferPb) GetSender

func (m *TransferPb) GetSender() string

func (*TransferPb) GetSenderPubKey

func (m *TransferPb) GetSenderPubKey() []byte

func (*TransferPb) ProtoMessage

func (*TransferPb) ProtoMessage()

func (*TransferPb) Reset

func (m *TransferPb) Reset()

func (*TransferPb) String

func (m *TransferPb) String() string

type ViewChangeMsg

type ViewChangeMsg struct {
	Vctype     ViewChangeMsg_ViewChangeType `protobuf:"varint,1,opt,name=vctype,enum=iproto.ViewChangeMsg_ViewChangeType" json:"vctype,omitempty"`
	Block      *BlockPb                     `protobuf:"bytes,2,opt,name=block" json:"block,omitempty"`
	BlockHash  []byte                       `protobuf:"bytes,3,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
	SenderAddr string                       `protobuf:"bytes,4,opt,name=senderAddr" json:"senderAddr,omitempty"`
	Decision   bool                         `protobuf:"varint,5,opt,name=decision" json:"decision,omitempty"`
}

func (*ViewChangeMsg) Descriptor

func (*ViewChangeMsg) Descriptor() ([]byte, []int)

func (*ViewChangeMsg) GetBlock

func (m *ViewChangeMsg) GetBlock() *BlockPb

func (*ViewChangeMsg) GetBlockHash

func (m *ViewChangeMsg) GetBlockHash() []byte

func (*ViewChangeMsg) GetDecision

func (m *ViewChangeMsg) GetDecision() bool

func (*ViewChangeMsg) GetSenderAddr

func (m *ViewChangeMsg) GetSenderAddr() string

func (*ViewChangeMsg) GetVctype

func (*ViewChangeMsg) ProtoMessage

func (*ViewChangeMsg) ProtoMessage()

func (*ViewChangeMsg) Reset

func (m *ViewChangeMsg) Reset()

func (*ViewChangeMsg) String

func (m *ViewChangeMsg) String() string

type ViewChangeMsg_ViewChangeType

type ViewChangeMsg_ViewChangeType int32
const (
	ViewChangeMsg_INVALID_VIEW_CHANGE_TYPE ViewChangeMsg_ViewChangeType = 0
	ViewChangeMsg_PROPOSE                  ViewChangeMsg_ViewChangeType = 1
	ViewChangeMsg_PREVOTE                  ViewChangeMsg_ViewChangeType = 2
	ViewChangeMsg_VOTE                     ViewChangeMsg_ViewChangeType = 3
)

func (ViewChangeMsg_ViewChangeType) EnumDescriptor

func (ViewChangeMsg_ViewChangeType) EnumDescriptor() ([]byte, []int)

func (ViewChangeMsg_ViewChangeType) String

type VotePb

type VotePb struct {
	Timestamp    uint64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
	SelfPubkey   []byte `protobuf:"bytes,2,opt,name=selfPubkey,proto3" json:"selfPubkey,omitempty"`
	VoterAddress string `protobuf:"bytes,3,opt,name=voterAddress" json:"voterAddress,omitempty"`
	VoteeAddress string `protobuf:"bytes,4,opt,name=voteeAddress" json:"voteeAddress,omitempty"`
}

func (*VotePb) Descriptor

func (*VotePb) Descriptor() ([]byte, []int)

func (*VotePb) GetSelfPubkey

func (m *VotePb) GetSelfPubkey() []byte

func (*VotePb) GetTimestamp

func (m *VotePb) GetTimestamp() uint64

func (*VotePb) GetVoteeAddress

func (m *VotePb) GetVoteeAddress() string

func (*VotePb) GetVoterAddress

func (m *VotePb) GetVoterAddress() string

func (*VotePb) ProtoMessage

func (*VotePb) ProtoMessage()

func (*VotePb) Reset

func (m *VotePb) Reset()

func (*VotePb) String

func (m *VotePb) String() string

Jump to

Keyboard shortcuts

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