Vitalik:從技術角度揭秘“分片”的優勢

來源:ETH中文站

稿源:vitalik.ca

作者 : Vitalik Buterin

此處特別感謝 Dankrad Feist 和 Aditya Asgaonkar 的校對工作

分片以太坊可擴展性的未來,是讓以太坊生態系統實現每秒數千筆交易的關鍵,這樣大部分人才能以負擔得起使用成本,成為該以太坊的用戶。然而,在以太坊生態系統中,分片是容易受到誤解的概念之一,在更廣泛的區塊鏈生態系統中也是如此。它指的是一組非常特定的概念,這些概念都擁有自己的特質,但人們經常將前者與一些技術混為一談,後者的安全特性更弱,且與前者不同。本篇文章的目的是介紹分片的特定屬性,並與其他非分片技術加以區分,且為了實現這些屬性,分片系統需要做出哪些犧牲。

Vitalik:從技術角度揭秘“分片”的優勢

圖註:以太坊分片系統,原圖來自Hsiao-wei Wang,由Quantstamp設計

擴展性不可能三角

要介紹分片,最佳方式是從描述一個問題開始,即擴展性不可能三角,這個問題促成了該解決方案的誕生。

Vitalik:從技術角度揭秘“分片”的優勢

根據擴展性不可能三角,一個區塊鏈想要實現三個特性,若使用簡單技術手段,只能實現三個特性中的兩個。這三個特性如下:

可擴展性:該區塊鏈可以處理和驗證的交易比單個普通節點更多,例如一台消費級筆記本電腦。

去中心化:該區塊鏈的運行可以不依賴於由大型中心化參與者組成的小群體。這通常理解為即使是大多數節點都是誠實的,也不應該信任不能用消費級筆記本電腦接入的節點群。

➤安全性:

該區塊鏈可以抵禦大量試圖攻擊的節點,理想情況下,要抵禦50%的節點,一般情況下,要抵禦超過25%的節點,但僅僅抵禦5%的節點不能夠保證安全性。

以下是三種不同類型的“簡單解決方案”,但是這些解決方案只能實現三個特性中的兩個。

傳統區塊鏈包括比特幣、實現PoS/分片之前的以太坊、萊特幣及其他類似區塊鏈。這些區塊鏈依賴於每個參與者運行全節點來驗證每筆交易,因此保證了去中心化和安全性,但沒有實現擴展性。

高TPS區塊鏈包含DPoS鏈,但也涵蓋許多其他區塊鏈。這種區塊鏈依賴於少量節點維持共識,數量通常介於10-100個,用戶必須信任大多數節點。根據上文的定義,該解決方案實現了擴展性和安全性,但沒有實現去中心化。

多鏈生態系統一般指讓區塊鏈“向外擴展”,即讓各種應用程序在不同的鏈上部署,並使用跨鏈通信協議進行通信。這實現了去中心化和擴展性,但並不安全,因為攻擊者只需要控制其中一個鏈的大多數共識節點 (通常數量小於整個生態系統1%的節點數) 就可以造成破壞,還可能引起連鎖反應,對在其他鏈中的應用程序造成巨大損害。

分片技術能夠同時實現上文提及的三個特性。一個分片型區塊鏈擁有以下特徵:

可拓展性:其處理的交易量遠高於單一節點。

去中心化:能夠完全基於消費級筆記本電腦運行,無需依賴超級節點等。

安全性:攻擊者無法通過少數資源對系統發動局部攻擊,只能嘗試控制整個系統,以進行攻擊。

本文接下來的部分將討論分片型區塊鏈如何實現這些優勢。

隨機抽樣分片

最容易理解的分片版本是通過隨機抽樣進行分片。與以太坊生態系統中構建的分片形式相比,隨機抽樣分片的信任屬性更弱,但以太坊分片應用的技術更簡單。

下文闡述了分片的核心思想。假設有一個PoS區塊鏈,其驗證者數量非常多,例如10000位驗證者,並且需要驗證區塊的數量非常龐大,比如100個區塊。在下一組區塊產生之前,沒有一台計算機能夠驗證這100個區塊。

為了解決這個問題,我們需要以隨機的方式,分配驗證工作。我們對驗證者名單進行隨機混洗,然後選取名單中前100個驗證者來驗證第一個區塊,第二組100位驗證者來驗證第二個區塊,以此類推。隨機抽樣分片通過這種方式來驗證區塊或執行其他任務,這些隨機選出的驗證者稱為委員會 (committee)

