難度的調整
是在每個完整節點中獨立自動發生的,每2016個區塊,所有節點都會按統的公式自動調整難度,這個公式是由最新2016個區塊的花要時長與期望時長(期望時長為20160分鐘,即兩周,是按每10分鐘一個區塊的產生速率計算出的總時長 )比較得出的,根據實際時長與期望時長的比值, 進行相應調整(或變難或變易),即如果區塊產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度公式總結為:
■新難度值=當前難度值x ( 20160分鐘/最近的2016個區塊的實際出塊時間)
■next difficulty = previous difficulty* (2 weeks) /(time to mine last 2016 blocks)
■注: 2016數字,既不是1024,也不是2048,也不是2100
不可能三角:
最多只能滿足其中兩項:
去中心化、安全和高性能構成了區塊鏈的“不可能三角”,在設計中無法將三個特性同時達成,只能符合其中兩個,
去中心化是擁有大量參與區塊生產和驗證的節點,一般節點的數量越多,去中心化程度越高,
安全性是獲得網路控制權需要花費的成本,通常在共識機制的設計中錨定現實世界的資產,例如作業量證明機制(PoW)錨定的是算力,
性能就是每秒處理交易的筆數(TPS),造成區塊鏈性能低下的主要原因是每筆交易都要在所有節點上達成一致,
位元幣的區塊形成程序
在當前區塊加入區塊鏈后,所有礦工就立即開始下一個區塊的生成作業:
1. 把在本地記憶體中的交易資訊記錄到區塊主體中
2. 在區塊主體中生成此區塊中所有交易資訊的Merkle樹,把Merkle樹根的值保存在區塊頭中
3. 把上一個剛剛生成的區塊的區塊頭的資料通過SHA256演算法生成一 個哈希值填入到當前區塊的父哈希值中
4.把當前時間保存在時間截欄位中(版上默時難隨)
5. 難度值欄位會根據之前一 段時間區塊的平均生成時間進行調整以應對整個網路不斷變化的整體計算總量,如果計算總量增長了,則系統會調高教學題的難度值 .使得預期完成下一個區塊的時間依然在一定時間內
■當在挖礦程序中,發現別的節點新發布了 一個區塊,那么應該停止挖礦 , 重新從UTXO中取出一系列合法交易組成候選區塊,在剛發布的這個區塊后面開始挖礦
UTXO:
UTXO(Unspent Transaction Outputs)是未花費的交易輸出,它是位元幣交易生成及驗證的一個核心概念,交易構成了一組鏈式結構,所有合法的位元幣交易都可以追溯到前向一個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當前未花費的交易輸出,
UTXO:未使用的交易輸出,位元幣核心概念之一參考鏈接:UTXO:未使用的交易輸出,位元幣核心概念之一
■因為一方面這個區塊中的交易可能和網剛在挖的那個區塊有面復,另一個本質的原因就是修選區塊的塊頭有指向前一個區塊的哈希指標,因為最新的區塊已經變了這個哈希指標也要跟著改變
基于此,提問:這樣是不是之前的作業都白費了而很可惜?
答:不可惜,因為挖礦程序的無記憶性,無論是在剛剛的區塊上繼續挖,還是新組裝一個區塊繼續挖,成功的概論是一樣的,
位元幣的區塊體:
■這些交易以什么樣的資料格式/資料結構存盤呢?
■區塊鏈中的Merkle樹將會對海筆交易進行數字簽名,可以保證每筆交易都不可偽造 ,且沒有重貿交易,所有的交易將通過Markle樹的Hash程序產生一 個唯的Merkle根值計入區塊頭
■Merkle根/Master Hash/Top Hash/RootHash
■Merklet將相鄰的兩個交易資料的兩個哈希值組成一一個字串,再對這個字串進行哈希,得到上層父節點的哈希值
■這些資料放在 levelDB資料庫中
Merkle樹

■在一個Merkle樹里, 資料塊是兩兩組的,每個塊的哈希值是儲存在上一級節點的,而上一節點又兩兩一組,其哈希值儲存在更上- -級的節點,這樣一直持續到觸及根節點
■特點:葉子節點上的值通常為交易資料塊的哈希值,而非葉子節點上的值是該節點的所有子節點的組合結果的哈希值,這類非葉子節點的哈希被稱為路徑哈希值
■只需記住樹開頭的哈希指標,就有能力去管理串列中任意一點的哈希指標,能判斷確保資料有沒有被篡改過,因為如果有攻擊者修改了樹下面的一些資料塊,那么這將導致高級的哈希指標不會再匹配,就算他繼續修改更高級的塊,但是資料的改變已經影響到了他無法修改的樹的最頂端,因為我們已經保存好了頂端的資料,因此,任何試圖修改任意資料的行為都將被檢查到,而我們只需記住頂端的哈希指標
隸屬證明(成員證明 Proof of membership)
■Merkle樹的另外一個優點,允許簡潔的成員證明
■即想要證明一個確切的資料塊是否Merkle樹中的一-員?
■通常,只記住了數根,之后需要向我們展示這個區塊和通向數根沿途的所有資料塊,就可以暫時忽略樹的其他部分,沿途的資料塊就已經足以讓我們驗證到數根
■如果在樹上有n個節點,那么就只有log(0)個塊需要被展示,因為每個步驟都只需要計算下一級塊的哈希,所以這大概只需要log(n)次去證明它.即定位的時間復雜度為0log(m)
■所以即使這個Merkdle樹包含了非常多的塊依舊可以在個較短的時間內證明一個成員塊
Merkle Proof默克爾證明
■對于 SPV(簡化支付驗證,Simplified Payment Verification )輕錢包而言,怎么知道一個交易是否真實的呢?
■SPV拿到一個交易資訊之后(比如接收到一筆錢),并不能確認這個交易是否合法 ,因此要對這個交易的輸入進行驗證,但是它只拿到了單個交易的資訊,而沒有本地的完整區塊鏈資料,因此,SPV要拿著這個交易的資訊向網路發起查詢請求,這個請求被稱為merkle block message
■當其他有完整區塊鏈資料的客戶端收到這個請求之后,利用傳過來的交易資訊在自己的區塊鏈資料庫中進行查詢,并把驗證路徑回傳給請求源,SPV 拿到驗證路徑之后,再做-次merke校驗.確認無誤之后,就認為這個交易是可信的
區塊鏈網路中,節點一般分為:
全節點
輕節點
SPV節點SPV與輕節點
不同點:
SPV節點: 目的是驗證一筆交易是否上鏈、是否得到多個確認,
輕節點:節點本地保存與其自身相關的交易資料,目的不僅僅是驗證交易,還有管理節點自身的資產收入、支付等資訊,共同點:
SPV節點和輕節點都無需在本地保存全部資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345828.html
標籤:區塊鏈
上一篇:跨鏈橋能改變什么
下一篇:元宇宙,終產者的起點~

