go語言區(qū)塊鏈P2P網(wǎng)絡(luò) go語言與區(qū)塊鏈

區(qū)塊鏈核心技術(shù)-P2P網(wǎng)絡(luò)

點(diǎn)對點(diǎn)網(wǎng)絡(luò)是區(qū)塊鏈中核心的技術(shù)之一,主要關(guān)注的方面是為區(qū)塊鏈提供一個(gè)穩(wěn)定的網(wǎng)絡(luò)結(jié)構(gòu),用于廣播未被打包的交易(交易池中的交易)以及共識(shí)過的區(qū)塊,部分共識(shí)算法也需要點(diǎn)對點(diǎn)的網(wǎng)絡(luò)支撐(如PBFT),另外一個(gè)輔助功能,如以太坊的消息網(wǎng)絡(luò),也需要點(diǎn)對點(diǎn)網(wǎng)絡(luò)的支持。

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為漢陰等服務(wù)建站,漢陰等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為漢陰企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

P2P網(wǎng)絡(luò)分為結(jié)構(gòu)化和非結(jié)構(gòu)化網(wǎng)絡(luò)兩類。結(jié)構(gòu)化網(wǎng)絡(luò)采用類似DHT算法來構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu);非結(jié)構(gòu)化網(wǎng)絡(luò)是一種扁平的網(wǎng)絡(luò),每個(gè)節(jié)點(diǎn)都有一些鄰居節(jié)點(diǎn)的地址。

點(diǎn)對點(diǎn)網(wǎng)絡(luò)的主要職責(zé)有維護(hù)網(wǎng)絡(luò)結(jié)構(gòu)和發(fā)送信息這兩個(gè)方面。網(wǎng)絡(luò)結(jié)構(gòu)要關(guān)注的是新節(jié)點(diǎn)的加入和網(wǎng)絡(luò)更新這兩個(gè)方面,而發(fā)送信息包括廣播和單播兩個(gè)方面

如何建立并維護(hù)點(diǎn)對點(diǎn)的整個(gè)網(wǎng)絡(luò)?節(jié)點(diǎn)如何加入、退出?

網(wǎng)絡(luò)結(jié)構(gòu)的建立有兩個(gè)核心的參數(shù),一個(gè)是每個(gè)節(jié)點(diǎn)向外連接的節(jié)點(diǎn)數(shù),第二個(gè)是最大轉(zhuǎn)發(fā)數(shù)。

新節(jié)點(diǎn)對于整個(gè)網(wǎng)絡(luò)一無所知,要么通過一個(gè)中心的服務(wù)獲取網(wǎng)絡(luò)中的一些節(jié)點(diǎn)去連接,要么去連接網(wǎng)絡(luò)中的“種子”節(jié)點(diǎn)。

網(wǎng)絡(luò)更新處理當(dāng)有新節(jié)點(diǎn)加入或者節(jié)點(diǎn)退出,甚至原來一些節(jié)點(diǎn)網(wǎng)絡(luò)不好,無法連接,過一段時(shí)間又活了,等等這些情況。一般通過節(jié)點(diǎn)已有的連接來廣播這些路由表的變化。需要注意的是,因?yàn)辄c(diǎn)對點(diǎn)網(wǎng)絡(luò)的特殊性,每個(gè)節(jié)點(diǎn)的路由表是不一樣的(也叫partial view)

廣播一般采用泛洪協(xié)議,即收到轉(zhuǎn)發(fā)方式,使的消息在網(wǎng)絡(luò)中擴(kuò)散,一般要采用一些限制條件,比如一條消息要設(shè)置最大的轉(zhuǎn)發(fā)數(shù),避免網(wǎng)絡(luò)的過渡負(fù)載。

單播需要結(jié)構(gòu)化網(wǎng)絡(luò)結(jié)構(gòu)支持,一般是DHT,類似于DNS解析的方式,逐跳尋找目標(biāo)節(jié)點(diǎn)地址,之后進(jìn)行傳輸,并且更新本地路由表。

要想快速檢索信息,有兩種數(shù)據(jù)結(jié)構(gòu)可以使用,一種是樹類型,如AVL樹、紅黑樹、B樹等;另外一類是hash表。

哈希表的效率比樹更高,但是需要占用更多的內(nèi)存。

信息的表示采用鍵值對的方式,即一個(gè)鍵對應(yīng)一個(gè)值,我們要查找的是key,值是附著的信息。

哈希表要解決的問題是如何均勻地為每一個(gè)key分配一個(gè)存儲(chǔ)位置。

這里面有兩個(gè)重點(diǎn):1.是為key分配一個(gè)存儲(chǔ)地點(diǎn),這個(gè)分配算法是固定的,保證存儲(chǔ)的時(shí)候和查找的時(shí)候使用同一個(gè)算法,不然存進(jìn)去之后會(huì)找不到;2.是均勻地分配,不能有點(diǎn)地方存放數(shù)據(jù)多,有點(diǎn)放存放數(shù)據(jù)少。