Vitalik:從技術角度揭秘“分片”的優勢

驗證者驗證一個區塊后,會通過發布一個簽名來證明。其他所有節點都只需要驗證10000個簽名,而不是驗證100個完整區塊,這樣會減少很多工作量,特別是應用了BLS簽名聚合技術之後。每個區塊的廣播無需通過同一個P2P網絡,而是通過不同子網,節點只需加入自己負責或其他想要驗證的區塊相對應的子網。

想象一下,如果每個節點的算力增加2倍,會產生什麼效果。對於每個節點,現在能夠安全驗證簽名的數量增加了2倍,那麼可以減低最小質押數量,讓驗證者的數量增加2倍,這樣就可以產生200個委員會,而不是100個。所以,每個時隙的區塊驗證數量能夠達到200個,而不是100個。此外,每個區塊容量可以擴大2倍。因此,總體區塊鏈容量會增加4倍。

我們可以通過數學術語來解釋其背後的原理。根據大O符號 (Big O notation),我們用 “O(C)” 表示單個節點的算力。O(C) 代表傳統區塊鏈能夠處理的區塊大小。如上所述,分片鏈可以并行處理大小為 O(C) 的區塊 (請記住,每個節點來驗證每個區塊的間接成本為O(1),因為每個節點只需要驗證固定數量的簽名)。因此,每個區塊容量為O(C),分片鏈總容量是 O(C^2)。這就是為什麼這種類型的分片稱為二次方分片 (quadratic sharding),基於二次方分片的關鍵作用,我們認為從長遠來看,分片是擴展區塊鏈的最佳方式。

人們經常會問這樣一個問題:“隨機組成100個委員會與分裂為100條獨立區塊鏈有什麼不同?”

其不同之處主要在於以下兩個方面:

1. 隨機抽樣能防止攻擊者將算力集中於某個分片中。在一個100條區塊鏈組成的多鏈生態系統中,攻擊者只要擁有總質押量的0.5%就可以造成破壞,意味着可以針對其中一個區塊鏈發起51%攻擊。在一個分片鏈中,攻擊者必須擁有總質押量的30-40%,才能達到相同目標,換言之,該鏈的安全性能共享給分片。當然,攻擊者可以等到運氣好的時候,偶然在單個分片中獲得51%的算力,儘管擁有的質押量不到50%,但對於質押量遠遠低於51%的攻擊者來說,發起攻擊的難度呈指數型上升。如果質押量少於30%,幾乎不可能發起攻擊。

2. 若有一個分片出現了壞塊,整個鏈會重組,以避免接受該區塊,這稱為緊密耦合性。根據社會契約,即使單個分片中出現了一個壞塊,也不能被主鏈接受,一旦發現壞塊,分片會被拒絕,本文後面章節將介紹一些從技術上強制執行社會契約的方法。有了這一機制,從應用程序的角度來看,分片鏈享有完美安全性,合約A能夠信任合約B,即使由於區塊鏈受到攻擊,合約B出現故障,並且回滾了整個歷史,其中也包含合約A中由於合約B出現問題而受到影響的交易。

這兩種差異確保分片為應用創建了一個環境,該環境保留了單鏈條件下的關鍵安全屬性,而多鏈生態系統則無法實現這一點。

通過更好的安全模型改善分片

我完全同意比特幣社區中的一種普遍看法,那就是像比特幣(或以太坊)等區塊鏈並不完全依賴“誠實的大多數”假設。如果對這些區塊鏈展開51%攻擊,則攻擊者可以做一些具有破壞力的壞事,例如回滾或審查交易,但不能插入無效的交易。而且即使他這麼做了,運行常規節點的用戶也可以輕鬆檢測到這種行為,因此,社區若希望通過分叉來剝奪攻擊者的力量,以協調的方式抵禦攻擊,可以迅速採取行動。

