新人必讀:區塊鏈實用型技能樹

张开翔發表於2019-12-19

隨著新一波的區塊鏈熱潮,許多同學懷著巨大的熱情進入了這個領域,同時也會遇到不少疑惑,區塊鏈開發需要哪些知識?怎麼學習?從哪裡學習?遇到問題怎麼辦?本文將試圖給區塊鏈領域新人一個快速實用的指引。

一、基本 IT 技能

區塊鏈堪稱“黑科技”,本身具有大量的技術元素,有志於從技術角度切入區塊鏈的人,應該具備或掌握基本的 IT 技能,達到至少是常規級別“程式設計師”或“系統管理員”的技能水平。 

新人必讀:區塊鏈實用型技能樹

首先需要熟練的 Linux 作業系統知識

大多數區塊鏈系統是可以跑在 Linux 上的,包括 CentOS 和 Ubuntu 等,你至少要會一些基本的 Linux 操作指令,比如 ls 檢視目錄、pstop 檢視程式、find 查詢檔案、netstat 檢視網路、ulimit 檢查系統引數限制、df/du 檢視磁碟空間、用 apt/yum 安裝軟體等等,如果這些基本命令都不掌握,在 Linux 上操作肯定是舉步維艱的。

這方面的書和資料都很多,相信一星期就能上手。另外,善於 Linux 的 man 指令,可以獲得每個命令的詳細幫助。如果學會寫 shell 指令碼,那更如虎添翼,可以把大量的繁瑣操作給自動化了。 

要有清晰的網路概念

區塊鏈本來是分散式系統,節點之間一定是通過網路相連的,只是跑起來的話,不需要多高深的網路知識,只需要瞭解什麼是 TCP/IP;公網、內網、本地地址的區別;埠如何配置;節點和節點、SDK 和節點之間的互聯是否會被防火牆和網路策略擋住;採用 ifconfigtelnetpingnetstat 等命令檢查網路資訊和進行探測、定位網路問題。一般來說,Linux 書籍也都會介紹這部分內容。

區塊鏈周邊的支援,如瀏覽器、中介軟體、業務應用,會依賴一些第三方基礎軟體,如 MySQL/MariaDB 資料庫、Nginx 服務、Tomcat 服務等,至少懂得怎麼去安裝指定版本的軟體,掌握修改這些軟體的配置檔案並使之生效的基本操作,瞭解各款軟體的密碼、許可權配置和網路安全策略,以保護自身安全。 

如果是基於雲、Docker 或者 k8s 等容器環境構建,需要了解使用的服務商或容器的功能、效能、配置方式,包括對資源的分配:CPU、記憶體、頻寬、儲存等,以及安全和許可權的配置、網路策略配置、運維方式,達到輕鬆分發構建的同時,還能保持其穩定性和可用性。 

各種雲服務商和容器解決方案都有周全的文件和客服服務渠道,可以幫助使用者順暢地使用。

到程式語言階段,可以根據自己的學習路徑,選擇不同的語言

如果是使用 Java 語言,那就應該熟練掌握 Eclipse、IntelliJ IDEA 等整合 IDE,熟悉 Gradle 為主的工程管理軟體,熟悉 Spring、Springboot 等 Java 的基礎開發元件,熟悉在 IDE 或命令列下對資源路徑如 ApplicationContext 等路徑的定義,或許還有 myBatis 等流行的元件,這些都可以在 Java 相關的社群和網站找到資料和書籍。

在熟練使用 Java 語言的情況下,採用 Java SDK 接入到區塊鏈,跑起一個演示示例,將是非常輕鬆寫意的事情。

如果是採用其他語言,我們也提供了 Python、Node.js、Golang 等語言的區塊鏈 SDK。 

不同的語言,其安裝包有不同的穩定版本,會採用不同的環境和依賴安裝配置方法,會有不同的 IDE 和除錯方法,就不在本文一一羅列,相信學習和使用語言這件事本身,於程式設計師已經是最基本的技能了。

最後,作為在開源世界裡衝浪的玩家,“全球最大同性交友網站”——GitHub 一定是要上的了

註冊 GitHub 賬號,掌握 Git 版本管理工具的基本操作,克隆和拉取開源軟體程式碼,提交議題,提交自己的修改,給開源專案提交拉取請求,再順手點個星標,激情而有範兒,在開源世界裡留下你的姓名。 

二、區塊鏈領域的基礎知識棧

以下部分的知識和區塊鏈或區塊鏈某一個平臺更加相關,從底到上依次是: 

新人必讀:區塊鏈實用型技能樹 

 HASH(雜湊演算法)、簽名、證照