一般語言里面的hashtable、map等結(jié)構(gòu)使用這個(gè)技術(shù)來實(shí)現(xiàn),哈希函數(shù)可以直接使用取模函數(shù),key%n,這種方式,n代表有多少個(gè)地方,key是整數(shù),如果key是其他類型,需要先進(jìn)行一次哈希,將key轉(zhuǎn)為整數(shù)。這種方式可以解決上面的兩個(gè)需求,但是當(dāng)n不夠大的時(shí)候(小于要存儲(chǔ)的數(shù)據(jù)),會(huì)產(chǎn)生沖突,一個(gè)地方一定會(huì)有兩個(gè)key要存儲(chǔ),這時(shí)候,需要在這個(gè)地方放一個(gè)鏈表,將分配到同一地點(diǎn)、不同key,順序擺放。當(dāng)一個(gè)地點(diǎn)放的key太多后,鏈表的查找速度太慢,要轉(zhuǎn)化為樹類型結(jié)構(gòu)(紅黑樹或者AVL樹)。

上面說過,哈希表效率很高,但是占用內(nèi)容,使用多臺(tái)機(jī)器就可以解決這個(gè)限制。在分布式環(huán)境中,可以將上述的地點(diǎn)理解為計(jì)算機(jī)(后面成為節(jié)點(diǎn)),即如何將一個(gè)key映射到一個(gè)節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)有一個(gè)節(jié)點(diǎn)ID,即key-node id的映射,這個(gè)映射算法也要固定。

這個(gè)算法還有一個(gè)非常重要的要求,即scalebility,當(dāng)新節(jié)點(diǎn)加入和退出時(shí)候,需要遷移的key要盡量少。

這個(gè)映射算法有兩種典型結(jié)構(gòu),一個(gè)是環(huán)形,一個(gè)是樹形;環(huán)形的叫一致性哈希算法,樹形的典型叫kademlia算法。

選點(diǎn)算法就是解決key-node id的映射算法,形象的來說就是為一個(gè)key選擇它生命中的她(節(jié)點(diǎn))。

假設(shè)我們使用32哈希,那么總共能容納的key的數(shù)據(jù)量是2**32,稱之為hash空間,把節(jié)點(diǎn)的ID映射成整數(shù),key也映射成整數(shù)。把key哈希和節(jié)點(diǎn)哈希值接的差值的叫做距離(負(fù)數(shù)的話要取模,不用絕對值),比如一個(gè)key的哈希是100(整數(shù)表示),一個(gè)節(jié)點(diǎn)的哈希是105,則這兩個(gè)的距離是105-100=5。當(dāng)然使用其他距離表示也可以,比如反過來減,但是算法要固定。我們把key映射(放到)距離他最近的節(jié)點(diǎn)上。距離取模的話,看起來就是把節(jié)點(diǎn)和key放到一個(gè)環(huán)上,key歸屬到從順時(shí)針角度離它最近的節(jié)點(diǎn)上。

kademlia算法的距離采用的是key哈希與節(jié)點(diǎn)哈希異或計(jì)算之后的數(shù)值來表示(整數(shù)),從左往右,擁有越多的“相同前綴”,則距離越近,越在左邊位置不一樣,距離越遠(yuǎn)。

樹結(jié)構(gòu)的體現(xiàn)是,將節(jié)點(diǎn)和key看成樹的節(jié)點(diǎn),這個(gè)算法支持的位數(shù)是160bit,即20個(gè)8字節(jié),樹的高度為160,每個(gè)邊表示一位。

選點(diǎn)的算法和一致性哈希相同,從所有節(jié)點(diǎn)中,選擇一個(gè)距離key距離最小的節(jié)點(diǎn)作為這個(gè)key的歸宿。

由于是在分布式環(huán)境中,為了保證高可用,我們假設(shè)沒有一個(gè)中心的路由表,沒有這個(gè)可以看到全貌的路由表,帶來了一些挑戰(zhàn),比如如何發(fā)現(xiàn)節(jié)點(diǎn)、查找節(jié)點(diǎn)?

在P2P網(wǎng)絡(luò)中,常用的方法是每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)部分路由表,即只包含部分節(jié)點(diǎn)的路由信息。在泛洪算法中,這些節(jié)點(diǎn)上隨機(jī)的;在DHT算法中,這個(gè)路由表是有結(jié)構(gòu)的,維護(hù)的節(jié)點(diǎn)也是有選擇性的。那么如何合理的選擇需要維護(hù)路由信息的節(jié)點(diǎn)呢?

