跨分片交易是一個難題,可是遺憾的是業界已經有一個項目RChain解決了這個問題。算法
分片方式有不少種,最難的是狀態分片,什麼是狀態分片呢?把以太坊比做銀行的話,狀態指的是銀行帳戶的當前餘額。那狀態分片就是,按照帳戶的不一樣區分開來,就像6222開頭的是工商銀行,6214開頭的招商銀行的帳戶。網絡
在以太坊的第一期的分片計劃當中是沒有跨分片交易的,交易只能存在於同一個分片的帳戶之間,也就是不能跨行轉帳。架構
那如何實現跨行轉帳呢?ide
分區是一個樹形結構區塊鏈
依賴關係是子分片依賴父分片spa
子分片的validators能夠做爲父分片的客戶端pwa
token在父分片和子分片的轉義是經過智能合約去實現的3d
在父分片中的智能合約叫作Depository,它表明存儲在子分片中token的餘額數blog
當餘額從子分片轉到父分片當中的時候,它是從Depository提款token
當餘額從父分片轉到子分片當中的時候,它是從Depository存款
在子分片中的智能合約叫Mint
當餘額進入子分片的時候,Mint建立相應的代幣
當餘額離開子分片的時候,Mint銷燬相應的代幣
Mint和Depository一塊兒創建起父分片和子分片的代幣之間的匯率
每一個實體都有一個URN,結構是 : <protocol_id>:<shard_path>/<public_key_fingerprint>.
每一個實習都有一個經過公鑰來識別身份的郵箱. RChain分片是經過channel實現的.
每一個分片都運行着一個Mailman合約來路由消息.
每條消息都包含這三個字段: destination, signature & payload
Mailman從消息中提取到destination,而後發送到目標郵箱
在消息發送到其餘分片前要通過共識,發送消息的意圖將存儲在塊鏈中,而且只有在塊完成後才發送。
向父分片發送消息的總結以下:
一、就發送消息到父分片的決定達成共識
二、validators簽名而後把消息發送給父分片
三、消息須要至少k個validators的簽名
四、得到k個簽名以後,消息存儲在區塊鏈中
五、共識達成以後,進行下一步
傳輸過程以下:
一、就發送消息的決定達成共識
二、子分片的validators做爲父分片的客戶端,收到了這條消息
三、子分片的validators在子分片的區塊鏈上存儲這條消息
四、共識達成以後進行下一步動做
愛麗絲和鮑勃要經過代幣P來交易貨物,他們須要如下的一個交易機制來保證:
一、愛麗絲擁有代幣P有效
二、在交易過程中,代幣P在愛麗絲的帳戶金額當中鎖定,而且不能被其餘交易使用
三、當獲得了K次確認以後,交易執行成功
四、交易被取消的話,若是時間少於T,則代幣會歸還到愛麗絲的帳戶當中
初始化轉帳的參數
提供一個合法的key來觸發交易的執行
outgoing-transfer-ready
給發送方的事件。通知發送方這個交易已經正確的創建了
incoming-transfer(keyHash : Hash)
經過接受方它有一筆收款。這個通知還包括了執行這個交易須要的key
transaction-finalised(key=K)
當這筆交易已經完成以後通知雙方。 這也是發送方接受交易的key的通道,這個key是用於觸發鏈中的下一個傳輸
父分片中的代幣要轉換成子分片中的代幣
愛麗絲擁有一個在父分片當中的錢包。鮑勃用戶一個在子分片中的錢包
整個轉帳過程須要是原子性操做
一個單項的值傳遞須要使用到以上的兩種操做:散列鎖託管轉移和跨分片消息
多步驟的跨分片轉帳經過它們的最小公共祖先的分片來完成。
在上述的例子當中,從"/a/b"轉帳給"/d"須要經過圖中紅色的分片
算法以下:
愛麗絲和鮑伯在不一樣的任意碎片之間的轉移將執行如下算法:
Let LCA-A be the depository of Alice's branch in the least common ancestor
Let LCA-B be the depository of Bob's branch in their least common ancestor.
The algorithm for cross-shard transfers is described below:
transfer(Key, Source, Destination) =
setup upward-tree-transfer with key-hash=hash(Key), from=Source, to=LCA-A
setup hash-locked-escrow-transfer with key-hash=hash(Key), from=LCA-A, to=LCA-B
setup downward-tree-transfer with key-hash=hash(Key), from=LCA-B, to=B
Destination publish Key
propagate K from B towards A
Tips:圖片上的字看着有點小,右鍵選擇「在新標籤頁面中打開圖片」看着就比較大了
Shard (aka locale) - 有本身的一組驗證人的獨立網絡
Shard tree - 分片的結構
Neighbour shards - 相鄰的分片
Mailman - 發送消息給別的分片的智能合約
Mailbox - 存儲消息. 也是分片的客戶端
Address - 多分片的環境裏的實體的惟一標識. 包括分片id和公鑰
Mint - 在分片當中建立和銷燬代幣的智能合約
Depository - 存儲子分片當中的代幣餘額的智能合約
https://blockstream.com/sidechains.pdf