合作的演化和BitTorrent經濟設計

• 11 min read
合作的演化和BitTorrent經濟設計

這個文章原本是一個演講在Papers We Love Taipei meetup。英文版在這裡,然後影片在這裡

介紹

上次我跟你們分享的是跟 合作有關係。合作是什麼,為什麼人決定互相合作,就算不合作對他們比較有利。

這個分享是基於「BitTorrent經濟設計」,BitTorrent發明家Bram Cohen寫的。再來,我們會看上次學的東西:怎麼運用這些在比較現代的系統中,特別是看BitTorrent,一種點對點(p2p)檔案共享協議,鼓勵人們或是「節點」之間彼此共享。

講完以後,你應該會比較懂 如何產生合作,什麼情況是好用的,怎麼用賽局理論來分析,以及怎麼將他設計在現代的系統中。

簡要回顧

首先,我們看看上次的總結。我們學了什麼?我們學到了:
1. 即使跟敵人同在戰場上,合作還是可以在重複出現的情況中演化。
2. 在賽局理論和現實生活中,囚犯困境(Prisoner’s dilemma, PD)是一種常見的遊戲類型
a) 在困境中,可以選擇要合作或是背叛
b) 在困境中,最好的結果是互相合作,可是優勢策略是 “雙方都背叛”。
c) 通過玩很多次囚犯困境,當作重複遊戲,這樣就會出現更好的策略,比如說以牙還牙。
3. 以牙還牙在重複的囚犯困境遊戲中,是一個很棒的策略。
a) 我們先合作,然後跟隨對方的決定。
b) 以牙還牙是友善、寬恕、報復、而且也很清楚的策略。
c) 也因此,在許多進化環境中,這讓以牙還牙成為一種非常簡單而且很強大的策略。

BitTorrent

讓我們一起看一下這些見解是怎麼運用在設計電腦系統中,尤其是在BitTorrent。BitTorrent(p2p)協議,可以將他運用在網路上分享檔案。

他已經存在20年了,而且很流行,它佔全部網路流量很大的一部分(下載2.5%,上傳25%),擁有數億用戶。BitTorrent是一種協議,就像HTTP之於網路,或是SMTP之於email。有很多不一樣的電腦程式可以跟他們互動。介面也很簡單:打開torrent檔案,然後只需要放著讓它運行就可以了。除了是一個開放、不用許可的協議以外,他的特色也有如何分配負載。和傳統的伺服器-客戶端系統不同,以前是一些伺服器管理檔案然後和客戶分享,在BitTorrent裡面每一個人是公平的節點,可以跟其他節點分享那個檔案。

所以要怎麼鼓勵人們互相分享呢?沒有東西可以阻止人們一直當伸手牌,只下載,不上傳、不回饋。要怎麼解決這個問題呢?你可能發現這是一種囚犯困境,節點比較想要只下載,不上傳。但要是每一個人都上傳回來,那每一個人會有比較好的結果。因為可以把檔案分成很多塊,我們可以把那個遊戲變成重複的囚犯困境,然後可以用以牙還牙的策略鼓勵合作。

BitTorrent還有一個很有趣的特色。想要某一塊的人越多,他被分散的速度就越快。因為有比較多的人在幫忙上傳,所以可以說他是反脆弱的(antifragile)。越多人使用系統,系統接受壓力的時候 就會變得更堅固。

這個圖片裡,如果你殺一個蛇頭,他會多兩個蛇頭:

這與一般脆弱的系統或強大的系統形成對比。普通網站在負載很重的時候,可能會很脆弱,並且需要復雜的操作,才能保持正常運行。但是,要怎麼讓任何系統在超載時,不會當機,反而有更好的表現呢?

想像,有一天你進去郵局,發現裡面的人比平常的多十倍。平常你可能會想 寄信速度會變慢。但如果沒變慢,反而變快?怎麼達到的?不是那些傳統郵務人員,取而代之,是去郵局的所有人,用點對點的方式處理郵務。比如說,有一些人寫提單,有一些人掃描提單,有一些人包裝等等。同時,每一個人有一些包裹想用點對點的方式發送。大家不再排隊、玩手機,大家反而一起合作,讓他們的郵務作業更快速。這當然會有很多問題,但你可以想像在大家庭採購和準備晚餐的情況。這類似BitTorrent的工作方式,只是這個都發生在幕後,而且只使用了你的頻寬。

BitTorrent中的以牙還牙

要是在Bittorrent裡面,只有一塊需要下載,你就會一口氣完成它,下載然後離開。可是Bittorrent故意把檔案分成很多資料塊,所以變成重複的遊戲形式。他要怎麼運作呢?

一個節點會告訴其他節點,他有哪一些資料塊,然後選擇一些,要從其他節點才能收到的資料塊。一開始,那些區塊選擇是很隨機的,但這裡也常使用一些策略法。比如說,節點會選“稀有優先”,意思是說會先收到最難的一塊,因為這一塊是最有價值的。這樣一來,一開始只有一個人上傳,但最後會有越來越多節點可以加入,並且幫第一個節點減輕負擔。

