sc

package
v1.2.0 Latest Latest
Warning

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

Go to latest
Published: Oct 21, 2019 License: GPL-3.0 Imports: 49 Imported by: 0

Documentation

Index

Constants

View Source
const (
	TokenEventChanSize = 10000
	BridgeAddrJournal  = "bridge_addrs.rlp"
)
View Source
const (
	KLAY uint8 = iota
	ERC20
	ERC721
)
View Source
const (
	// Protocol messages belonging to servicechain/1
	StatusMsg = 0x00

	// Below message can be deprecated.
	ServiceChainTxsMsg                     = 0x01
	ServiceChainReceiptResponseMsg         = 0x02
	ServiceChainReceiptRequestMsg          = 0x03
	ServiceChainParentChainInfoResponseMsg = 0x04
	ServiceChainParentChainInfoRequestMsg  = 0x05

	ServiceChainCall     = 0x06
	ServiceChainResponse = 0x07
	ServiceChainNotify   = 0x08
)
View Source
const (
	ErrMsgTooLarge = iota
	ErrDecode
	ErrInvalidMsgCode
	ErrProtocolVersionMismatch
	ErrNetworkIdMismatch
	ErrNoStatusMsg
	ErrUnexpectedTxType
)
View Source
const (
	DefaultBridgeTxGasLimit = 5000000
)
View Source
const ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message
View Source
const (
	SyncRequestInterval = 10
)

Variables

View Source
var (
	ErrInvalidTokenPair     = errors.New("invalid token pair")
	ErrNoBridgeInfo         = errors.New("bridge information does not exist")
	ErrDuplicatedBridgeInfo = errors.New("bridge information is duplicated")
	ErrDuplicatedToken      = errors.New("token is duplicated")
	ErrNoRecovery           = errors.New("recovery does not exist")
	ErrAlreadySubscribed    = errors.New("already subscribed")
	ErrBridgeRestore        = errors.New("restoring bridges is failed")
)
View Source
var (
	SCProtocolName    = "servicechain"
	SCProtocolVersion = []uint{1}
	SCProtocolLength  = []uint64{9}
)
View Source
var (
	ErrVtrDisabled       = errors.New("VTR is disabled")
	ErrVtrAlreadyStarted = errors.New("VTR is already started")
)
View Source
var DefaultConfig = SCConfig{
	NetworkId: 1,
	MaxPeer:   1,
}

DefaultConfig contains default settings for use on the Klaytn main net.

View Source
var (
	ErrGetServiceChainPHInCCEH = errors.New("ServiceChainPH isn't set in ChildChainEventHandler")
)
View Source
var (
	ErrGetServiceChainPHInMCEH = errors.New("ServiceChainPH isn't set in MainChainEventHandler")
)
View Source
var (
	ErrInvalidBridgePair = errors.New("invalid bridge pair")
)
View Source
var (
	ErrRPCDecode = errors.New("failed to decode mainbridge rpc call message")
)
View Source
var (
	NoParentPeerErr = errors.New("no parent peer")
)

Functions

func CreateDB

func CreateDB(ctx *node.ServiceContext, config *SCConfig, name string) database.DBManager

CreateDB creates the chain database.

func InitializeBridgeAccountKeystore added in v1.1.0

func InitializeBridgeAccountKeystore(keystorePath string) (*keystore.KeyStore, common.Address, bool, error)

InitializeBridgeAccountKeystore initializes a keystore, imports existing keys, and tries to unlock the bridge account. This returns the 1st account of the wallet, its address, the lock status and the error.

func NewRpcClientP2P added in v1.1.0

func NewRpcClientP2P(sb *SubBridge) *rpc.Client

func NewValueTransferRecovery

func NewValueTransferRecovery(config *SCConfig, cBridgeInfo, pBridgeInfo *BridgeInfo) *valueTransferRecovery

NewValueTransferRecovery creates a new value transfer recovery structure.

Types

type Backend

type Backend interface {
	bind.ContractBackend
	CurrentBlockNumber(context.Context) (uint64, error)
	BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)
}

Backend wraps all methods for local and remote backend

type BridgeAccounts added in v1.1.0

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

BridgeAccounts manages bridge account for parent/child chain.

func NewBridgeAccounts added in v1.1.0

func NewBridgeAccounts(dataDir string) (*BridgeAccounts, error)

NewBridgeAccounts returns bridgeAccounts created by main/service bridge account keys.

func (*BridgeAccounts) GetBridgeOperators added in v1.1.0

func (ba *BridgeAccounts) GetBridgeOperators() map[string]interface{}

GetBridgeOperators returns the information of bridgeOperator.

type BridgeInfo

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

func NewBridgeInfo

func NewBridgeInfo(sb *SubBridge, addr common.Address, bridge *bridgecontract.Bridge, cpAddr common.Address, cpBridge *bridgecontract.Bridge, account *accountInfo, local, subscribed bool, cpBackend Backend) (*BridgeInfo, error)

func (*BridgeInfo) AddRequestValueTransferEvents

func (bi *BridgeInfo) AddRequestValueTransferEvents(evs []*RequestValueTransferEvent)

AddRequestValueTransferEvents adds events into the pendingRequestEvent.

func (*BridgeInfo) DeregisterToken added in v1.1.0

func (bi *BridgeInfo) DeregisterToken(token, counterpartToken common.Address) error

func (*BridgeInfo) GetCounterPartToken added in v1.1.0

func (bi *BridgeInfo) GetCounterPartToken(token common.Address) common.Address

func (*BridgeInfo) GetCurrentBlockNumber added in v1.2.0

func (bi *BridgeInfo) GetCurrentBlockNumber() (uint64, error)

GetCurrentBlockNumber returns a current block number for each local and remote backend.

func (*BridgeInfo) GetPendingRequestEvents added in v1.1.0

func (bi *BridgeInfo) GetPendingRequestEvents() []*RequestValueTransferEvent

func (*BridgeInfo) GetReadyRequestValueTransferEvents

func (bi *BridgeInfo) GetReadyRequestValueTransferEvents() []*RequestValueTransferEvent

GetReadyRequestValueTransferEvents returns the processable events with the increasing nonce.

