1. 區塊結構
鏈式區塊的基本資料結構都是一棵樹(考慮有分叉的情況),石墨烯的區塊鏈也不例外,一個區塊中包含上一個區塊的id,每個區塊的id為區塊內容的MAC,

block由block header和transaction list構成,
1.1 block header
- previous:前一個塊的id
- block_num
- digest:塊id
- witness:出塊者
- transaction_merkle_root
1.2 transaction list
為本塊打包的交易集合,transaction list的結構與其他區塊鏈不一樣,石墨烯的transaction list中的每個transaction并不只是一個交易的操作,而是支持多個operation的集合,
一個operation是一個基本操作的定義,如轉賬、投票等,
一個transaction里可以包含多個operation,但是這些在一個transaction里的operations依然保持事務的特性,也就是在同一個transaction里的operation要么都執行,要么都不執行,
石墨烯區塊鏈沒有獨立的虛擬機,不支持智能合約,所有操作都由operation來定義,如gas計算、撮單等,如果需要擴展operation,只需要實作相應的介面即可,
2. 存盤
石墨烯中的存盤使用的是檔案存盤,
- 所有資料都以檔案的形式進行組織和管理,并沒有使用資料庫,
- 存盤框架需要實作資料的管理功能,石墨烯框架在啟動和運行時,需要將大部分資料加載到記憶體,因此對記憶體的要求非常之高,
2.1 物件模型和索引模型
所有的物件實體都有一個全域唯一的id編號,

2.2 一個物件編號包括三部分內容
- space_id:標識是否協議物件,正常都為1
- type_id:表示物件型別
- id為此型別是第幾個創建的實體,
space id 占最高 8 位, type id 占中間 8 位, 最低 48 位是 id,
eg. id為1.2.12376,
石墨烯的物件索引實作其實使用的是vector和map,由于所有的索引資料都會加載到記憶體,所以B+樹無法發揮減少IO的優勢,
3. 共識
石墨烯的共識演算法使用的是Dpos,系統中最重要的角色是witness和committee,
- witness:通過投票產生的,系統有個witness維護時間周期,沒到周期進行一次witness、committee等的更新,
- Committee由得票最多的11個人組成,Committee的職責是修改系統引數,無法左右出塊,
- Witness負責出塊,其中投票統計和洗牌程序決定了出塊的witness,
在收到一個new block時,如果new block前一個block不是當前塊,并且塊高高于當前塊高會進行分叉判斷和處理:
step1. 找到兩個叉的LCA,
step2. 回滾到LCA,
step3. 沿最長鏈,依次push_block(),
石墨烯通過記錄每一步的undo日志,實作了操作的回滾,每出現切換分支時,先找到最近公共祖先進行回滾操作,然后執行新的block的操作,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/294535.html
標籤:區塊鏈