一個(gè)樸素的做法是,每一個(gè)節(jié)點(diǎn)保存比他大的節(jié)點(diǎn)的信息,這樣可以組成一個(gè)環(huán),但是這樣做的話,有一個(gè)大問題和一個(gè)小問題。大問題是,每個(gè)節(jié)點(diǎn)知道的信息太少(只有下一個(gè)節(jié)點(diǎn)的哈希和地址),當(dāng)給出一個(gè)key時(shí),它不知道網(wǎng)絡(luò)中還有沒有比它距離這個(gè)key距離還短的節(jié)點(diǎn),所以它首先判斷key是否屬于自己和下一個(gè)節(jié)點(diǎn),如果是,那么這個(gè)key就屬于下一個(gè)節(jié)點(diǎn),如果不是就調(diào)用下一個(gè)節(jié)點(diǎn)同樣的方法,這個(gè)復(fù)雜度是N(節(jié)點(diǎn)數(shù))。一個(gè)優(yōu)化的方法是,每個(gè)節(jié)點(diǎn)i維護(hù)的其他節(jié)點(diǎn)有:i+2 1, i+2 2,....i+2**31,通過觀察這個(gè)數(shù)據(jù),發(fā)現(xiàn)由近到遠(yuǎn),節(jié)點(diǎn)越來越稀疏。這樣可以把復(fù)雜度降低到lgN

每個(gè)節(jié)點(diǎn)保存的其他節(jié)點(diǎn)的信息,包括,從左到右,每一位上與本節(jié)點(diǎn)不同的節(jié)點(diǎn),最多選擇k個(gè)(算法的超參數(shù))。比如在節(jié)點(diǎn)00110上(為演示起見,選擇5位),在要保存的節(jié)點(diǎn)路由信息是:

1****: xxx,....,xxx(k個(gè))

01 : xxx,....,xxx(k個(gè))

000 : xxx,....,xxx(k個(gè))

0010 : xxx,....,xxx(k個(gè))

00111: xxx,....,xxx(k個(gè))

以上為一行稱為k-bucket。形象的來看,也是距離自己越近,節(jié)點(diǎn)越密集,越遠(yuǎn),節(jié)點(diǎn)越稀疏。這個(gè)路由查找、節(jié)點(diǎn)查找的算法也是lgN復(fù)雜度。

Go語言與區(qū)塊鏈涉及到的技術(shù)領(lǐng)域

Go語言與區(qū)塊鏈 涉及到的領(lǐng)域有 區(qū)塊鏈上層應(yīng)用開發(fā)、區(qū)塊鏈底層系統(tǒng)開發(fā)、高并發(fā)服務(wù)器、Web及微服務(wù)開發(fā),分布式開發(fā)等。Go語言與區(qū)塊鏈主打區(qū)塊鏈底層系統(tǒng),更加深入。

我知道的是傳智播客開設(shè)了這個(gè)學(xué)科,他們有的學(xué)科都會(huì)有配套資料和免費(fèi)課程,可以去看看。

go語言可以做什么

1、服務(wù)器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。

2、分布式系統(tǒng)、數(shù)據(jù)庫代理器、中間件:例如Etcd。

3、網(wǎng)絡(luò)編程:這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實(shí)現(xiàn)了。

4、開發(fā)云平臺(tái):目前國外很多云平臺(tái)在采用Go開發(fā),我們所熟知的七牛云、華為云等等都有使用Go進(jìn)行開發(fā)并且開源的成型的產(chǎn)品。

5、區(qū)塊鏈:目前有一種說法,技術(shù)從業(yè)人員把Go語言稱作為區(qū)塊鏈行業(yè)的開發(fā)語言。如果大家學(xué)習(xí)區(qū)塊鏈技術(shù)的話,就會(huì)發(fā)現(xiàn)現(xiàn)在有很多很多的區(qū)塊鏈的系統(tǒng)和應(yīng)用都是采用Go進(jìn)行開發(fā)的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯(lián)盟鏈,兩者都有g(shù)o語言的版本,且go-ehtereum還是以太坊官方推薦的版本。

自1.0版發(fā)布以來,go語言引起了眾多開發(fā)者的關(guān)注,并得到了廣泛的應(yīng)用。go語言簡單、高效、并發(fā)的特點(diǎn)吸引了許多傳統(tǒng)的語言開發(fā)人員,其數(shù)量也在不斷增加。

使用 Go 語言開發(fā)的開源項(xiàng)目非常多。早期的 Go 語言開源項(xiàng)目只是通過 Go 語言與傳統(tǒng)項(xiàng)目進(jìn)行C語言庫綁定實(shí)現(xiàn),例如 Qt、Sqlite 等。

后期的很多項(xiàng)目都使用 Go 語言進(jìn)行重新原生實(shí)現(xiàn),這個(gè)過程相對于其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發(fā)項(xiàng)目的出現(xiàn)。

分享標(biāo)題:go語言區(qū)塊鏈P2P網(wǎng)絡(luò) go語言與區(qū)塊鏈
路徑分享:http://muchs.cn/article0/hgicio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站維護(hù)、企業(yè)網(wǎng)站制作、、網(wǎng)站收錄網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名