網上有很多關于pos機的報文格式,路由器和核心交換機之間有什么關系的知識,也有很多人為大家解答關于pos機的報文格式的問題,今天pos機之家(www.tonybus.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
pos機的報文格式
免責聲明:本文旨在傳遞更多市場信息,不構成任何投資建議。文章僅代表作者觀點,不代表火星財經官方立場。
小編:記得關注哦
來源:知道創宇
作者:0x7F@知道創宇404實驗室時間:2020年01月09日
原文:https://paper.seebug.org/1110/
0x00 前言隨著技術浪潮的涌動,國家政策的推動,區塊鏈又慢慢的進入了我們的視野中。在 2020 年初這個時刻,不妨我們再回頭看看區塊鏈的發展,聊聊區塊鏈中的幾個技術點,為新的一年打打基礎。
2017 年是數據貨幣大爆發的一年,其標志性事件是 2017 年 12 月比特幣價格達到歷史最高,并將區塊鏈引入公眾的視野中;也因此,2018 年被稱之為區塊鏈元年,各類數字貨幣和與區塊鏈沾邊的技術如雨后春筍般出現在互聯網上;后來隨著區塊鏈的監管力度增大,2019 年則是區塊鏈冷寂的一年,最后經過考驗的都是具有價值的區塊鏈項目。
那么本文,我們就拋開數字貨幣不談,僅從區塊鏈的方面來聊聊;文中使用比特幣 v0.19.x(commit: 0655c7a94cc9bf54d43eceed805e83f1b59e2409)的源碼來幫助理解。
0x01 區塊鏈的簡介區塊鏈隨著比特幣的誕生而誕生,首次出現于比特幣的白皮書中(https://bitcoin.org/bitcoin.pdf),用于存儲比特幣的交易記錄;在比特幣中,根據時序將多條交易記錄整理集中存儲以形成區塊,塊與塊之間采用哈希值的方式連接形成鏈式結構,我們將這種結構稱為區塊鏈。
比特幣中,多個節點通過p2p網絡共同維護一條區塊鏈,使得這種鏈式結構具有去中心化、不可篡改、可追溯等特性。后續的以太坊、超級賬本等項目也都基于這種鏈式結構。
這里我們拋開數字貨幣,把區塊鏈作為主角來看,我們可以更加容易的來理解區塊鏈:區塊鏈就是一個基于P2P的分布式數據庫,以多個節點共同維護一份數據;那么從這個角度來看,比特幣的區塊鏈存儲的「交易記錄」也是數據,只是數據比較特別而已。
0x02 區塊鏈vs分布式數據庫我們可以認為區塊鏈就是基于P2P的分布式數據庫,是因為區塊鏈和分布式數據庫有著相似的目標:使用多個節點來共同維護一份數據。
但我們僅僅以「存儲」這一個操作來理解,并且忽略掉了它們本身的應用場景、默認所有節點都是可信、可靠、無延時通信的、等等。實際環境下,我們需要去考慮如上諸多的因素,因此區塊鏈不能等同于分布式存儲數據庫。
我們使用表格來對比區塊鏈和分布式數據庫:
區塊鏈分布式數據庫
架構分布式分布式
價值主張數字化信任系統高性能存儲和訪問
網絡通信peer-to-peerclient-server
管理方式集中管理分散管理
數據結構鏈式索引、等等
節點關系懷疑 & 制約信任 & 協作
一致性共識算法主從復制
數據持久數據不可變可修改 & 非持久
性能低高
在了解區塊鏈和分布式存儲數據庫的異同點后,我們可以知道無論是分布式存儲數據庫還是區塊鏈,都需要去解決分布式中的問題;并且區塊鏈還需要去解決它所特有的問題。所以我們以分布式存儲數據庫為基礎,來幫助我們理解區塊鏈中所涉及到的技術點。
0x03 分布式中的挑戰1.FLP不可能原理對于分布式系統中的不確定性,Fischer、Lynch和Patterson三位科學家在1985年發表論文并提出FLP不可能原理:在網絡可靠,但允許節點失效(即便只有一個)的最小化異步模型系統中,不存在一個可以解決一致性問題的確定性算法。
所以理論上不存在一個可以完美解決一致性問題的方法,但在工程應用中,我們可以選擇犧牲部分特性,以換取一個可行的方案。
2.CAP原理那么我們應該如何選擇代價,來換取這個可行的方案呢?在 2000 年由 Eric Brewer 教授在 ACM 組織的一個研討會上提出了 CAP 原理:分布式系統不可能同時確保以下三個特性:一致性(Consistency)、可用性(Availability)和分區容忍性(Partition),設計中往往需要弱化對某個特性的保證。
根據 CAP 原理,我們就可以根據不同的需求,對三種特性進行抉擇。如訪問分布式的網站的靜態內容,可以接受數據延遲更新,這是弱化了一致性;而在區塊鏈中,即便犧牲性能也要保證只有一份公認的數據,這是弱化了可用性。
3.拜占庭容錯在分布式數據庫中,節點之間是相互信任的、是忠誠的,它們可能會離線、宕機,但它們絕不會發送錯誤的消息;所以我們可以信任任意一個節點,分布式數據庫常用「主從復制」實現一致性,也就是:從中選擇一個節點作為主節點,其他節點從該節點復制數據,如果該節點出現故障,則重新選擇新的主節點。
而在區塊鏈中節點是自由的加入和退出的,可能會出現惡意節點:該節點可能會離線、宕機,并且會發送錯誤的消息來擾亂數據的一致性;這就是常說的拜占庭將軍問題。
這是 20 世紀 80 年代提出的一個假想問題,描述的是:「一組拜占庭將軍分別各率領一支軍隊共同圍困一座城市,由于各支軍隊處于城市不同方向,所以他們只能通過信使進行聯系;軍隊的行動策略限定為進攻或撤離兩種,部分軍隊進攻部分軍隊撤離都可能會造成災難性后果,因此各位將軍必須通過投票來達成一致策略;每位將軍都將自己投票信息通過信使通知其他將軍,所以每位將軍根據自己的投票和其他所有將軍送來的信息就可以知道投票結果而決定行動策略」。
在上圖中,由叛軍發送錯誤的投票信息引起不一致的問題,稱之為「拜占庭錯誤」,能夠處理拜占庭錯誤的方法稱為「拜占庭容錯」(Byzantine Fault Tolerance)。那么區塊鏈中是如何解決的呢?
0x04 共識算法PBFT算法PBFT(Practical Byzantine Fault Tolerance) 算法的提出主要就是為了解決拜占庭錯誤。其算法的核心為三大階段:pre-prepare階段(預準備階段),prepare階段(準備階段),commit階段(提交階段),我們以下圖來理解該算法。
其中 C 表示發起請求客戶端,0123 表示服務節點,3 節點出現了故障,用 f 表示故障節點的個數。
C 向 0 節點發起請求0 節點廣播該請求到其他服務節點節點在收到 pre-prepare 消息后,可以選擇接受和拒絕該消息,接收該消息則廣播 prepare 消息到其他服務節點當一個節點在 prepare 階段并收到 2f 個 prepare 消息后,進入到 commit 階段,廣播 commit 消息到其他服務節點當一個節點在 commit 階段并收到 2f+1 個 commit 消息后(包括它自己),發送消息給 C 客戶端當 C 客戶端收到 f+1 個 reply 消息后,表示共識已經完成PBFT 中節點數必須滿足 N >= 3f+1 這個關系,只要節點中的故障節點不超過 1/3 時,就可以完成共識確定一致性。由于 PBFT 算法的特性以及性能問題,所以其常用于小規模聯盟鏈中。
PoW算法比特幣中使用 PoW(Proof of Work) 算法,即為工作量證明算法。其算法的核心為利用復雜的數學計算競爭一次添加區塊的機會,結合「不利原則」,并僅認可最長的鏈為合法的鏈 這一規則,完成節點共識。
在比特幣中,PoW 的工作方式如下:
用戶發起交易,由節點廣播交易至所有節點節點收到交易打包并將其放入塊中某一節點計算出了哈希結果,獲得添加區塊的機會,將 2 中的塊添加到區塊鏈尾部,并廣播區塊至所有節點節點收到新的區塊信息后,驗證區塊合法性,合法后將其添加到區塊鏈尾部,并進入下一輪的競爭通過 PoW 算法,比特幣可以允許全網有 50% 的節點錯誤的情況下,依然能夠完成共識。
PoW 算法的實現PoW 算法位于區塊生成的模塊中(挖礦)。我們先看看比特幣的啟動流程,比特幣程序入口位于 bitcoind.cpp下,通過這樣的調用鏈啟動比特幣中的各項服務:
main->AppInit->AppInitMain
其中包括 RPC 服務,在比特幣中我們需要使用 bitcoin-cli通過 RPC 服務啟動挖坑,最終到rpc/mining.cpp/generateBlocks這個區塊生成主邏輯:
其中 pow.cpp/CheckProofOfWork函數進行了 PoW 算法的驗證,主要是判斷在當前nonce值的情況下,區塊哈希值是否小于難度值:
其他但由于 PoW 算法性能低下、而且會造成大量的算力浪費,大家紛紛提出新的共識算法,如 PoS(股權權益證明)、DPoS(委托權益人證明機制),等等;但以比特幣占據區塊鏈項目的半壁江山來看,PoW 仍是目前用得最多的共識算法。
0x05 存儲結構在了解共識算法后,我們可以保證數據的一致性了,那么這些數據是如何在區塊鏈中存儲的呢?
Merkle樹在比特幣中,使用 Merkle 樹組織和存儲一個塊內的交易信息,它是一種基于哈希的二叉樹(或多叉樹),其結構如下:
葉子節點存儲數據非葉子節點存儲其子節點的內容的哈希值使用 Merkle 樹的優勢所在:
快速比較大量數據,比較根節點的哈希值即可知道兩組數據是否相同快速定位修改,任何子節點的變動都會傳遞至根節點,從根節點向下檢索即可找到修改的節點。
Merkle 樹實現 在比特幣中,Merkle 樹的生成是挖礦步驟中的子步驟,跟入上文中的區塊生成流程中的 miner.cpp/IncrementExtraNonce函數中,在該函數中調用consensus/merkle.cpp/BlockMerkleRoot函數以構建 Merkle 樹:
哈希鏈在一個區塊中,除了打包成Merkle樹的交易信息,還包括塊高度、隨機數、時間等等信息,其中父塊哈希值將各個區塊聯系起來,形成鏈式結構,如下:
哈希鏈實現在比特幣中,區塊由區塊頭和 Merkle 交易樹組成,區塊頭數據結構定義在 primitives/block.h,如下:
0x06 網絡通信那么在區塊鏈中,各個節點之間是如何傳遞數據的呢?相對于分布式數據庫 server-client 網絡結構,采用主從復制的方式同步數據,區塊鏈則是 peer-to-peer 的網絡結構,節點在獲取數據的同時,還需要提供數據給其他節點。
我們直接來看看比特幣中 p2p 協議的實現方式。
p2p 協議的實現方式在比特幣中,默認在 8333端口建立 tcp 監聽,啟動 p2p 服務。在bitcoind啟動流程的init.cpp/AppInitMain中,對網絡進行了初始化啟動:
[init.cpp/AppInitMain()]1.node.connman->Start 啟動節點入口,網絡初始化和建立[net.cpp/Start()]2.InitBinds 建立網絡監聽3.AddOneShot 添加種子節點4.&TraceThread...... 啟動五個網絡處理線程
p2p網絡處理流程就由這五個線程進行負責:
其中負責 p2p 協議處理的線程就是 ThreadMessageHandler線程,我們主要來看看這一部分的流程;在該線程中嘗試對每個節點接收數據,接收到數據就如下的調用流程:
[net_processing.cpp]ProcessMessages->ProcessMessage
在 ProcessMessages對協議格式進行判斷,比特幣中 p2p 協議格式如下:
隨后進入到 ProcessMessage進行實際的消息處理流程,在該函數中主要邏輯是多個if-else語句根據commmand進入不同的消息的處理流程,支持的消息有:
每個命令下都有不同報文格式和處理邏輯,比特幣通過這樣的方式,打通了節點間的通道。
0x07 總結通過本文我們在脫離數字貨幣的情況下,從分布式數據庫的角度,聊了些區塊鏈中的幾個技術點,了解到區塊鏈與傳統分布式的異同之處,也了解到區塊鏈中的基本概念和原理。
區塊鏈的去中心化、不可篡改性的特性,給我們提供了無限的遐想,但目前還沒有公開的、完善的區塊鏈項目出現,我們希望這一天能早點到來。
References:
1. 《區塊鏈技術指南》
2. 《白話區塊鏈》
3. 《區塊鏈原理、設計與應用》
4. https://bitcoin.org/bitcoin.pdf
5. https://101blockchains.com/blockchain-vs-database-the-difference/
6. https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf
7. https://medium.com/ultrain-chain/the-difference-between-blockchain-and-a-distributed-database-556f8361e6b3
8. http://pmg.csail.mit.edu/papers/osdi99.pdf
9. https://github.com/bitcoin/bitcoin
10. https://zh.wikipedia.org/wiki/拜占庭將軍問題
11. https://www.zhihu.com/question/264717547
·轉載請注明來源
以上就是關于pos機的報文格式,路由器和核心交換機之間有什么關系的知識,后面我們會繼續為大家整理關于pos機的報文格式的知識,希望能夠幫助到大家!
