新聞中心
現(xiàn)在有很多區(qū)塊鏈,但只有少數(shù)幾個獨立的實施方案存在。Tezos是其中之一,作為該鏈的早期架構(gòu)師,我有機會從一開始就參與了它的創(chuàng)建和開發(fā)。早期一個偶然的決定是遵循函數(shù)式編程范式,使用OCaml編程語言來構(gòu)建該鏈。在這段經(jīng)歷中,我發(fā)現(xiàn)函數(shù)式編程和區(qū)塊鏈?zhǔn)欠浅:线m的。讓我們來試試,看看為什么!

安全性
從一開始,很明顯,安全應(yīng)該是技術(shù)設(shè)計選擇的中心。區(qū)塊鏈和加密貨幣為bug提供了一個幾乎最壞的環(huán)境。
關(guān)鍵bug不能被公開討論,因為它們會影響到實時系統(tǒng),但它們需要在許多參與者中同時部署,而不使用可信的第三方。除了隱蔽的錯誤修復(fù)外,這使得解決這些問題的選擇非常少。
對于犯罪黑客來說,發(fā)現(xiàn)這些系統(tǒng)中的漏洞有很大的、直接的經(jīng)濟激勵,因為它們能確保真正的經(jīng)濟價值。
雖然安全是至關(guān)重要的,但不幸的是,沒有萬無一失的方法來確保安全。即使是最嚴(yán)格的方法,如形式化驗證,仍然是昂貴的,并且受制于規(guī)范本身的漏洞。然而,一些技術(shù)上的選擇可以幫助我們。
選擇OCaml作為編程語言的一個主要原因是,它可以幫助消除大類錯誤。作為一種內(nèi)存管理語言,不需要擔(dān)心緩沖區(qū)溢出等問題,但這只是表面現(xiàn)象。Tezos利用OCaml非常強大的靜態(tài)類型系統(tǒng)來執(zhí)行隔離和權(quán)限。管理交易的代碼不能訪問賬本的底層存儲;它甚至不能構(gòu)建它需要寫到存儲的類型。相反,類型系統(tǒng)限制它寫到一個更高的抽象中,這個抽象可以檢查和凈化每一個動作。當(dāng)然,封裝并不是函數(shù)式編程所獨有的,但OCaml的模塊簽名機制使得審查和完善權(quán)限變得非常簡單。
Tezos協(xié)議為Michelson嵌入了一個解釋器,Michelson是Tezos智能合約背后的虛擬機,它本身是靜態(tài)類型和功能的。該解釋器利用OCaml的GADT系統(tǒng)來確保錯誤輸入的Michelson合約甚至不能被構(gòu)建。這是我們從語言本身繼承的另一個不錯的安全屬性。
一句老話聲稱,如果一個程序是用函數(shù)式編程語言編寫的,那么它就能工作。這句話當(dāng)然是輕描淡寫的,盡管我確實記得,經(jīng)過幾個月的開發(fā),Tezos的第一個編譯版本確實在第一次嘗試中運行,并且能夠處理交易。
這些屬性都不能保證安全,但它們能解決更明顯的缺陷,使程序員和安全研究人員能夠?qū)W⒂诟邔哟蔚膯栴}。
如果黃金標(biāo)準(zhǔn)是形式驗證,那么OCaml的地位就非常好。Coq是一個領(lǐng)先的交互式定理檢驗器和證明檢驗器,它是用OCaml寫的,可以自然地輸出OCaml。此外,Coq-of-OCaml可以做相反的事情,從現(xiàn)有的OCaml代碼中準(zhǔn)備Coq代碼。
區(qū)塊鏈看起來像一個函數(shù)式編程問題
隨著Tezos開始成形,我意識到,在實現(xiàn)區(qū)塊鏈時需要解決的許多問題與函數(shù)式程序員非常熟悉的問題類型類似。就其核心而言,區(qū)塊鏈?zhǔn)且环N使用僅附加的數(shù)據(jù)結(jié)構(gòu)來表示可改變狀態(tài)的方式。當(dāng)你用一個累加器持有區(qū)塊時,你得到的就是這個狀態(tài)。這就是我們在函數(shù)式世界中處理數(shù)據(jù)及其不可變性的典型方式。
函數(shù)式編程非常適用的一個問題是處理鏈?zhǔn)街亟M,當(dāng)已經(jīng)應(yīng)用于狀態(tài)的塊需要回滾時,因為不同的分支最終被共識所選擇。當(dāng)數(shù)據(jù)被存儲為功能樹時,網(wǎng)絡(luò)參與者可以有效地撤銷這些塊對狀態(tài)的影響。然后,隨著鏈的進展,你需要用垃圾收集器來清理它并釋放內(nèi)存,這又是函數(shù)式編程世界中非常熟悉的事情。
此外,如果你正在構(gòu)建智能合約,那么你需要一個智能合約語言,這意味著你需要一個編譯器,編譯器往往在函數(shù)式編程中處理得非常好,特別是OCaml。從源語言編譯到目標(biāo)語言時有很多步驟:對文本進行詞法解析以創(chuàng)建單個標(biāo)記,將這些標(biāo)記組裝成一個抽象的語法樹,并對該樹的各個部分進行轉(zhuǎn)換,直到我們到達目標(biāo)語言,有時要經(jīng)過一些中間表示,其中類型系統(tǒng)對轉(zhuǎn)換進行約束。所有這些步驟的代碼在用OCaml編寫時可以非常優(yōu)雅和高效。
編譯后的智能合約,也得益于用函數(shù)式寫法。每個合約都有自己的不可變的數(shù)據(jù)與之相關(guān),所以你不能讓它成為一個純函數(shù)。然而,我們可以做的是將該存儲和合約加載到一個孤立的虛擬機中執(zhí)行。這是最接近純函數(shù)的東西,是確定性的,不受外部值的影響。
為什么是OCaml?
OCaml不是一個明顯的選擇。作為一種編程語言,它仍然有些小眾。然而,它是一種成熟的語言,提供了強類型函數(shù)式編程語言的安全性,同時又不影響性能。它扎根于法國學(xué)術(shù)界,并被Facebook、Jane Street Capital和Docker等公司用于安全敏感項目。它也是一種用于編寫編譯器的流行語言。你可以用OCaml寫出非??勺x、可靠和高效的代碼,雖然它不能防止直接的編程錯誤,但強大的類型系統(tǒng)和函數(shù)式編程帶來的無副作用有助于讓你對代碼的正確性有很高的信心。
Haskell是一種比較流行的函數(shù)式編程語言,它提供了一種基于懶惰評估的非常純粹的范式,但要寫出性能和成語兼?zhèn)涞腍askell代碼是比較困難的。
一個常見的反對意見是,使用像OCaml這樣的不常見的編程語言會使招聘程序員更加困難。這種說法對于試圖招募成千上萬的開發(fā)人員的公司來說可能有一定的分量,但很顯然,早期的核心協(xié)議開發(fā)團隊的最有效規(guī)模要比這小得多。此外,我發(fā)現(xiàn)對構(gòu)建這些類型的系統(tǒng)有訣竅的開發(fā)人員在幾個月內(nèi)學(xué)會這門語言并不困難。
WhatsApp能夠通過一個小型的、專注的Erlang開發(fā)者團隊擴展到數(shù)以億計的用戶,這在早期給了我很大的啟發(fā),我想說,這種啟發(fā)經(jīng)得起時間的考驗。
雖然OCaml被用于Tezos的基礎(chǔ),但圍繞它構(gòu)建工具和應(yīng)用程序的開發(fā)者社區(qū)通常用各種流行語言來做。同樣,對于編寫智能合約,有一些高級語言可以給你帶來類似Python或JavaScript的體驗,這只是一些例子。
結(jié)論
總之,區(qū)塊鏈和函數(shù)式編程之間存在著非常自然的契合,如果不使用正確的工具來完成正確的工作,那將是一種恥辱! 有許多問題有待解決,各地的開發(fā)者有機會應(yīng)用他們的技能,為這個新生(但蓬勃發(fā)展)的類別建立更好的工具、應(yīng)用程序和基礎(chǔ)設(shè)施。
當(dāng)前標(biāo)題:為什么函數(shù)式編程非常適合開發(fā)區(qū)塊鏈?
文章起源:http://fisionsoft.com.cn/article/cdisjdj.html


咨詢
建站咨詢