func (*BridgeInfo) RegisterToken added in v1.1.0

func (bi *BridgeInfo) RegisterToken(token, counterpartToken common.Address) error

func (*BridgeInfo) UpdateHandledNonce

func (bi *BridgeInfo) UpdateHandledNonce(nonce uint64)

UpdateHandledNonce updates the handled nonce with new nonce.

func (*BridgeInfo) UpdateInfo

func (bi *BridgeInfo) UpdateInfo() error

func (*BridgeInfo) UpdateLowerHandleNonce added in v1.2.0

func (bi *BridgeInfo) UpdateLowerHandleNonce(nonce uint64)

UpdateLowerHandleNonce updates the lower handle nonce.

func (*BridgeInfo) UpdateRequestNonce

func (bi *BridgeInfo) UpdateRequestNonce(nonce uint64)

UpdateRequestNonce updates the request nonce of the bridge.

func (*BridgeInfo) UpdateRequestNonceFromCounterpart

func (bi *BridgeInfo) UpdateRequestNonceFromCounterpart(nonce uint64)

UpdateRequestNonceFromCounterpart updates the request nonce from counterpart bridge.

type BridgeJournal

type BridgeJournal struct {
	ChildAddress  common.Address `json:"childAddress"`
	ParentAddress common.Address `json:"parentAddress"`
	Subscribed    bool           `json:"subscribed"`
}

func (*BridgeJournal) DecodeRLP

func (b *BridgeJournal) DecodeRLP(s *rlp.Stream) error

DecodeRLP decodes the Klaytn

func (*BridgeJournal) EncodeRLP

func (b *BridgeJournal) EncodeRLP(w io.Writer) error

EncodeRLP serializes a BridgeJournal into the Klaytn RLP BridgeJournal format.

type BridgeManager

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

BridgeManager manages Bridge SmartContracts for value transfer between child chain and parent chain

func NewBridgeManager

func NewBridgeManager(main *SubBridge) (*BridgeManager, error)

func (*BridgeManager) AddRecovery

func (bm *BridgeManager) AddRecovery(localAddress, remoteAddress common.Address) error

AddRecovery starts value transfer recovery for a given addresses pair.

func (*BridgeManager) DeleteBridgeInfo

func (bm *BridgeManager) DeleteBridgeInfo(addr common.Address) error

DeleteBridgeInfo deletes the bridge info of the specified address.

func (*BridgeManager) DeleteRecovery

func (bm *BridgeManager) DeleteRecovery(localAddress, remoteAddress common.Address) error

DeleteRecovery deletes the journal and stop the value transfer recovery for a given address pair.

func (*BridgeManager) DeployBridge

func (bm *BridgeManager) DeployBridge(auth *bind.TransactOpts, backend bind.ContractBackend, local bool) (*bridgecontract.Bridge, common.Address, error)

Deploy Bridge SmartContract on same node or remote node

func (*BridgeManager) GetAllBridge

func (bm *BridgeManager) GetAllBridge() []*BridgeJournal

GetAllBridge returns a slice of journal cache.

func (*BridgeManager) GetBridgeInfo

func (bm *BridgeManager) GetBridgeInfo(addr common.Address) (*BridgeInfo, bool)

GetBridge returns bridge contract of the specified address.

func (*BridgeManager) GetCounterPartBridge added in v1.1.0

func (bm *BridgeManager) GetCounterPartBridge(bridgeAddr common.Address) *bridgecontract.Bridge

func (*BridgeManager) GetCounterPartBridgeAddr added in v1.1.0

func (bm *BridgeManager) GetCounterPartBridgeAddr(bridgeAddr common.Address) common.Address

func (*BridgeManager) GetERC20Fee added in v1.1.0

func (bm *BridgeManager) GetERC20Fee(bridgeAddr, tokenAddr common.Address) (*big.Int, error)

GetERC20Fee returns the ERC20 transfer fee on the bridge contract.

func (*BridgeManager) GetFeeReceiver added in v1.1.0

func (bm *BridgeManager) GetFeeReceiver(bridgeAddr common.Address) (common.Address, error)

GetFeeReceiver returns the receiver which can get fee of value transfer request.

func (*BridgeManager) GetKLAYFee added in v1.1.0

func (bm *BridgeManager) GetKLAYFee(bridgeAddr common.Address) (*big.Int, error)

GetKLAYFee returns the KLAY transfer fee on the bridge contract.

func (*BridgeManager) GetOperators added in v1.2.0

func (bm *BridgeManager) GetOperators(bridgeAddr common.Address) ([]common.Address, error)

func (*BridgeManager) GetValueTransferOperatorThreshold added in v1.2.0

func (bm *BridgeManager) GetValueTransferOperatorThreshold(bridgeAddr common.Address) (uint8, error)

func (*BridgeManager) IsValidBridgePair added in v1.1.0

func (bm *BridgeManager) IsValidBridgePair(bridge1, bridge2 common.Address) bool

func (*BridgeManager) LogBridgeStatus

func (bm *BridgeManager) LogBridgeStatus()

LogBridgeStatus logs the bridge contract requested/handled nonce status as an information.

func (*BridgeManager) RegisterOperator added in v1.2.0

func (bm *BridgeManager) RegisterOperator(bridgeAddr, operatorAddr common.Address) (common.Hash, error)

func (*BridgeManager) ResetAllSubscribedEvents

func (bm *BridgeManager) ResetAllSubscribedEvents() error

resetAllSubscribedEvents resets watch logs and recreates a goroutine loop to handle event messages.

func (*BridgeManager) RestoreBridges

func (bm *BridgeManager) RestoreBridges() error

RestoreBridges setups bridge subscription by using the journal cache.

func (*BridgeManager) SetBridgeInfo

func (bm *BridgeManager) SetBridgeInfo(addr common.Address, bridge *bridgecontract.Bridge, cpAddr common.Address, cpBridge *bridgecontract.Bridge, account *accountInfo, local bool, subscribed bool) error

SetBridgeInfo stores the address and bridge pair with local/remote and subscription status.

func (*BridgeManager) SetERC20Fee added in v1.1.0

