operation

package
v0.39.3-preview.1 Latest Latest
Warning

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

Go to latest
Published: Mar 11, 2025 License: AGPL-3.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func BatchIndexLightTransactionResult

func BatchIndexLightTransactionResult(w storage.Writer, blockID flow.Identifier, txIndex uint32, transactionResult *flow.LightTransactionResult) error

func BatchIndexTransactionResultErrorMessage

func BatchIndexTransactionResultErrorMessage(w storage.Writer, blockID flow.Identifier, transactionResultErrorMessage *flow.TransactionResultErrorMessage) error

BatchIndexTransactionResultErrorMessage indexes a transaction result error message by index within the block using a batch write.

func BatchInsertLightTransactionResult

func BatchInsertLightTransactionResult(w storage.Writer, blockID flow.Identifier, transactionResult *flow.LightTransactionResult) error

func BatchInsertTransactionResultErrorMessage

func BatchInsertTransactionResultErrorMessage(w storage.Writer, blockID flow.Identifier, transactionResultErrorMessage *flow.TransactionResultErrorMessage) error

BatchInsertTransactionResultErrorMessage inserts a transaction result error message by block ID and transaction ID into the database using a batch write.

func BatchRemoveTransactionResultsByBlockID

func BatchRemoveTransactionResultsByBlockID(blockID flow.Identifier, batch storage.ReaderBatchWriter) error

BatchRemoveTransactionResultsByBlockID removes transaction results for the given blockID in a provided batch. No errors are expected during normal operation, but it may return generic error if badger fails to process request

func EncodeKeyPart

func EncodeKeyPart(v interface{}) []byte

EncodeKeyPart encodes a value to be used as a part of a key to be stored in storage.

func ExistChunkLocator added in v0.39.1

func ExistChunkLocator(r storage.Reader, locatorID flow.Identifier) (bool, error)

func ExistExecutionResult

func ExistExecutionResult(r storage.Reader, blockID flow.Identifier) (bool, error)

func Exists

func Exists(key []byte, keyExists *bool) func(storage.Reader) error

func FindHighestAtOrBelow

func FindHighestAtOrBelow(prefix []byte, height uint64, entity interface{}) func(storage.Reader) error

func FindHighestAtOrBelowByPrefix

func FindHighestAtOrBelowByPrefix(r storage.Reader, prefix []byte, height uint64, entity interface{}) (errToReturn error)

