該相信誰?
共識是指一群人的一致性認可,眾所周知,區塊鏈是乙個不屬於任何個體的分布式資料庫/賬本,那麼誰有權記賬?記賬的人造假怎麼辦?如果不解決這些問題,沒人會認可這些資料的真實性,也就沒人使用,無法產生價值。
對於第乙個問題,位元股用的是 dpos(**權益證明)機制,通過投票的方式,選舉多名見證人(接下來都用見證人代表記賬人)來負責資料庫的記賬,每個區塊記賬權隨機分給某乙個見證人。投票的條件是擁有位元股,參加選舉的條件是將賬號公升級為高階賬號。這種機制能夠驅使參選人為了得到社群人群的支援而做有益於社群的事。
第二個問題比較複雜,可以先拆分為兩部分,為什麼要造假,如何才能造假。
1. 為什麼要造假?
那肯定是有利益驅動的,假設記賬權在 a 手上,如果先把付款交易記錄到區塊裡,拿到貨物後再撤銷這筆付款交易,錢不用給,貨卻到手了。
2. 如何才能造假?
造假又分交易造假和區塊造假,交易需要使用者的私鑰簽名不可能造假,區塊只要是見證人就能生成,存在造假可能。針對打包區塊這個行為,有兩個可選操作,將交易包含到區塊中,或者不將交易包含到區塊中。假如打包時先包含乙個交易,之後再選擇不包含這個交易,就能達到欺騙的目的。這個問題在應用於金融的區塊鏈叫做雙花問題,在其他應用方面就不知道叫啥了,但是原理是一樣的。區塊鏈是不可篡改的,要實現撤銷交易只能依靠最長鏈原則。最長鏈原則是指在區塊鏈出現分叉時,所有節點都會從當前分叉鏈切換到最長的分叉鏈,並認為這條鏈的資料才是正確的。
正常情況下區塊記賬流程:
少數見證人修改資料產生分叉:
這時候資料正常的鏈因為有更多見證人,生成塊的速度也會比資料造假的鏈更快,所以資料正常的鏈依舊被其他節點當作主鏈。
多數見證人修改資料產生分叉:
這時候資料造假的鏈更長,被其他節點接受並成為了主鏈。
造假流程:
完成交易後,造假的見證人返回到記錄轉賬交易的區塊,把轉賬記錄刪除並重新打包區塊,然後繼續打包後面的區塊直到長度超過資料正常的鏈,取代它成為主鏈,這時造假就成功了。
不行,因為區塊鏈網路中所有節點都知道當前網路下哪些賬戶是見證人,也知道哪個時間間隔內的區塊是由誰來打包,這一點是能夠驗證的,如果你原本應該在下午2點和3點打包區塊,想在2點30打包,打包出來的塊不會被其他節點接受。
驗證**如下:
檔案/libraries/chain/db_block.cpp
const witness_object& database::validate_block_header( uint32_t skip, const signed_block& next_block )const
return witness;
}複製**
有避免的方法,等到區塊被確認無法回溯時,才能認為交易成功了,再進行下一步操作。區塊確認的條件是被 2/3 的見證人確認,耗時大概是1分鐘左右。怎麼才算確認?當乙個見證人打包區塊 b 時是基於區塊 a 的,此時可以認為見證人認可/確認了區塊a。2/3的比例是可以調的,只是個經驗值,比例太高確認耗時會提高,太小又會降低容錯性。如果節點收到了比已經確認的區塊還要早的區塊會拒絕處理,所以被確認的區塊是不會因為分叉而修改的,分叉只會發生在未確認的區塊之間。
具體**如下:
檔案/libraries/chain/fork_database.cpp
void fork_database::_push_block(const item_ptr& item)
// 省略
}複製**
即使不是故意造假產生分叉,在複雜的網路情況下還是會存在分叉的,但是 dpos 都能保證正確執行,可見其強大的穩定性,更多的情況可以檢視文末的 dpos consensus algorithm - the missing white ***** 。
區塊鏈學習
區塊鏈是乙個分布式賬本,一種通過去中心化 去信任的方式集體維護乙個可靠資料庫的技術方案。2.1 數字簽名 使用數字簽名驗證交易物件身份。2.2 時間戳 位元幣網路採取從 5 個以上節點獲取時間,然後取中間值的方式作為時間戳。2.3 merkle tree 用於校驗資料完整性的二叉樹,葉子節點儲存交易...
區塊鏈學習
一。什麼是區塊鏈 區塊鏈是 分布式資料儲存 點對點傳輸 共識機制 加密演算法 等計算機技術的新型應用模式。二。區塊鏈型別分類為 公有區塊鏈 公有區塊鏈 public block chains 是指 世界上任何個體或者團體都可以傳送交易,且交易能夠獲得該區塊鏈的有效確認,任何人都可以參與其共識過程。公...
區塊鏈學習 區塊概念
區塊是區塊鏈的基本結構單元。它是資料檔案,它由元資料的區塊頭和交易資料的區塊主體構成。區塊通過鏈結上乙個區塊形成乙個鏈式結構,就稱為區塊鏈。區塊引數 魔法數 客戶端解析block資料的識別碼,每種幣種魔法數不同。區塊頭 版本號,上一區塊雜湊值,merkle根節點,時間戳,難度值,隨機數。每個區塊頭通...