func (bm *BridgeManager) SetERC20Fee(bridgeAddr, tokenAddr common.Address, fee *big.Int) (common.Hash, error)

SetERC20Fee set the ERC20 transfer fee on the bridge contract.

func (*BridgeManager) SetFeeReceiver added in v1.1.0

func (bm *BridgeManager) SetFeeReceiver(bridgeAddr, receiver common.Address) (common.Hash, error)

SetFeeReceiver set the fee receiver which can get the fee of value transfer request.

func (*BridgeManager) SetJournal

func (bm *BridgeManager) SetJournal(localAddress, remoteAddress common.Address) error

SetJournal inserts or updates journal for a given addresses pair.

func (*BridgeManager) SetKLAYFee added in v1.1.0

func (bm *BridgeManager) SetKLAYFee(bridgeAddr common.Address, fee *big.Int) (common.Hash, error)

SetKLAYFee set the KLAY transfer fee on the bridge contract.

func (*BridgeManager) SetValueTransferOperatorThreshold added in v1.2.0

func (bm *BridgeManager) SetValueTransferOperatorThreshold(bridgeAddr common.Address, threshold uint8) (common.Hash, error)

func (*BridgeManager) Stop

func (bm *BridgeManager) Stop()

Stop closes a subscribed event scope of the bridge manager.

func (*BridgeManager) SubscribeEvent

func (bm *BridgeManager) SubscribeEvent(addr common.Address) error

SubscribeEvent registers a subscription of BridgeERC20Received and BridgeTokenWithdrawn

func (*BridgeManager) SubscribeHandleEvent added in v1.1.0

func (bm *BridgeManager) SubscribeHandleEvent(ch chan<- *HandleValueTransferEvent) event.Subscription

SubscribeHandleEvent registers a subscription of RequestValueTransferEvent.

func (*BridgeManager) SubscribeRequestEvent added in v1.1.0

func (bm *BridgeManager) SubscribeRequestEvent(ch chan<- *RequestValueTransferEvent) event.Subscription

SubscribeRequestEvent registers a subscription of RequestValueTransferEvent.

func (*BridgeManager) UnsubscribeEvent

func (bm *BridgeManager) UnsubscribeEvent(addr common.Address)

UnsubscribeEvent cancels the contract's watch logs and initializes the status.

type BridgePeer

type BridgePeer interface {
	// Close signals the broadcast goroutine to terminate.
	Close()

	// Info gathers and returns a collection of metadata known about a peer.
	Info() *BridgePeerInfo

	Head() (hash common.Hash, td *big.Int)

	// AddToKnownTxs adds a transaction hash to knownTxsCache for the peer, ensuring that it
	// will never be propagated to this particular peer.
	AddToKnownTxs(hash common.Hash)

	// Send writes an RLP-encoded message with the given code.
	// data should have been encoded as an RLP list.
	Send(msgcode uint64, data interface{}) error

	// Handshake executes the Klaytn protocol handshake, negotiating version number,
	// network IDs, difficulties, head, genesis blocks, and onChildChain(if the node is on child chain for the peer)
	// and returning if the peer on the same chain or not and error.
	Handshake(network uint64, chainID, td *big.Int, head common.Hash) error

	// ConnType returns the conntype of the peer.
	ConnType() p2p.ConnType

	// GetID returns the id of the peer.
	GetID() string

	// GetP2PPeerID returns the id of the p2p.Peer.
	GetP2PPeerID() discover.NodeID

	// GetChainID returns the chain id of the peer.
	GetChainID() *big.Int

	// GetAddr returns the address of the peer.
	GetAddr() common.Address

	// SetAddr sets the address of the peer.
	SetAddr(addr common.Address)

	// GetVersion returns the version of the peer.
	GetVersion() int

	// KnowsTx returns if the peer is known to have the transaction, based on knownTxsCache.
	KnowsTx(hash common.Hash) bool

	// GetP2PPeer returns the p2p.
	GetP2PPeer() *p2p.Peer

	// GetRW returns the MsgReadWriter of the peer.
	GetRW() p2p.MsgReadWriter

	// Handle is the callback invoked to manage the life cycle of a Klaytn Peer. When
	// this function terminates, the Peer is disconnected.
	Handle(bn *MainBridge) error

	SendRequestRPC(data []byte) error
	SendResponseRPC(data []byte) error

	// SendServiceChainTxs sends child chain tx data to from child chain to parent chain.
	SendServiceChainTxs(txs types.Transactions) error

	// SendServiceChainInfoRequest sends a parentChainInfo request from child chain to parent chain.
	SendServiceChainInfoRequest(addr *common.Address) error

	// SendServiceChainInfoResponse sends a parentChainInfo from parent chain to child chain.
	// parentChainInfo includes nonce of an account and gasPrice in the parent chain.
	SendServiceChainInfoResponse(pcInfo *parentChainInfo) error

	// SendServiceChainReceiptRequest sends a receipt request from child chain to parent chain.
	SendServiceChainReceiptRequest(txHashes []common.Hash) error

	// SendServiceChainReceiptResponse sends a receipt as a response to request from child chain.
	SendServiceChainReceiptResponse(receipts []*types.ReceiptForStorage) error
}

type BridgePeerInfo

type BridgePeerInfo struct {
	Version int    `json:"version"` // Klaytn Bridge protocol version negotiated
	Head    string `json:"head"`    // SHA3 hash of the peer's best owned block
}

BridgePeerInfo represents a short summary of the Klaytn Bridge sub-protocol metadata known about a connected peer.

type ChildChainEventHandler

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

func NewChildChainEventHandler

func NewChildChainEventHandler(bridge *SubBridge, handler *SubBridgeHandler) (*ChildChainEventHandler, error)

func (*ChildChainEventHandler) ConvertChildChainBlockHashToParentChainTxHash added in v1.1.1

func (cce *ChildChainEventHandler) ConvertChildChainBlockHashToParentChainTxHash(scBlockHash common.Hash) common.Hash

ConvertChildChainBlockHashToParentChainTxHash returns a transaction hash of a transaction which contains AnchoringData, with the key made with given child chain block hash. Index is built when child chain indexing is enabled.

