RChain的跨分片交易算法

跨分片交易是一個難題,可是遺憾的是業界已經有一個項目RChain解決了這個問題。算法

分片方式有不少種,最難的是狀態分片,什麼是狀態分片呢?把以太坊比做銀行的話,狀態指的是銀行帳戶的當前餘額。那狀態分片就是,按照帳戶的不一樣區分開來,就像6222開頭的是工商銀行,6214開頭的招商銀行的帳戶。網絡

在以太坊的第一期的分片計劃當中是沒有跨分片交易的,交易只能存在於同一個分片的帳戶之間,也就是不能跨行轉帳。架構

那如何實現跨行轉帳呢?ide

一、架構

分區是一個樹形結構區塊鏈

依賴關係是子分片依賴父分片spa

子分片的validators能夠做爲父分片的客戶端pwa

token在父分片和子分片的轉義是經過智能合約去實現的3d

在父分片中的智能合約叫作Depository,它表明存儲在子分片中token的餘額數blog

當餘額從子分片轉到父分片當中的時候,它是從Depository提款token

當餘額從父分片轉到子分片當中的時候,它是從Depository存款

在子分片中的智能合約叫Mint

當餘額進入子分片的時候,Mint建立相應的代幣

當餘額離開子分片的時候,Mint銷燬相應的代幣

Mint和Depository一塊兒創建起父分片和子分片的代幣之間的匯率

1.一、跨分片消息傳遞

1.1.1 組織

每一個實體都有一個URN,結構是 : <protocol_id>:<shard_path>/<public_key_fingerprint>.

每一個實習都有一個經過公鑰來識別身份的郵箱. RChain分片是經過channel實現的.

每一個分片都運行着一個Mailman合約來路由消息.

每條消息都包含這三個字段: destinationsignature & payload

描述

同一個分片的消息傳遞

Mailman從消息中提取到destination,而後發送到目標郵箱

準備跨分片消息

在消息發送到其餘分片前要通過共識,發送消息的意圖將存儲在塊鏈中,而且只有在塊完成後才發送。

 

 

 

子分片到父分片交易

向父分片發送消息的總結以下:

一、就發送消息到父分片的決定達成共識

二、validators簽名而後把消息發送給父分片

三、消息須要至少k個validators的簽名

四、得到k個簽名以後,消息存儲在區塊鏈中

五、共識達成以後,進行下一步

 

 

父分片向子分片交易

傳輸過程以下:

一、就發送消息的決定達成共識

二、子分片的validators做爲父分片的客戶端,收到了這條消息

三、子分片的validators在子分片的區塊鏈上存儲這條消息

四、共識達成以後進行下一步動做

1.2 散列鎖託管轉移(Hash-locked escrow transfer)

愛麗絲和鮑勃要經過代幣P來交易貨物,他們須要如下的一個交易機制來保證:

一、愛麗絲擁有代幣P有效

二、在交易過程中,代幣P在愛麗絲的帳戶金額當中鎖定,而且不能被其餘交易使用

三、當獲得了K次確認以後,交易執行成功

四、交易被取消的話,若是時間少於T,則代幣會歸還到愛麗絲的帳戶當中

 

Hash-locked escrow API

如下是對上圖中的一些概念的解釋:
Methods
initialize(key-hash : Hash, from : LocalAddress, to : LocalAddress, deadline: TimeInterval)

初始化轉帳的參數

execute(key : Key)

提供一個合法的key來觸發交易的執行

通知事件

outgoing-transfer-ready

給發送方的事件。通知發送方這個交易已經正確的創建了

incoming-transfer(keyHash : Hash)

經過接受方它有一筆收款。這個通知還包括了執行這個交易須要的key

transaction-finalised(key=K)

當這筆交易已經完成以後通知雙方。 這也是發送方接受交易的key的通道,這個key是用於觸發鏈中的下一個傳輸

1.3 原子交叉碎片單向值傳遞(Atomic cross-shard one-way value transfer)

父分片中的代幣要轉換成子分片中的代幣

愛麗絲擁有一個在父分片當中的錢包。鮑勃用戶一個在子分片中的錢包

整個轉帳過程須要是原子性操做

一個單項的值傳遞須要使用到以上的兩種操做:散列鎖託管轉移和跨分片消息

多步驟的跨分片轉帳經過它們的最小公共祖先的分片來完成。

在上述的例子當中,從"/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

 1.3.1 例子

例子1:父分片到子分片

例子2:子分片到父分片

例子3:任意碎片之間的傳遞

Tips:圖片上的字看着有點小,右鍵選擇「在新標籤頁面中打開圖片」看着就比較大了

二、相關名詞解釋

Shard (aka locale) - 有本身的一組驗證人的獨立網絡

Shard tree - 分片的結構

Neighbour shards - 相鄰的分片

Mailman - 發送消息給別的分片的智能合約

Mailbox - 存儲消息. 也是分片的客戶端

Address - 多分片的環境裏的實體的惟一標識. 包括分片id和公鑰

Mint - 在分片當中建立和銷燬代幣的智能合約

Depository - 存儲子分片當中的代幣餘額的智能合約

 

三、Useful links

https://blockstream.com/sidechains.pdf

https://en.bitcoin.it/wiki/Atomic_cross-chain_trading

https://en.bitcoin.it/wiki/Hashed_Timelock_Contracts

相關文章
相關標籤/搜索