以太坊作為第一個實(shí)現(xiàn)智能合約的平臺,它帶來的影響是巨大的,但以太坊本身仍舊存在不少的問題,一個以太坊養(yǎng)貓游戲就已經(jīng)讓以太坊網(wǎng)絡(luò)擁堵,這對于定位是全球計算機(jī)的以太坊平臺是不可接受的。
1. 引言
以太坊為作為一個公有鏈,允許任何人發(fā)布智能合約,但使用以太坊網(wǎng)絡(luò)的成本很高,無論是普通交易或是智能合約都需要一定費(fèi)用。尤其對于大批量的小額交易來講,如果頻繁的執(zhí)行智能合約,不單單會增加以太坊網(wǎng)絡(luò)的負(fù)擔(dān),光交易手續(xù)費(fèi)一項,就讓人望而卻步。
狀態(tài)通道為此提供了一種新的思路,通過將部分流程移出到鏈外來提高區(qū)塊鏈的效率,但這并不會增加參與者的風(fēng)險。目前狀態(tài)通道的應(yīng)用仍然是純粹的支付通道,如閃電網(wǎng)絡(luò),該研究旨在解決小額交易高昂的手續(xù)費(fèi)和極低的效率問題。但狀態(tài)通道的應(yīng)用不應(yīng)僅限于支付領(lǐng)域。
2. 什么是狀態(tài)通道?
首先,先看一下什么是狀態(tài)機(jī)。狀態(tài)機(jī)是一個很簡單的概念,維持著世上很多軟件的各種表現(xiàn)形式,可以總結(jié)為:f(state, action) => state’,也就是說,這個函數(shù)采用當(dāng)前的狀態(tài)和一次操作(即更改狀態(tài)的方法),并返回執(zhí)行完該操作之后的狀態(tài)。
以太坊是一個全球化的基于交易的狀態(tài)機(jī),在鏈上的每一步操作都會產(chǎn)生最新的狀態(tài)。不同的是,狀態(tài)通道是在鏈外進(jìn)行狀態(tài)維護(hù)。
狀態(tài)通道聽起來就像是“支付通道”的延伸,這也是這項技術(shù)一直被低估和忽視的原因,一個隱私、效率、信任最小化、安全性和模塊化的廣義通道是我們要建設(shè)的重要基礎(chǔ)設(shè)施之一。
狀態(tài)通道本質(zhì)上是通過在不同用戶之間或用戶和服務(wù)之間建立一個雙向通道,為不同實(shí)體之間提供狀態(tài)維護(hù)服務(wù)。它允許把區(qū)塊鏈上的許多操作在鏈外進(jìn)行管理,等完成鏈外操作后多方簽名確認(rèn)后,才將最終結(jié)果上鏈。其實(shí)可以把狀態(tài)通道理解成一個執(zhí)行特殊操作的智能合約,一個專門建立雙向通道,在一定條件下進(jìn)行狀態(tài)保持的智能合約。
可以將狀態(tài)通道中的執(zhí)行過程作為原子操作,在執(zhí)行完成這個原子操作后,將最終結(jié)果上鏈。
我們用銀行和余額寶的例子來講解一下狀態(tài)通道,雖然可能不太準(zhǔn)確,但多多少少可以說明一些問題。
首先我們把銀行比作區(qū)塊鏈,我們把部分的錢從銀行存到余額寶中,用余額寶進(jìn)行平時的小額交易,當(dāng)我們想提現(xiàn)時,直接從余額寶提現(xiàn)至銀行卡即可。狀態(tài)通道對應(yīng)余額寶,當(dāng)有一方要關(guān)閉狀態(tài)通道時,相當(dāng)于提現(xiàn)操作,余額寶中保存了當(dāng)前賬戶的狀態(tài),關(guān)閉狀態(tài)通道時將狀態(tài)更新至鏈上,相當(dāng)于更新銀行賬戶狀態(tài)。
3.狀態(tài)通道的生命周期
- 打開通道:首先由兩個或多個參與者就初始狀態(tài)達(dá)成一致,區(qū)塊鏈中的某些狀態(tài)將發(fā)生變化(在支付通道中意味著放入一些代幣進(jìn)行托管)則狀態(tài)通道開啟。通道預(yù)言機(jī)被用來報告通道中的狀態(tài),并根據(jù)規(guī)則進(jìn)行判斷是否關(guān)閉通道。
- 關(guān)閉通道:當(dāng)狀態(tài)通道oracle從其中一個通道參與者接收到有效的狀態(tài)更新時,它將進(jìn)入挑戰(zhàn)期,在此期間另一個通道參與者可以提交更高序列號的狀態(tài)更新。在挑戰(zhàn)周期結(jié)束之后,具有最高序列號的有效狀態(tài)更新被接受為最終狀態(tài)。
- 結(jié)算:當(dāng)參與方的任何一方想要關(guān)閉交易通道,則更新到最近的狀態(tài)后,將數(shù)據(jù)上鏈進(jìn)行結(jié)算,并關(guān)閉通道。
狀態(tài)通道預(yù)言機(jī)對于狀態(tài)是否有效的判斷依據(jù)如下:
- 狀態(tài)更新必須由至少兩個通道參與者簽署。
- 每個連續(xù)的狀態(tài)更新必須高于sequence最后一個。
- 預(yù)言機(jī)在通道關(guān)閉后只能提交關(guān)閉前的最近狀態(tài)更新。
4. 為什么要使用狀態(tài)通道?
為什么要把信息(信息的哈希)保存在鏈下?有兩個重要的原因,交易費(fèi)和效率。
狀態(tài)通道為Dapp的可用性提供了基礎(chǔ),減少Dapp的延遲以及將網(wǎng)絡(luò)響應(yīng)時間控制在用戶的可容忍范圍。Dapp的參與者將消息與事務(wù)相互發(fā)送,以更新狀態(tài),但不會將消息發(fā)布到鏈中。如果其中一位參與者離開或試圖欺騙另一位參與者,可以隨時向區(qū)塊鏈發(fā)布最新交易以完成狀態(tài)。這其中的獎罰措施足以讓參與者保持誠實(shí)。
狀態(tài)通道是兩方之間的互動,可以適用于任何智能合約。狀態(tài)通道管理商業(yè)進(jìn)程或者交易狀態(tài)。它可以在保證指定人群之間交互性能和隱私性的同時,降低交易成本。
使用分片技術(shù)可以一定程度上實(shí)現(xiàn)可擴(kuò)展性,但是對于依賴大量原子操作(如流式支付、物聯(lián)網(wǎng)設(shè)備、游戲等)的應(yīng)用程序來說,分片技術(shù)無法有效降低成本,而對于大量細(xì)碎交易來講,通過狀態(tài)通道,可以很大程度上縮小開支。
5.狀態(tài)通道應(yīng)用場景
比特幣的閃電網(wǎng)絡(luò)是狀態(tài)通道在支付領(lǐng)域的一個很好的應(yīng)用
下面我們來舉例描述狀態(tài)通道在其他方面的應(yīng)用:
(1)舉一個象棋游戲的例子
兩個人開始一局游戲(創(chuàng)建一個新的“評判”程序),并為其提供初始投注。他們的實(shí)際舉動不是作為交易提交給區(qū)塊鏈,而是對每一步的操作進(jìn)行簽名并直接發(fā)送給對手方。當(dāng)對手方接受移動時,由程序檢查當(dāng)前操作是否有效,并在游戲“狀態(tài)”的更新版本上簽名,再將其返回給對手方。如果此舉無效,他們會向法官提交最近達(dá)成一致的狀態(tài),由該方簽名操作,以便法官可以使用規(guī)則來確定適當(dāng)?shù)奶幜P。每一個新動作都會增加序列號,所以其他玩家將無法向法官提交舊版本的狀態(tài)。如果他們這樣做,另一位玩家將在等待期間回復(fù)最近的版本。同樣,如果其他玩家拒絕返回更新狀態(tài)的簽名副本,法官也可以被要求裁決。但只要對方遵守規(guī)則,就不需要訴諸法官。當(dāng)程序根據(jù)規(guī)則判定一方勝出時,結(jié)束游戲,將最新的狀態(tài)提交到鏈上。因?yàn)轵?yàn)證和簽署新舉動的時間要比區(qū)塊鏈確認(rèn)交易所需的時間小得多,所以這個過程無明顯延時。除非一個玩家行為異常,否則這些操作對其他區(qū)塊鏈用戶是透明的。
游戲結(jié)束后,玩家可以簽署一個更新,根據(jù)游戲的結(jié)局簡單地分配投注,甚至不需要裁判的復(fù)雜邏輯,從而再次降低成本。事實(shí)上,通過進(jìn)一步優(yōu)化,使判定的邏輯和比賽規(guī)則本身也可以放入簽名的“狀態(tài)”中,各方之間進(jìn)行交換。只需建立一個簡單的合約,以存儲通道參與方的資產(chǎn),遵守由各方同意的規(guī)則。
6. 狀態(tài)通道展望
- 我們希望看到明確設(shè)計的通用目的渠道不會減少,實(shí)際上在很多情況下會大大增加隱私。
- 盡可能的把不必要上鏈的操作在狀態(tài)通道中進(jìn)行處理。
- 狀態(tài)通道可以很容易地融入到新的應(yīng)用程序中,降低開發(fā)難度,使研發(fā)人員可以盡可能的參與進(jìn)來。
- 保證隱私,使得狀態(tài)通道的運(yùn)行看起來與其他常見的鏈上活動無異。
- 在單個通道中對于并行操作的支持,并且這些操作不會相互干擾。
- 狀態(tài)通道做到組件化,用戶在進(jìn)行dapp開發(fā)時,無需再進(jìn)行重復(fù)的工作,可以直接使用通用的狀態(tài)通道。
- 平滑升級狀態(tài)通道,盡可能的不影響用戶端。
- 做到標(biāo)準(zhǔn)化,讓用戶可以輕松的鏈接其他通道。