C++從零開始區塊鏈:P2P模組之節點廣播
之前忘了說了,現在補上
主要有以下幾個方案
udp協議廣播
該方案的優點是協議自身支援,實現簡單,高效。但其缺點也是致命的,就是隻能在同一區域網內才能進行廣播,限制太大。
udp協議組播
和廣播的方案差不多,雖然udp協議支援在外網上的組播,但很依賴於網路裝置是否支援。很遺憾,現實中絕大部分的網路裝置是不支援的,同樣只能在同一區域網內有效。
節點輪詢
該方案的優點是不受網路環境限制,不需要網路裝置的支援。缺點是效率太低,網路中節點很少還可以接受,如果節點太多,光是每個節點都輪詢一遍都需要好久。
節點分組輪詢
這是目測最可行的一個方案,同時也是實現起來最麻煩的一個方案。先將所有節點分組,要保證每個節點至少存在與兩個組內。節點對自己所在的組內進行輪詢廣播,組內其他節點接收到訊息後,再在自己的另一個組內進行廣播,達到一傳十,十傳百的效果。
本例中應用
在本例中,僅將訊息發給了一個節點進行廣播模擬,並未進行實際上的廣播,等以後有時間了嘗試使用節點分組輪詢的方式進行廣播。
相關推薦
C++從零開始區塊鏈:P2P模組之節點廣播
之前忘了說了,現在補上 主要有以下幾個方案 udp協議廣播 該方案的優點是協議自身支援,實現簡單,高效。但其缺點也是致命的,就是隻能在同一區域網內才能進行廣播,限制太大。 udp協議組播 和廣播的方案差不多,雖然udp協議支援在外網上的組播,但很依賴於網路裝置是否支援。很遺
C++從零開始區塊鏈:P2P模組之節點註冊和監聽
ThreadPool是一個執行緒池,具體實現就不貼了,隨便找個執行緒池實現就行,也可以戳這裡檢視程式完整程式碼。 P2PNode::P2PNode(const char *if_name) { m_sock = socket(AF_INET, SOCK_DGRAM, 0);//I
C++從零開始區塊鏈:P2P模組之UDP資料包分組排序
udp的特點是不可靠,不連線,資料發過去就完事,至於對方收沒收到就不管了。 在使用udp進行通訊的時候,要在應用層做分組、排序、組包、校驗等工作。 傳送方現將要傳送的資料切片,所有的切片組成一組,標上組號,每個切片根據原始資料的順序有個組內編號。 傳送的時候,每次傳送一個切片,並等待接
C++從零開始區塊鏈:P2P模組之打洞伺服器
原則上說,打洞伺服器應該是可以返回多個節點的,這裡為了簡化,只返回一個節點。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #i
C++從零開始區塊鏈:P2P模組之公共標頭檔案定義
搞了臺阿里雲做內網打洞測試,巨集開關ALITEST用來內外網測試轉換 #define SERVERIP “xx.xx.xx.xx” 是外網測試機的外網IP #include <cstdio> #include <cstdlib> #include <cst
C++從零開始區塊鏈:P2P模組之簡單介紹一下原理
想徹底說明P2P的原理太麻煩了,而且這種東西網上一搜就是一大堆(雖然好多連結其實都是同一篇文章),這裡就不贅述了,只簡單說一下本例所用到的一些東西。 如果所有節點都在公網上,p2p通訊就非常容易,找臺搭橋伺服器,每個節點啟動的時候都向搭橋伺服器註冊自己,並獲取其他節點資訊,然後就可以節點間
C++從零開始區塊鏈:main函式的一種實現
前面已經把各種業務邏輯都寫好了,main函式怎麼呼叫就隨便了,這裡只是其中一種實現方法 int main(int argc, char **argv) { if (argc < 2) { std::cout << "argc error!
C++從零開始區塊鏈:區塊鏈業務模組之主鏈同步
同樣是採用一個簡單,但效率低下的方案,遍歷自己的鏈和其他節點的鏈,誰的長誰的就是主鏈。 然後將自己的鏈和主鏈進行比較,將自己的鏈上的區塊掛在主鏈上,掛的同時驗證一下自己的區塊是否已經存在於主鏈上,如果存在就跳過。 void BlockChain::MergeBlockChain(con
C++從零開始區塊鏈:區塊鏈業務模組之重複交易檢測
想象這樣一個場景: 節點a廣播了一條訊息,節點b和節點c都收到並記錄在自己的交易列表中了。 然後節點b和節點c挖礦。 當節點b挖礦成功,將a的交易打包到區塊中,並在網路上廣播。 這時節點c接收到節點b的挖礦成功的廣播,區塊驗證通過後掛到自己的區塊上,然後繼續挖礦。 當節點c也挖礦成
C++從零開始區塊鏈:區塊鏈業務模組之餘額檢查
比特幣中的餘額檢查實現起來好麻煩,嚴格來說比特幣中並沒有所謂的餘額,具體請讀者自行百度比特幣相關的資料。 在本例中,我們採用一個效率低下,但很簡單的方法:遍歷整個區塊鏈的所有交易,查詢要查詢的地址參與的所有交易,如果目標地址是支出方,就減少,是收入方就增加,便利後的結果就餘額 int
C++從零開始區塊鏈:區塊鏈業務模組之建立交易和區塊
建立交易簡單,直接給結構體賦值就行 Transactions BlockChain::CreateTransactions(const std::string &sender, const std::string &recipient, float amount)
C++從零開始區塊鏈:區塊鏈業務模組之基於boost的json讀寫
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> std::string BlockChain::GetJsonFromBlock(Bloc
C++從零開始區塊鏈:區塊鏈業務模組之區塊結構定義
區塊鏈的對外展示主要是以json的形式,我們先來定義一下json,主要是說明格式,資料什麼的我瞎寫的。實際應用中應該加入一個隨機值用作校驗,這裡就不加了 block = { 'index': 1, //索
C++從零開始區塊鏈:區塊鏈業務模組之挖礦
挖礦就是找到一個滿足工作量驗證條件的工作量證明,當一個節點找到了一個工作量證明之後,首先以給自己新增一個挖礦交易的形式進行金額獎勵,即新增一個付款地址為0,收款地址為自己的交易到自己的交易記錄。然後錄他會將自己記錄的所有交易資訊打包程一個區塊,並向其他節點進行廣播。其他節點接收到以後會對工作
C++從零開始區塊鏈:區塊鏈業務模組之工作量證明與驗證
原則上說,工作量證明演算法應該是計算困難,驗證容易,但我們這裡只為學習,一切從簡,使用一個簡單的工作量證明演算法:先取一個字串,如“Hello Shacoin!”,然後取一個自然整數,再將該整數轉成字串,銜接到前面的字串後面,形成一個新的字串。然後將這個新字串取雜湊,判斷雜湊的最後一位是不是
C++從零開始區塊鏈:區塊鏈業務模組之交易地址生成
在比特幣中,為了避免地址重複、安全性等各種問題,比特幣的地址的生成過程是很繁瑣的。我們這裡由於只是學習其原理,一些實際中可能會遇到的問題就不予考慮了,將地址生成的過程最大程度的簡化。 簡化後的流程是:首先生成一對祕鑰,然後對公鑰取雜湊,再將雜湊轉成BASE64,最後生成的一組BASE64編
從零開始學Socket:(二)連線服務端和客戶端
先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。 在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就
從零開始學Socket:(一)服務端和客戶端建立
上篇我提到Socket是TCP/IP的抽象介面。所以我們直接使用就好,沒必要知其甚解。 1.開啟VS 新建專案 名稱,位置隨意 這裡名稱是Server 框架選.NET 4.5(在這篇部落格裡也無所謂) 注意引用 using System.Net; using
從零開始學Socket:前言
我學習Socket的動機很簡單,我要做一個基於Socekt的網路遊戲。 關於Socket的基礎概念以及相關知識,請大家自行百度。 https://blog.csdn.net/fighting_xa/article/details/50623571 http://liulili
從零瞭解區塊鏈不可錯過一篇論文
2009年中本聰發表論文《比特幣-一種點對點的電子現金系統》之後比特幣橫空出世,比特幣誕生至今的9年時間幣價增長了200萬倍,2016年至今區塊鏈行業也產生了爆炸式的增長,越來越多的人開始關注區塊鏈行業,想要深入瞭解區塊鏈,中本聰當年的論文是不可錯過的重要資料,區塊鏈行業至今的很多重要創新都源於這篇論文,對該