1 概述

過去二十年來,數字技術已經顛覆了全球娛樂和媒體行業。它轉變了內容製作和媒體的發行方式。市場預計在未來幾年內將繼續增長,目前估計價值超過2萬億美元。這些給藝術家帶來機遇的同時,也面臨著一些急性問題。鑒於數字內容可以在互聯網上輕鬆複製和免費分發,跟蹤數字內容版權和特許權使用費仍然十分複雜。

區塊鏈技術可以幫助解決一些問題,通過連接數字內容原創者(藝術家,音樂家,攝影師等),發行平台與消費者,更有效地組織點播付費和結算服務。它還可以幫助數字權利在整個行業得到更有效的識別和管理,並向正確的藝術家和內容所有者支付適當的賠償。區別於傳統的發行模式,區塊鏈去掉了所有中介平台,例如在市場上發售的音樂和視頻等流媒體獲得的收入大部分都會歸原創者所有。 除了解決版權和付費結算問題,我們還打算利用區塊鏈和P2P技術解決內容文件的存儲問題。所有發行的內容文件都會存儲在分散式的各個節點中,通過代幣驅動各主機節點,實現了完全去中心化,自治的媒體生態。我們的分散式存儲費大概只有傳統雲儲存費用的1/10,這能幫助內容原創者降低了作品的存儲成本。

2 StreamChain的智能合約

自從2008年中本聰發布了描述比特幣協議的白皮書。比特幣就已經成為全球公認的最有價值的數字貨幣。比特幣非常成功,這是因為它提供了訪問區塊鏈的機制。然而,區塊鏈是一個非常強大的技術,它能夠執行複雜的操作,並不僅僅是比特幣。這就是智能合約的想法。智能合約已經成為企業區塊鏈應用的基石,可能成為塊鏈技術的支柱之一。下面我們將探討智能合約是什麼,它的工作原理以及它如何被使用。

智能合約只是一段計算機程序,合約上的條款可以被預編程,具有自我執行的能力。智能合約的主要目的是讓兩個匿名方通過互聯網進行交易和開展業務,而不需要通過任何中介。

StreamChain將會獨立開發自己的區塊鏈系統,為了滿足自身的特殊需求,它必須且只能被設計成為一條公有鏈。和以太坊一樣,我們的所有業務都會跑在智能合約之上。StreamChain有三類智能合約:

  • 發行合約
  • 交易合約
  • 存儲合約

每種合約滿足了不同的業務需求,例如發行合約保護了內容原創者的版權,存儲合約維護著租用者和主機存儲之間的關係。這些合約ded輸入和輸出的結果都會被礦工打包進區塊,同時每個節點都會驗證合約結果的正確性。

3 發行與版權

StreamChain利用了區塊鏈不可篡改的特點來保護內容發行者的版權。用戶只需要擁有一個私鑰就能通過智能合約來發行自己的作品,而且這一過程是完全匿名的。區塊鏈在本質上,是一個共享、可信的公共總賬,任何人都可以對它進行核查,但不存在一個單一的用戶可以對它進行控制。簡單地說,它是一台製造信任的機器。以下將會討論StreamChain是如何利用區塊鏈來保護內容發行者的版權,它的原理和實現。

StreamChain發行媒體的流程圖:

3.1 數字媒體的指紋與簽名

在計算機系統中,常用MD5和SHA是用來計算和校驗文件報文摘要的工具程序。將一個文件的內容經過計算與校驗和分布到一個128位的散列值上。該散列值可以作為該文件的數字指紋使用。兩個不同的文件不可能得到同樣的散列結果。因此,一旦文件被改動,就可檢測出來。 例如在linux中,產生某個md5sum的命令如下:

md5sum filename > finame.md5

在其他P2P對等網路系統中,常用文件頭部的一些特徵信息作為散列的內容,例如作者,歌名,年份等。在開源的情況下,這種方案也許是不錯的選擇。但這種校驗結果往往局限在某個對等網路中,在跨系統中存在互相不兼容的現象。

Keccak256加密演算法