嚴格來說,這並不是區塊鏈領域的專有知識,只是必須具備的基礎知識,包括 SHA3/SHA256/RIPEMD160 等摘要演算法,以及這些演算法和“區塊鏈地址”的關係,基於公私鑰的數字簽名和驗證方法,數字證照的概念和格式,比如 X.509 證照,以及儲存證照/公私鑰的檔案格式,如 PEM 檔案、keystore檔案等。

基礎應用密碼學 

基礎應用密碼學其實範圍很廣,作為入門者,至少要了解對稱和非對稱加密的常見演算法,如 AES 對稱加密,RSA、ECDSA 橢圓曲線等非對稱加密演算法,以及這些演算法在簽名驗籤、資料加密、通訊協商和保護方面的作用。如果要使用國密,那麼需要了解 SM2~SM9 一系列演算法的概念和使用。

分散式網路結構

區塊鏈是先天的“分散式網路系統”,節點和節點通過網路的 P2P 埠互連,客戶端、SDK 通過 RPC/通道埠互連,首先要保證網路之間是互通的,監聽的地址和埠是對的,埠是開放的,防火牆和網路策略是正確的,用於安全連線的證照已經到位,才能保證區塊鏈的“通則不痛”。

這也要求使用者具備基本的網路知識、網路工具,同時瞭解區塊鏈特有的節點型別(共識節點、觀察節點、輕節點等)、互連方式(點對點雙向連線、JSON RPC 的 HTTP 短連線、通道長連線等)。詳情點選參考《FISCO BCOS 網路埠講解》。 

智慧合約

智慧合約可說是應用開發者直面區塊鏈的一道大門,入得此門,精彩無窮。流行的智慧合約語言是 Solidity 語言,這門源自以太坊,從誕生開始就是為區塊鏈而來的。 

Solidity 語言更新活躍、文件完備,具有良好的一致性和事務性,功能足夠實現中型的商業應用。

當然,它在實時除錯、第三庫支援、執行速度等方面還比不上成熟的語言,如果開發者想要用 C++ 等語言編寫智慧合約,那就要對區塊鏈上的計算正規化進行深入瞭解,避免寫出無法共識的智慧合約來,一般是建議有深入的瞭解後再採用 Solidity 之外的其他語言編寫合約。 

要掌握 Solidity 合約,當然是通讀文件,並動手嘗試。具體參考該文件

ABI 介面原理 

在採用 EVM 作為虛擬機器的區塊鏈上,EVM 執行的是 Solidity 語言的合約。合約編譯會生成字尾名為 ABI 的檔案,其實裡面就是該合約介面定義的 JSON 文字,可以用文字檢視器查閱,瞭解你寫的合約如何翻譯成 ABI 裡的介面,介面返回型別,引數列表,引數型別等,只要有合約的 ABI 檔案,就可以呼叫區塊鏈 SDK 的介面,解析這個合約相關的交易、返回值、回執等。

區塊資料結構 

區塊Block有區塊頭和區塊體。區塊體有交易列表,交易列表裡的每個交易Transaction(Tx)有發起方、目標地址、呼叫方法和引數,以及傳送者簽名。交易的結果會生成一個“回執Receipt”,回執裡包含被呼叫方法的返回值、執行過程生成的 EventLog 等……

瞭解這些,基本上就掌握了區塊鏈資料的脈絡,還可以繼續深究資料結構裡的梅克爾根以及對應的梅克爾樹是如何生成的,有什麼作用(如用於 SPV:Simplified PaymentVerification)。具體參考該文件

RPC 介面 

這裡把區塊鏈節點暴露的功能介面統稱為“RPC 介面”。檢視鏈上資料,包括區塊、交易、回執、系統資訊、配置資訊,向鏈上發起交易,以呼叫智慧合約、修改系統配置等,或者通過 AMOP 協議傳送訊息、監聽事件,都是通過 RPC 介面。 

幾十個 RPC 介面建議一一走讀,或善用搜尋,以發現自己想要的介面。

介面通訊採用的協議可能是 JSON RPC,或者是 FISCO BCOS 獨創的通道協議,SDK 基本上已經對介面和協議進行了良好的包裝,也可以在深入理解 ABI 和 RLP 等編碼模式前提下自行開發介面客戶端。具體參考該文件

准入和許可權模型

聯盟鏈強調安全可控,節點准入是第一步,在鏈初始化後,其他節點或者 SDK 配置了相應的證照,才能接入到既有的聯盟鏈上。

鏈上的角色用許可權模型控制,包括管理員許可權、釋出合約的許可權、建立表的許可權、引數配置許可權等,以避免角色之間操作混淆,某些角色既當運動員又當裁判員。

初學者需要仔細閱讀區塊鏈平臺提供的技術文件瞭解原理,遵循操作手冊的步驟進行操作。具體參考該文件

資料儲存模型 

