PCP:Peer Copy
1. PCP簡介
基于libp2p實(shí)現(xiàn)的,完全去中心化的p2p文件傳輸工具。
傳統(tǒng)的p2p文件傳輸工具,比如croc和magic-wormhole都需要一個(gè)公網(wǎng)固定IP的中繼服務(wù)器,來進(jìn)行p2p節(jié)點(diǎn)的互相發(fā)現(xiàn)、數(shù)據(jù)中轉(zhuǎn)、NAT穿透。這樣的p2p應(yīng)用,仍然避免不了單點(diǎn)故障、受運(yùn)營者監(jiān)管的問題。
2. PCP工作原理
PCP的使用方法非常簡單,主要思想就是發(fā)送方和接收方可以分別獨(dú)立生成相同的標(biāo)識(shí)符,然后雙方在DHT表中通過這個(gè)標(biāo)識(shí)符來 碰頭。下面分別從發(fā)送方與接收方進(jìn)行介紹。
發(fā)送方:
- 運(yùn)行
pcp send $FILE命令,就會(huì)出現(xiàn)四個(gè)隨機(jī)的單詞。使用四個(gè)隨機(jī)單詞的idea來自比特幣第39號(hào)改進(jìn)提案:BIP39 - 第一個(gè)單詞會(huì)被翻譯成由整數(shù)表示的Channel ID,范圍從0-2047。
PCP通過mDNS, 將/pcp/{unix-timestamp}/{channel-id}作為discovery ID,廣播到局域網(wǎng)中。并且將這個(gè)discovery ID的Hash(IPFS CID)傳到IPFS的DHT當(dāng)中,作為Provider ID。實(shí)現(xiàn)局域網(wǎng)以及廣域網(wǎng)的p2p節(jié)點(diǎn)發(fā)現(xiàn)。{unix-timestamp}是由當(dāng)前的時(shí)間減去五分鐘而來 (It's truncated to the most recent 5-minutes time slot),為了減少碰撞、網(wǎng)絡(luò)延遲、節(jié)點(diǎn)間時(shí)鐘不統(tǒng)一、DHT節(jié)點(diǎn)間通信、網(wǎng)絡(luò)延遲等問題的影響。一般來說,Provider ID可以在DHT中保留24小時(shí)。/PCP是IPFS中的協(xié)議前綴。
接收方:
- 運(yùn)行
pcp receive four-words-from-above命令。接收方會(huì)采用第一個(gè)單詞以及時(shí)間戳,來生成一個(gè)相同的discovery ID。為了緩解時(shí)鐘不同步、網(wǎng)絡(luò)延遲等問題的影響,接收方會(huì)并行地向DHT查詢,過去5分鐘時(shí)間間隙內(nèi)的所有 (queries the DHT in parallel for the previous 5 minutes time slot)。查詢DHT中的其他peer節(jié)點(diǎn);同時(shí)也會(huì)通過mDNS在局域網(wǎng)中查詢。
完成 碰頭 后,即接收方在DHT中查詢到了對(duì)應(yīng)的Discovery ID:
- p2p節(jié)點(diǎn)連接:這一步完全通過Libp2p實(shí)現(xiàn)。
- 鑒權(quán):雙方完成一次PAKE協(xié)議,將四個(gè)單詞組成的弱密碼,替換成一個(gè)安全性高的會(huì)話密鑰。
- 文件傳輸:發(fā)送方先傳輸文件的大小、名稱等信息,待接收方確認(rèn)后,進(jìn)行文件傳輸。
3. PCP使用示例
發(fā)送方:
$ pcp send my_file
Code is: bubble-enemy-result-increase
On the other machine run:
pcp receive bubble-enemy-result-increase
接收方:
$ pcp receive bubble-enemy-result-increase
Looking for peer bubble-enemy-result-increase...
4. PCP現(xiàn)階段弊端以及未來改進(jìn)
- DHT查詢的速度很慢,通常會(huì)花費(fèi)2-3分鐘
- libp2p對(duì)于NAT的處理并不優(yōu)秀,不能很好的穿透NAT后面的節(jié)點(diǎn)。
- 未來將考慮利用本地IPFS節(jié)點(diǎn),來加速peer間 碰頭 的問題