基于區(qū)塊鏈技術(shù)的全棧開發(fā)平臺ArcBlock介紹
ArcBlock 是誰,為什么他們喜歡 BEAM?
ArcBlock 區(qū)塊基石[1]肩負這樣一項使命:大大簡化區(qū)塊鏈技術(shù)并將其迅速應(yīng)用于日常生活之中。為此,他們開發(fā)了一個區(qū)塊鏈全棧開發(fā)平臺,為開發(fā)者提供了輕松構(gòu)建、運行和部署去中心化應(yīng)用(DApps)所需的一切。其平臺的核心是 BEAM 虛擬機。他們?nèi)娜庑湃魏椭С?Erlang 生態(tài)系統(tǒng),并且作為創(chuàng)始贊助人加入了 Erlang 生態(tài)系統(tǒng)基金會。在這篇博文中,ArcBlock 研發(fā)副總裁陳天將談?wù)勊麄優(yōu)槭裁寸姁?BEAM 虛擬機以及將其用作所有希望開發(fā) DApp 的人的基石的益處。
BEAM 和區(qū)塊鏈簡介
在構(gòu)建具有高可用度、容錯能力和可擴展性的實時系統(tǒng)方面,Erlang 是最好的編程語言之一。BEAM 是虛擬機——在我們看來也是默默無聞的英雄。BEAM 的優(yōu)點也適用于在虛擬機上運行的其他語言,包括 Elixir。無論人們使用何種高級編程語言,一切都歸結(jié)于 BEAM。這是技術(shù)中重要的一環(huán),它幫助實現(xiàn)所有重要的百分百可用性。
如今,BEAM 為全球一半以上的互聯(lián)網(wǎng)路由器助力,我們不認為能找到比這更有力的證明了。以下是 BEAM 的一些好處,使其極其適合打造區(qū)塊鏈。
網(wǎng)絡(luò)共識
將 BEAM 作為構(gòu)建去中心化應(yīng)用的關(guān)鍵組件的決定很簡單。首先,區(qū)塊鏈和去中心化應(yīng)用[2]需要在網(wǎng)絡(luò)中的所有節(jié)點上實現(xiàn)一致的狀態(tài)。我們通過使用狀態(tài)副本引擎(也稱為共識引擎)來實現(xiàn)這一點。共識很重要,因為這種機制確保信息添加到區(qū)塊鏈賬本是有效的。為了達成共識,網(wǎng)絡(luò)上的節(jié)點需要對信息達成一致,共識達成后,數(shù)據(jù)就可被添加到分類賬中。可用的引擎很多,我們平臺目前選擇 Tendermint,支持狀態(tài)復(fù)制引擎。
BEAM + DApps
除了共識引擎外,BEAM 是滿足去中心化應(yīng)用其他幾個關(guān)鍵需求的完美解決方案。為了讓去中心化應(yīng)用能在我們的開發(fā)框架中工作,我們需要一個嵌入式數(shù)據(jù)庫來存儲應(yīng)用狀態(tài),以及一個用于區(qū)塊鏈數(shù)據(jù)的索引數(shù)據(jù)庫。在此過程中,我們還需要區(qū)塊鏈節(jié)點能夠監(jiān)聽網(wǎng)絡(luò)上的節(jié)點,并為下一個數(shù)據(jù)區(qū)塊“投票”。對于這些需求,系統(tǒng)需要持續(xù)的響應(yīng)和可用性。
現(xiàn)在,需要注意的是,除了持續(xù)響應(yīng)之外,我們還需要考慮 CPU 任務(wù)。特別是當(dāng)系統(tǒng)遇到 CPU 密集型任務(wù)時,我們的區(qū)塊鏈平臺和服務(wù)不能停止工作。如果系統(tǒng)變得無響應(yīng),則可能發(fā)生潛在的災(zāi)難性錯誤。
代碼熱重載
除了 BEAM 的調(diào)度器,我們喜歡的另一個特性是代碼熱重載。它可以讓你在運行中做幾乎任何事情,而不需要關(guān)閉 BEAM。例如,我們的區(qū)塊鏈應(yīng)用平臺附帶了許多不同的智能合約,開發(fā)者可以使用這些合約使去中心化應(yīng)用的功能更加豐富。然而,通過區(qū)塊鏈,您擁有一個分布式網(wǎng)絡(luò),需要確保每個節(jié)點都行為一致。
在大多數(shù)情況下,開發(fā)者必須更新和重新啟動他們的節(jié)點以啟用最新軟件,這將導(dǎo)致潛在的問題和不必要的宕機。通過 ArcBlock,我們利用 BEAM 的代碼熱重載特性,讓節(jié)點在整個網(wǎng)絡(luò)中動態(tài)地啟用/禁用智能合約。這只需通過發(fā)送交易來完成,該交易告訴系統(tǒng),它應(yīng)該在特定的時間升級軟件。當(dāng)這種情況發(fā)生時,ArcBlock 將告訴 BEAM 安裝新代碼,然后網(wǎng)絡(luò)中的每個節(jié)點都將擁有最新的功能。
速度是相對的
BEAM 使用“演員模型”來模擬真實世界,一切都是不可變的。因此,不需要鎖定狀態(tài)并預(yù)防競爭狀況。當(dāng)然,一切都是有代價的。BEAM 簡單而美麗的不變性可能會導(dǎo)致程序運行得更慢。為了緩解這一潛在的緩慢,ArcBlock 利用 Rust 來幫助 CPU 完成密集的任務(wù),例如為狀態(tài)創(chuàng)建 Merkle-Patricia 樹。再次強調(diào),通過提供簡單的方法來與外部世界溝通,使用 Rust 將性能提高到另一個水平,BEAM 證明了它的價值。
垃圾收集
別讓這個名字欺騙你。垃圾收集是至關(guān)重要的。Erlang 使用動態(tài)內(nèi)存和跟蹤垃圾收集。每個進程都有自己的堆棧和堆,它們被分配在相同的內(nèi)存塊中,并且可以彼此增長。當(dāng)堆棧和堆相遇時,垃圾收集器被觸發(fā),內(nèi)存將被回收。
雖然這個解釋有點技術(shù)性,但是 BEAM 的垃圾收集過程是在進程水平完成的,從而確保不會出現(xiàn)“讓世界停止,讓我清理垃圾”這類的垃圾收集。相反,它確保進程在沒有任何類型的中斷情況下繼續(xù)運行。
OTP
最后但并非最不重要的是,Erlang 提供了一個名為 OTP 的開發(fā)套件,讓開發(fā)者使用在 BEAM 世界中得到認可的最佳實踐的簡單方法。對于任何企業(yè)或區(qū)塊鏈應(yīng)用平臺而言,圍繞行業(yè)標(biāo)準構(gòu)建是必須的,OTP 使利用 BEAM 中開發(fā)者可用的所有優(yōu)點編寫代碼變得容易。
容錯
我們把這一點留到最后是有原因的。這是目前為止 ArcBlock 最依賴 BEAM 的特性。在區(qū)塊鏈領(lǐng)域,它是使 BEAM 優(yōu)于許多競爭對手的技術(shù)。盡管成千上萬的交易同時發(fā)生;但系統(tǒng)特定部分發(fā)生的任何錯誤都不會影響整個節(jié)點。錯誤將可自我修復(fù),使節(jié)點能夠抵御不良行為或特定攻擊。對于向用戶交付服務(wù)或支持生產(chǎn)品質(zhì)的應(yīng)用的任何人來說,這都是一個關(guān)鍵特性。通過引入默認容錯,我們可以確保運行在 ArcBlock 平臺上的任何人都保持在線和可用。
我們相信,BEAM 雖然是多年前設(shè)計的,但其目的是用于區(qū)塊鏈。它為開發(fā)者和像 ArcBlock 這樣的區(qū)塊鏈平臺提供了所有必要的特性,以及運行高并發(fā)、容錯系統(tǒng)的能力,讓開發(fā)者的工作變得更加輕松。