區塊鏈節點會採用檔案資料庫(LevelDB 或 RocksDB),或者關係型資料庫如 MySQL 儲存資料,所以,鏈上是真的有“資料庫”的。 

寫入資料庫的資料包括區塊、交易、回執、合約產生的狀態資料等,是否寫入“呼叫合約產生的歷史資料”根據不同的平臺而定, FISCO BCOS 預設只儲存最新的狀態值,可以選擇性地將修改記錄寫入“回執”或“歷史表”裡進行追蹤。

FISCO BCOS 還提供方案,將歷史資料匯出到鏈下資料庫進行關聯分析。具體參考該文件

共識機制原理

聯盟鏈通常採用外掛化共識機制實現,FISCO BCOS 提供 PBFT 和 RAFT 兩種高效共識演算法,而不會採用“挖礦”這些高耗能低效率的共識。 

共識機制是區塊鏈的靈魂,對共識機制進行深入學習,才可以深入理解區塊鏈通過多方協作、達成高度一致性、支援交易事務性、防篡改防作惡的功效。具體參考該文件

區塊鏈的知識包羅永珍,更深層次的知識還有分散式系統理論、博弈論、前沿密碼學、經濟學、社會學等,掌握以上的基礎知識,再深入學習,舉一反三,用場景去驗證和探索創新式應用,方可發揮技術的潛力,感受分散式商業的魅力。 

三、做一個怎樣的學習者

在這個過程中,希望學習者做到: 

讀文件的耐心 

我們的開源專案文件足有 20 萬字以上的篇幅,公眾號裡還有大量的技術解析和科普文章,這都是程式設計師們在編碼之外,用盡自己僅有的語文儲備,碼出的海量文字,是一筆巨大的技術財富,涵蓋了相關開源專案的方方面面。如果能通讀,或者記住文件結構和標題,需要時快速開啟,足以解惑且深入。

搜資料的能力 

文件、公眾號都有搜尋功能,當想起和開源社群有關的問題時,可以隨手用關鍵字搜尋,一般都能找到答案。如果有語言不詳之處,可以向開源專案團隊提出,或者根據自己的理解進行補充。通用的知識點,如作業系統、網路等,通過公網搜尋引擎,一般都能找到答案。 

排查環境和依賴問題的能力 

開源軟體牽涉的系統環境、第三方軟體、軟體的版本等常常有錯綜複雜的依賴關係,太高或太低的版本都可能會有一些問題,請注意閱讀專案文件對軟硬體環境和依賴的描述,保證自己的環境符合要求,並善用配置管理工具、軟體安裝工具獲取和設定合適的版本。

除錯能力 

如上所述,Solidity 語言的除錯工具完善程度尚未達到完美,但可以善用合約的返回值、EventLog 等方式,通過 WeBASE、控制檯等趁手的工具進行除錯,並查閱 Solidity 文件,瞭解問題可能出在哪裡。

區塊鏈節點的日誌開啟 debug 級別後,也會列印詳細的資訊,可以查閱執行日誌,獲取執行資訊和可能的錯誤資訊,將這些資訊與自己所做的操作比如發交易的流程結合起來進行分析,提高除錯效率。 

同時,目前的開源軟體通常會在螢幕上列印錯誤原因和解決問題的提示,仔細檢視操作反饋,大概率能瞭解錯誤原因和解決方案。

程式碼閱讀能力 

開源軟體的最大效能是把程式碼毫無遺漏的攤到了開發者和學習者面前,瞭解程式碼結構,查閱程式碼裡的關鍵流程,用關鍵字去搜尋程式碼裡的對應實現,都可以深入系統細節,挖掘設計思想,定位問題,尋找優化方法。一個好學且硬核的程式設計師,足可通過程式碼,和世界對話。 

問問題的方式方法 

“一個好問題,比答案還重要”。我們的社群非常活躍,大家都很熱情地答覆和解決問題。我們鼓勵在社群裡公開提出問題,一方面使大家都可以分享問題,找到解決方案,另一方面提問者也可以得到更多人的幫助。同時,希望提問者提出問題時,一次性描述詳盡,把相關的操作步驟、系統環境、軟體版本、出錯提示以及希望得到的解決方案都提出來。 

如果是通用性的問題,可以先搜尋再提問,有利於培養獨立解決問題的能力。希望提問者能向社群反饋更深層次的問題,以幫助社群快速優化。對很多典型問題,社群也積累了一些行之有效的解決方案,我們會整理和公佈出來,以便查閱。

從新人到老鳥的路也許漫漫,如果能參考這篇小文的一些方法,可以少踩許多坑,多寫一些應用。Enjoy blockchain,社群與你共同進步。

資源連結

新人必讀:區塊鏈實用型技能樹

訂閱“Linux 中國”官方小程式來檢視

相關文章