【BSC詳解】2——bsc relayer

bsc-relayer.png

1 簡(jiǎn)介

bsc-relayer 是一個(gè)獨(dú)立進(jìn)程隙券,可單獨(dú)運(yùn)行男应,運(yùn)行時(shí)首先會(huì)向 BSC 查詢是否注冊(cè)過(guò),如果沒(méi)有是尔,則會(huì)自動(dòng)在 BSC 上注冊(cè),需要 deposit 100 BNB(目前合計(jì)約 22 大不溜多軟妹幣......)开仰,注冊(cè)成功后拟枚,該 bsc-relayer 的信息被記錄在 BSC 上名叫 RelayerHub.sol 的 solidity 系統(tǒng)合約中薪铜,之后就可以執(zhí)行中繼的服務(wù)了。

bsc-relayer 主要有兩個(gè)功能:

  • 拉取 BC 的塊頭恩溅,并同步給 BSC
  • 拉取 BC 的跨鏈數(shù)據(jù)包隔箍,并同步跨鏈數(shù)據(jù)包給 BSC

BSC 上存在 solidity 兩個(gè)系統(tǒng)合約(除了這兩個(gè)還有其它的系統(tǒng)合約),分別為 TendermintLightClient.solCrossChain.sol脚乡,bsc-relayer “同步塊頭” 的操作會(huì)調(diào)用 BSC 的 TendermintLightClient.sol蜒滩,“同步跨鏈數(shù)據(jù)包” 的操作會(huì)調(diào)用 BSC 的 CrossChain.sol

除此之外奶稠,bsc-relayer 還有部分其它的功能俯艰,例如本地查詢狀態(tài),tx 追蹤等锌订,這邊暫時(shí)不進(jìn)行詳細(xì)介紹了竹握。

2 bsc-relayer 與 BC、BSC 的連接通道

bsc-relayer 與 BC辆飘、BSC 均通過(guò) RPC 進(jìn)行通信啦辐,RPC 的信息記錄在 config/config.json 文件下。

  1. bsc-relayer <-----> BC
    bsc-relayer 通過(guò)發(fā)送不同的請(qǐng)求信息獲取 BC 上的數(shù)據(jù)蜈项,例如 abci_info芹关、block 等。
  2. bsc-relayer <-----> BSC
    bsc-relayer 直接使用了 Etheruem 提供的 RPC 模塊紧卒,可直接調(diào)用發(fā)送數(shù)據(jù)或者請(qǐng)求侥衬,其中最常用的是 eth_sendRawTransaction 進(jìn)行交易的發(fā)送(用來(lái)調(diào)用前文提到的兩個(gè)合約 TendermintLightClient.solCrossChain.sol)。
bsc-relayer-rpc.png

3 拉取常侦、同步跨鏈數(shù)據(jù)包

3.1 拉取跨鏈?zhǔn)录?info

bsc-relayer 會(huì)一直輪詢每個(gè)高度的 BC 塊的所有 跨鏈?zhǔn)录?/strong>浇冰,事件的格式如下:

{
  "type": "IBCPackage",
  "attributes":
  [
    {
      "key": "IBCPackageInfo",
      "value": "96::8::19"
    }
  ]
}

其中:

  • type 為 "IBCPackage",表示跨鏈包聋亡;
  • key 為 "IBCPackageInfo"肘习,表示跨鏈包的信息;
  • value 通過(guò)“::”分隔為3個(gè)字段坡倔,分別為 CrossChainID of destination chain漂佩、channel idsequence罪塔;
  1. CrossChainID
    對(duì)于 bsc-relayer 來(lái)說(shuō)投蝉,srcCrossChainID 為 BC 的 ChainID,destCrossChainID 為 BSC 的 ChainID征堪。
  2. channel id
    channel id 為跨鏈調(diào)用 BSC 系統(tǒng)合約(solidity)的 id瘩缆,bsc-relayer 中包含有以下 4 個(gè) id:
channel id contract address
BIND_CHANNELID 0x01 TokenManager.sol 0x0000000000000000000000000000000000001008
TRANSFER_IN_CHANNELID 0x02 TokenHub.sol 0x0000000000000000000000000000000000001004
TRANSFER_OUT_CHANNELID 0x02 TokenHub.sol 0x0000000000000000000000000000000000001004
STAKING_CHANNELID 0x08 BSCValidatorSet.sol 0x0000000000000000000000000000000000001000
  1. sequence
    每個(gè) channel id 都對(duì)應(yīng)有一個(gè) sequence,用來(lái)計(jì)數(shù)佃蚜。

(BSC 相關(guān)系統(tǒng)合約邏輯將在后續(xù)章節(jié)中進(jìn)行介紹)

3.2 拉取跨鏈?zhǔn)录?payload

bsc-relayer 根據(jù) channel idsequence 組合生成唯一標(biāo)識(shí)庸娱,通過(guò) RPC 向 BC 請(qǐng)求對(duì)應(yīng)的 payload着绊,這些 payload 以 bytes 的形式傳到 bsc-relayer。

3.3 同步

bsc-relayer 將上述的 payload 生成調(diào)用 CrossChain.sol 的 tx 熟尉,通過(guò) RPC 發(fā)送到 BSC归露。

4 拉取、同步 BC 塊頭

bsc-relayer 拉取的是 BC 的塊頭斤儿,BC 的塊頭本質(zhì)上是 Tendermint 塊頭剧包,這里就不得不先介紹一下 Tendermint 的相關(guān)特性了:

In Tendermint, validators agree on a block before processing it. This means that the signatures and state root for that block aren't included until the next block. Thus, each block contains a field called LastCommit, which contains the votes responsible for committing the previous block, and a field in the block header called AppHash, which refers to the Merkle root hash of the application after processing the transactions from the previous block. So, if we want to verify the AppHash from height H, we need the signatures from LastCommit at height H+1. (And remember that this AppHash only contains the results from all transactions up to and including block H-1)

上文的大概意思是說(shuō),一個(gè)塊的 狀態(tài)簽名 等數(shù)據(jù)需要至少等到下一個(gè)塊才能得到往果,所以如果需要驗(yàn)證高度為 H 的塊疆液,需要等到高度為 H+1 的塊的 LastCommit 信息(聲明一下,本人不是很了解 Tendermint 的算法棚放,如果某些地方說(shuō)的不正確請(qǐng)及時(shí)指明)枚粘。

bsc-relayer 拉取 BC 塊頭的行為完全是 自身驅(qū)動(dòng) 的,當(dāng)出現(xiàn)以下兩種情況時(shí)進(jìn)行觸發(fā):

  1. BC validator 集合更新
    BC 本地會(huì)定期更新 bc-validator 集合飘蚯,BSC 需要獲取每一輪的 bc-validator 集合信息馍迄,用于驗(yàn)證跨鏈數(shù)據(jù),bc-validator 集合信息包括所有 bc-validator 的賬號(hào)局骤、公鑰攀圈、投票(VotingPower)等。
    bsc-relayer 會(huì)一直輪詢每個(gè)高度的 BC 塊的 bc-validator 集合是否發(fā)生變化(包括當(dāng)前正在工作的 bc-validator 集合和下一輪即將更新的 bc-validator 集合)峦甩,如果發(fā)生變化赘来,則會(huì)打包 當(dāng)前工作的 bc-validator 集合信息下一輪更新的 bc-validator 集合信息凯傲、當(dāng)前查詢的 BC 高度的塊頭犬辰,將其生成調(diào)用 TendermintLightClient.sol 的 tx,并發(fā)送到 BSC冰单。
  2. 查到跨鏈數(shù)據(jù)包
    bsc-relayer 會(huì)一直輪詢每個(gè)高度的 BC 塊是否有跨鏈數(shù)據(jù)包幌缝,如果在高度 H 查到了跨鏈數(shù)據(jù)包,如前文所述诫欠,則會(huì)先打包高度為 H+1 的塊頭 和 validator 集合信息涵卵,將其生成調(diào)用 TendermintLightClient.sol 的 tx,并發(fā)送到 BSC荒叼。