FindHighestAtOrBelowByPrefix is for database entries that are indexed by block height. It is suitable to search keys with the format prefix` + `height` (where "+" denotes concatenation of binary strings). The height is encoded as Big-Endian (entries with numerically smaller height have lexicographically smaller key). The function finds the *highest* key with the given prefix and height equal to or below the given height.

func GetBlockIDsByStatus added in v0.39.2

func GetBlockIDsByStatus(r storage.Reader, blockIDs *[]flow.Identifier,
	targetUploadStatus bool) error

GetBlockIDsByStatus returns all IDs of stored ComputationResult instances.

func GetComputationResultUploadStatus added in v0.39.2

func GetComputationResultUploadStatus(r storage.Reader, blockID flow.Identifier,
	wasUploadCompleted *bool) error

GetComputationResult returns stored ComputationResult instance with given ID.

func IndexCollectionPayload

func IndexCollectionPayload(w storage.Writer, blockID flow.Identifier, txIDs []flow.Identifier) error

IndexCollectionPayload indexes the transactions within the collection payload of a cluster block. IndexCollectionPayload will overwrite any existing index, which is acceptable because the blockID is derived from txIDs within the payload, ensuring its uniqueness.

func IndexExecutionReceipts

func IndexExecutionReceipts(w storage.Writer, blockID, receiptID flow.Identifier) error

IndexExecutionReceipts inserts an execution receipt ID keyed by block ID and receipt ID. one block could have multiple receipts, even if they are from the same executor

func IndexExecutionResult

func IndexExecutionResult(w storage.Writer, blockID flow.Identifier, resultID flow.Identifier) error

IndexExecutionResult inserts an execution result ID keyed by block ID

func IndexOwnExecutionReceipt

func IndexOwnExecutionReceipt(w storage.Writer, blockID flow.Identifier, receiptID flow.Identifier) error

IndexOwnExecutionReceipt inserts an execution receipt ID keyed by block ID

func IndexStateCommitment

func IndexStateCommitment(w storage.Writer, blockID flow.Identifier, commit flow.StateCommitment) error

IndexStateCommitment indexes a state commitment.

State commitments are keyed by the block whose execution results in the state with the given commit.

func IndexTransactionResult

func IndexTransactionResult(w storage.Writer, blockID flow.Identifier, txIndex uint32, transactionResult *flow.TransactionResult) error

func IndexVersionBeaconByHeight added in v0.39.2

func IndexVersionBeaconByHeight(
	w storage.Writer,
	beacon *flow.SealedVersionBeacon,
) error

IndexVersionBeaconByHeight stores a sealed version beacon indexed by flow.SealedVersionBeacon.SealHeight.

No errors are expected during normal operation.

func InsertChunkDataPack

func InsertChunkDataPack(w storage.Writer, c *storage.StoredChunkDataPack) error

InsertChunkDataPack inserts a chunk data pack keyed by chunk ID. any error are exceptions

func InsertChunkLocator added in v0.39.1

func InsertChunkLocator(w storage.Writer, locator *chunks.Locator) error

func InsertEvent

func InsertEvent(w storage.Writer, blockID flow.Identifier, event flow.Event) error

func InsertExecutionReceiptMeta

func InsertExecutionReceiptMeta(w storage.Writer, receiptID flow.Identifier, meta *flow.ExecutionReceiptMeta) error

InsertExecutionReceiptMeta inserts an execution receipt meta by ID.

func InsertExecutionResult

func InsertExecutionResult(w storage.Writer, result *flow.ExecutionResult) error

InsertExecutionResult inserts an execution result by ID.

func InsertExecutionStateInteractions

func InsertExecutionStateInteractions(
	w storage.Writer,
	blockID flow.Identifier,
	executionSnapshots []*snapshot.ExecutionSnapshot,
) error

func InsertJobAtIndex added in v0.39.1

func InsertJobAtIndex(w storage.Writer, queue string, index uint64, entity flow.Identifier) error

InsertJobAtIndex insert an entity ID at the given index

func InsertLightTransactionResult

func InsertLightTransactionResult(w storage.Writer, blockID flow.Identifier, transactionResult *flow.LightTransactionResult) error

deprecated

func InsertResultApproval

func InsertResultApproval(w storage.Writer, approval *flow.ResultApproval) error

InsertResultApproval inserts a ResultApproval by ID. The same key (`approval.ID()`) necessitates that the value (full `approval`) is also identical (otherwise, we would have a successful pre-image attack on our cryptographic hash function). Therefore, concurrent calls to this function are safe.

func InsertServiceEvent

func InsertServiceEvent(w storage.Writer, blockID flow.Identifier, event flow.Event) error

func InsertTransactionResult

func InsertTransactionResult(w storage.Writer, blockID flow.Identifier, transactionResult *flow.TransactionResult) error

func Iterate

func Iterate(startPrefix []byte, endPrefix []byte, check func(key []byte) error) func(storage.Reader) error

func IterateKeys

func IterateKeys(r storage.Reader, startPrefix []byte, endPrefix []byte, iterFunc IterationFunc, opt storage.IteratorOption) (errToReturn error)

IterateKeys will iterate over all entries in the database, where the key starts with a prefixes in the range [startPrefix, endPrefix] (both inclusive). No errors expected during normal operations.

func IterateKeysByPrefixRange

func IterateKeysByPrefixRange(r storage.Reader, startPrefix []byte, endPrefix []byte, check func(key []byte) error) error

IterateKeysByPrefixRange will iterate over all entries in the database, where the key starts with a prefixes in the range [startPrefix, endPrefix] (both inclusive). We require that startPrefix <= endPrefix (otherwise this function errors). On every such key, the `check` function is called. If `check` errors, iteration is aborted. In other words, error returned by the iteration functions will be propagated to the caller. No errors expected during normal operations.

func KeyExists

func KeyExists(r storage.Reader, key []byte) (exist bool, errToReturn error)

KeyExists returns true if a key exists in the database. When this returned function is executed (and only then), it will write into the `keyExists` whether the key exists. No errors are expected during normal operation.

func KeyPartToBytes

func KeyPartToBytes(v interface{}) []byte

func LookupCollectionPayload

func LookupCollectionPayload(r storage.Reader, blockID flow.Identifier, txIDs *[]flow.Identifier) error

LookupCollection looks up the collection for a given cluster payload.

func LookupEventsByBlockID

func LookupEventsByBlockID(r storage.Reader, blockID flow.Identifier, events *[]flow.Event) error

func LookupEventsByBlockIDEventType

func LookupEventsByBlockIDEventType(r storage.Reader, blockID flow.Identifier, eventType flow.EventType, events *[]flow.Event) error

func LookupExecutionReceipts

func LookupExecutionReceipts(r storage.Reader, blockID flow.Identifier, receiptIDs *[]flow.Identifier) error

LookupExecutionReceipts finds all execution receipts by block ID

func LookupExecutionResult

func LookupExecutionResult(r storage.Reader, blockID flow.Identifier, resultID *flow.Identifier) error

LookupExecutionResult finds execution result ID by block

func LookupLastVersionBeaconByHeight added in v0.39.2

func LookupLastVersionBeaconByHeight(
	r storage.Reader,
	maxHeight uint64,
	versionBeacon *flow.SealedVersionBeacon,
) error

Returns storage.ErrNotFound if no version beacon exists at or below the given height.

func LookupLightTransactionResultsByBlockIDUsingIndex

func LookupLightTransactionResultsByBlockIDUsingIndex(r storage.Reader, blockID flow.Identifier, txResults *[]flow.LightTransactionResult) error

LookupLightTransactionResultsByBlockIDUsingIndex retrieves all tx results for a block, but using tx_index index. This correctly handles cases of duplicate transactions within block.

func LookupOwnExecutionReceipt

func LookupOwnExecutionReceipt(r storage.Reader, blockID flow.Identifier, receiptID *flow.Identifier) error

LookupOwnExecutionReceipt finds execution receipt ID by block

func LookupResultApproval

func LookupResultApproval(r storage.Reader, resultID flow.Identifier, chunkIndex uint64, approvalID *flow.Identifier) error

LookupResultApproval finds a ResultApproval by result ID and chunk index. Returns `storage.ErrNotFound` if no Approval for the given key (resultID, chunkIndex) has been stored.

NOTE that the Flow protocol requires multiple approvals for the same chunk from different verification nodes. In other words, there are multiple different approvals for the same chunk. Therefore, the index Executed Chunk ➜ ResultApproval ID (queried here) is *only safe* to be used by Verification Nodes for tracking their own approvals (for the same ExecutionResult, a Verifier will always produce the same approval)

func LookupServiceEventsByBlockID

func LookupServiceEventsByBlockID(r storage.Reader, blockID flow.Identifier, events *[]flow.Event) error

func LookupStateCommitment

func LookupStateCommitment(r storage.Reader, blockID flow.Identifier, commit *flow.StateCommitment) error

LookupStateCommitment gets a state commitment keyed by block ID

State commitments are keyed by the block whose execution results in the state with the given commit.

func LookupTransactionResultErrorMessagesByBlockIDUsingIndex

func LookupTransactionResultErrorMessagesByBlockIDUsingIndex(r storage.Reader, blockID flow.Identifier, txResultErrorMessages *[]flow.TransactionResultErrorMessage) error

LookupTransactionResultErrorMessagesByBlockIDUsingIndex retrieves all tx result error messages for a block, by using tx_index index. This correctly handles cases of duplicate transactions within block.

func LookupTransactionResultsByBlockIDUsingIndex

func LookupTransactionResultsByBlockIDUsingIndex(r storage.Reader, blockID flow.Identifier, txResults *[]flow.TransactionResult) error

LookupTransactionResultsByBlockIDUsingIndex retrieves all tx results for a block, by using tx_index index. This correctly handles cases of duplicate transactions within block.

func MakePrefix

func MakePrefix(code byte, keys ...interface{}) []byte

func Remove

func Remove(key []byte) func(storage.Writer) error

func RemoveByKey

func RemoveByKey(w storage.Writer, key []byte) error

RemoveByKey removes the entity with the given key, if it exists. If it doesn't exist, this is a no-op. Error returns: * generic error in case of unexpected database error

func RemoveByKeyPrefix

func RemoveByKeyPrefix(reader storage.Reader, w storage.Writer, key []byte) error

RemoveByKeyPrefix removes all keys with the given prefix Error returns: * generic error in case of unexpected database error

func RemoveByKeyRange

func RemoveByKeyRange(reader storage.Reader, w storage.Writer, startPrefix []byte, endPrefix []byte) error

RemoveByKeyRange removes all keys with a prefix that falls within the range [start, end], both inclusive. It returns error if endPrefix < startPrefix no other errors are expected during normal operation

func RemoveByPrefix

func RemoveByPrefix(reader storage.Reader, key []byte) func(storage.Writer) error

func RemoveByRange

func RemoveByRange(reader storage.Reader, startPrefix []byte, endPrefix []byte) func(storage.Writer) error

func RemoveChunkDataPack

func RemoveChunkDataPack(w storage.Writer, chunkID flow.Identifier) error

RemoveChunkDataPack removes the chunk data pack with the given chunk ID. any error are exceptions

func RemoveCollection

func RemoveCollection(w storage.Writer, collID flow.Identifier) error

RemoveCollection removes a collection from the storage. It returns nil if the collection does not exist. any error returned are exceptions

func RemoveComputationResultUploadStatus added in v0.39.2

func RemoveComputationResultUploadStatus(
	w storage.Writer,
	blockID flow.Identifier) error

RemoveComputationResult removes an instance of ComputationResult with given ID.

func RemoveEventsByBlockID

func RemoveEventsByBlockID(r storage.Reader, w storage.Writer, blockID flow.Identifier) error

func RemoveExecutionResultIndex

func RemoveExecutionResultIndex(w storage.Writer, blockID flow.Identifier) error

RemoveExecutionResultIndex removes execution result indexed by the given blockID

func RemoveOwnExecutionReceipt

func RemoveOwnExecutionReceipt(w storage.Writer, blockID flow.Identifier) error

RemoveOwnExecutionReceipt removes own execution receipt index by blockID

func RemoveServiceEventsByBlockID

func RemoveServiceEventsByBlockID(r storage.Reader, w storage.Writer, blockID flow.Identifier) error

func RemoveStateCommitment

func RemoveStateCommitment(w storage.Writer, blockID flow.Identifier) error

RemoveStateCommitment removes the state commitment by block ID

func RemoveTransactionResultsByBlockID

func RemoveTransactionResultsByBlockID(r storage.Reader, w storage.Writer, blockID flow.Identifier) error

RemoveTransactionResultsByBlockID removes the transaction results for the given blockID

func Retrieve

func Retrieve(key []byte, entity interface{}) func(storage.Reader) error

func RetrieveByKey

func RetrieveByKey(r storage.Reader, key []byte, entity interface{}) (errToReturn error)

RetrieveByKey will retrieve the binary data under the given key from the database and decode it into the given entity. The provided entity needs to be a pointer to an initialized entity of the correct type. Error returns:

  • storage.ErrNotFound if the key does not exist in the database
  • generic error in case of unexpected failure from the database layer, or failure to decode an existing database value

func RetrieveChunkDataPack

func RetrieveChunkDataPack(r storage.Reader, chunkID flow.Identifier, c *storage.StoredChunkDataPack) error

RetrieveChunkDataPack retrieves a chunk data pack by chunk ID. it returns storage.ErrNotFound if the chunk data pack is not found

func RetrieveChunkLocator added in v0.39.1

func RetrieveChunkLocator(r storage.Reader, locatorID flow.Identifier, locator *chunks.Locator) error

func RetrieveCollection

func RetrieveCollection(r storage.Reader, collID flow.Identifier, collection *flow.LightCollection) error

func RetrieveCollectionID

func RetrieveCollectionID(r storage.Reader, txID flow.Identifier, collectionID *flow.Identifier) error

LookupCollectionID retrieves a collection id by transaction id

func RetrieveEvents

func RetrieveEvents(r storage.Reader, blockID flow.Identifier, transactionID flow.Identifier, events *[]flow.Event) error

func RetrieveExecutedBlock

func RetrieveExecutedBlock(r storage.Reader, blockID *flow.Identifier) error

func RetrieveExecutionReceiptMeta

func RetrieveExecutionReceiptMeta(r storage.Reader, receiptID flow.Identifier, meta *flow.ExecutionReceiptMeta) error

RetrieveExecutionReceiptMeta retrieves a execution receipt meta by ID.

func RetrieveExecutionResult

func RetrieveExecutionResult(r storage.Reader, resultID flow.Identifier, result *flow.ExecutionResult) error

RetrieveExecutionResult retrieves a transaction by fingerprint.

func RetrieveExecutionStateInteractions

func RetrieveExecutionStateInteractions(
	r storage.Reader,
	blockID flow.Identifier,
	executionSnapshots *[]*snapshot.ExecutionSnapshot,
) error

func RetrieveJobAtIndex added in v0.39.1

func RetrieveJobAtIndex(r storage.Reader, queue string, index uint64, entity *flow.Identifier) error

RetrieveJobAtIndex returns the entity at the given index

func RetrieveJobLatestIndex added in v0.39.1

func RetrieveJobLatestIndex(r storage.Reader, queue string, index *uint64) error

func RetrieveLightTransactionResult

func RetrieveLightTransactionResult(r storage.Reader, blockID flow.Identifier, transactionID flow.Identifier, transactionResult *flow.LightTransactionResult) error

func RetrieveLightTransactionResultByIndex

func RetrieveLightTransactionResultByIndex(r storage.Reader, blockID flow.Identifier, txIndex uint32, transactionResult *flow.LightTransactionResult) error

func RetrieveProcessedIndex

func RetrieveProcessedIndex(r storage.Reader, jobName string, processed *uint64) error

RetrieveProcessedIndex returns the processed index for a job consumer

func RetrieveResultApproval

func RetrieveResultApproval(r storage.Reader, approvalID flow.Identifier, approval *flow.ResultApproval) error

RetrieveResultApproval retrieves an approval by ID. Returns `storage.ErrNotFound` if no Approval with the given ID has been stored.

func RetrieveTransaction

func RetrieveTransaction(r storage.Reader, txID flow.Identifier, tx *flow.TransactionBody) error

RetrieveTransaction retrieves a transaction by fingerprint.

func RetrieveTransactionResult

func RetrieveTransactionResult(r storage.Reader, blockID flow.Identifier, transactionID flow.Identifier, transactionResult *flow.TransactionResult) error

func RetrieveTransactionResultByIndex

func RetrieveTransactionResultByIndex(r storage.Reader, blockID flow.Identifier, txIndex uint32, transactionResult *flow.TransactionResult) error

func RetrieveTransactionResultErrorMessage

func RetrieveTransactionResultErrorMessage(r storage.Reader, blockID flow.Identifier, transactionID flow.Identifier, transactionResultErrorMessage *flow.TransactionResultErrorMessage) error

RetrieveTransactionResultErrorMessage retrieves a transaction result error message by block ID and transaction ID.

func RetrieveTransactionResultErrorMessageByIndex

func RetrieveTransactionResultErrorMessageByIndex(r storage.Reader, blockID flow.Identifier, txIndex uint32, transactionResultErrorMessage *flow.TransactionResultErrorMessage) error

RetrieveTransactionResultErrorMessageByIndex retrieves a transaction result error message by block ID and index.

func SetJobLatestIndex added in v0.39.1

func SetJobLatestIndex(w storage.Writer, queue string, index uint64) error

func SetProcessedIndex

func SetProcessedIndex(w storage.Writer, jobName string, processed uint64) error

SetProcessedIndex updates the processed index for a job consumer with given index

func TransactionResultErrorMessagesExists

func TransactionResultErrorMessagesExists(r storage.Reader, blockID flow.Identifier, blockExists *bool) error

TransactionResultErrorMessagesExists checks whether tx result error messages exist in the database.

func Traverse

func Traverse(prefix []byte, iterFunc IterationFunc, opt storage.IteratorOption) func(storage.Reader) error

func TraverseByPrefix

func TraverseByPrefix(r storage.Reader, prefix []byte, iterFunc IterationFunc, opt storage.IteratorOption) error

Traverse will iterate over all keys with the given prefix error returned by the iteration functions will be propagated to the caller. No other errors are expected during normal operation.

func UnsafeIndexCollectionByTransaction

func UnsafeIndexCollectionByTransaction(w storage.Writer, txID flow.Identifier, collectionID flow.Identifier) error

UnsafeIndexCollectionByTransaction inserts a collection id keyed by a transaction id Unsafe because a transaction can belong to multiple collections, indexing collection by a transaction will overwrite the previous collection id that was indexed by the same transaction id To prevent overwritting, the caller must check if the transaction is already indexed, and make sure there is no dirty read before the writing by using locks.

func UnsafeIndexResultApproval

func UnsafeIndexResultApproval(w storage.Writer, resultID flow.Identifier, chunkIndex uint64, approvalID flow.Identifier) error

UnsafeIndexResultApproval inserts a ResultApproval ID keyed by ExecutionResult ID and chunk index. Unsafe means that it does not check if a different approval is indexed for the same chunk, and will overwrite the existing index. CAUTION:

  • In general, the Flow protocol requires multiple approvals for the same chunk from different verification nodes. In other words, there are multiple different approvals for the same chunk. Therefore, this index Executed Chunk ➜ ResultApproval ID is *only safe* to be used by Verification Nodes for tracking their own approvals (for the same ExecutionResult, a Verifier will always produce the same approval)
  • In order to make sure only one approval is indexed for the chunk, _all calls_ to `UnsafeIndexResultApproval` must be synchronized by the higher-logic. Currently, we have the convention that `store.ResultApprovals` is the only place that is allowed to call this method.

func UpdateExecutedBlock

func UpdateExecutedBlock(w storage.Writer, blockID flow.Identifier) error

func Upsert

func Upsert(key []byte, val interface{}) func(storage.Writer) error

func UpsertByKey

func UpsertByKey(w storage.Writer, key []byte, val interface{}) error

UpsertByKey will encode the given entity using msgpack and will insert the resulting binary data under the provided key. If the key already exists, the value will be overwritten. Error returns:

  • generic error in case of unexpected failure from the database layer or encoding failure.

func UpsertCollection

func UpsertCollection(w storage.Writer, collection *flow.LightCollection) error

UpsertCollection inserts a light collection into the storage. If the collection already exists, it will be overwritten.

func UpsertComputationResultUploadStatus added in v0.39.2

func UpsertComputationResultUploadStatus(w storage.Writer, blockID flow.Identifier,
	wasUploadCompleted bool) error

UpsertComputationResult upserts given existing instance of ComputationResult in local BadgerDB.

func UpsertTransaction

func UpsertTransaction(w storage.Writer, txID flow.Identifier, tx *flow.TransactionBody) error

UpsertTransaction inserts a transaction keyed by transaction fingerprint. It overwrites any existing transaction, which is ok because tx is unique by its ID

Types

type Callbacks

type Callbacks struct {
	sync.RWMutex // protect callbacks
	// contains filtered or unexported fields
}

func (*Callbacks) AddCallback

func (b *Callbacks) AddCallback(callback func(error))

func (*Callbacks) NotifyCallbacks

func (b *Callbacks) NotifyCallbacks(err error)

type CheckFunc

type CheckFunc func(key []byte) (bool, error)

CheckFunc is a function that checks if the value should be read and decoded. return (true, nil) to read the value and pass it to the CreateFunc and HandleFunc for decoding return (false, nil) to skip reading the value return (false, err) if running into any exception, the iteration should be stopped. when making a CheckFunc to be used in the IterationFunc to iterate over the keys, a sentinel error can be defined and checked to stop the iteration early, such as finding the first key that match certain condition. Note: the returned bool is to decide whether to read the value or not, rather than whether to stop the iteration or not.

type CreateFunc

type CreateFunc func() interface{}

CreateFunc returns a pointer to an initialized entity that we can potentially decode the next value into during a badger DB iteration.

type HandleFunc

type HandleFunc func() error

HandleFunc is a function that starts the processing of the current key-value pair during a badger iteration. It should be called after the key was checked and the entity was decoded. No errors are expected during normal operation. Any errors will halt the iteration.

type IterationFunc

type IterationFunc func() (CheckFunc, CreateFunc, HandleFunc)

func KeyOnlyIterateFunc

func KeyOnlyIterateFunc(fn func(key []byte) error) IterationFunc

KeyOnlyIterateFunc returns an IterationFunc that only iterates over keys

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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