原因:1.Go語言具有部署簡單、效能優秀、並行執行效能好、良好語言設計、內建大量函式庫、團隊牛逼等優勢。 2.以太坊和超級帳本都選擇使用Go作為開發語言;這兩大超級區塊鏈的影響力很大,不僅在生態中佔據了大的坑位,事實上還隱性的製定了區塊鏈的標準。
本教學操作環境:windows10系統、GO 1.18、thinkpad t480電腦。
在區塊鏈公鏈的開發圈裡,我們找到了一些流行的程式語言,有C 、Golang、Python和最近新起的Rust等等。
我們稍微對比較有名的專案所採用的程式語言做個統計,如下圖:
#老一代的公鏈,例如Bitcoin,Litcoin一般使用C/C 較多(我們看看那個時間,當時Go還沒起來呢),新一代的公鏈比如以太坊,聯盟鏈翹楚超級賬本,開始較多使用Go語言,當然我們看到Rust的發展勢頭也很猛,近兩年的許多公鏈例如波卡,Grin都開始採用Rust語言開發了。
Go 編譯產生的是一個靜態可執行文件,除了glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種套件、庫的依賴關係,大大減輕了維護的負擔。可直接編譯成機器碼,不依賴其他函式庫,glibc的版本有一定要求,部署就是丟一個檔案上去就完成了。
雖然不如 C 和 Java,但通常比原生 Python 應用程式還是高一個數量級的,適合寫一些瓶頸業務。記憶體佔用也非常省。
Goroutine 和channel 使得編寫高並發的服務端軟體變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單一 Go 應用也能有效的利用多個 CPU 核,並行執行的效能好。
Go 非常簡單,而且很容易學習。從學術的角度講 Go 語言其實非常平庸,不支援許多高階的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範夠簡單、靈活。正是由於 Go 的簡單性,任何的 Python、Elixir、C 、Scala 或 Java 開發者皆可在一月內組建成一個高效的 Go 團隊。
Go目前已經內建了大量的函式庫,特別是網路庫非常強大。更重要的是 Go 自帶完善的工具鏈,大大提升了團隊協作的一致性。例如 gofmt 自動排版 Go 程式碼,很大程度上杜絕了不同人寫的程式碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動執行 gofmt,這樣在寫程式碼的時候可以隨意擺放位置,存檔的時候會自動變成正確排版的程式碼。另外還有 gofix, govet 等非常有用的工具。
Go語言後面的支持者是Google,語言足夠在各種場景下得到檢驗,同時創始人還是C語言之父,後續的發展和創新可期。
Go語言在雲端時代得到了比較廣泛的應用,特別是Docker和K8s這樣的殺手級產品的出現讓Go語言在工程界佔有一席之地除此之外Go語言還有非常多的成功運行中的軟體:
nsq:bitly開源的消息隊列系統,性能非常高,目前他們每天處理數十億條的訊息
packer:用來產生不同平台的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
skynet:分散式調度框架Doozer:分散式同步工具,類似ZooKeeper
Heka:mazila開源的日誌處理系統
cbfs:couchbase開源的分散式檔案系統
tsuru:開源的PAAS平台,和SAE實現的功能一模一樣
groupcache:memcahe作者寫的谷歌下載系統的快取系統
god:類似redis的快取系統,但是支援分散式和擴充性
gor:網路流量抓包與重播工具
除了打鐵還需自身硬之外,還有些機會與運勢,讓區塊鏈選擇的了Go語言。我們來看區塊鏈2.0以來最成功的公鏈和聯盟鏈代表,以太坊和超級帳本Fabric,無一例外都選擇使用Go作為開發語言(雖然以太坊其實也有其他語言的客戶端版本,但進入到Homestead階段以後,Go客戶端佔據了主導地位),這兩大超級區塊鏈的影響力可不是一般項目可以比擬的,不僅在生態中佔據了大的坑位,事實上還隱性的製定了區塊鏈的標準,不論是公鏈中的智慧合約,還是聯盟鏈的技術,都繞不開以太坊和Fabric,那麼對於想要做區塊鏈技術選型的公司來說,最快捷的實現是什麼?
自然是直接複製這兩個專案的創新,再捷徑一點就是直接拿開源程式碼改,那麼自然Go語言就成為後來者的首選,換種語言重新實現一遍難度也不小,而且如果選擇一些創新但不是非常成熟的語言還會缺少一些特定庫的支援從而導致專案無法開展。
許多人對以太坊的影響力毋庸置疑,但實際上Fabric在企業區塊鏈部署上的影響力更不容小覷:
圖表來源《2019年全球企業區塊鏈基準研究報告》
Hyperledger Fabric是已部署的企業區塊鏈網路中使用最多的協定框架,超級帳本Hyperledger(其中Fabric作為旗艦協定)是整合商和軟體開發平台最常支援的協定框架,比例達到了53%。而在所有的區塊鏈技術書籍裡面,有關超級帳本的書籍是賣的最為火爆這個事實也是側面印證了超級帳本Hyperledger的影響力。
#我們在選型程式語言的過程中,考慮了C,C , Java ,但C/C 大專案維護難度大,而Java又略顯笨重,此時Go語言已經在區塊鏈專案上大放異彩,也逐漸形成技術和人才的一個頭部效應,那麼順應潮流進行技術選型自然也會減少初始比原鏈專案所遇到的阻力,當然在逐漸開發過程中,我們也感受到了選用Go語言帶來的便利與優勢。
從技術上來說,區塊鏈節點是需要多模組非同步協同工作的,所以Go語言並發性和通道就顯得非常有優勢,我們看下面交易驗證的例子:
func ValidateTxs(txs []*bc.Tx, block *bc.Block) []*ValidateTxResult { txSize := len(txs) //init the goroutine validate worker var wg sync.WaitGroup workCh := make(chan *validateTxWork, txSize) resultCh := make(chan *ValidateTxResult, txSize) closeCh := make(chan struct{}) for i := 0; i <= validateWorkerNum && i < txSize; i++ { wg.Add(1) go validateTxWorker(workCh, resultCh, closeCh, &wg) } //sent the works for i, tx := range txs { workCh <- &validateTxWork{i: i, tx: tx, block: block} } //collect validate results results := make([]*ValidateTxResult, txSize) for i := 0; i < txSize; i++ { result := <-resultCh results[result.i] = result } close(closeCh) wg.Wait() close(workCh) close(resultCh) return results }
我們使用Routine Ch WaitGroup在30行程式碼之內,就可以建立一個並發的驗證交易的功能,在高配置的伺服器的情況下,可以跑出10萬以上的TPS。
輕鬆變成Go語言大師
從人才上來說,比原鏈核心開發團隊的部分成員之前也沒有做過Go語言開發,但都能夠很快上手,基本上在半個月內能夠參與核心程式碼的開發和維護了(對於從C/C /Java有經驗的開發者尤其輕鬆),這就是語言簡單對團隊建立的好處。
從協作上來說,透過gofmt 自動排版Go 程式碼,能夠讓核心團隊成員甚至社群開發者提交的程式碼風格的差異性降到最小,提升專案的整體品質和可維護性。
Go語言本身的特質和優勢為其做好了鋪墊,而以太坊和超級帳本兩個超級區塊鏈專案的加持也讓Go語言成為了許多區塊鏈專案的首選,比原鏈選用Go語言也充分體會到了其開發區塊鏈底層的優勢,但是無需落入語言之爭的陷阱,講求實用主義才是做工程應有之義,比原鏈核心專案是用Go語言完成,但是周邊的很多子專案也有用Java,Python或JavaScript實現,畢竟生態的多樣性才是一個專案長久的根本。
推薦學習:Golang教學
以上是為什麼用go語言寫區塊鏈的詳細內容。更多資訊請關注PHP中文網其他相關文章!