StreamChain和以太坊一樣,採用了更加安全高效的Keccak256散列演算法來生成數字內容的指紋。以下是以太坊源碼中採用Keccak256來加密字元串。

hash := crypto.Keccak256Hash([]byte("helloworld"))

經過多年的測試和分析,美國政府選擇了Keccak演算法作為SHA3的加密標準。Keccak擁有良好的加密性能以及抗解密能力。它採用了創新的的「海綿引擎」散列消息文本。它是快速的,在英特爾酷睿2處理器下的平均速度為12.5周期每位元組。它設計簡單,方便硬體實現。 Keccak使用了24個變換循環來縮減消息文本為散列值。每個循環連續調用了五個模塊。

Keccak256的計算過程:

$ heta$: $a[i][?j][k] ← a[i][?j][k] ⊕ parity(a[0...4][?j?1][k]) ⊕ parity(a[0...4][?j+1][k?1])$

$
ho$: $a[i][?j][k] ← a[i][?j][k?(t+1)(t+2)/2], where {displaystyle {egin{pmatrix}ijend{pmatrix}}={egin{pmatrix}3&21&0end{pmatrix}}^{t}{egin{pmatrix}01end{pmatrix}}} {egin{pmatrix}ijend{pmatrix}}={egin{pmatrix}3&21&0end{pmatrix}}^{t}{egin{pmatrix}01end{pmatrix}}$ $pi$: $a[?i][j] ← a[j][3i+j]$ $chi$: $a[i][j][k] ← a[i][?j][k] ⊕ (?a[i][?j+1][k] & a[i][?j+2][k])$ $iota$: 把數組中的一個元素與一循環常量異或。 Keccak256加密的hash結果將會作為某個文件在streamChain網路上的唯一標識ID。某個用戶節點想要獲取某個文件時,必須要帶上該該文件的指紋才能找到該文件。

3.2 簽名與驗證

如何證明A用戶擁有B文件內容的版權呢?streamChain將會圍繞該問題做一些非常複雜而有效的工作。大多數加密貨幣都是利用ECDSA橢圓曲線非對稱加密演算法來實現簽名的。例如Alice擁有一把公鑰和一把私鑰。她可以利用私鑰來完成對某一內容的簽名,而另外一個人則可以利用該公鑰來驗證簽名。比特幣賬戶的地址是公鑰的兩次SHA-256加密,在經過Base58編碼而成。

Checksum = SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Checksum)

不同於比特幣,streamChain擁有兩類賬戶: 外部用戶的賬戶,通過私鑰控制;智能合約賬戶,通過合約代碼控制。

區塊鏈節點驗證交易簽名需要發送方的公鑰,公鑰並沒有標準的發布方法,通常會把公鑰增加到交易里。由於比特幣和以太坊所用的ECDSA演算法有一個很有意思的特性:可以從簽名推導出公鑰,streamChain的交易格式只包含了簽名,驗證交易簽名前先用演算法推導出公鑰,然後再進行驗證簽名。 現在問題很簡單了,那麼我們只需要一個用戶A對文件B的簽名就可以證明它擁有B文件的版權。StreamChain把該過程通過智能合約簡化了,但驗簽原理是一樣的。我們把用戶A和文件B的關係都經過智能合約發布在了區塊鏈上了,而且完全是去中心化的。

3.3 區塊鏈上的版權存儲

可以把作者和作品的關係存儲在分散式的區塊鏈上,而且只有被驗證通過的作者簽名的地址才有資格確定和作品的指紋綁定關係。streamChain的每個節點都會把這些存儲的過程驗證一遍,因此該關係的合法性自然而然的得到了大多數節點的認可。況且通過工作量證明來防止一些意外發生,例如雙花這種情形。以上證明有效性的前提是發行作品過程的合約和源碼必須是公開的。靜態地限制存儲的讀寫許可權,並且保證作品指紋的唯一存儲性。

簡單的存儲結構:

struct Stream {
bytes32 name; //數字作品名稱
uint version //發行版本號
bytes32 date; //發行時間
bytes32 author_name; //擁有著的名稱
address owner; // 數字作品擁有者
}
mapping(info_hash => Stream) public Streams;// 數字作品的hash-->Stream

