Linux中國

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

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

一、基本 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 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國