fabric的交易處理過程大體能夠分爲三個過程,數據庫
一、背書,交易的模擬執行,生成讀寫集;數據結構
二、排序,對交易的順序達成共識,生成區塊;mvc
三、驗證存儲,驗證區塊,存儲到帳本;區塊鏈
今天討論一些讀寫集和MVCC這種方式優缺點,首先看一下優勢,spa
一、因爲背書階段分散到不一樣peer節點,因此該階段能夠並行進行,這意味交易讀寫集生成的效率也是大幅度提高了;3d
二、交易的模擬執行,生成讀寫集,能夠說爲後續的驗證階段減小了工做量,只須要驗證幾個k/v值便可,而其餘一些區塊鏈驗證階段,可能就是交易模擬執行,並且仍是串行的;blog
這種讀寫集和MVCC會產生什麼樣子的弊端呢?排序
若是咱們的鏈碼連續的讀寫同一個k/v值,則很大機率這些交易只能成功幾筆;這徹底是由於MVCC的功勞;ci
那咱們有沒有什麼辦法解決一下呢? 咱們能夠把讀寫集——一個保存K/V的簡單數據結構,轉換成一個帶有邏輯結構的數據結構;it
之因此有mvcc衝突,是由於咱們在一個塊中,靠前的交易對某個key進行了寫操做,然後續的交易又須要對該交易進行讀;因爲生出讀寫集的時候,一個塊裏的交易,可能都是依賴於同一個版本的狀態數據庫,因此mvcc衝突的機率仍是很大的;若是咱們可讓排在後邊的交易不依賴於狀態數據庫的版本,而是依賴於前一個交易的執行的結果,這樣是否是就能夠避免了mvcc的錯誤;
原始的讀寫集,在驗證存儲階段咱們拿到讀寫集基本作不了很複雜的操做,除了校驗一下版本,就是更新數據,因此當有mvcc衝突的時候,只能捨棄交易;若是咱們在讀寫集種增長一些可控的邏輯,這樣在交易遇到mvcc衝突的時候,能夠根據讀寫集自身攜帶的邏輯以及當前狀態數據庫進行判斷,該如何進行下一步操做;
例以下面這個讀寫集的例子,當咱們要invoke張三的駕照這個key的值的時候,咱們能夠根據R-condition、R-key、R-value的值聯合判斷,咱們此次寫入的值的前提條件是須要年齡大於18歲,若是前一個rwset執行完畢以後,世界狀態知足,則能夠繼續執行,不受mvcc的限制。
key |
value |
R-key |
R-value |
R-condition |
W-key |
W-value |
name |
張三 |
年齡 |
18 |
大於 |
駕照 |
能夠 |