對於更為中心化的高TPS鏈,它們的主要弱點是缺乏這種額外安全性。這種區塊鏈沒有,也不可能具有讓普通用戶運行節點的文化,因此主要節點和生態系統參與者可以更輕鬆地聚在一起,強制實行一項協議更改,即使社區非常不喜歡這個改動。更糟糕的是,在默認情況下,用戶的節點會接受這項改動。一段時間后,用戶會察覺到,但等到那時,這個更改已經成為既成事實,意味着其中主要的協調負擔,即拒絕更改,將由用戶承擔,並且不得不做出痛苦的決定,回滾一天或更多的交易記錄,而其他用戶都以為這些記錄已經得到了最終確認。

理想情況下,我們希望採用一種分片形式,其驗證方式能避免上文提到的51%信任假設,並保留傳統區塊鏈的高安全性,這種安全性只有在經過完全驗證的情況下才能實現。而這正是我們過去幾年的大部分研究成果。

可擴展計算驗證

我們可以將能夠抵禦51%攻擊的可擴展驗證問題分為兩種情況:

驗證計算:檢查某些計算是否正確完成,並假設你擁有完成該計算的所有輸入數據

驗證數據的可用性:檢查計算本身輸入的數據是否以某種形式存儲,在必要情況下以供下載;執行此檢查時,無需實際下載所有輸入數據,因為數據可能太大,無法每個區塊都進行下載。

區塊鏈中的區塊驗證同時涉及計算和數據可用性檢查,即你需要確信區塊中的交易有效,並且區塊中的新狀態根哈希是執行這些交易的正確執行結果,但是你還需要確信該區塊中有足夠多的數據實際得到發布,這樣下載數據的用戶可以計算狀態,繼續處理區塊。第二點關係到一個非常微妙但重要的概念,即數據可用性問題 (data availability problem)。下文會對這個問題進行探討。

可擴展計算驗證相對容易實現,其中會運用兩類技術:欺詐證明及ZK-SNARKs

Vitalik:從技術角度揭秘“分片”的優勢

欺詐證明能夠驗證計算的同時,保證擴展性

以下是對兩類技術的簡單介紹:

欺詐證明 (fraud proof) 是一個接受計算結果的系統,你可以要求有質押存款的人簽署以下形式的消息:“我證明,如果使用輸入X進行計算C,則會得到輸出Y”。你會默認信任該消息,但其他有質押存款的人會有挑戰計算結果的機會,他們可以簽名一條消息,稱“我不同意,輸出結果應該為Z,而不是Y。”僅發起挑戰後,所有節點才會進行運算。這兩方中任何一方出錯都會失去保證金,並且所有基於錯誤計算的運算都會重新進行。

ZK-SNARKs 是一種密碼學證明形式,可以直接驗證“輸入X后,執行計算C,會輸出Y”。在密碼學層面,該驗證機制是“可靠”的,因為如果輸入X后,進行計算C,結果不等於Y,則無法通過計算生成有效性證明。即使運行計算C本身花費大量時間,該證明也可以很快得到驗證。有關ZK-SNARK的更多數理解釋,請參閱此文章。

基於欺詐證明的計算之所以具有擴展性,是因為在“通常情況下”,你不用運行複雜計算,只需驗證單個簽名。在特殊情況下,挑戰出現后,你必須在鏈上驗證計算,但是特殊情況很少發生,因為觸發這種情況的成本非常昂貴,因為最初的聲明者或挑戰者之一會失去大量保證金。ZK-SNARKs概念更簡單,它們只是通過成本更低的證明進行驗證,從而代替計算,但其背後的數學原理卻要複雜得多。

有一種半可擴展系統,它能以可擴展的形式驗證計算,但需要每個節點驗證所有數據。該系統若能通過一系列壓縮技術,通過運算替換大部分數據,效率便可大大提高。這便是Rollup所做的事。

對數據可用性進行可擴展性驗證難度更高

欺詐證明不能用於驗證數據可用性。運算的欺詐證明基於這樣一種條件,即原始聲明一旦提交,運算的輸入數據要在鏈上發布,因此,如果有人發起挑戰,該挑戰的執行與原始執行的“環境”完全一致。對於數據可用性檢查,上述操作無法實現,因為如果要在鏈上發布,需要檢查的數據量太多。因此,針對數據可用性,如何生成欺詐證明方案變成了一個關鍵問題,有人可以聲稱“數據X可用”,但不在鏈上發布,等待挑戰者出現,發起挑戰後,再向整個網絡發布該數據,使得網絡中的其他參與者認為挑戰者是不正確的