func (*ChildChainEventHandler) HandleChainHeadEvent

func (cce *ChildChainEventHandler) HandleChainHeadEvent(block *types.Block) error

func (*ChildChainEventHandler) HandleLogsEvent

func (cce *ChildChainEventHandler) HandleLogsEvent(logs []*types.Log) error

func (*ChildChainEventHandler) HandleTxEvent

func (cce *ChildChainEventHandler) HandleTxEvent(tx *types.Transaction) error

func (*ChildChainEventHandler) HandleTxsEvent

func (cce *ChildChainEventHandler) HandleTxsEvent(txs []*types.Transaction) error

func (*ChildChainEventHandler) ProcessHandleEvent

func (cce *ChildChainEventHandler) ProcessHandleEvent(ev *HandleValueTransferEvent) error

func (*ChildChainEventHandler) ProcessRequestEvent

func (cce *ChildChainEventHandler) ProcessRequestEvent(ev *RequestValueTransferEvent) error

type HandleValueTransferEvent

type HandleValueTransferEvent struct {
	*bridgecontract.BridgeHandleValueTransfer
}

HandleValueTransferEvent from Bridge contract

type LocalBackend

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

TODO-Klaytn currently LocalBackend is only for ServiceChain, especially Bridge SmartContract

func NewLocalBackend

func NewLocalBackend(main *SubBridge) (*LocalBackend, error)

func (*LocalBackend) BalanceAt added in v1.2.0

func (lb *LocalBackend) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)

func (*LocalBackend) CallContract

func (lb *LocalBackend) CallContract(ctx context.Context, call klaytn.CallMsg, blockNumber *big.Int) ([]byte, error)

func (*LocalBackend) ChainID

func (lb *LocalBackend) ChainID(ctx context.Context) (*big.Int, error)

ChainID can return the chain ID of the chain.

func (*LocalBackend) CodeAt

func (lb *LocalBackend) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error)

func (*LocalBackend) CurrentBlockNumber added in v1.2.0

func (lb *LocalBackend) CurrentBlockNumber(ctx context.Context) (uint64, error)

CurrentBlockNumber returns a current block number.

func (*LocalBackend) EstimateGas

func (lb *LocalBackend) EstimateGas(ctx context.Context, call klaytn.CallMsg) (gas uint64, err error)

func (*LocalBackend) FilterLogs

func (lb *LocalBackend) FilterLogs(ctx context.Context, query klaytn.FilterQuery) ([]types.Log, error)

func (*LocalBackend) PendingCodeAt

func (lb *LocalBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error)

func (*LocalBackend) PendingNonceAt

func (lb *LocalBackend) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)

func (*LocalBackend) SendTransaction

func (lb *LocalBackend) SendTransaction(ctx context.Context, tx *types.Transaction) error

func (*LocalBackend) SubscribeFilterLogs

func (lb *LocalBackend) SubscribeFilterLogs(ctx context.Context, query klaytn.FilterQuery, ch chan<- types.Log) (klaytn.Subscription, error)

func (*LocalBackend) SuggestGasPrice

func (lb *LocalBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error)

func (*LocalBackend) TransactionReceipt

func (lb *LocalBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)

type MainBridge

type MainBridge struct {
	APIBackend *MainBridgeAPI
	// contains filtered or unexported fields
}

MainBridge implements the main bridge of service chain.

func NewMainBridge

func NewMainBridge(ctx *node.ServiceContext, config *SCConfig) (*MainBridge, error)

NewMainBridge creates a new MainBridge object (including the initialisation of the common MainBridge object)

func (*MainBridge) APIs

func (mb *MainBridge) APIs() []rpc.API

APIs returns the collection of RPC services the Klaytn sc package offers. NOTE, some of these services probably need to be moved to somewhere else.

func (*MainBridge) AccountManager

func (mb *MainBridge) AccountManager() *accounts.Manager

func (*MainBridge) BridgePeerSet

func (mb *MainBridge) BridgePeerSet() *bridgePeerSet

BridgePeerSet implements PeerSetManager

func (*MainBridge) ChainDB

func (mb *MainBridge) ChainDB() database.DBManager

func (*MainBridge) Components

func (mb *MainBridge) Components() []interface{}

func (*MainBridge) EventMux

func (mb *MainBridge) EventMux() *event.TypeMux

func (*MainBridge) IsListening

func (mb *MainBridge) IsListening() bool

func (*MainBridge) NetVersion

func (mb *MainBridge) NetVersion() uint64

func (*MainBridge) NodeInfo

func (mb *MainBridge) NodeInfo() *MainBridgeInfo

NodeInfo retrieves some protocol metadata about the running host node.

func (*MainBridge) ProtocolVersion

func (mb *MainBridge) ProtocolVersion() int

func (*MainBridge) Protocols

func (mb *MainBridge) Protocols() []p2p.Protocol

Protocols implements node.Service, returning all the currently configured network protocols to start.

func (*MainBridge) SCProtocol

func (mb *MainBridge) SCProtocol() SCProtocol

func (*MainBridge) SendRPCResponseData added in v1.1.0

func (mb *MainBridge) SendRPCResponseData(data []byte) error

func (*MainBridge) SetComponents

func (mb *MainBridge) SetComponents(components []interface{})

func (*MainBridge) Start

func (mb *MainBridge) Start(srvr p2p.Server) error

Start implements node.Service, starting all internal goroutines needed by the Klaytn protocol implementation.

func (*MainBridge) Stop

func (mb *MainBridge) Stop() error

Stop implements node.Service, terminating all internal goroutines used by the Klaytn protocol.

type MainBridgeAPI

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

MainBridgeAPI Implementation for main-bridge node

func (*MainBridgeAPI) ConvertChildChainBlockHashToParentChainTxHash added in v1.1.1

func (mb *MainBridgeAPI) ConvertChildChainBlockHashToParentChainTxHash(scBlockHash common.Hash) common.Hash

func (*MainBridgeAPI) GetChildChainIndexingEnabled

func (mb *MainBridgeAPI) GetChildChainIndexingEnabled() bool

func (*MainBridgeAPI) NodeInfo

