注意這篇文章你已經(jīng)了解Smart Contract 的話理解比較簡單,如果不了解Smart Contract 的話讀起來會有點吃力。
Raiden是一個基于Ethereum (以太坊)的鏈下交易方案,主要想解決三大問題:速度、費用與隱私。
速度跟費用是在Ethereum上蠻需要解決的問題,依照目前的資訊目前網(wǎng)路上每秒的平均交易數(shù)量為10個,而交易費雖然可以每次Transaction都可以調(diào)整gas price,不過網(wǎng)路雍塞時卻不得不調(diào)高來讓自己的交易可以完成,最近的加密貓之亂讓整個Ethereum網(wǎng)路擁塞想必有些支援以太幣(Ether)的交易所像是熱鍋上的螞蟻一樣吧。
雖然Sharding與Plasma等等解決交易速度的擴展解決方案愈來愈常提及,不過距離正式的釋出似乎都還需要一段時間的醞釀。而Raiden在目前看起來是完成度較高的擴展方案。
注:我沒介紹隱私方面有什么問題,因為覺得速度跟費用這兩個問題比較嚴(yán)重。
速度與交易費的問題
但這實際上問題到底是出在哪里呢?
在速度方面,因為所有交易都需要全網(wǎng)共識的關(guān)系,所以每個交易都須要等到新的區(qū)塊被算出來時,并且此筆新交易需要包含在其中之后才會成立,依照目前Ethereum 的出塊速度交易可能會需要數(shù)十秒到數(shù)分鐘才有辦法確認(rèn),在網(wǎng)絡(luò)壅塞時甚至需要等更久。
交易費的狀況則是因為Ethereum 中所設(shè)計的gas 機制的關(guān)系,每筆交易都會支付給礦工一筆交易費用,這交易費用如果放到比較大額的交易時還好,不過如果在小額交易時費用比例就會太高。比如說最近幾次我完成的交易費用大約在0.3USD~0.37USD 之間,如果只是作幾百塊臺幣的交易那就顯然太貴了。
Raiden 網(wǎng)絡(luò)的解決方案
最前面有提到一個讓人很疑惑的句子:Raiden 是一個基于 Ethereum (以太坊)的鏈下交易方案,既然是鏈下解決方案,怎么會又基于Ethereum呢?
因為Raiden 是一個輔佐型的網(wǎng)絡(luò),利用開啟通道(Channel) 來處理一批次的交易,再用一些加密演算法的機制在鏈下紀(jì)錄并核實真正的交易數(shù)據(jù),最后在關(guān)閉Channel 時將交易數(shù)據(jù)送入?yún)^(qū)塊鏈中進行實際的加密貨幣交易與核實。這樣實際在區(qū)塊鏈上的交易筆數(shù)就會減少許多,達(dá)成減低交易費與加速的目的了。
聽起來很神奇(確實也是),但是要達(dá)成這樣的目的需要有許多細(xì)節(jié),會在下面一一的解釋。
首先要先說明Raiden 是一個多節(jié)點的網(wǎng)絡(luò),但是為了先從簡單的情境開始,我們會先說明兩個節(jié)點之間要怎么利用Raiden 的原理達(dá)成減少交易費以及加速的目的,最后再解釋在許多Raiden 的節(jié)點所形成的網(wǎng)路要怎么達(dá)成目的。
另外Raiden 可以轉(zhuǎn)任何ERC20 的token,我們以下雖然用以太幣Ether (ETH) 作為范例,不過實際上會被包裝成一個相容于ERC20 的token。
先想像一下…
因為我還沒看過Raiden 的服務(wù)或錢包長怎樣,為了比較好的解釋跟想像Raiden Network,請先想像使用Raiden 時會像是悠游卡一樣的儲值卡app,不一樣的是它是一個app,平常你會到捷運的儲值機儲值悠游卡,在Raiden Network 底下你需要要一個app 把你的Ether 以太幣儲值入Raiden 里面。
你可以在這個app 上面看到你的Ethereum 帳戶與Raiden 帳戶里面分別有多少余額、列出你曾經(jīng)在Raiden 網(wǎng)絡(luò)上作的轉(zhuǎn)帳,最后app 底端有三個功能:
· 儲值(Deposit):把以太幣從Ethereum 帳戶轉(zhuǎn)到Raiden 帳戶
· 提領(lǐng)(Withdraw):把以太幣從Raiden 帳戶轉(zhuǎn)回Ethereum 帳戶
· 轉(zhuǎn)帳(Transfer):把以太幣轉(zhuǎn)給同樣在Raiden 網(wǎng)絡(luò)里面的帳戶
先談兩個節(jié)點之間的互動
說了這么多,終于要開始解釋兩個節(jié)點之間的互動了。前面有提到Raiden 網(wǎng)絡(luò)的原理是在Ethereum 上開一個通道來處理多筆交易,讓我們來好好檢視一下之中的細(xì)節(jié)。
開啟通道
首先,其實通道(Channel) 其實就是一個Smart Contract。當(dāng)你打開了一個通道后就是布署了一個新的Smart Contract。舉例來說Bob 跟Alice 之間經(jīng)常一起吃飯,三天兩頭就要互相Cover 飯錢,他們之間的互動會是這樣:
上面的這張圖虛線以上是區(qū)塊鏈上的互動,虛線以下是Raiden 網(wǎng)絡(luò)上的互動。
首先他們要先開啟一個通道(部署一個Smart Contract),接著兩個人都先放5 以太幣到這個Smart Contract 里面,讓資金足夠可以在兩人之間流動。當(dāng)這個Smart Contract 已經(jīng)儲存了兩人的以太幣后,雙方就可以開始在Raiden 網(wǎng)絡(luò)中進行交易了。當(dāng)Bob 在Raiden 網(wǎng)絡(luò)送出第一筆1 ETH 的交易給Alice 時,此筆交易并不會發(fā)到區(qū)塊鏈上,取而代之的是Bob 會將此筆交易資訊包含雙方在通道中的余額利用自己的私鑰簽章過后,送給Alice 保存此筆資訊,此筆資訊稱為Balance Proof。當(dāng)Alice 也通知Bob 收到Balance Proof 后,這筆交易在Raiden 上面就會成立了。
在這個時間點,雙方都會有通道上的余額資訊,如Alice會擁有一份Balance Proof Bob: 4 ETH, Alice 6 ETH并且已經(jīng)經(jīng)過了Bob的簽章。
接下來的三筆交易都會用同樣的方式僅在Raiden 當(dāng)中檢查、簽名與傳送,這些資訊都不會上到Ethereum區(qū)塊鏈網(wǎng)絡(luò)上。
另外在Raiden 網(wǎng)絡(luò)上面并不需要保存所有的交易紀(jì)錄,僅需要保存最后的余額即可。
關(guān)閉通道
當(dāng)這兩個節(jié)點的任何一個節(jié)點想要把在Smart Contract 的儲值的錢領(lǐng)回時,可以關(guān)閉通道(Close Channel)。
假設(shè)是Bob想要關(guān)閉通道,則Bob呼叫Smart Contract的close(),此時Bob會在close()的參數(shù)內(nèi)附上自己最新取得的一次Balance Proof,同時在一段時間內(nèi)Alice也可以呼叫updateTransfer()更新雙方余額數(shù)據(jù)。
當(dāng)雙方都更新完數(shù)據(jù)后,此通道可以被任何一個人(不限于雙方,可以是Ethereum上的任一節(jié)點)觸發(fā)settle()將雙方的錢都發(fā)回。Bob跟Alice當(dāng)初都存了5 ETH進去這個通道,最后余額的狀況則是發(fā)回給Bob 6 ETH,給Alice 4 ETH。
這邊的重點就是因為每個人擁有的Balance Proof都會經(jīng)過對方的私鑰簽名,所以不論是哪一方呼叫了close()或是updateTransfer(),此通道的Smart Contract都可以利用Solidity中的ecrecover()驗證簽名,當(dāng)Balance Proof驗證正確后,Smart Contract就可以確認(rèn)這筆余額雙方都確認(rèn)無誤。
整個Raiden 網(wǎng)絡(luò)
剛剛先說明了兩個節(jié)點在Raiden 網(wǎng)絡(luò)的運作狀況,但是如果每次都要在需要支付的雙方開一個通道來轉(zhuǎn)帳顯得很不合理,所以Raiden 網(wǎng)絡(luò)上的多個節(jié)點就派上用場,假如說Alice (A) 現(xiàn)在要轉(zhuǎn)帳給David (D),他們之間其實并不需要雙方存在直接通道,僅需要Alice 跟David 都在Raiden 網(wǎng)絡(luò)上即可,也就是說他們都跟Raiden 網(wǎng)絡(luò)上的其中一些節(jié)點之間已經(jīng)開啟了通道。
原圖出自Raiden Network 101,但是把格式改成橫的方便閱讀
當(dāng)Alice要轉(zhuǎn)帳給David時,首先他要先在Raiden中找到一條通往David節(jié)點的路徑,找到后就可以借用這些節(jié)點之間的通道把以太幣轉(zhuǎn)給David。而在整個傳輸完成前,這條通道上交易會使用Hash Lock鎖定住,直到David在通道上確認(rèn)已經(jīng)收到款項,跟Alice用SecretRequest要求解鎖的Key后,整個交易才會解鎖。
最后每個傳送者都會傳送Balance Proof 給下一個接收者,最終的狀態(tài)則是在這個通道上的所有人,都會擁有上一個的Balance Proof。比如說Bob (B) 有Alice (A) 簽名過的Balance Proof,Carol (C) 有Bob (B) 簽名過的Balance Proof,這些Balance Proof 就可以在關(guān)閉通道時使用。
而這些通道不必然要馬上關(guān)閉,因為這些通道還可以用在其他人的轉(zhuǎn)帳,這樣就可以在不需要Ethereum 交易費的狀況下繼續(xù)轉(zhuǎn)帳。這個時候讓我們再回到原本的那張草圖,你的Raiden app 就像是儲值卡一樣,可以快速地拿它來做小額交易,直到你認(rèn)為需要把錢提領(lǐng)回你的Ethereum 帳號時,才按Withdraw 提領(lǐng)把錢領(lǐng)出來。在你的通道還沒關(guān)閉時,都可以透過Raiden 網(wǎng)絡(luò)轉(zhuǎn)帳給另外一個人。
由于不需要全網(wǎng)共識的關(guān)系,所以Raiden 可以在相對快的速度當(dāng)中完成交易。另外在這邊要說Raiden 網(wǎng)絡(luò)中傳輸還是會有費用的,總共有兩種,其中一種Protocol level fees 會在你轉(zhuǎn)帳時收取,不過理論上費用會非常少。另外一個費用是Peripheral fees,如果你只有使用Raiden 的輕節(jié)點(light node) 時因為自身沒有跑完整的Raiden 服務(wù)的關(guān)系,所以會需要全節(jié)點替你提供服務(wù),所以會收取費用。
但如果是跑全節(jié)點(full node)就不需要收取費用,反而還可以因為提供轉(zhuǎn)發(fā)服務(wù)而從輕節(jié)點那邊收取到Peripheral fees。
結(jié)論
總之Raiden Network 就是利用上述的方式用鏈下的方案來解決目前Ethereum 交易速度與費用的問題,不過我目前都僅是在文件上的閱讀與理解,還沒試著跑過他們的網(wǎng)絡(luò)來實際體驗一下效果。所以實際上到底能不能解決問題還需要更深入的探討才能知道目前實作的狀況。
另外在Raiden Network 要解決交易費太少的這個問題上,其實在透過多個節(jié)點轉(zhuǎn)送交易時,交易費的高低會依照中間經(jīng)過的節(jié)點數(shù)量會有所不同,數(shù)量愈高交易費也會伴隨著提高。所以問題會回到在Raiden 網(wǎng)絡(luò)上找到的最短路徑所產(chǎn)生的交易費是不是可以比原本直接在Ethereum 區(qū)塊鏈上直接交易要來得低。