位元幣早期版本P2P之IRC通訊說明

2021-10-05 02:50:43 字數 2925 閱讀 9078

----紅亞太學鏈:yjh、bjgpdn

位元幣的前幾個版本使用irc作為位元幣p2p的seed,以此獲取到位元幣內節點的位址。本文講述irc的基本原理,及位元幣如何使用irc作為seed獲取其它節點位址。

irc基本原理

附一結構圖:

ircseed的原理

irc的資訊交流採用請求與應答模式,通過sockect程式設計與irc伺服器進行通訊可以達到使用irc的目的。

位元幣早期版本就是使用irc作為p2p的seed,想要連線到位元幣節點的使用者可以通過連線irc伺服器,並進入指定的#bitcoin頻道從而達到你獲取到頻道內其它節點位址的效果。

下面是詳細原理流程:

下面展示一些內聯**片

struct hostent* phostent =

gethostbyname

("chat.freenode.net");

caddress addrconnect(*

(u_long*

)phostent-

>h_addr_list[0]

,htons

(8001))

;socket hsocket;if(

!connectsocket

(addrconnect, hsocket)

)

首先tcp連線到irc的伺服器。irc伺服器有很多,之前國內也有,現在很少了,我們使用的是可以用於連線的埠號也有好幾個,可以去這個**上,有介紹文件,我們使用的是8001埠,連不上就換乙個連。

stringstrmyname =

encodeaddress

(addrlocalhost)

;//編碼外網**

之後本地節點獲得自己的外網位址(內網位址不行),並將位址通過base58格式進行編碼。編碼的內容前面加上字元『u』作為自己的暱稱。

值得一提的是,早期版本的位元幣通過特定ip服務**,讓**返回自己的外網ip,但是僅僅得到ip對現在的網路情況已經不適用了,後面會繼續做進一步解釋,從位元幣中間幾個版本開始,訪問的服務**將返回ip+port而不僅僅是ip位址。

send

(hsocket,

strprintf

("nick %s\r"

, strmyname.

c_str()

).c_str()

);send

(hsocket,

strprintf

("user %s 8 * : %s\r"

, strmyname.

c_str()

, strmyname.

c_str()

).c_str()

);

向irc伺服器傳送由位址編碼得到的暱稱資訊。

send

(hsocket,

"join #bitcoin\r");

send

(hsocket,

"who #bitcoin\r"

);

向irc伺服器傳送加入位元幣#bitcoin頻道的join請求,和請求頻道內使用者列表的who請求.

後續就是進入位元幣頻道,並開始接收伺服器發來的#bitcoin使用者列表訊息以及其它使用者的join訊息或者普通資訊。

if

(pszname[0]

=='u'

)}

前面提到,位元幣程式將位址用base58編碼並在前面加上字元』u』作為暱稱。當收到』u』開頭的暱稱時,則代表可能是位址,於是對該暱稱進行反編碼從而獲得對方位址。然後將位址加入mapaddresses位址表。後續會進行連線嘗試。

以上就是位元幣程式將irc作為seed的基本過程。

附一張時序圖:

下面是從位元幣原始碼中摘取的p2p**程式演示:

之後會收到一連串irc伺服器發來的訊息,就是伺服器發來的一些訊息。

在這之後伺服器響應請求,發來#bitcoin使用者列表(got who),當識別到有』u』開頭的暱稱時 ,代表可能是位元幣節點使用者,則對該暱稱進行反編碼得到位址並嘗試連線。由於現在位元幣不再使用irc來seed節點,所以現在位元幣頻道的使用者的名字幾乎都不是』u』開頭的,也就無從獲取位址了。另外還可以收到其它新使用者的join資訊。

感興趣的同學可以自己開乙個頻道,然後兩台電腦分別登入這個頻道,這樣兩台電腦應該可以互相識別對面的暱稱,並反編碼獲取位址。

不過需要說明的是,即使得到外網位址,兩個節點也無法連線。在現在的網路情況,電腦的ip幾乎都是隱藏在多層nat轉換之下的區域網ip,即使獲取到外網的ip,一來由於網路出口不同,外部ip動態變化,二來許多內網主機共用乙個外網ip,僅僅使用外網ip位址無法定位到目標主機(以前好像是有預設靜態nat,外網的8333埠會繫結到內網用8333作為埠傳送過訊息的主機)。所以位元幣後續的幾個版本改為接收指定伺服器發來的ip+port資訊,然後將該資訊編碼為暱稱。

位元幣網路與P2P

特幣採 了基於國際互聯 internet 的p2p peer to peer 絡架構。p2p是指位於同 絡中的每台計算機都彼此 對等,各個節點共同提供 絡服務,不存在任何 特殊 節點。每個 絡節點以 扁平 flat 的拓撲結構相互連通。在p2p 絡 中不存在任何服務端 server 化的服務 以及層...

P2P之NAT穿透問題

stun協議 rfc3489 詳見http www.ietf.org rfc rfc3489.txt 提出了4種nat型別的定義及其分類,並給出了如何檢測 在用的nat究竟屬於哪種分類的標準。但是,具體到p2p程式如何應用stun協議及其分類法穿越nat,則是仁者見仁 智者見智。因為stun協議並沒...

P2P之NAT穿透原理

p2p之nat穿透原理介紹 一次專案中,對於主動協議接入的裝置,客戶希望能夠裝置端直接推送碼流到客戶端以此減少中心 的負載。所以對p2p這塊方案做了了解,這裡做下整理。即對等計算機網路,是一種在對等者 peer 之間分配任務和工作負載的分布式應用架構 是對等計算模型在應用層形成的一種組網或網路形式。...