隨著新一波的區(qū)塊鏈熱潮,許多同學懷著巨大的熱情進入了這個領域,同時也會遇到不少疑惑,區(qū)塊鏈開發(fā)需要哪些知識?怎么學習?從哪里學習?遇到問題怎么辦?本文將試圖給區(qū)塊鏈領域新人一個快速實用的指引。
一、基本IT技能
區(qū)塊鏈堪稱“黑科技”,本身具有大量的技術元素,有志于從技術角度切入區(qū)塊鏈的人,應該具備或掌握基本的IT技能,達到至少是常規(guī)級別“程序員”或“系統(tǒng)管理員”的技能水平。
首先需要熟練的Linux操作系統(tǒng)知識。
大多數(shù)區(qū)塊鏈系統(tǒng)是可以跑在Linux上的,包括CentOS和Ubuntu等,你至少要會一些基本的Linux操作指令,比如ls查看目錄、ps或top查看進程、find查找文件、netstat查看網絡、ulimit檢查系統(tǒng)參數(shù)限制、df/du查看磁盤空間、用apt/yum安裝軟件等等,如果這些基本命令都不掌握,在Linux上操作肯定是舉步維艱的。
這方面的書和資料都很多,相信一星期就能上手。另外,善于Linux的man指令,可以獲得每個命令的詳細幫助。如果學會寫shell腳本,那更如虎添翼,可以把大量的繁瑣操作給自動化了。
要有清晰的網絡概念。
區(qū)塊鏈本來是分布式系統(tǒng),節(jié)點之間一定是通過網絡相連的,只是跑起來的話,不需要多高深的網絡知識,只需要了解什么是TCP/IP;公網、內網、本地地址的區(qū)別;端口如何配置;節(jié)點和節(jié)點、SDK和節(jié)點之間的互聯(lián)是否會被防火墻和網絡策略擋住;采用ifconfig、telnet、ping、netstat等命令檢查網絡信息和進行探測、定位網絡問題。一般來說,Linux書籍也都會介紹這部分內容。
區(qū)塊鏈周邊的支持,如瀏覽器、中間件、業(yè)務應用,會依賴一些第三方基礎軟件,如MySQL/MariaDB數(shù)據(jù)庫、Nginx服務、Tomcat服務等,至少懂得怎么去安裝指定版本的軟件,掌握修改這些軟件的配置文件并使之生效的基本操作,了解各款軟件的密碼、權限配置和網絡安全策略,以保護自身安全。
如果是基于云、docker或者k8s等容器環(huán)境構建,需要了解使用的服務商或容器的功能、性能、配置方式,包括對資源的分配:CPU、內存、帶寬、存儲等,以及安全和權限的配置、網絡策略配置、運維方式,達到輕松分發(fā)構建的同時,還能保持其穩(wěn)定性和可用性。
各種云服務商和容器解決方案都有周全的文檔和客服服務渠道,可以幫助用戶順暢地使用。
到編程語言階段,可以根據(jù)自己的學習路徑,選擇不同的語言。
如果是使用Java語言,那就應該熟練掌握Eclipse、IntelliJ IDEA等集成IDE,熟悉Gradle為主的工程管理軟件,熟悉Spring、Springboot等java的基礎開發(fā)組件,熟悉在IDE或命令行下對資源路徑如ApplicationContext等路徑的定義,或許還有myBatis等流行的組件,這些都可以在java相關的社區(qū)和網站找到資料和書籍。
在熟練使用Java語言的情況下,采用Java SDK接入到區(qū)塊鏈,跑起一個Demo Sample,將是非常輕松寫意的事情。
如果是采用其他語言,我們也提供了Python、Node.js、Golang等語言的區(qū)塊鏈SDK。
不同的語言,其安裝包有不同的穩(wěn)定版本,會采用不同的環(huán)境和依賴安裝配置方法,會有不同的IDE和調試方法,就不在本文一一羅列,相信學習和使用語言這件事本身,于程序員已經是最基本的技能了。
最后,作為在開源世界里沖浪的玩家,“全球最大同性交友網站”——github一定是要上的了。
注冊github賬號,掌握git版本管理工具的基本操作,clone和pull開源軟件代碼,提交issue,commit自己的修改,給開源項目提交pull request,再順手點個star,激情而有范兒,在開源世界里留下你的姓名。
二、區(qū)塊鏈領域的基礎知識棧
以下部分的知識和區(qū)塊鏈或區(qū)塊鏈某一個平臺更加相關,從底到上依次是:
HASH(哈希算法)、簽名、證書
嚴格來說,這并不是區(qū)塊鏈領域的專有知識,只是必須具備的基礎知識,包括SHA3/SHA256/RIPEMD160等摘要算法,以及這些算法和“區(qū)塊鏈地址”的關系,基于公私鑰的數(shù)字簽名和驗證方法,數(shù)字證書的概念和格式,比如X.509證書,以及保存證書/公私鑰的文件格式,如PEM文件、keystore文件等。
基礎應用密碼學
基礎應用密碼學其實范圍很廣,作為入門者,至少要了解對稱和非對稱加密的常見算法,如AES對稱加密,RSA、ECDSA橢圓曲線等非對稱加密算法,以及這些算法在簽名驗簽、數(shù)據(jù)加密、通信協(xié)商和保護方面的作用。如果要使用國密,那么需要了解SM2~SM9一系列算法的概念和使用。
分布式網絡結構
區(qū)塊鏈是先天的“分布式網絡系統(tǒng)”,節(jié)點和節(jié)點通過網絡的P2P端口互連,客戶端、SDK通過RPC/Channel端口互連,首先要保證網絡之間是互通的,監(jiān)聽的地址和端口是對的,端口是開放的,防火墻和網絡策略是正確的,用于安全連接的證書已經到位,才能保證區(qū)塊鏈的“通則不痛”。
這也要求使用者具備基本的網絡知識、網絡工具,同時了解區(qū)塊鏈特有的節(jié)點類型(共識節(jié)點、觀察節(jié)點、輕節(jié)點等)、互連方式(點對點雙向連接、JSON RPC的HTTP短連接、Channel長連接等)。詳情點擊參考《FISCO BCOS網絡端口講解》。
智能合約
智能合約可說是應用開發(fā)者直面區(qū)塊鏈的一道大門,入得此門,精彩無窮。流行的智能合約語言是Solidity語言,這門源自以太坊,從誕生開始就是為區(qū)塊鏈而來的。
Solidity語言更新活躍、文檔完備,具有良好的一致性和事務性,功能足夠實現(xiàn)中型的商業(yè)應用。
當然,它在實時調試、第三庫支持、運行速度等方面還比不上成熟的語言,如果開發(fā)者想要用C++等語言編寫智能合約,那就要對區(qū)塊鏈上的計算范式進行深入了解,避免寫出無法共識的智能合約來,一般是建議有深入的了解后再采用Solidity之外的其他語言編寫合約。
要掌握Solidity合約,當然是通讀文檔,并動手嘗試。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/smart_contract.html
ABI接口原理
在采用EVM作為虛擬機的區(qū)塊鏈上,EVM執(zhí)行的是Solidity語言的合約。合約編譯會生成后綴名為ABI的文件,其實里面就是該合約接口定義的JSON文本,可以用文本查看器查閱,了解你寫的合約如何翻譯成ABI里的接口,接口返回類型,參數(shù)列表,參數(shù)類型等,只要有合約的ABI文件,就可以調用區(qū)塊鏈SDK的接口,解析這個合約相關的交易、返回值、回執(zhí)等。
區(qū)塊數(shù)據(jù)結構
區(qū)塊(Block)有區(qū)塊頭和區(qū)塊體。區(qū)塊體有交易列表,交易列表里的每個交易(Transaction或Tx)有發(fā)起方、目標地址、調用方法和參數(shù),以及發(fā)送者簽名。交易的結果會生成一個“回執(zhí)(Receipt)”,回執(zhí)里包含被調用方法的返回值、運行過程生成的EventLog等……
了解這些,基本上就掌握了區(qū)塊鏈數(shù)據(jù)的脈絡,還可以繼續(xù)深究數(shù)據(jù)結構里的merkle root以及對應的merkle tree是如何生成的,有什么作用(如用于SPV:Simplified PaymentVerification)。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/protocol_description.html
RPC接口
這里把區(qū)塊鏈節(jié)點暴露的功能接口統(tǒng)稱為“RPC接口”。查看鏈上數(shù)據(jù),包括區(qū)塊、交易、回執(zhí)、系統(tǒng)信息、配置信息,向鏈上發(fā)起交易,以調用智能合約、修改系統(tǒng)配置等,或者通過AMOP協(xié)議發(fā)送消息、監(jiān)聽事件,都是通過RPC接口。
幾十個RPC接口建議一一走讀,或善用搜索,以發(fā)現(xiàn)自己想要的接口。
接口通信采用的協(xié)議可能是JSON RPC,或者是FISCO BCOS獨創(chuàng)的Channel協(xié)議,SDK基本上已經對接口和協(xié)議進行了良好的包裝,也可以在深入理解ABI和RLP等編碼模式前提下自行開發(fā)接口客戶端。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html
準入和權限模型
聯(lián)盟鏈強調安全可控,節(jié)點準入是第一步,在鏈初始化后,其他節(jié)點或者SDK配置了相應的證書,才能接入到既有的聯(lián)盟鏈上。
鏈上的角色用權限模型控制,包括管理員權限、發(fā)布合約的權限、創(chuàng)建表的權限、參數(shù)配置權限等,以避免角色之間操作混淆,某些角色既當運動員又當裁判員。
初學者需要仔細閱讀區(qū)塊鏈平臺提供的技術文檔了解原理,遵循操作手冊的步驟進行操作。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/permission_control.html
數(shù)據(jù)存儲模型
區(qū)塊鏈節(jié)點會采用文件數(shù)據(jù)庫(LevelDB或RocksDB),或者關系型數(shù)據(jù)庫如MySQL保存數(shù)據(jù),所以,鏈上是真的有“數(shù)據(jù)庫”的。
寫入數(shù)據(jù)庫的數(shù)據(jù)包括區(qū)塊、交易、回執(zhí)、合約產生的狀態(tài)數(shù)據(jù)等,是否寫入“調用合約產生的歷史數(shù)據(jù)”根據(jù)不同的平臺而定,F(xiàn)ISCO BCOS默認只保存最新的狀態(tài)值,可以選擇性地將修改記錄寫入“回執(zhí)”或“歷史表”里進行追蹤。
FISCO BCOS還提供方案,將歷史數(shù)據(jù)導出到鏈下數(shù)據(jù)庫進行關聯(lián)分析。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/storage/index.html
共識機制原理
聯(lián)盟鏈通常采用插件化共識機制實現(xiàn),F(xiàn)ISCO BCOS提供PBFT和RAFT兩種高效共識算法,而不會采用“挖礦”這些高耗能低效率的共識。
共識機制是區(qū)塊鏈的靈魂,對共識機制進行深入學習,才可以深入理解區(qū)塊鏈通過多方協(xié)作、達成高度一致性、支持交易事務性、防篡改防作惡的功效。具體參考以下文檔:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/consensus/index.html
區(qū)塊鏈的知識包羅萬象,更深層次的知識還有分布式系統(tǒng)理論、博弈論、前沿密碼學、經濟學、社會學等,掌握以上的基礎知識,再深入學習,舉一反三,用場景去驗證和探索創(chuàng)新式應用,方可發(fā)揮技術的潛力,感受分布式商業(yè)的魅力。
三、做一個怎樣的學習者
在這個過程中,希望學習者做到:
讀文檔的耐心
我們的開源項目文檔足有20萬字以上的篇幅,公眾號里還有大量的技術解析和科普文章,這都是程序員們在coding之外,用盡自己僅有的語文儲備,碼出的海量文字,是一筆巨大的技術財富,涵蓋了相關開源項目的方方面面。如果能通讀,或者記住文檔結構和標題,需要時快速打開,足以解惑且深入。
搜資料的能力
文檔、公眾號都有搜索功能,當想起和開源社區(qū)有關的問題時,可以隨手用關鍵字搜索,一般都能找到答案。如果有語言不詳之處,可以向開源項目團隊提出,或者根據(jù)自己的理解進行補充。通用的知識點,如操作系統(tǒng)、網絡等,通過公網搜索引擎,一般都能找到答案。
排查環(huán)境和依賴問題的能力
開源軟件牽涉的系統(tǒng)環(huán)境、第三方軟件、軟件的版本等常常有錯綜復雜的依賴關系,太高或太低的版本都可能會有一些問題,請注意閱讀項目文檔對軟硬件環(huán)境和依賴的描述,保證自己的環(huán)境符合要求,并善用配置管理工具、軟件安裝工具獲取和設置合適的版本。
調試能力
如上所述,Solidity語言的調試工具完善程度尚未達到完美,但可以善用合約的返回值、EventLog等方式,通過WeBASE、控制臺等趁手的工具進行調試,并查閱Solidity文檔,了解問題可能出在哪里。
區(qū)塊鏈節(jié)點的日志開啟debug級別后,也會打印詳細的信息,可以查閱運行日志,獲取運行信息和可能的錯誤信息,將這些信息與自己所做的操作比如發(fā)交易的流程結合起來進行分析,提高調試效率。
同時,目前的開源軟件通常會在屏幕上打印錯誤原因和解決問題的提示,仔細查看操作反饋,大概率能了解錯誤原因和解決方案。
代碼閱讀能力
開源軟件的最大效能是把代碼毫無遺漏的攤到了開發(fā)者和學習者面前,了解代碼結構,查閱代碼里的關鍵流程,用關鍵字去搜索代碼里的對應實現(xiàn),都可以深入系統(tǒng)細節(jié),挖掘設計思想,定位問題,尋找優(yōu)化方法。一個好學且硬核的程序員,足可通過代碼,和世界對話。
問問題的方式方法
“一個好問題,比答案還重要”。我們的社區(qū)非常活躍,大家都很熱情地答復和解決問題。我們鼓勵在社區(qū)里公開提出問題,一方面使大家都可以分享問題,找到解決方案,另一方面提問者也可以得到更多人的幫助。同時,希望提問者提出問題時,一次性描述詳盡,把相關的操作步驟、系統(tǒng)環(huán)境、軟件版本、出錯提示以及希望得到的解決方案都提出來。
如果是通用性的問題,可以先搜索再提問,有利于培養(yǎng)獨立解決問題的能力。希望提問者能向社區(qū)反饋更深層次的問題,以幫助社區(qū)快速優(yōu)化。對很多典型問題,社區(qū)也積累了一些行之有效的解決方案,我們會整理和公布出來,以便查閱。
從新人到老鳥的路也許漫漫,如果能參考這篇小文的一些方法,可以少踩許多坑,多寫一些應用。Enjoy blockchain,社區(qū)與你共同進步。
責任編輯:ct
評論