Derek:剖析源碼,一文理解比原鏈
2018年11月17日上午,「2018比原鏈全球開發者大會」正式在杭州國際博覽中心(G20會館)開幕,這是杭州第一次由開源組織舉辦的技術型峰會,也是杭州被譽為區塊鏈之城以來規模最大的一場區塊鏈開發者大賽,100+開發團隊歷經4個月激烈廝殺,16支團隊將在本次大會上展開最終角逐。
在大賽進行過程中,資深程序員,比原社區的開發者Derek作了題為《GO語言公鏈實戰》的分享。這是即將上市的一本圖書,它主要討論了GO語言的使用,而比原鏈是該書剖析GO語言的一個具體項目。
「現在講區塊鏈的書很多,但真正深入公鏈的書不多,而從一個技術語言入手,去剖析區塊鏈技術的就更少了。我認為Go語言是區塊鏈未來的趨勢,我這本書就是想通過對比原代碼的剖析,讓更多程序員了解區塊鏈。」Derek說。
以下為Derek演講,經巴比特整理:
大家好,今天主要和大家分享一下關於比原鏈的技術細節。主要四個方面,第一,比原鏈的總架構;第二,虛擬機的堆棧實現;第三,區塊快速同步和定期同步原理;第四,P2P節點狀態機。
上面是比原鏈總架構圖,比原鏈官方提供了一個三層架構圖,我在這上面細化了一下。第一層是用戶交互層,比原鏈提供兩種用戶交互工具,包括bytomcli、Bytom-dashboard,我們開發者用得比較多。第二層是介面層,ApiServer服務,主要接收交互層工具的請求和處理請求,並響應請求。第三層是內核層,是比原鏈的核心,佔整體代碼54%左右。最主要的兩塊是交易管理,交易的構建、交易的簽名和交易的提交。包括智能合約,它也有這三個過程。智能合約運行在bvm虛擬機,還有Equity語言,今天參賽選手都是用Equity語言做代碼編寫。還有BUTXO,這是比原鏈在比特幣UTXO上做了一些拓展。
再下一層是錢包層,大家用得比較多,這一塊比較簡單,就不說了。然後是共識層,目前主流的共識有兩種,PoW和PoS,比原鏈的宗旨是算力即權力,所以他們選擇PoW方式去做共識。比原鏈在PoW做了一個創新,自主研發了Tensority演算法,基於AI友好型的矩陣計算hash方式。接下來是資料庫,在比原鏈上面用得比較多,對開發者來說把時間換成空間的一種方式。最主要的資料庫有幾個,一個是Core,存放所有主鏈區塊信息和交易信息。還有Wallet,錢包資料庫等。
下面一層是P2P網路層,P2P大家都知道,當年快播用得特別溜。比原鏈在該基礎上面主要實現幾個功能,節點發現,區塊同步、交易同步、快速廣播,快速廣播主要為了挖礦時讓交易能夠在全網儘快達成共識。
說一下虛擬機的運行原理,大家在學校里都學過堆棧,先進先出和先進後出的數據結構。BVM在這裡就是先進後出的數據結構。第一步操作,假設堆棧里有兩個指令,有兩個元素,X和Y。這時候入站的話,將2入站到站中,就是XY和2。當出站操作時,它是先進後出的原理,首先會從棧中推出一個元素,比如說常數2從站點推出來。下面是執行DUP的指令,複製指令,將棧中元素再複製一個元素放入到棧當中。我們可以看到原有的是X和2,然後通過執行到DUP指令之後就變成X,2和2。這是一個虛擬機,我們在虛擬機發布指令,都會涉及指令進站出站的操作,這是堆棧虛擬機。
下面說一下區塊,區塊早期一般都是定期同步,這種情況下在一個區塊鏈網路上比較緩慢。比原鏈在上面做了快速同步機制,我們可以看到這兩邊的區別,它是根據Checkpoints,是比特幣最早提出來的,用於檢驗舊區塊是否有分叉。所以比原鏈在Checkpoints做了快速同步,基於當前節點在Checkpoints高度節點範圍內就使用快速同步,不然就是定期同步。
快速同步的話,從當前節點和已知節點中找到已知最優對等節點進行加密握手鏈接,加密握手鏈接之後會向它發送請求,發送請求範圍是從當前高度到Checkpoint範圍,最大是128個區塊,一次請求會請求128個最大。然後它就會驗證區塊,添加到本地區塊鏈上面,這是快速同步。定期同步,前面流程都是一樣,但是到後面因為為了安全問題,每次這個塊還沒有出來的時候只請求一個區塊,再驗證,再添加到本地。添加完之後會最後通知對等節點,告訴它最新節點高度和區塊hash。
下面再簡單介紹一下P2P節點狀態機,狀態機的話,大家應該在學校里都學過,它是一種狀態的切換。不知道大家有沒有看過一些P2P源碼,在比原鏈里有7種狀態的定義。當前節點和對等節點進行連接的時候,對等節點的初始狀態是Unknown,經過不同包的發送切換不同的狀態。由Unknown一直往下切,整個狀態機圖表大概是這樣的。
這裡面包含幾個策略,比如說當前節點和對等節點剛開始加密握手連接之後,大家的狀態都是Unknown,然後發一些Ping包,對等節點返回一些Pong包,狀態節點就會被切換。直到它會將對等節點加入到自己路由表中,就會和對等節點建立一些交易和區塊的發送。不光是比原,包括比特幣和以太坊,所有幣種都是用KAD去實現這種路由表。KAD是一個路由演算法,它是基於兩個節點的ID進行異貨算出來一個邏輯距離。這個距離不是實際物理地址,比如我在中國,我在美國,這也有可能建立連接。並不是說我在中國和杭州建立最近的連接,它是邏輯的距離。
下面說一下今天來的目的,前面都是一些鋪墊。今天主要和大家介紹一下,我和我的小夥伴在9月初時,寫了一本書,目前的進度是2/3,大約是在明年年初就能出版。《GO語言公鏈實戰》裡面的內容是和比特幣有點類似,但又比精通比特幣內容豐富很多,包括原理上的實現和演算法上的實現,都會以比原鏈底層代碼作為鋪墊,在上面展示出來。
※通證威觀點:零風險賺到錢的互聯網通證經濟案例解析
※安全公司:知名 DApp EOSDice 由於隨機數問題再次被黑
TAG:巴比特資訊 |