💾Bridge Daemon
An overview of the Bridge Daemon
Last updated
An overview of the Bridge Daemon
Last updated
The Bridge Daemon
is implemented in the same way as other daemons in the dYdX Chain open source software. Specifically, the daemon:
will be run in process as go routines, and
will use gRPC for communication with the main application.
Application initializes gRPC server
The daemon initializes gRPC client
need to make a connection to localhost:9090
for query service
need to make a connection to unix socket for private daemon service
Let n
be the nextRecognizedEventId
on the in-memory BridgeEvents
struct on thex/bridge
module.
Let c
be the ProposeParams.MaxBridgesPerBlock
parameter on the x/bridge
module.
For each Ethereum node endpoint configured, use the eth_getLogs
RPC call with the following parameters:
address
: BridgeContractAddress
topics
: [ sha256(LogBridge(…))
, [ n
, n+1
, … , n+c-1
]]
from_block
: "ethereum block height of last recognized bridge event"
to_block
: "finalized"
For each event returned by each of the Ethereum nodes, send a single, batched AddBridgeEventsRequest
to the server with the events in-order.
To prevent hogging resources (from the validator itself or the remote Ethereum Node), the go routine can sleep until the next iteration. It can use the ProposeParams.ProposeDelayDuration
parameter on the x/bridge
module to determine a suitable sleep time. Ideally it would sleep for no more than about half of this interval.
These should be configurable by a validator.
EthereumNodeRpcEndpoint
: The daemon maintains an Ethereum node RPC endpoint.
Ideally, this should be a list of RPC endpoints and every RPC query will be sent to each node and daemon will only proceed if each node provides the same response. However, if a validator hosts its own Ethereum node, then it can use a single endpoint. All 16 private-testnet validators who responded to a dYdX survey indicated that they will host their own Ethereum full nodes.
BridgeContractAddress
: The bridge contract to query logs from.
Information is stored in the BridgeEvent
struct as described in x/bridge.