4 交易合約和交易自動化

StreamChain不僅僅要解決版權的問題,而且要實現交易流程流程自動化。智能合約可以輕鬆地為我們解決這一問題。StreamChain中有兩類賬戶,它們共用同一個地址空間。外部賬戶,該類賬戶被公鑰-私鑰對控制(人類)。合約賬戶,該類賬戶被存儲在賬戶中的代碼控制。StreamChain將會在以太坊上創建一個付費的智能合約,並且公開該合約的地址。只要有觀眾向這個地址發送交易的請求,合約代碼就能自動地把費用分發到某個作品的所有利益方,例如作者,平台,廣告商等。StreamChain的智能合約擁有一些付費相關高級特性,例如交易,轉讓,定價,分佣,退款,分期,提現等。而且這些都是透明的,任何人都有權查看某個作品的所有歷史交易記錄。

版權認可和支付透明這兩個條件,可以讓StreamChain網路上的所有節點對流媒體的內容分發做到定量可控。P2P流媒體網路本身也是去中心化的,分散式存儲的,因此可以天然地跟區塊鏈網路結合。這將會讓我們進一步的做到整個流程的可控。

5 去中心化文件存儲

類似於Sia和storj,streamChain也會把音樂,視頻等流媒體文件分散地存儲在各個主機節點上。不同於Sia,我們的文件都是公開發行的,任何人只需要通過發送代幣即可下載和瀏覽。

只把數據存儲在一台不受信任的主機上,在可用性,帶寬和服務質量上得不到很好的保證。因此,我們建議把數據存儲在多個主機上。而且多主機並行傳輸能夠加速下載速度。利用糾刪碼(erasure code)或者隨機網路編碼等技術可以保證數據的高可用性和傳輸的無冗餘性。 我們利用DHT演算法最終確定數據的存儲位置。DHT全稱叫分散式哈希表(Distributed Hash Table),是一種分散式存儲方法,可由鍵值來唯一標示的信息按照某種協議被分散地存儲在多個節點上,這樣也可以有效地避免中心伺服器的單一故障而帶來的整個網路癱瘓。常用的實現方案有Kademlia,CHORD,Pastry等。其中Kademlia(簡稱Kad)是應用最廣泛的一種。這裡我們只討論Kademlia的一些技術原理和細節。

5.1 Kademlia網路

Kad中所有節點都被當做一顆二叉樹的葉子,每一個節點的位置都由其ID值的最短前綴唯一的確定。對於每個節點來說按照離自己的遠近區域又可以把這棵樹劃分為160棵子樹,每一個子樹和該節點都有一個共同的前綴,共同前綴越少離得越遠。如下圖示黑色節點擁有3棵子樹(灰色圈表示)。Kademlia使用獨特的異或距離演算法來計算節點間的距離,異或是一種簡單的數學計算。對於異或(xor)操作,擁有如下數學性質: $$d(x,x)=0$$ $$d(x,y)>0$$ $$d(x,y)=d(y,x)$$ $$d(x,y)+d(y,z) geq d(x,z)$$ 一個典型的Kad網路拓撲結構如下:

和區塊鏈不同,點對點的流媒體網路存儲的資源信息比較大,因此在大規模應用的情況下,每個節點都存儲所有的資源和節點信息是不可能的。如果需要找到目標節點不是領節點,就需要通過間接的方法找到該節點。Kad的路由表是通過"K桶"的表格構造起來的。 K桶路由表結構圖示:

由此可見,每個節點都保存一些和自己距離 $[2^i,2^{i+1}]$ 內的一些節點的信息,這些信息由(IP address, UDP port, Node ID)構成。K-桶中的條目是按與其他臨近節點的狀態信息排序的,每當收到一個消息時,就要更新一次K桶。經過證明,對一項有N個節點構成的Kad路由網路,最多只需要經過 $log N$ 次查詢,就可以精確定位到目標節點。

