我為什麼用GO語言來做區塊鏈?

來源:互聯網
上載者:User

——區塊鏈兄弟,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者聚集地

作者:Syed Jafar Naqvi

來源:Medium

發表時間:Nov 8, 2017

原文連結:https://medium.com/karachain/why-i-am-building-a-blockchain-in-go-6395a60b24dd

稿源:部落格園

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

本文約1700字+,閱讀(觀看)需要20分鐘


Go語言現在常常被用來做去中心化系統(decentralised system)。其他類型的公司也都把Go用在產品的核心模組中,並且它在網站開發中也佔據了一席之地。

我們在決定做Karachain的時候,考量(benchmark)了C,C++, Java, 甚至NodeJs,我們也試著用一些演算法來作為考量標準。而現在,我表示我們正在用Go來實現此目標,並且感覺不錯。

啊,現在建造一個區塊鏈,恰如當時建造一個作業系統!

我們在建造像區塊鏈平台這樣複雜的東西時,把注意力放在了那些核心問題上。經過差不多4周的開發與探索,我們才發現這門奇妙的語言是如何優雅地解答了我們的難題。


長期項目中的易維護代碼

Go語言很簡單。並且每次你中途休息(cessation)之後回到代碼中時,它沒有那麼多詭異的錯誤(quirk)來浪費你的時間。再加上,它所需要的學習量很少,因為它的文法比較福士,開發人員的學習曲線很平緩,這樣的特性本身就很吸引開發人員。這也導致(facilitate)出現Bug的幾率很低。所以整個開發過程顯得如此簡單快速。

一般來講,代碼量越多,項目越難維護。而一個區塊鏈系統需要的代碼可達幾千行,所以我們需要一門語言,來讓維護變得輕鬆。


輕鬆變成Go語言大師

我們初期有20位出色的工程師,大多來自JavaScript, Java, 和Python,也有的是系統工程師,善使C器。

我們自然需要同一個語言來協同工作。說服(convince)他們來學習Go非常容易,但讓他們一個月速成Go語言工程師,卻也是挺簡單。。。我倒不確定選擇其他語言是否也能有此神速。


速度與效率

不似Python, Go不是一種解釋型語言——它是編譯型的。這大大地(drastically)減少了在運行中突然出現的Bug。這一點有點像C語言,代碼先被編譯,錯誤會在編譯時間出現並得到處理,然後才能運行;但是,它比C更進階,比JavaScript和Python更具生產力。

一個區塊鏈非常需要高效性,鑒於其使用的是加密(cryptographic)演算法,鑒於它把大量資料轉送(propagate)於網路,並儲存於網路。


為分布式系統而生

這一點,在那些用Golang打造的工具和軟體中顯而易見。Docker,作為一種微服務的容器,也是用Golang打造。

我們已經看到了我們能用Golang打造的微服務輕鬆駕馭百萬數量的請求。


Goroutines

並發(Concurrency)是讓幾個程式或者一個程式的幾個部分同時間運行,或者說並行,以提升電腦的輸送量(throughput)。通常,在Java或其他一些語言中,通過線程(threads)來實現並發。而Go則用的是“Goroutines”方法。Goroutines就是說一些函數,它們可以同另外的一些函數同時被執行。一個Goroutine在記憶體中佔用大概4kb,而一個線程需要大約1024kb的記憶體。所以,Goroutines同其他語言所使用的線程比起來,小了250倍,這使得它也可以同時執行不斷增加的其他Goroutines。

以下是Go語言在處理線程方面與Java的不同之處:

在Java中,對象(object)在工作單元間共用,其中某一單元為了訪問到這個資料,必須先得到它的對象鎖。在Golang中,工作單元間共用一種被稱為通道(channel)的東西,一個通道基本上就是一個先入先出通道(FIFO pipe)——工作單元可以向通道發起資料讀寫。

Go語言遵循著它的準則——“不要通過記憶體共用進行通訊,應當通過通訊來共用記憶體”(not to communicate by sharing memory, instead share memory by communicating)。

並行操作對於區塊鏈是有著特殊意義的。同時跑大量函數——這一巧妙而天然的特性使得Go程式靈活地運行於分布式系統,這正是區塊鏈的主要需求。不過這一特性早已被發掘,有Docker,MongoDB,Netflix,Uber等等等,他們的產品功能也都主要依賴於高並發。


區塊鏈領域的所有人都用它

很多基於穩定區塊鏈的DApps和tools都是用的Go語言。你所需要的某個功能,很輕鬆就能找到一個相對應的庫。

Go是編譯型的,所以直接由作業系統執行。這讓我們可以更自如地實現像以太坊沙箱(EVM (Ethereum Virtual Machine))一樣的技術。而如果是Java,因為它本身的運行載體JVM就是一個虛擬機器,要再在上面做一個沙箱,實質是更高一層的抽象,這完全沒有必要,會浪費電腦資源。

當然,Go的使用體驗像是指令碼語言,學習成本很低,所以非常適合小型項目。而在QPS(The Queries per second)上,比起Java好太多,所以又適合用來構建高請求量的服務。


一些美妙的Go程式碼片段

1, 這個是輕易地從一個函數返回一個指標到局部變數:

2, 你可以在函數內部再定義另外的函數並可以用函數作為傳回值,其中的局部變數會被當做閉包內變數:

3, 基於對象編程:


Go語言是簡單而易學的,是簡潔而易懂的。“實用主義”是它的標籤,效能高於觀感。它被設計用於團隊型工作,並且,效果十分出色。

文章發布只為分享區塊鏈技術內容,著作權歸原作者所有,觀點僅代表作者本人,絕不代表區塊鏈兄弟贊同其觀點或證實其描述。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.