下圖的“漁夫困境”能夠很好闡釋其中道理:

Vitalik:從技術角度揭秘“分片”的優勢

“漁夫困境”的核心理念涉及到兩種情況,一種情況是V1是惡意發布者,但V2是一個誠實挑戰者,而另一種情況是V1是誠實發布者,而V2是惡意挑戰者。兩種情況對於當時未嘗試下載該特定數據的任何人來說都沒有區別。當然,在可擴展的去中心化區塊鏈中,每個個人節點只期望下載一小部分數據,因此只有一小部分節點能夠了解分歧之外的所有狀況。

由於不可能辨識出哪一方是正確的,所以也無法為數據可用性生成有效的欺詐證明解決方案。

人們經常問道:“如果某些數據不可用怎麼辦?ZK-SNARK可以確保一切數據的有效性,但這還不夠嗎?”

不幸的是,僅僅保證數據有效性還不足以維持區塊鏈正常運行。原因是如果區塊鏈能經過驗證,但所有數據均不可用,則用戶將無法更新數據,生成證明驗證未來的區塊。攻擊者如果能生成一個區塊,該區塊雖然能夠經過驗證,但數據不可用,可以有效阻礙區塊鏈運行。有的攻擊者還可以不上傳特定用戶的帳戶數據,直到該用戶支付贖金為止,因此這不僅僅是一個活性問題。

有一些強有力的信息論觀點認為這個問題是根本性問題,沒有優良解決方案 (例如密碼學累加器的應用)。有關詳細信息,請參見本文。

那麼,如何在不下載的情況下,檢查1 MB數據是否可用?這聽起來無法實現!

關鍵的解決方案是一種稱為數據可用性採樣 (data availability sampling) 的技術。該技術的工作方式如下:

1. 通過糾刪碼工具,將具有N段的數據分成為2N段的數據,因此只需任意N個數據段都可以恢復整個數據。

2.用戶如果要檢查可用性,無需下載全部數據,而是隨機選擇區塊中的位置(常數,例如30),並且僅當在區塊中找到所有選定位置的數據時,才接受這個區塊。

Vitalik:從技術角度揭秘“分片”的優勢

通過糾刪碼,我們能夠將問題從“檢查100%數據可用性” (即保證每條數據均可用) 轉變為“檢查50%數據可用性” (即至少一半數據可用)。隨機抽樣則解決了50%可用性問題。如果可用數據量少於50%,那麼這兩種檢查手段中至少一個不可行,並且如果至少50%的數據可用,那麼,儘管某些節點可能無法得知一個區塊的可用性,但只需要一個誠實節點運行糾刪碼重構程序,就能恢復剩餘50%的區塊數據。因此,為了檢查1 MB區塊的可用性,你無需下載1 MB數據,只需下載幾KB。這樣每個區塊都能接受數據可用性檢查。有關如何使用P2P子網有效進行數據檢查,請參見這篇文章

通過ZK-SNARK證明,數據糾刪碼的正確性也能夠得到驗證,然後利用默克爾樹的分支來驗證各個數據塊。另一種驗證方式是使用多項式承諾 (polynomial commitment),例如 Kate commitments (KZG承諾),本質上,該承諾通過一個簡單組件進行糾刪編碼,證明每個要素和正確性驗證,這就是以太坊分片所使用的技術。

總結:如何保證所有數據的正確性?

假設有100個區塊,並且你不想依賴委員會有效地驗證所有區塊的正確性。為了實現這個目標,我們需要進行以下措施:

➤ 每個客戶端在每個區塊上進行數據可用性採樣,以驗證每個區塊中的數據是否可用,同時需要下載每個區塊幾KB的數據,即使區塊的整體大小為MB或更大。僅在所有數據可用性挑戰得到正確回應后,客戶點才會接受區塊。

➤ 數據可用性得到驗證后,那麼驗證其正確性將變得更加容易。驗證正確性要通過以下兩種技術:

  • 我們可以使用欺詐證明,一些質押了保證金的參與者可以提供簽名,證明每個區塊的正確性。其他挑戰者或者是漁夫節點會進行隨機檢查,並嘗試完整處理整個區塊。因為數據可用性已經經過檢查,所以其他節點始終可以下載數據,並對任何特定區塊進完全處理。如果發現無效區塊,節點會發布一個所有人都可以驗證的挑戰。如果該區塊被證明是壞塊,則基於這一區塊的所有區塊都需要重新經過運算。
  • 我們可以使用 ZK-SNARK 技術。這樣每個區塊的正確性都能得到這種技術的驗證。