Kademlia協議僅定義了四種操作:

  • PING: 探測一個節點是否在線
  • STORE: 令對方儲存一份數據
  • FIND NODE: 根據節點ID查找一個節點
  • FIND VALUE: 根據鍵查找一個值(數據)

5.2 默克爾樹(Merkle Tree)

StreamChain的音樂,視頻等流媒體文件將會分割成大量的很小的數據片段,這些片段會根據「K桶」存儲在Kademlia網路的節點上。默克爾樹有效的組織所有片段,並且能證明某數據片段是否來自某個原始文件。

Merkle Tree具有以下特性:

+ 它是一棵二叉樹,也可以是多叉樹,但具有樹的所有特點。 + 葉子節點是所有數據的hash值。 + 非葉子節點是所有子節點的組合的hash值。

我們把所有數據片段的hash值存儲在Merkle Tree的所有葉子節點上。利用它可以用來組織數據片段,文件完整性證明,以及存儲證明等。下節將會介紹我們如何利用它來實現存儲證明。

6 存儲證明(Proof of Storage)

內容發行者需要消耗代幣來讓streamChain上各個主機節點存儲自己的數據。消耗代幣的多少取決於文件的大小和存儲時間。但存儲的主機只能分期的獲得租用者的傭金,以便保障租用者的權益。這些規則都會定義在streamChain的存儲智能合約上。每個主機都需要定期的發送自己的存儲證明。

6.1 演算法

主機只需要提供數據的一個片段(segment)。各個節點只需要比較該數據片段的hash值和默克爾樹比較來驗證。這些信息足以證明該數據片段來自原始文件。選擇的數據片段編號是隨機的,而且必須在一個「挑戰窗口」內完成。

隨機種子的定義如下: $$ H(contract ID || H(B_{i-1})) $$ 數據的隨機片段編號根據該隨機種子生成。所有的「挑戰窗口」將會充滿整個存儲的時間(合約上定義的時間),只有完成了大部分調整的主機才能拿到所有的報酬。如果存儲主機不能完成50%的挑戰,該主機也會懲罰部分的報酬。通過代幣激勵這種模式,讓P2P網路上的存儲節點更好的為所有用戶服務,包括內容發行者和消費者。

7 數字媒體的P2P傳播與校驗

通過以上對Kad網路的討論可知,所有內容的存儲也是分散式的。不僅原創者發行內容需要代幣,內容消費者也需要消耗代幣來觀看內容。 我們如何控制這些節點有效的傳播到點播節點呢? 例如 媒體A要分發到用戶B。

  1. B已經產生了對A的交易。
  2. B的行為得到了大多數節點(存儲A的節點)的認可。
  3. B節點校驗A內容的有效性。

因此只需要滿足以上三個條件,就可以認為某個媒體內容在StreamChain上的傳播是可接受的。StreamChain在區塊鏈上交易的透明性可以滿足條件1。而條件2和條件3都會加在StreamChain的傳播協議裡面。這些步驟的唯一的目標是讓節點選擇拒絕還是接受這兩種行為。這其中所有的驗證都運行在StreamChain的三類智能合約上。

一旦校驗完成,被交易的流媒體數據會立即地發送給內容訂閱者,由於這一傳輸過程是並行的,因此下載速度會很快。利用糾刪碼(erasure code)或者隨機網路編碼等技術可以保證數據的高可用性和傳輸的無冗餘性。StreamChain採用隨機網路編碼來完成數據的高可用傳輸。

7.1 隨機網路編碼

與傳統的數據傳輸模式不同,為了避免多條線路的數據重複傳播,並且保持對不同線路數據組裝的一致性,StreamChain採用隨機網路編碼分發數據技術。這種方式的優點在於不需要事先人為設定數據傳輸的內容,只需要少量冗餘的代價即可實現數據靈活的分割與組合。

隨機網路編碼演算法:

編碼過程 $$ x=sum_{i=1}^{m}c_i^pcdot b_i^j $$

解碼過程

$$ b = A^{-1}x^T $$

$c_i^p$: 上游某節點發送給節點p的第i個區塊對應的隨機係數。