func (mb *MainBridgeAPI) NodeInfo() (*p2p.NodeInfo, error)

NodeInfo retrieves all the information we know about the host node at the protocol granularity.

func (*MainBridgeAPI) Peers

func (mb *MainBridgeAPI) Peers() ([]*p2p.PeerInfo, error)

Peers retrieves all the information we know about each individual peer at the protocol granularity.

type MainBridgeHandler

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

func NewMainBridgeHandler

func NewMainBridgeHandler(scc *SCConfig, main *MainBridge) (*MainBridgeHandler, error)

func (*MainBridgeHandler) HandleSubMsg

func (mbh *MainBridgeHandler) HandleSubMsg(p BridgePeer, msg p2p.Msg) error

type MainBridgeInfo

type MainBridgeInfo struct {
	Network    uint64              `json:"network"`    // Klaytn network ID
	BlockScore *big.Int            `json:"blockscore"` // Total blockscore of the host's blockchain
	Genesis    common.Hash         `json:"genesis"`    // SHA3 hash of the host's genesis block
	Config     *params.ChainConfig `json:"config"`     // Chain configuration for the fork rules
	Head       common.Hash         `json:"head"`       // SHA3 hash of the host's best owned block
}

MainBridgeInfo represents a short summary of the Klaytn sub-protocol metadata known about the host peer.

type MainChainEventHandler

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

func NewMainChainEventHandler

func NewMainChainEventHandler(bridge *MainBridge, handler *MainBridgeHandler) (*MainChainEventHandler, error)

func (*MainChainEventHandler) ConvertChildChainBlockHashToParentChainTxHash added in v1.1.1

func (mce *MainChainEventHandler) ConvertChildChainBlockHashToParentChainTxHash(scBlockHash common.Hash) common.Hash

ConvertChildChainBlockHashToParentChainTxHash returns a transaction hash of a transaction which contains AnchoringData, with the key made with given child chain block hash. Index is built when service chain indexing is enabled.

func (*MainChainEventHandler) GetChildChainIndexingEnabled

func (mce *MainChainEventHandler) GetChildChainIndexingEnabled() bool

GetChildChainIndexingEnabled returns the current child chain indexing configuration.

func (*MainChainEventHandler) GetLastIndexedBlockNumber

func (mce *MainChainEventHandler) GetLastIndexedBlockNumber() uint64

GetLastIndexedBlockNumber returns the last child block number indexed to chain DB.

func (*MainChainEventHandler) HandleChainHeadEvent

func (mce *MainChainEventHandler) HandleChainHeadEvent(block *types.Block) error

func (*MainChainEventHandler) HandleLogsEvent

func (mce *MainChainEventHandler) HandleLogsEvent(logs []*types.Log) error

func (*MainChainEventHandler) HandleTxEvent

func (mce *MainChainEventHandler) HandleTxEvent(tx *types.Transaction) error

func (*MainChainEventHandler) HandleTxsEvent

func (mce *MainChainEventHandler) HandleTxsEvent(txs []*types.Transaction) error

func (*MainChainEventHandler) WriteLastIndexedBlockNumber

func (mce *MainChainEventHandler) WriteLastIndexedBlockNumber(blockNum uint64)

WriteLastIndexedBlockNumber writes the last child block number indexed to chain DB.

type PeerSetManager

type PeerSetManager interface {
	BridgePeerSet() *bridgePeerSet
}

type RemoteBackend

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

TODO-Klaytn currently RemoteBackend is only for ServiceChain, especially Bridge SmartContract

func NewRemoteBackend

func NewRemoteBackend(sb *SubBridge) (*RemoteBackend, error)

func (*RemoteBackend) BalanceAt added in v1.2.0

func (rb *RemoteBackend) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)

func (*RemoteBackend) CallContract

func (rb *RemoteBackend) CallContract(ctx context.Context, call klaytn.CallMsg, blockNumber *big.Int) ([]byte, error)

func (*RemoteBackend) ChainID

func (rb *RemoteBackend) ChainID(ctx context.Context) (*big.Int, error)

ChainID returns the chain ID of the sub-bridge configuration.

func (*RemoteBackend) CodeAt

func (rb *RemoteBackend) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error)

func (*RemoteBackend) CurrentBlockNumber added in v1.2.0

func (rb *RemoteBackend) CurrentBlockNumber(ctx context.Context) (uint64, error)

CurrentBlockNumber returns a current block number.

func (*RemoteBackend) EstimateGas

func (rb *RemoteBackend) EstimateGas(ctx context.Context, msg klaytn.CallMsg) (uint64, error)

func (*RemoteBackend) FilterLogs

func (rb *RemoteBackend) FilterLogs(ctx context.Context, query klaytn.FilterQuery) (result []types.Log, err error)

func (*RemoteBackend) PendingCodeAt

func (rb *RemoteBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error)

func (*RemoteBackend) PendingNonceAt

func (rb *RemoteBackend) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)

func (*RemoteBackend) SendTransaction

func (rb *RemoteBackend) SendTransaction(ctx context.Context, tx *types.Transaction) error

func (*RemoteBackend) SubscribeFilterLogs

func (rb *RemoteBackend) SubscribeFilterLogs(ctx context.Context, query klaytn.FilterQuery, ch chan<- types.Log) (klaytn.Subscription, error)

func (*RemoteBackend) SuggestGasPrice

func (rb *RemoteBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error)

func (*RemoteBackend) TransactionReceipt

func (rb *RemoteBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)

func (*RemoteBackend) TransactionReceiptRpcOutput added in v1.1.0

func (rb *RemoteBackend) TransactionReceiptRpcOutput(ctx context.Context, txHash common.Hash) (r map[string]interface{}, err error)

type RemoteBackendInterface added in v1.1.0

type RemoteBackendInterface interface {
	bind.ContractBackend
	TransactionReceiptRpcOutput(ctx context.Context, txHash common.Hash) (map[string]interface{}, error)
	BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)
}

RemoteBackendInterface wraps methods for remote backend

type RequestValueTransferEvent

type RequestValueTransferEvent struct {
	*bridgecontract.BridgeRequestValueTransfer
}

RequestValueTransferEvent from Bridge contract

