
編者按:區塊鏈涉及到的技術很多,從互聯網底層到不明覺厲的密碼學,可是往往關注幣價者多而研究技術的人少。牛市的時候,大家為了炒幣也會努力學習,熊市的時候,反正也沒啥事,我覺得可以更加努力學習。作為一個文科生,我當然會有很多理科生看起來覺得很白痴的問題。作為一個記者,我不難找到業內懂的人用人話給我解釋,而且他們往往不會當面嫌棄我。
《小明學習筆記| 一文看懂區塊鏈虛擬機》《小明學習筆記| 一文看懂區塊鏈虛擬機》《小明學習筆記| 一文看懂區塊鏈虛擬機》
《小明學習筆記| 一文看懂區塊鏈虛擬機》
二級標題
二級標題
二級標題
二級標題
二級標題跨鏈有什麼用?
跨鏈第一個“最痛”的應用場景就是去中心化交易所,解決了剛剛提到的第一個資產交換的問題。現在很多人用中心化交易所的方式也能解決,加上現行的去中心化交易所交易體驗差、速度慢、還不能跨鏈交易,小白用戶都不喜歡,看起來實在沒什麼戲。不過理想主義者會說:作為一個追求去中心化的行業,話語權最大的卻是一大堆中心化的組織,大家覺得這實在太詭異了,而且中心化交易所作惡多端。
另外一種應用場景就是部署在A鏈上的應用支持其他鏈的token。比如以太坊上的智能合約想用比特幣支付——聽到這個場景我的同事馬上一臉懵逼地問:“為啥呀?”他這個反應也是對的,因為這個聽起來貌似沒有必要,但是有人就是希望支持比特幣或者其他token,希望擴大用戶群。其實這個問題同樣可以用中心化交易所解決。
這個問題也能泛化為,某個DAPP的不同模塊可能部署在不同鏈上,那它怎麼調用其他鏈上的模塊、不同的模塊之間怎麼交互?也就是鏈A需要得知鏈B的才能進行下一步或者執行。說白了,這也還是可以用“鏈外”的方式解決,就像一個權威中介,這說起來很像預言機(提供鏈外可信數據)。"atomic swap"V神2016年給R3寫的那篇報告裡提到提到了五個use cases,都離不開以上三種,包括:
1、資產(原子)交易(Payment-versus-payment or payment-versus-delivery - in technical circles, this concept is also often called
二級標題
二級標題
二級標題
怎麼跨鏈?
其實不可能真正意義上某個幣真的“到了” 另外一個鏈上,大部分只是B 鏈上生成了一個A 鏈的錨定幣,同時A 鏈會將等值代幣“鎖定”。
如果以資產交換這個思路來理解,我理解跨鏈有三種的情況:
第一種是雙方都不知道自己在跨鏈,或者說雙方不能“讀” 對方,比如中心化交易所這種的。
第二種是其中一條鏈能讀別的鏈,比如側鏈/ 中繼鏈的方式,就是A 能讀B,B 不能讀A;如果一條C 鏈能讀到所有鏈,按理說也能成為一個“鏈上” 中介,整個過程就是“ACB”。當一條“側鏈” 鏈接了很多主鏈時,它就變成一條中繼鏈。
其中資產交換的過程可能是用戶把BTC 和ETH“充值”到這個鏈上,各個代幣在這個網絡中都能流通(其實就是給每個幣在這個跨鍊網絡裡都有一個錨定幣,類似以太坊的ERC 20),然後分別“提現”。萬維鍊和阿希鏈的模式有點像這種,他們能跟很多鏈交互,但是這些鏈之間不能直接交互。以阿希鍊為例說明:
用戶將BTC“充值”到阿希鏈上,需要先把BTC 轉到網關賬戶(就是比特幣鏈上的一個普通賬戶,但是管理者是一組節點);跨鍊網關收到信息以後鎖定網關賬戶並驗證,經過大多數節點驗證後;網關會在阿希鏈上給用戶解鎖等值數字資產,用戶即可在阿希鏈上使用BTC。 BTC 和XAS 好像是兩個國家的商人,雙方不能互相信任而且使用不同的貨幣,無法直接交易。因此,雙方協商了一套規則(相當於跨鍊網關協議)並且設立了一個專門的交易場所來處理交易,由本國有聲望的大商人(相當於網關節點)作為代表來共同管理,這些大商人還需要擁有足夠數量的資產作為擔保。
第三種是A 和B 都能讀到對方的,這種理論上可以通過統一的協議實現,不過現在還沒有類似協議落地。
說白了,鏈下也能做“跨鏈”;只是有人認為鏈上更安全。
結合萬維鏈的看法,這裡的安全可以拆解為兩個問題:一是保證跨鏈信息是正確的,即如何驗證原鏈上的交易狀態。如果要考慮到使用POW 機制的區塊鏈上沒有終局狀態(始終存在分叉的情況,只是隨著確認塊的增加,概率逐漸變小),這個問題的複雜度會更高。二是是保證交易的原子性,即如果交易處理的某個環節停止,整個交易能夠撤銷;否則,部分成功的情況可能會導致雙花。
接下來我會稍微介紹一下我了解到的某些相關技術。首先是關於如何驗證原鏈上的交易狀態,現在我了解到的主要有兩種方式(V 神的報告原文均有提到):。
In a notary mechanism, a trusted entity or set of entities that is trusted as a group is used in order to claim to chain X that a given event on chain Y took place, or that a particular claim about chain Y is true. Such entities may be active, listening and automatically acting based on events in some chain, or reactive, issuing signed messages only when asked. The most advanced effort that has taken steps in this direction is the Interledger project developed by Ripple. Interledger, at least in what it describes as “atomic mode”, uses a Byzantine-fault-tolerant consensus algorithm in order to achieve consensus among a set of notaries on whether or not a given event took place,第一種是有一組同時承擔兩條鏈節點的個人或聯盟,也有可能是一條單獨的鏈,告訴B 鏈A 鏈上發生什麼事,或者告訴B 某個消息的真的。比如Ripple 開發的跨賬本價值傳輸開放協議Interledger,但它不是鏈,只是一套網關協議。 V 神把這種稱為
公證人模式(Notary schemes)and then issues a signature that can be used to finalize payments conditional on this consensus. (來自V 神報告)另一種則是
側鏈/ 中繼(Sidechains/relays)
,與公證人模式的“別人告訴B 鏈A 鏈上發生的事” 不同,中繼模式則是更“直接” 地B 鏈自己讀A 鏈。比如通過驗證A 鏈區塊頭和默克爾樹等信息驗證A 鏈上的交易,比如以太坊上的BTC Relay。
根據公開資料,BTCRelay 的運作機制如此:“一個外部的第三方,被稱為Relayer,發送一個交易到BTCRelay 的智能合約,內容是最新的比特幣區的區塊頭(當然希望的情況下這個區塊頭尚未被提交過的)。BTCRelay 基於現存的區塊頭信息校驗發送的區塊頭的有效性。如果校驗通過,則加入到BTCRelay 維護的比特幣區塊頭鏈。”
Relays are a more “direct” method for facilitating interoperability, where instead of relying on trusted intermediaries to provide information about one chain to another, the chains effectively take on the task of doing that themselves. The general approach is as follows. Suppose that a smart contract executing on chain B wants to learn that either a particular event took place on chain A, or that some particular object in the state of chain A contained some value at some particular time. Suppose also that chain A is designed similarly to Bitcoin or Ethereum in that it has a notion of “blocks” and “block headers”, where a “block header” is a compact piece of information that “represents” the block (and possibly state data) in some cryptographically authenticated way,由此,在BTCRelay 的智能合約裡,實現了一個內置的SPV(簡單支付校驗)節點,可以用來校驗比特幣交易的有效性。在以太坊平台的任意用戶或者是智能合約都能請求BTCRelay 來驗證,是否某個在比特幣網絡上存在某個交易。但這種一方面只能實現單向錨定(由於比特幣腳本語言不支持),一方面需要以太網絡中有Relayer 不斷往合約中提交驗證信息,賺取用戶手續費。
其實這個模式邏輯上更困擾我的地方在於,既然側鏈也需要第三方的Relayer 提交信息,Relayer 的角色跟“公證人”很類似,不同之處只在於側鏈打包了主鏈的區塊頭。
This use of this so-called “light client verification” technology is ideal for relays because of how fundamentally resource constrained a blockchain is. In fact, it is impossible for a mechanism inside chain A to fully validate chain B and a mechanism inside chain B to fully validate chain A at the same time, for the same simple mathematical reason why two boxes cannot simultaneously contain each other: A would need to re-run the part of B that re-runs A, including the part of A that re-runs B, and so forth. With light client verification, however, a protocol where chain A contains small pieces of chain B and chain B contains small pieces of chain A that are pulled on-demand is entirely feasible. A smart contract on a relay on chain B that wants to verify a particular transaction, event or state information on chain A would, much like a traditional light client, verify a branch of the cryptographic hash tree of chain A, then verify the block header that the root of this branch is inside, and if both checks pass it would accept that the transaction, event or state information is correct (note that because blockchains are fully selfcontained environments and have no natural access to the outside world, the relevant bits of chain A would need to be fed into chain B by a user; however, because the data is in a cryptographic sense "selfverifying", this user that feeds this information in need not be trustedmost likely using Merkle trees.(來自V 神報告)
V 神認為,利用輕客戶端驗證技術SPV(簡單支付驗證,Simple Payment Verificaiton)確實可行,能驗證區塊頭(Header)及其之默克爾樹(Merkle tree)中對應的交易。iBlockKim). (來自V 神報告)
首先,怎麼驗證交易,說到這裡可能要簡單Mark一下什麼是SPV,網絡上有不少科普文,其中
這個作者寫得比較清楚(有刪減):
根據中本聰在比特幣白皮書裡描述:“不運行全節點也可以驗證支付,用戶只需要保存所有的區塊頭(Block Header)就可以了。用戶雖然不能自己驗證交易,但如果能夠從區塊鏈的某處找到相符的交易,他就可以知道網絡已經認可了這筆交易,而且得到了網絡的多個確認。”
一個區塊鏈中的信息通過兩兩打包,最後歸納成一個節點,即根節點(如圖中的節點0),區塊頭中包含了根節點的哈希值,包含了所有交易又大大減少了區塊頭部的大小。不僅如此,當要搜索某一個交易,比如上圖中的23的時候,可通過幾步,比如0-2-5-11即可以快速搜到。
因此,SPV在尋找交易時,只需下載尋找區塊頭而不是整個區塊。區塊頭只有80字節,每小時6個,一年也就4M大小。那麼如何定位區塊呢?比特幣提供了一種叫做布隆過濾器(Bloom filter)的功能,節點會在通信鏈路上建立一個這樣的過濾器,限制只接受含有目標地址的交易,從而能過濾掉大量不相關的數據,減少客戶端不必要的下載量。比如,SPV節點會收到少於1KB的有關區塊頭和Merkle路徑的數據,其數據量只約佔一個完整區塊(目前大約1MB)的千分之一。):
然後怎麼打包,用BTC舉例的話,側鏈協議實際的操作步驟是(
來自碼農學習區塊鏈
提交鎖定交易:比特幣持有者在BTC 主鏈上發送一個特殊交易,把比特幣鎖定在BTC 鏈上。
等待確認:在BTC 鏈上等待鎖定交易被更多區塊確認,以防止該鎖定是虛假的交易。
解鎖交易:鎖定交易確認後,用戶在側鏈上創建一個解鎖交易(也被叫做贖回交易)花掉鎖定交易的輸出,並提供SPV 工作量證明(即該解鎖交易所在區塊的工作量證明),並將贖回交易的輸出導入自己在側鏈上的地址中。
等待一個競爭期:競爭期也被稱作可修改階段,作用是防雙花。而且在此期間,解鎖交易不會被打包到區塊新轉移到側鏈上的比特幣還不能被使用
如果解鎖交易包括了比特幣主鏈更大難度的SPV 證明,則上一個解鎖交易將被替換。
競爭期結束後,該解鎖交易將被打包到區塊中,用戶可以使用他的比特幣了(其實是側鏈上相對應的代幣)。
跟BTCRelay 類似,中繼模式的弊端在於成本太大,V 神也認為驗證對方鏈上的信息會影響速度。可以想像,如果你單純用“公證人模式”,只需要等比特幣鏈上確認就行了,可是如果驗證信息還要上側鏈,就意味等待確認的事情多了很多。阿希鏈並沒有選擇打包區塊鏈,就是因為單青峰認為,將區塊頭打包上鍊“成本比較大,沒有通用性,解決了比特幣的解決不了以太坊的”。同樣萬維鏈也沒有用,呂旭軍錶示,Voucher 共識的模式還在驗證階段:工程上Voucher 信息的提交和驗證如果上鍊,需要耗費較高的鏈上資源並限制吞吐量;經濟上需要更合理的激勵機制讓Voucher 成員積極參與並消極作惡。
較為知名的跨鏈項目還有Cosmos 和Polkadot,不過都未落地。在Cosmos 中,不同空間(Zone,獨立區塊鏈)通過IBC(區塊鏈通信)協議分別和“中心”(Hub,管理眾多Zone)通信,不同空間的信息包裹經過中心傳輸。為了保證傳輸無誤,一個證明(Merkle-proof)需要被發佈在接收方的區塊鏈上。接收方為了驗證這個證明,需要時刻了解發送方的區塊頭,類似側鏈採用的機制。Polkadot 中繼鏈的區塊包含平行鏈的區塊頭,還有一些確認信息,以避免雙花。驗證人負責運營中繼鏈節點,並驗證平行鏈上的區塊;可能還會有一個收集人運行特定平行鏈的全節點,負責提交新區塊。萬維鏈暫時使用的方式,是
哈希鎖定
,也叫原子互換(Atomic Swap),主要是通過哈希時間鎖(hash time lock)和密數(Secret)讓雙方完成交易,不需要第三方公證人。這個方式通俗來說可以這樣理解:
假設小明要轉10 個ETH 給小紅,小紅要轉10 個wan 給小明;
小明在以太坊一智能合約裡鎖了10 個ETH 加上一個密碼的哈希值,並置入條件:如果小紅在10 小時內提供了密碼,合約驗證之後小紅就能獲得10 個ETH,否則回滾;
小紅在萬維鏈一智能合約裡鎖了100 個wan 並把密碼的哈希值放在裡面,並置入條件如果小明在5 小時內提供了密碼,就能獲得100 個wan;
小明看到小紅在wan 也鎖了錢,就憑密碼到wan 上拿走了100wan;
小紅也從wan 上的合約中得知密碼,憑密碼到ETH 合約中拿走10 個ETH。
我們可以把小紅換成萬維鏈的Storeman,用戶(小明)只需要在發起交易、釋放密數、撤銷交易的環節進行操作。對於參與跨鏈的Storeman,萬維鏈會提供專門的客戶端,客戶端根據協議進行無需值守的自動化運行。這是一個比較成熟的方案,閃電網絡用的也是這個,安全度高不過似乎應用場景比較少。
如果是單純兩個用戶交換資產,其實哈希鎖定是個挺安全的方式(不過用戶體驗不太友好),而且只靠哈希鎖定就能完成。這跟上面兩種不太一樣,哈希鎖定還能可以跟第一種結合使用,萬維鏈目前就是這麼做;閃電網絡就是哈希鎖定+多簽。
關於這三個不同技術的應用場景可以看看V 神的總結。另外一個涉及到跨鏈的技術叫做多重簽名技術,有的項目也會採用分佈式私鑰。比如閃電網絡中就利用了多重簽名,交易雙方需要對同一個交易簽名,交易才可以被確認。跨鏈的很多模式,都會涉及到一個作為“連接器”的網關,跨鍊網關主要負責讀取各自公鏈上的賬戶信息,共同對某賬戶下待跨鏈的數字資產鎖定與解鎖。為了安全,這個網關往往是一個多節點共同維護的中繼網絡和多簽名賬戶。有一定比例的節點參與了之後,才算完成簽名。阿希鏈用的是多重簽名技術。萬維鏈中用的安全多方計算+ 門限秘鑰的技術,Storeman 必須共同參與計算才能生成鎖定賬號的公私鑰,而私鑰只是理論存在,從未出現在網絡中,而是以碎片的方式分散在各Storeman 手中,交易時參與方要再次合力才能共同構造簽名,且互不洩露碎片。為了保證可用性,只需要一定比例的Storeman 參與計算即可構造簽名。PS. 有小朋友看了文章之後覺得錨定幣生成跟
參考文章:
我是Odaily編輯盧曉明,探索真實區塊鏈,爆料、交流請加微信lohiuming,煩請備註姓名、單位、職務和事由。
我是Odaily編輯盧曉明,探索真實區塊鏈,爆料、交流請加微信lohiuming,煩請備註姓名、單位、職務和事由。
參考文章:
Vitalik 給R3 提供的跨鏈技術報告下載:Chain Interoperability
對話比特幣側鏈RSK:擴容且加入智能合約後的BTC能成為金融基礎設施嗎?