5 gas 問(wèn)題

上述可知 bsc-relayer 會(huì)不停向 BSC 發(fā)送交易轿偎,相當(dāng)于中繼自己出 gas 進(jìn)行工作。為了彌補(bǔ)這一損失被廓,BSC 會(huì)在 RelayerIncentivize.sol 系統(tǒng)合約中向 bsc-relayer 發(fā)放系統(tǒng) reward坏晦,reward 應(yīng)該會(huì)遠(yuǎn)高于扣掉的 gas,否則就虧本 gg 了。

6 總結(jié)

bsc-relayer 作為中繼昆婿,不參與處理具體的數(shù)據(jù)結(jié)構(gòu)间护,只是作為數(shù)據(jù)的監(jiān)控者和搬運(yùn)工。

參考

https://github.com/bnb-chain/bsc-relayer.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挖诸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子法精,更是在濱河造成了極大的恐慌多律,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搂蜓,死亡現(xiàn)場(chǎng)離奇詭異狼荞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)帮碰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)相味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人殉挽,你說(shuō)我怎么就攤上這事丰涉。” “怎么了斯碌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵一死,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我傻唾,道長(zhǎng)投慈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任冠骄,我火速辦了婚禮伪煤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凛辣。我一直安慰自己抱既,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布蟀给。 她就那樣靜靜地躺著蝙砌,像睡著了一般跋理。 火紅的嫁衣襯著肌膚如雪择克。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天前普,我揣著相機(jī)與錄音肚邢,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骡湖,可吹牛的內(nèi)容都是我干的贱纠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼响蕴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谆焊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起浦夷,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辖试,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后劈狐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罐孝,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年肥缔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莲兢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡续膳,死狀恐怖改艇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坟岔,我是刑警寧澤遣耍,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站炮车,受9級(jí)特大地震影響舵变,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘦穆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扛或。 院中可真熱鬧绵咱,春花似錦熙兔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至舆声,卻和暖如春柳爽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磷脯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娩脾,地道東北人赵誓。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柿赊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闹瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 系統(tǒng)合約 BSC 的核心在于 系統(tǒng)合約(solidity)展辞,在 【BSC詳解】2——bsc relayer[h...
    ixiaolong閱讀 3,222評(píng)論 0 2
  • 1 簡(jiǎn)介 Binance Chain罗珍,簡(jiǎn)稱 BCBinance Smart Chain洽腺,簡(jiǎn)稱 BSC BC 在20...
    ixiaolong閱讀 1,633評(píng)論 0 0
  • 分片背景 Sharding是以太坊提出的一種解決方案覆旱,用于解決區(qū)塊鏈(如Plasma和Raiden網(wǎng)絡(luò))的可擴(kuò)展性...
    吳偉彬閱讀 2,311評(píng)論 0 1
  • Table of Contents 介紹 Tendermint驗(yàn)證人共識(shí)輕客戶端防止攻擊ABCI Cosmos 概...
    區(qū)塊鏈習(xí)生閱讀 1,868評(píng)論 1 1
  • 跨鏈,狹義上來(lái)說(shuō)是兩個(gè)相對(duì)獨(dú)立的區(qū)塊鏈賬本間進(jìn)行資產(chǎn)互操作的過(guò)程藕坯。跨鏈的實(shí)現(xiàn)形態(tài)主要表現(xiàn)為資產(chǎn)互換和資產(chǎn)轉(zhuǎn)移炼彪,是區(qū)...
    筆名輝哥閱讀 1,392評(píng)論 0 51