func (RequestValueTransferEvent) Nonce added in v1.1.0

func (rEv RequestValueTransferEvent) Nonce() uint64

type SCConfig

type SCConfig struct {
	// Name sets the instance name of the node. It must not contain the / character and is
	// used in the devp2p node identifier. The instance name is "kscn". If no
	// value is specified, the basename of the current executable is used.
	Name string `toml:"-"`

	// BridgeService
	EnabledMainBridge bool
	EnabledSubBridge  bool
	DataDir           string

	// Protocol options
	NetworkId uint64 // Network ID to use for selecting peers to connect to

	// Database options
	SkipBcVersionCheck bool `toml:"-"`
	DatabaseHandles    int  `toml:"-"`
	LevelDBCacheSize   int
	TrieCacheSize      int
	TrieTimeout        time.Duration
	TrieBlockInterval  uint
	ChildChainIndexing bool

	// Network
	MainBridgePort string
	SubBridgePort  string
	MaxPeer        int

	// ServiceChain
	ServiceChainConsensus string
	AnchoringPeriod       uint64
	SentChainTxsLimit     uint64

	ParentChainID      uint64
	VTRecovery         bool
	VTRecoveryInterval uint64
	Anchoring          bool
}

func (*SCConfig) MainBridges

func (c *SCConfig) MainBridges() []*discover.Node

StaticNodes returns a list of node enode URLs configured as static nodes.

func (SCConfig) MarshalTOML

func (s SCConfig) MarshalTOML() (interface{}, error)

MarshalTOML marshals as TOML.

func (*SCConfig) NodeName

func (c *SCConfig) NodeName() string

NodeName returns the devp2p node identifier.

func (*SCConfig) ResolvePath

func (c *SCConfig) ResolvePath(path string) string

ResolvePath resolves path in the instance directory.

func (*SCConfig) UnmarshalTOML

func (s *SCConfig) UnmarshalTOML(unmarshal func(interface{}) error) error

UnmarshalTOML unmarshals from TOML.

type SCProtocol

type SCProtocol struct {
	// Official short name of the protocol used during capability negotiation.
	Name string
	// Supported versions of the Klaytn protocol (first is primary).
	Versions []uint
	// Number of implemented message corresponding to different protocol versions.
	Lengths []uint64
}

Protocol defines the protocol of the consensus

type SubBridge

type SubBridge struct {
	APIBackend *SubBridgeAPI
	// contains filtered or unexported fields
}

SubBridge implements the Klaytn consensus node service.

func NewSubBridge

func NewSubBridge(ctx *node.ServiceContext, config *SCConfig) (*SubBridge, error)

New creates a new CN object (including the initialisation of the common CN object)

func (*SubBridge) APIs

func (s *SubBridge) APIs() []rpc.API

APIs returns the collection of RPC services the ethereum package offers. NOTE, some of these services probably need to be moved to somewhere else.

func (*SubBridge) AccountManager

func (s *SubBridge) AccountManager() *accounts.Manager

func (*SubBridge) BridgePeerSet

func (sb *SubBridge) BridgePeerSet() *bridgePeerSet

implement PeerSetManager

func (*SubBridge) ChainDB

func (s *SubBridge) ChainDB() database.DBManager

func (*SubBridge) Components

func (s *SubBridge) Components() []interface{}

func (*SubBridge) EventMux

func (s *SubBridge) EventMux() *event.TypeMux

func (*SubBridge) GetAnchoringTx

func (sb *SubBridge) GetAnchoringTx() bool

func (*SubBridge) GetBridgeTxPool

func (sb *SubBridge) GetBridgeTxPool() *bridgepool.BridgeTxPool

func (*SubBridge) IsListening

func (s *SubBridge) IsListening() bool

func (*SubBridge) NetVersion

func (s *SubBridge) NetVersion() uint64

func (*SubBridge) NodeInfo

func (pm *SubBridge) NodeInfo() *SubBridgeInfo

NodeInfo retrieves some protocol metadata about the running host node.

func (*SubBridge) ProtocolVersion

func (s *SubBridge) ProtocolVersion() int

func (*SubBridge) Protocols

func (s *SubBridge) Protocols() []p2p.Protocol

Protocols implements node.Service, returning all the currently configured network protocols to start.

func (*SubBridge) SCProtocol

func (s *SubBridge) SCProtocol() SCProtocol

func (*SubBridge) SendRPCData added in v1.1.0

func (sb *SubBridge) SendRPCData(data []byte) error

func (*SubBridge) SetAnchoringTx

func (sb *SubBridge) SetAnchoringTx(flag bool) bool

func (*SubBridge) SetComponents

func (sc *SubBridge) SetComponents(components []interface{})

func (*SubBridge) SetRPCConn added in v1.1.0

func (sb *SubBridge) SetRPCConn(conn net.Conn)

func (*SubBridge) Start

func (s *SubBridge) Start(srvr p2p.Server) error

Start implements node.Service, starting all internal goroutines needed by the Klaytn protocol implementation.

func (*SubBridge) Stop

func (s *SubBridge) Stop() error

Stop implements node.Service, terminating all internal goroutines used by the Klaytn protocol.

type SubBridgeAPI

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

SubBridgeAPI Implementation for sub-bridge node

func (*SubBridgeAPI) AddPeer

func (sb *SubBridgeAPI) AddPeer(url string) (bool, error)

AddPeer requests connecting to a remote node, and also maintaining the new connection at all times, even reconnecting if it is lost.

func (*SubBridgeAPI) Anchoring

func (sb *SubBridgeAPI) Anchoring(flag bool) bool

func (*SubBridgeAPI) ConvertChildChainBlockHashToParentChainTxHash added in v1.1.1

func (sb *SubBridgeAPI) ConvertChildChainBlockHashToParentChainTxHash(cBlockHash common.Hash) common.Hash

func (*SubBridgeAPI) ConvertRequestTxHashToHandleTxHash

func (sb *SubBridgeAPI) ConvertRequestTxHashToHandleTxHash(hash common.Hash) common.Hash

func (*SubBridgeAPI) DeployBridge

func (sb *SubBridgeAPI) DeployBridge() ([]common.Address, error)