➤ 在以上兩種情況中,無論區塊有多大,每個客戶端僅需要對區塊進行少量驗證工作。對於欺詐證明,區塊偶爾需要在鏈上得到充分驗證,但這種情況很少發生,因為就算髮起一個挑戰,成本也十分高昂。

以上就是全文的總結!就以太坊分片而言,短期計劃是讓分片中的區塊只包含數據。也就是說,這些分片的作用純粹是“數據可用性引擎”,Layer2 rollup 的工作則是使用安全的數據空間,另外還會利用欺詐證明或 ZK-SNARK 技術,實現高交易吞吐量,同時維持安全性。但是,我們還可以創建一個內部系統,“原地”實現高吞吐執行,這是完全有可能實現的。

分片系統的關鍵特性是什麼?有哪些權衡?

分片的主要目標是儘可能地繼承傳統非分片區塊鏈最重要的安全屬性,同時無需每個節點驗證每筆交易。

分片基本可以滿足這些要求。以下是傳統區塊鏈的特徵:

無效區塊無法添加到區塊鏈中,因為驗證節點會檢測到該區塊是無效的,並忽略該區塊。

數據不可用的區塊無法添加到區塊鏈中,因為驗證節點無法下載數據,並選擇忽略。

以下是強安全性的分片區塊鏈特徵:

無效區塊無法添加到區塊鏈中,原因如下:

  • 欺詐證明會迅速檢測到該區塊,並告知整個網絡其為不正確區塊,並重罰創建者。
  • 或者通過ZK-SNARK驗證其正確性,因為無法為無效區塊生成有效ZK-SNARK證明。

➤ 數據不可用的區塊無法添加到區塊鏈中,原因如下:

  • 如果區塊可用數據量只有不到50%,幾乎可以肯定的是,每個客戶端至少有一次數據可用性抽樣檢查會失敗,導致客戶端拒絕該區塊,
  • 如果至少有50%的區塊數據可用,那麼實際上整個區塊數據都是可用的,因為僅需一個誠實節點即可恢復其餘數據。

傳統高TPS鏈因為沒有分片,無法實現上述特徵。而多鏈系統面臨的問題在於,攻擊者如果選擇一條鏈進行攻擊,就可以輕易取得控制,系統中的鏈也可以共享安全性,但是如果安全性低,那將與傳統高TPS鏈沒有區別,還會繼承傳統區塊鏈的所有缺點,若安全性較高,共享安全性只是上述分片技術的一種更複雜的實現。

側鏈 (sidechain) 高度依賴於實現方式,如果它們共享礦工或驗證者,通常它們容易面臨傳統高TPS鏈的弱點;如果它們不共享礦工或驗證者,也會面對多鏈生態系統的弱點。分片鏈避免了這些問題。

但是,分片系統也有一些隱患。尤其是在以下幾個方面:

若遭遇適應性敵手攻擊,僅依賴於委員會的分片鏈難以應付,並且較難追責。也就是說,如果攻擊者能夠實時入侵或選擇關閉任何節點集合,那麼只需要攻擊少量節點即可破壞一個委員會。此外,攻擊者無論是應變能力強,還是擁有質押總數的50%,如果破壞了一個委員會,整個網絡只能確認少數參與攻擊的節點,即該委員會中的節點,結果處罰金額只佔少量質押。這又是另一個關鍵原因,解釋為什麼數據可用性採樣要與欺詐證明或ZK-SNARK結合,成為隨機採樣技術的重要補充。

僅在線客戶端數量足夠多,能生成足夠多數據可用性採樣請求時,這些重複響應總是構成至少50%的區塊數據。在實踐中,這意味着必須有幾百個客戶端在線,並且此數量越大,系統容量與單個節點容量的比率就越高。這是一個few-of-N信任模型——通常非常值得信賴,當然,它不如非分片鏈節點在數據可用性方面的0-of-N信任模式那麼穩健。