$b_i^j$: 上游某節點待發送到節點p的第i個區塊數據。 $A$: 節點P收到的上游所有節點發送的隨機係數$c_i^p$組成的矩陣。

例如假設當前時刻欲傳輸的數據為4,3,2(圖示A client和 B client上方的數據)。A和B向C傳輸時,不會直接傳輸原始數據。隨機生成隨機係數([1,2,3] [1,1,2] [2,1,2]),然後將原始數據和隨機係數依次相乘並相加得到要傳輸的數據A。最終C得到了[16,11,15]和三個隨機係數。然後C根據求解多元線性方程組的方法反算出原數據。這樣傳輸方式不需要用戶節點的各個上游節點事先約定,只要用戶接收到足夠多的數據即可計算出原始數據。雖然增加了係數的傳遞,但考慮整個系統需要這樣的靈活方便性還是值得的。

隨機網路編碼圖示:

8 Sybil攻擊

如果某個惡意的實體模仿很多個身份,他就可以控制整個P2P網路的流動方向。在網路上,偽裝成很多個地址是很容易的,例如他可以偽裝成多個主機節點來獲得更多的文件存儲。我們可以通過某種信譽評級機制來抵禦Sybil攻擊。streamChain需要每個存儲主機提供銷毀證明,把收益的2%發送給一個公認的不可再使用的地址。而且銷毀的越多,信譽評級就越高。每個文件streamChain上至少有3個備份,因此攻擊者需要付出更高的代價來控制整個P2P網路的流向。隨著streamChain節點數量的增長,要收集那麼多代幣發動Sybil攻擊幾乎是不可能完成的任務。攻擊難度足以媲美比特幣的51%攻擊。

9 關閉窗口攻擊

假設某個惡意的礦工把一個塊的存儲證明刪除,並以此敲詐存儲主機。這就是關閉窗口攻擊,認為的把某個挑戰窗口給抹掉了,從而讓存儲主機拿不到報酬。streamChain建議存儲主機選用比較大的挑戰窗口,讓一個挑戰窗口的存儲證明分散在各個區塊中,每個礦工只能擁有部分的存儲證明,這樣存儲主機就能拿到大部分的報酬。存儲主機也可以拒絕選擇不適合的挑戰窗口合約。

10 代幣

StreamChain的代幣也會遵循ERC20標準,代幣合約將提供提供以下幾個介面:

  • 獲得代幣總供應量
  • 獲得賬戶餘額
  • 轉讓代幣
  • 批准花費代幣

這些代幣將會用於音樂,視頻等媒體的發行費用,存儲費用,同時消費者也可以利用代幣來下載查閱媒體內容。代幣是激勵StreamChain自主運行的關鍵原材料。整個流媒體生態也可以通過這些代幣獲得更好的良性循環。代幣的價格也暗示著整個流媒體生態環境的好壞。

11 網路自適應模型與演算法