func (*SubBridgeAPI) DeregisterBridge

func (sb *SubBridgeAPI) DeregisterBridge(cBridgeAddr common.Address, pBridgeAddr common.Address) error

func (*SubBridgeAPI) DeregisterToken

func (sb *SubBridgeAPI) DeregisterToken(cBridgeAddr, pBridgeAddr, cTokenAddr, pTokenAddr common.Address) error

func (*SubBridgeAPI) GetAnchoring

func (sb *SubBridgeAPI) GetAnchoring() bool

func (*SubBridgeAPI) GetAnchoringPeriod

func (sb *SubBridgeAPI) GetAnchoringPeriod() uint64

func (*SubBridgeAPI) GetAnchoringTxHashByBlockNumber added in v1.2.0

func (sb *SubBridgeAPI) GetAnchoringTxHashByBlockNumber(bn uint64) common.Hash

func (*SubBridgeAPI) GetBridgeInformation

func (sb *SubBridgeAPI) GetBridgeInformation(bridgeAddr common.Address) (map[string]interface{}, error)

func (*SubBridgeAPI) GetChildOperatorAddr added in v1.1.1

func (sb *SubBridgeAPI) GetChildOperatorAddr() common.Address

func (*SubBridgeAPI) GetChildOperatorBalance added in v1.2.0

func (sb *SubBridgeAPI) GetChildOperatorBalance() (*big.Int, error)

func (*SubBridgeAPI) GetChildOperatorNonce added in v1.1.1

func (sb *SubBridgeAPI) GetChildOperatorNonce() uint64

func (*SubBridgeAPI) GetERC20Fee added in v1.1.0

func (sb *SubBridgeAPI) GetERC20Fee(bridgeAddr, tokenAddr common.Address) (*big.Int, error)

func (*SubBridgeAPI) GetFeeReceiver added in v1.1.0

func (sb *SubBridgeAPI) GetFeeReceiver(bridgeAddr common.Address) (common.Address, error)

func (*SubBridgeAPI) GetKLAYFee added in v1.1.0

func (sb *SubBridgeAPI) GetKLAYFee(bridgeAddr common.Address) (*big.Int, error)

func (*SubBridgeAPI) GetLatestAnchoredBlockNumber

func (sb *SubBridgeAPI) GetLatestAnchoredBlockNumber() uint64

func (*SubBridgeAPI) GetOperators added in v1.1.0

func (sb *SubBridgeAPI) GetOperators() map[string]interface{}

GetOperators returns the information of bridge operators.

func (*SubBridgeAPI) GetParentOperatorAddr added in v1.1.1

func (sb *SubBridgeAPI) GetParentOperatorAddr() common.Address

func (*SubBridgeAPI) GetParentOperatorBalance added in v1.2.0

func (sb *SubBridgeAPI) GetParentOperatorBalance() (*big.Int, error)

func (*SubBridgeAPI) GetParentOperatorNonce added in v1.1.1

func (sb *SubBridgeAPI) GetParentOperatorNonce() uint64

func (*SubBridgeAPI) GetParentTransactionReceipt added in v1.1.0

func (sb *SubBridgeAPI) GetParentTransactionReceipt(txHash common.Hash) (map[string]interface{}, error)

func (*SubBridgeAPI) GetReceiptFromParentChain

func (sb *SubBridgeAPI) GetReceiptFromParentChain(blockHash common.Hash) *types.Receipt

func (*SubBridgeAPI) GetRegisteredOperators added in v1.2.0

func (sb *SubBridgeAPI) GetRegisteredOperators(bridgeAddr common.Address) ([]common.Address, error)

func (*SubBridgeAPI) GetSentChainTxsLimit

func (sb *SubBridgeAPI) GetSentChainTxsLimit() uint64

func (*SubBridgeAPI) GetValueTransferOperatorThreshold added in v1.2.0

func (sb *SubBridgeAPI) GetValueTransferOperatorThreshold(bridgeAddr common.Address) (uint8, error)

func (*SubBridgeAPI) ListBridge

func (sb *SubBridgeAPI) ListBridge() []*BridgeJournal

func (*SubBridgeAPI) LockChildOperator added in v1.1.0

func (sb *SubBridgeAPI) LockChildOperator() error

LockChildOperator can lock the child bridge operator.

func (*SubBridgeAPI) LockParentOperator added in v1.1.0

func (sb *SubBridgeAPI) LockParentOperator() error

LockParentOperator can lock the parent bridge operator.

func (*SubBridgeAPI) NodeInfo

func (sb *SubBridgeAPI) NodeInfo() (*p2p.NodeInfo, error)

NodeInfo retrieves all the information we know about the host node at the protocol granularity.

func (*SubBridgeAPI) Peers

func (sb *SubBridgeAPI) Peers() ([]*p2p.PeerInfo, error)

Peers retrieves all the information we know about each individual peer at the protocol granularity.

func (*SubBridgeAPI) RegisterBridge

func (sb *SubBridgeAPI) RegisterBridge(cBridgeAddr common.Address, pBridgeAddr common.Address) error

func (*SubBridgeAPI) RegisterOperator added in v1.2.0

func (sb *SubBridgeAPI) RegisterOperator(bridgeAddr, operatorAddr common.Address) (common.Hash, error)

func (*SubBridgeAPI) RegisterToken

func (sb *SubBridgeAPI) RegisterToken(cBridgeAddr, pBridgeAddr, cTokenAddr, pTokenAddr common.Address) error

func (*SubBridgeAPI) RemovePeer

func (sb *SubBridgeAPI) RemovePeer(url string) (bool, error)

RemovePeer disconnects from a a remote node if the connection exists

func (*SubBridgeAPI) SetERC20Fee added in v1.1.0

func (sb *SubBridgeAPI) SetERC20Fee(bridgeAddr, tokenAddr common.Address, fee *big.Int) (common.Hash, error)

func (*SubBridgeAPI) SetFeeReceiver added in v1.1.0

func (sb *SubBridgeAPI) SetFeeReceiver(bridgeAddr, receiver common.Address) (common.Hash, error)