如果分片鏈依賴於欺詐證明,那麼它要基於時序假設,即如果網絡太慢,則在欺詐證明顯示數據有誤之前,節點可能已經敲定了某一個區塊。幸運的是,如果你嚴格遵循規則,一旦發現了無效區塊,就會回滾所有無效區塊,該時段參數由用戶設置,每個用戶都能設置確認區塊前的等待時間,如果他們不想等待太久可能會遭受損失,但更謹慎的用戶也更加安全。即使如此,這一機制會削弱用戶體驗。使用ZK-SNARK驗證有效性可以解決此問題。

需要傳輸的原始數據量大得多,增加了極端網絡條件下發生故障的風險。與大量數據相比,少量數據更容易傳輸,如果強大的政府試圖審查區塊鏈,也更容易安全隱藏。若區塊鏈瀏覽器想要維持整個鏈的信息,則需要存儲更多數據。

➤ 分片鏈依賴於分片式的P2P網絡,並且每個單獨P2P“子網”由於節點較少,更容易受到攻擊。因為子網之間存在一些冗餘,數據可用性採樣的子網模型可以緩解這種情況,但其中仍然存在風險。

這些是數據驗證需要關注的問題,儘管在我們看來,讓更多應用程序在鏈上運行,而不是通過中心化layer 2服務,減少用戶層的中心化,會比上述方面更值得注意。也就是說,實際上這些問題,特別是最後兩個問題,會對增加分片鏈吞吐量造成真正限制,使其無法超過特定規模。二次方分片 (quadratic sharding) 只能實現有限二次方性。

順便說一句,如果吞吐量過高,分片鏈的安全風險將日益增大,很大程度上,這也是放棄擴展至超二次分片的主要原因。使二次方分片保持其有限二次方性似乎是合適的中間值。

區塊生產中心化,而驗證分片化是否可行?

人們經常提出一種替代分片的方法,那就是使用類似於中心化高TPS鏈的結構,除此之外,利用數據可用性採樣和分片以驗證數據有效性和可用性。

這種方案能夠改善既有的中心化高tps區塊鏈,但仍遠沒有分片系統強大。其中一些原因如下:

1. 在高TPS鏈中,更難監測到區塊生產者的審查行為。

監測審查行為需要滿足以下任一:(i) 能夠看到每筆交易,並且驗證沒有合理交易莫名其妙未進入,或者(ii)在區塊生產者中使用1-of-N信任模型,並驗證沒有區塊無法上鏈。在中心化高TPS鏈中,第一點不可能實現,而實現第二點更困難,因為節點數少,甚至1-of-N信任模型都更容易被破壞,並且 如果該鏈的區塊時間對於DAS (數據可用性採樣) 來說太快 (就像大多數中心化高TPS鏈那樣),則很難證明節點的區塊不會僅僅因為它們的發布速度太慢而被拒絕。

2. 如果大多數區塊生產者和生態系統成員試圖強制執行一項協議更改,雖然這項更改不受歡迎,用戶的客戶端肯定會檢測到更改,但是對於社區,拒絕更改、進行分叉的難度要大得多,因為需要運行成本高昂的新的高吞吐量節點,維持基於舊規則的區塊鏈。

3. 在中心化基礎設施中,外部攻擊者更容易實施審查。區塊生產節點交易吞吐量高,非常易被檢測到,關停這些節點也很容易。審查專用的高性能計算在政治上和後勤上比在單個用戶的筆記本電腦上進行審查要容易得多。改:與追蹤個人用戶的筆記本電腦相比,對專用的高性能計算進行審查在邏輯和實踐中都更加容易。

4. 高性能計算向中心化雲服務轉移會面對更大壓力,增加了風險,因為整個鏈將在1-3家公司的雲服務中運行,如果許多區塊生產者同時出現故障,會增大區塊鏈崩潰的風險。驗證節點都在個人硬件上運行的分片鏈不會那麼容易受到這種攻擊。

系統適當分片化后,能更加適合作為基礎層。基於一個分片化的基礎層,你始終能夠通過構建Rollup的方式創建一個中心化的產品系統 (例如用於DeFi的具有同步可組合性的高吞吐量領域)。但是,如果基礎層依賴於中心化區塊生產,則無法基於此構建一個更加去中心化的Layer2。

本文鏈接:https://www.8btc.com/article/6637404

轉載請註明文章出處

(0)
上一篇 2021-05-20 12:33
下一篇 2021-05-20 13:08

相关推荐