賽局理論在其中發揮了拒絕(choking)和接受(unchoking)的作用。沒有一個中央協調去決定誰會得到什麼。相反的,是每一個節點會自己決定。一個節點想要最大化他的下載速度。從其他的節點下載,然後使用以牙還牙的方法決定誰要上傳。通常在限定時間內能上傳完的點是有限的。合作代表共享,背叛的意思是:你拒絕上傳一個節點。有時候也會樂觀地接受(optimistic unchoking),一個節點會隨便決定上傳到另外一個節點,這和以牙還牙概念中的“先合作”一樣,並且允許節點找到互惠互利的關係。

我們之前看到,在重複的囚犯困境中,用以牙還牙是很有效率的策略。加上BitTorrent是一種協議,每一個使用BitTorrent的APP可以選他們想用什麼策略。很多都使用這個策略的原因很簡單,因為:為了自己的利益,隨機跟節點共享,這樣能帶來最好的結果。這裡沒有強制性/或由上往下的控制,而是由下往上的,自然地發展與他人共享某個檔案。

在BitTorrent中,如何運作還有很多細節和技術。要是你對這個題目有興趣,建議你可以看看文章來得到更多細節。

一個比賽持續多久的時間?

BitTorrent檔案共享遊戲,是有時間限制的。每一個檔案本質上都當成新的遊戲。意思是說一個檔案現在下載完了,或是快下載完了,就沒有理由繼續分享。接下來,BitTorrent會有很多流量,特別是分享盜版檔案這類的東西,最後會流入私人社群。這些一般來說是私人網站,需要被邀請,然後要,繼續有很好的種子比率(seed ratio)才可以繼續留下來。種子比率意思是說:你貢獻多少和你下載多少的比率,平常需要大於1,才代表你上傳的東西比下載的東西多。包括第一次的心得分享資料。

這一些社群中的種子比率跟這個BitTorrent協議沒有很大的關係。他們只用BitTorrent檔案共享機制,可以算是一種工具。這讓一些社群比較容易被攻擊,成為單點故障。有一些很有名的例子,例如 OiNK Pink Palace 2007和What.cd 2016都被要求關閉。當時,這兩個都是全世界最全面、最豐富的音樂資料庫。

還有一些沒有解決的問題

我們不知道可不可以普及這種由下而上,運用分權的方法來達成合作。這個議題就超出今天介紹的範圍了。

BitTorrent中的遊戲也定義得很清楚:有一個檔案和一組固定塊是被需要的。當檔案裡的訊息一直在變的時候,並且不清楚每塊的價值怎麼樣的時候,會發生什麼事呢?當材料稀有,但是大多數人對此沒有興趣時,又該怎麼辦呢? BitTorrent傾向鼓勵更多受歡迎的內容。

另外一方面,是關於什麼資源正在交易。對於BitTorrent,使用頻寬是很有道理的。但是,和現實生活相比,這不是很好的指標。在現實生活中,合作的形式有很多種。最平常的可能是用金錢購買產品、買服務,但很多其他社會合作形式也很常見,而且被認為是當然的。

BitTorrent做得很好的是,他給人們選擇是否可以幫忙、貢獻,並且提供獎勵。傳統的客戶端-伺服器架構中,“提供者” 和“用戶”之間有清楚的區分,但在BitTorrent中,就像在真實世界中,邊界更不清楚、更流暢。這變成一種代理形式,這種代理 帶來了更豐富、更好的行為,你可以在共享經濟中看到很多類似的現象:人們在Airbnb和Uber網站上留下評論,好的參與者能夠重覆參加遊戲(會有很多評論、留言)。我們可以怎麼利用這些觀察,來創造其他類似的系統,並且鼓勵合作,然後幫助其他參與者帶來更好的結果呢?

結論

在這兩次分享中,我們看到在最可怕的情況裡,比如 在戰場,怎麼發展合作。我們學了一點囚犯困境和他的結構。我們看到 為什麼重複玩一樣的遊戲很多次以後,會造成一些策略的發展,特別是以牙還牙。我們已經了解以牙還牙如何成功,因為他很友善、很寬容,有報復性也很清楚。最後,我們也了解  要怎麼在設計現代系統時,運用這種方法。特別是透過BitTorrent點對點(p2p)檔案共享協議來鼓勵分享。更看到一些關於這個的開放性問題。

我希望這個演講,能給你們一些工具思考這種問題,也可能給了你們一些想法,思考怎麼設計系統。

謝謝

謝謝Sanaz 給我feedback,然後謝謝我的中文老師Jenny幫我改很多中文。

Evolution of Cooperation and BitTorrent Economics →

Subscribe to Gaptry

Subscribe to the newsletter and unlock access to member-only content.

You've successfully subscribed to Gaptry
Welcome! You are now a Gaptry subscriber.
Welcome back! You've successfully signed in.
Success! You are now a paying member and have access to all content.
Success! Your billing info is updated.
Billing info update failed.