func (*SubBridgeAPI) SetKLAYFee added in v1.1.0

func (sb *SubBridgeAPI) SetKLAYFee(bridgeAddr common.Address, fee *big.Int) (common.Hash, error)

func (*SubBridgeAPI) SetValueTransferOperatorThreshold added in v1.2.0

func (sb *SubBridgeAPI) SetValueTransferOperatorThreshold(bridgeAddr common.Address, threshold uint8) (common.Hash, error)

func (*SubBridgeAPI) SubscribeBridge

func (sb *SubBridgeAPI) SubscribeBridge(cBridgeAddr, pBridgeAddr common.Address) error

SubscribeBridge enables the given child/parent chain bridges to subscribe the events.

func (*SubBridgeAPI) TxPending

func (sb *SubBridgeAPI) TxPending() map[common.Address]types.Transactions

func (*SubBridgeAPI) TxPendingCount

func (sb *SubBridgeAPI) TxPendingCount() int

func (*SubBridgeAPI) UnlockChildOperator added in v1.1.0

func (sb *SubBridgeAPI) UnlockChildOperator(passphrase string, duration *uint64) error

UnlockChildOperator can unlock the child bridge operator.

func (*SubBridgeAPI) UnlockParentOperator added in v1.1.0

func (sb *SubBridgeAPI) UnlockParentOperator(passphrase string, duration *uint64) error

UnlockParentOperator can unlock the parent bridge operator.

func (*SubBridgeAPI) UnsubscribeBridge

func (sb *SubBridgeAPI) UnsubscribeBridge(cBridgeAddr, pBridgeAddr common.Address) error

UnsubscribeBridge disables the event subscription of the given child/parent chain bridges.

type SubBridgeHandler

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

func NewSubBridgeHandler

func NewSubBridgeHandler(main *SubBridge) (*SubBridgeHandler, error)

func (*SubBridgeHandler) GetAnchoringPeriod

func (sbh *SubBridgeHandler) GetAnchoringPeriod() uint64

GetAnchoringPeriod returns the period to make and send a chain transaction to parent chain.

func (*SubBridgeHandler) GetChildOperatorAddr added in v1.1.1

func (sbh *SubBridgeHandler) GetChildOperatorAddr() *common.Address

GetChildOperatorAddr returns a pointer of a hex address of an account used for child chain. If given as a parameter, it will use it. If not given, it will use the address of the public key derived from chainKey.

func (*SubBridgeHandler) GetLatestAnchoredBlockNumber

func (sbh *SubBridgeHandler) GetLatestAnchoredBlockNumber() uint64

GetLatestAnchoredBlockNumber returns the latest block number whose data has been anchored to the parent chain.

func (*SubBridgeHandler) GetParentOperatorAddr added in v1.1.1

func (sbh *SubBridgeHandler) GetParentOperatorAddr() *common.Address

GetParentOperatorAddr returns a pointer of a hex address of an account used for parent chain. If given as a parameter, it will use it. If not given, it will use the address of the public key derived from chainKey.

func (*SubBridgeHandler) GetReceiptFromParentChain

func (sbh *SubBridgeHandler) GetReceiptFromParentChain(blockHash common.Hash) *types.Receipt

GetReceiptFromParentChain returns a receipt received from parent chain to child chain with corresponding block hash. It assumes that a child chain has only one parent chain.

func (*SubBridgeHandler) GetSentChainTxsLimit

func (sbh *SubBridgeHandler) GetSentChainTxsLimit() uint64

GetSentChainTxsLimit returns the maximum number of stored chain transactions for resending.

func (*SubBridgeHandler) HandleMainMsg

func (sbh *SubBridgeHandler) HandleMainMsg(p BridgePeer, msg p2p.Msg) error

func (*SubBridgeHandler) LocalChainHeadEvent

func (sbh *SubBridgeHandler) LocalChainHeadEvent(block *types.Block)

LocalChainHeadEvent deals with servicechain feature to generate/broadcast service chain transactions and request receipts.

func (*SubBridgeHandler) LockParentOperator added in v1.1.1

func (sbh *SubBridgeHandler) LockParentOperator()

func (*SubBridgeHandler) RegisterNewPeer

func (sbh *SubBridgeHandler) RegisterNewPeer(p BridgePeer) error

func (*SubBridgeHandler) SyncNonceAndGasPrice

func (scpm *SubBridgeHandler) SyncNonceAndGasPrice()

SyncNonceAndGasPrice requests the nonce of address used for service chain tx to parent chain peers.

func (*SubBridgeHandler) UnLockParentOperator added in v1.1.1

func (sbh *SubBridgeHandler) UnLockParentOperator()

func (*SubBridgeHandler) UpdateLatestTxCountAddedBlockNumber added in v1.2.0

func (sbh *SubBridgeHandler) UpdateLatestTxCountAddedBlockNumber(newLatestAnchoredBN uint64)

UpdateLatestTxCountAddedBlockNumber sets the latestTxCountAddedBlockNumber to the block number of the last anchoring tx which was added into bridge txPool.

func (*SubBridgeHandler) WriteAnchoredBlockNumber

func (sbh *SubBridgeHandler) WriteAnchoredBlockNumber(blockNum uint64)

WriteAnchoredBlockNumber writes the block number whose data has been anchored to the parent chain.

func (*SubBridgeHandler) WriteReceiptFromParentChain

func (sbh *SubBridgeHandler) WriteReceiptFromParentChain(blockHash common.Hash, receipt *types.Receipt)

WriteReceiptFromParentChain writes a receipt received from parent chain to child chain with corresponding block hash. It assumes that a child chain has only one parent chain.

type SubBridgeInfo

type SubBridgeInfo struct {
	Network uint64              `json:"network"` // Klaytn network ID
	Genesis common.Hash         `json:"genesis"` // SHA3 hash of the host's genesis block
	Config  *params.ChainConfig `json:"config"`  // Chain configuration for the fork rules
	Head    common.Hash         `json:"head"`    // SHA3 hash of the host's best owned block
	ChainID *big.Int            `json:"chainid"` // ChainID
}

NodeInfo represents a short summary of the ServiceChain sub-protocol metadata known about the host peer.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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