假設節點個數為$n$。$p_i(i=1..m)$ 表示第i個固定節點。用 $P$ 表示節點的集合,則 $$ left{ egin{aligned} P & = {p_i},i=1..n end{aligned}
ight. $$

$r$ 表示支撐固定節點所需數據的正常運行的最小流率。用 $u_i$ 表示第i個固定節點的上傳帶寬。$u_s$表示源節點負載大小,$u_{smin}$系統通用流。 對於$P$ $$u_{smin}geq r $$

且所有的最小流率之和不能大於所有的上傳帶寬之和。 $$ u_{smin} + sum_{P}u_i geq nr $$

固定節點和移動節點的平均上傳帶寬 $$ left{ egin{aligned} ar {u} & = frac{sum_{i=1}^{n}{u_i}}{n} end{aligned}
ight. $$

結合以上兩公式: $$ u_{smin}+n_f(ar {u}-r) geq 0 $$

整理得: $$ left{ egin{aligned} u_{smin} & geq r u_{smin} & geq n_f(r-ar u) end{aligned}
ight. $$ 令 $MAX=max[r,n(r-ar u)]$

所以 $$u_{smin} geq MAX $$

令 $u_s = MAX$

用$s_{oi}(i=1,..,n_f)$表示源節點發送給 $p_i$ 的多媒體數據的流率大小,用 $s_{ki}$ 表示 $p_k$ 。用 $tr_i(i=1,..,m)$ 表示 $p_i$ 所接受多媒體數據的總流率。當 $r geq n(r-ar u)$,即:

$rleq frac{n ar u}{n-1}$時,s為 $p_i$發送的數據流率為: $s_{oi}=frac{u_i r}{n ar u}$ , 所以: $$ sum_{P}=r leq u_s $$ 因此$s$有足夠的上傳帶寬實現以上發送。 又由於 $$ (n-1)s_{oi} = frac{(n-1)u_i}{n ar u} r leq frac{(n-1)u_i}{n ar u} cdot frac{n ar u}{n-1} = u_i $$ 因此,$p_i^f$ 有足夠的上傳帶寬把數據發送給其他固定節點。 每個固定節點接受的總流率為 $$ tr_i = s_{oi} + sum_{P}^{j
eq i}s_{oj} = r $$ 所以該條件能滿足所有固定節點獲取足夠的流率,滿足媒體正常播放。 當$r<n(r-ar u)$時,$s$為$p_i$ 發送兩次流媒體數據, 第一次流率: $$ s_{oi}^{1} = frac{u_i}{n-1}$$ 第二次為 $$ s_{oi}^{2} = r - frac{u(P)}{n-1}=r-frac{nar u}{n-1}$$

經過計算推導 $$ sum_{P} s_{oi}^{1} + sum_{P} s_{oi}^2 = n_f(r-ar u) leq u_s $$ 所以$s$有足夠的上傳帶寬實現以上發送。又由於 $$ (n-1)s_{oi}^{1}=(n-1)cdot frac{u_i}{n-1} = u_i $$ $p_i$有足夠的上傳打款將所得的 $s_{oi}^{1}$ 包含數據一同樣的流率轉發給其他節點。總流率為 $$ tr_i = s_{oi}^{1} + s_{oi}^{2} + sum_{P}^{j
eq i} s_{oi}^{1} = r $$ 因此 $p_i(i=1...m)$ 獲得足夠的流率來保證媒體的正常播放。 綜上兩種情況,都按照演算法設計實現了所有節點的正常播放。

12 StreamChain生態

StreamChain既是音視頻等流媒體的發行平台,也是去中心化的公共數據存儲平台。所有的自動化交易都運行在區塊鏈的智能合約上。StreamChain將會顛覆整個音樂,短視頻等流媒體行業,這只是一個必然的趨勢。StreamChain未來將會和一些現有的媒體平台合作,例如QQ音樂,酷狗音樂,秒拍,快手等。可以說StreamChain未來將會成為整個流媒體行業的上游應用。我們也會構建自己的去中心化的媒體客戶端,和Steemit一樣加入去中心化的點評排名機制,促進原創內容的增長。

參考文獻

  1. Satoshi Nakamoto. 比特幣白皮書[EB/OL]. bitcoin.org/bitcoin.pdf,(2008).
  2. Wikipedia. SHA-3 wiki[EB/OL]. en.wikipedia.org/wiki/S
  3. Ethereum Wiki. 以太坊白皮書[EB/OL]. github.com/ethereum/wik
  4. 廖丹,孫罡,曾帥. P2P流媒體系統關鍵技術[M]. 北京:國防工業大學出版社. (2014)
  5. Wikipedia. Kademlia網路[EB/OL]. en.wikipedia.org/wiki/K
  6. Yandong Wen1,Kaipeng Zhang1,Zhifeng Li1,Yu Qiao. Discriminative Feature Learning Approach for Deep Face Recognition. ydwen.github.io/papers/. (2016)
  7. Don Johnson,Alfred Menezes,Scott Vanstone. The Elliptic Curve Digital Signature Algorithm (ECDSA). cs.ucsb.edu/~koc/ccs130.
  8. David Vorick,Luke Champine. Sia: Simple Decentralized Storage. sia.tech/whitepaper.pdf. (2014)

推薦閱讀:

相关文章