bsc-relayer 是壹個獨立進程,可單獨運行,運行時首先會向 BSC 查詢是否註冊過,如果沒有,則會自動在 BSC 上註冊,需要 deposit 100 BNB(目前合計約 22 大不溜多軟妹幣......),註冊成功後,該 bsc-relayer 的信息被記錄在 BSC 上名叫 RelayerHub.sol 的 solidity 系統合約中,之後就可以執行中繼的服務了。
bsc-relayer 主要有兩個功能:
BSC 上存在 solidity 兩個系統合約(除了這兩個還有其它的系統合約),分別為 TendermintLightClient.sol 和 CrossChain.sol ,bsc-relayer “同步塊頭” 的操作會調用 BSC 的 TendermintLightClient.sol ,“同步跨鏈數據包” 的操作會調用 BSC 的 CrossChain.sol 。
除此之外,bsc-relayer 還有部分其它的功能,例如本地查詢狀態,tx 追蹤等,這邊暫時不進行詳細介紹了。
bsc-relayer 與 BC、BSC 均通過 RPC 進行通信,RPC 的信息記錄在 config/config.json 文件下。
bsc-relayer 會壹直輪詢每個高度的 BC 塊的所有 跨鏈事件 ,事件的格式如下:
其中:
(BSC 相關系統合約邏輯將在後續章節中進行介紹)
bsc-relayer 根據 channel id 和 sequence 組合生成唯壹標識,通過 RPC 向 BC 請求對應的 payload ,這些 payload 以 bytes 的形式傳到 bsc-relayer。
bsc-relayer 將上述的 payload 生成調用 CrossChain.sol 的 tx ,通過 RPC 發送到 BSC。
bsc-relayer 拉取的是 BC 的塊頭,BC 的塊頭本質上是 Tendermint 塊頭,這裏就不得不先介紹壹下 Tendermint 的相關特性了:
上文的大概意思是說,壹個塊的 狀態 和 簽名 等數據需要至少等到下壹個塊才能得到,所以如果需要驗證高度為 H 的塊,需要等到高度為 H+1 的塊的 LastCommit 信息(聲明壹下,本人不是很了解 Tendermint 的算法,如果某些地方說的不正確請及時指明)。
bsc-relayer 拉取 BC 塊頭的行為完全是 自身驅動 的,當出現以下兩種情況時進行觸發:
上述可知 bsc-relayer 會不停向 BSC 發送交易,相當於中繼自己出 gas 進行工作。為了彌補這壹損失,BSC 會在 RelayerIncentivize.sol 系統合約中向 bsc-relayer 發放系統 reward,reward 應該會遠高於扣掉的 gas,否則就虧本 gg 了。
bsc-relayer 作為中繼,不參與處理具體的數據結構,只是作為數據的監控者和搬運工。
/bnb-chain/bsc-relayer.git