文章目錄
- 1. 位元幣
- 1.1 區塊鏈介紹
- 1.2 位元幣密碼學
- 1.2.1 密碼學基礎
- 1.2.2 哈希函式 HASH FUNCTION
- 1.2 位元幣密碼學基礎
- 1.2.1 數字簽名方案
- 1.3 位元幣的資料結構
- 1.3.1 哈希指標
- 1.3.2 位元幣的區塊
- 1.3.3 交易
- UTXO模型
- 1.3.4默克爾樹
- 1.4 位元幣的引擎----共識機制
- 1.4.1 共識
- 1.4.2 共識機制
- 1.4.3 共識機制的型別
- 1.4.4 區塊鏈的共識機制
- 1.4.5 為什么位元幣需要共識
- 1.4.5.1 拜占庭將軍問題與容錯演算法
- 1.4.5.2位元幣為何需要共識機制
- 1.4.5.3位元幣的作業量證明機制是什么
- 1.5 挖礦與區塊鏈分叉
- 1.5.1 挖礦背后的數學
- 1.5.1.1 挖礦的概率分析
- 1.5.1.2 挖礦的難度設定
- 1.5.2 分叉
- 1.5.2.1 一般的分叉
- 1.5.2.2 硬軟分叉
- 1.5.2.3 惡意分叉
- 1.5.3 位元幣安全機制的保障
- 1.5.3.1 挖礦的安全性分析
- 1.5.3.2 自私挖礦
- 1.5.3.3 分叉攻擊分析
- 1.6 bitcoin 社區 與 獎勵
- 1.6.1 位元幣社區
- 1.6.2 挖礦的激勵與策略
- 1.7 匿名監管網路
- 1.7.1 位元幣網路
- 1.7.2 匿名
- 1.7.3 監管
- 2. 以太坊(重頭戲)
- 2.1 以太坊簡介
- 2.2 以太坊區塊資料結構
- 2.3 以太坊的賬戶模型
- 2.4 以太坊的狀態樹
- 2.5 以太坊的交易樹,收據樹,Bloom Filter
- 2.6 以太坊基本架構及原理------狀態模型
- 2.7 以太坊交易
- 2.8 以太坊共識機制
- 2.9 以太坊挖礦難度調整
- 3. 位元幣與以太坊的區別(主要關注)
- **位元幣與以太坊在資料結構方面有什么不同**
- **位元幣的共識機制,以太坊的共識機制,二者有什么不同**
- **以太坊的狀態樹**
- **以太坊的交易樹,收據樹**
- **以太坊,位元幣基本架構原理**
- **位元幣和以太坊的nonce有什么區別**
- **以太坊的pow與位元幣的共識機制有什么不一樣,哈希演算法不一樣,具體是怎么作業的**
1. 位元幣
主要關注 密碼學,資料結構,共識機制;
其他的生態方面的涉及不多
1.1 區塊鏈介紹
區塊鏈是載體/平臺,位元幣是產品
位元幣:一種建立在計算機技術,密碼學及經濟學基礎上的貨幣形式,(加密數字貨幣)
區塊鏈的定義:按照時間順序將資料區塊以順序相連的方式組合成的一種鏈式資料結構,
- 區塊鏈是一個分布式的賬本資料庫,網路中的每個節點都有一本完整的賬本,
- 無法篡改
- 去中心化,降低成本,提高效率,
區塊鏈特性:
- 匿名性
- 一致性
- 分布式
- 不可篡改性
區塊鏈的分類:
- 公有鏈:
- 鏈上的節點向全世界每一個人開放,任何人都可以在自己設備上運行公共節點,驗證區塊鏈中的交易,參與到共識的程序中,確認當前加入鏈上的區塊以及當前區塊鏈的狀態,任何用戶都可以向鏈上發起交易,查看鏈上的任意資料,是一種完全去中心化的機制的區塊鏈,
- 比較有名的公鏈是位元幣,以太坊,
- 私有鏈:
- 私鏈中對鏈上的讀寫權限由單一的組織來控制,可選擇性地開放給特定群體,去中心化程度低,交易速度快,常用于一些私人企業的資料管理,審計中,
- 聯盟鏈:
- 聯盟鏈由一些特定機構作為節點參與到區塊鏈的共識機制中,用戶對鏈上資料的讀寫權限由這些節點控制,用于機構之間的合作場景中,
1.2 位元幣密碼學
1.2.1 密碼學基礎
- 對稱加密:使用相同的密鑰加密大量資料
- 非對稱加密:采用不同的密鑰加密少量資料用于交換對成密鑰,用于簽名驗簽,
位元幣只采用了兩種最簡單的密碼學技術:哈希與數字簽名,
- 哈希:表示大量資料的唯一摘要值,原資料的少量改動會在哈希值中產生不可預知的大量更改,可以作為資料的驗證憑證,(HASH可以保證資料的完整性,正確性,)
- 數字簽名:資訊的發送者(掌握私鑰)能產生的別人無法偽造的一段數字串,且可以通過其發布出去的公鑰驗證是由他發送的,(數字簽名:所有者確權)
1.2.2 哈希函式 HASH FUNCTION
定義:HASH函式是將任意長度的訊息映射成一個較短的定長輸出資訊的函式,
如下形式:h=H(M),M是變長的訊息,h是定長的Hash值,
目的:為檔案,訊息或其他的分組資料產生”數字指紋“
密碼學哈希函式,特性:
- 輸入可以為任意大小的string
- 輸出固定大小(長度),e.g.:256 bit-long
- 有效計算:特定的輸入字串,合理時間內輸出-----O(n)復雜度
為了達到密碼學安全,還需如下特性:
- 碰撞阻力(collision-resistance):如果無法找到兩個值,x與y,x!= y,而H(x)=H(y),那么稱哈希函式H具有碰撞阻力,(MD5無法防止碰撞,不適合用于安全認證)
- 隱秘性(hiding):稱哈希函式H具有隱蔽性,如果:當其輸入r選自一個符合高階最小熵的概率分布,在給定H(r||x)時,來確定x是不可行的,
+ 保證:如果僅僅知道哈希函式的輸出y=H(x),則沒有可行的辦法算出輸入值x - 謎題友好(puzzle-friendliness):如果對于任意n位輸出值y,假定k選自高階最小熵發呢不,如果無法找到一個可行的方法,在比2^n小很多的時間內找到x,保證H(k||x)=y成立,那么我們稱哈希函式H為謎題友好,
1.2 位元幣密碼學基礎
位元幣沒有賬戶,但用戶有”錢包<public key, secret key>,非對稱加密
加密貨幣不加密,私鑰公鑰的作用:
- 簽名Sign(message, sk) = Signature
- 驗證verify(message, Signature, pk) = True/ False
1.2.1 數字簽名方案
-
由三個演算法組成:
- (sk, pk) := generateKeys(keysize)
- 把keysize作為輸入,來產生一對公鑰和私鑰
- 私鑰sk被安全保存,并用來簽名
- 公鑰pk是人人都可以找到的,拿到它用來驗證你的簽名,
- sig := sign(sk, msg) 簽名程序
- 把一段訊息message和私鑰sk作為輸入,輸出是簽名sig
- isValid := verify(pk, message, sig), 驗證程序
- 通過把一段訊息和簽名訊息與公鑰作為輸入
- 如果回傳是真,證明簽名屬實;否則,證明簽名的訊息為假,
- 實踐中:
- 對要簽名的資訊大小有限制,所以使用Hash函式,因為哈希函式的輸出是定長的,
- (sk, pk) := generateKeys(keysize)
-
在位元幣中"公鑰即身份":
- Bitcoin用戶自己開賬戶------<pk,sk>
- 其他用戶看到一個簽名,并被一個pk驗證了:pk就可以代表一個人的身份,
- 位元幣中用戶的身份:地址 := Hash(pk || x)
-
位元幣可以提供去中心化身份管理
- 隨時定制新的隨即身份:
new<pk , sk> = generateKeys(keysize) - 具有匿名性:一個人可以有多個<pk, sk>,隨便使用哪一個身份轉賬
- 隨時定制新的隨即身份:
高飛幣:
- 簡單規則一:用戶可以隨時創建新幣
- 簡單規則二:用戶可將幣轉給其他人,必須通過密碼程式完成,
- 安全隱患:
- double spending:一個人可以同時簽署多分transfer
- 用戶可以無限制鑄幣
財奴幣:
- 解決了”雙花問題“
- 設計“僅增賬本”:保證已經寫入賬本的資料都會被永久保留下來,
1.3 位元幣的資料結構
高飛幣使用"哈希指標"
財奴幣使用的“僅增賬本”
1.3.1 哈希指標
- 正常指標:指示資料的位置 *ptr= &data
- 哈希指標:不僅指示資料的位置,還可以驗證資料是否有被篡改過, *ptr = H(Data)
1.3.2 位元幣的區塊
在任何區塊鏈中的第一個塊都稱為創世區塊,創世區塊是靜態編碼在客戶端軟體中的,不可被修改,
交易需要得到驗證和執行才能夠正式被區塊鏈系統確認,如果每一個交易都要被單獨確認將會帶來巨大的開銷,所以位元幣系統中采用了批量確認交易的方法,形成區塊,
區塊:
- 區塊鏈系統理解為一個數字賬本,那么一個區塊便是賬本上的一頁,
- 記錄了相對獨立的一批交易記錄,并在對這些交易進行一次確認
- 組成:
- 區塊頭:包含了這個區塊的所有資訊
- 區塊體:存放交易等詳細資料
區塊頭(block header):
- 定義與作用:
- 存放區塊資訊
- 作為區塊的摘要在網路間進行傳輸
- 組成:
- 區塊版本 4B
- 前一個區塊的哈希 32B
- 交易哈希:交易串列的哈希值 32B
- 產生的時間 4B
- 難度資訊:區塊產生的門檻難度 4B
- Nonce值:用于動態調整以產生滿足門檻條件的合法區塊 4B
區塊身:交易串列,組織成默克爾樹形式,
1.3.3 交易
- 賬戶
- 賬戶是區塊鏈系統中數字貨幣的所有者,也稱為地址,
- 賬戶之間的貨幣轉移通過交易來實作,成為轉賬,
- 賬戶系統的經典模型
- UTXO(未花費的交易輸出),應用于位元幣
- 賬戶狀態轉移,應用于以太坊
- 賬戶余額:由UTXO計算得到,
- 位元幣的交易類似于借據交易
- 在這個程序中,結局上的借款數額雖然是可以繼續劃分的,但是借據本身是一個不可劃分的整體,而位元幣的交易也是類似的,交易分為輸入和輸出兩個部分
- 交易的輸入表示了交易的位元幣從哪里來
- 交易的輸出標識了交易中的這些位元幣在交易結束后往哪里去,
- 交易中的位元幣數額可以劃分到很小的單位,但是交易的輸入和輸出本身都是單一的整體,不可劃分,
- 交易的程序:
- 假設現在Alice要想Bob進行轉賬一個BTC,那么她必須使用一個交易來完成這個轉賬的動作,
- 首先,Alice會將她所擁有的1個BTC放入到交易的輸入中,再將這個交易的輸出標記為Bob所有,
- 執行完這一交易后,Alice就失去了放入輸入的這一個BTC的所有權 ,而Bob獲得這個交易輸出的BTC的所有權,
- 在這個程序中,位元幣系統中的所有參與者共同充當了公證人的角色,而密碼學的原理充當了原本借據上具有法律效力的印章和簽名,
- 交易可以有多個輸出
- 交易的輸入不能憑空產生,必須參考和解鎖一個已完成的其他交易的一個輸出
- 交易的組成:
- 交易輸入由兩部分組成------使用到的前一個交易輸出的參考和用于解鎖這個輸出的一個解鎖腳本,
- 其中對輸出的參考通過交易的哈希值和輸出在這個交易中的位置決定,而解鎖腳本通常使用了用戶的密鑰生成,只有本人才能夠使用解鎖腳本,
UTXO模型
- 在位元幣中,還沒有花費出去的交易才能夠真正地反映出一個用戶擁有的位元幣,稱之為未花費交易輸出,簡稱為UTXO,
- 可回溯的交易鏈條:我們可以對任意位元幣不斷回溯,直到最初產生位元幣的起點,
1.3.4默克爾樹
Merkle樹是一種以哈希形式組織大量資料的方法,并用單個哈希表示該資料,
1.4 位元幣的引擎----共識機制
1.4.1 共識
共識:指的是在不可信的節點之間對指定資料的最終狀態達成一致的一種處理程序,
分布式共識:在多個節點之間獲得一個共同的狀態/值,盡管有些節點存在故障,
分布式系統達到一致性的程序,應該滿足:
- 可終止性:一致性的結果在有限時間內能完成
- 約同行:不同節點最終完成決策的結果是相同的,
- 合法性:決策的結果必須是某個節點提出的提案
對應著三個分布式系統的要求:
- 活性:系統的可用性
- 安全性:任何給出的結果必定是達成共識的
- 正確性:正確的共識結果
1.4.2 共識機制
共識機制:分布式系統中的大多數或全部節點所執行的來同意一個提議的狀態或值的一組步驟,
共識機制的作用:
- 在分布式系統中解決錯誤
- 允許分布式系統達到最終的狀態
共識機制的要求:
- 一致性:誠實(好)的節點決定相同的值
- 可結束性,活性:誠實的節點共識程序的執行是可終止的,
- 有效性,正確性:被統一的值等于由至少一個誠實節點提出來的值,
- 錯誤容忍:共識機制應該能夠在出現故障或惡意節點時運行,
- 節點的誠實性:在一個共識回圈中,任何節點都不能多次做出決策
1.4.3 共識機制的型別
共識機制大致分為兩種:
- BFT-based(拜占庭錯誤容忍)
- Leader Election-based共識機制 (選舉)
BFT-based:
- 沒有算力密集操作
- 依賴于一個簡單的節點方案
- 最后,當接收到一定數量的訊息時就會達成協議
Leader Election-based:
- 要求節點在領匯入選舉中競爭
- 只有獲勝的節點才能提出最終值
1.4.4 區塊鏈的共識機制
是區塊鏈的支柱,通過一個稱為挖掘的可選程序提供分散控制,
不同區塊鏈需要不同的共識機制:
- 公有鏈
- 幾乎人人都可以參與,每個參與者都是匿名
- 參與者之間不存在任何信任
- 采用算力敏感的"挖礦"共識 作為獎勵機制
- 聯盟鏈/私有鏈
- 在一組已知的,已識別的,且經常經過審查的參與者中進行區塊鏈的操作,
- 節點具有一定的信任基礎
- 不需要算力敏感的共識機制,BFT型別的共識機制比較適合
1.4.5 為什么位元幣需要共識
1.4.5.1 拜占庭將軍問題與容錯演算法
1.4.5.2位元幣為何需要共識機制
共識機制中常見的攻擊:
- 雙花攻擊:將導致每個節點記錄的賬本資訊不一致
- 對抗雙花攻擊:同等驗證,
- 提交者向其他用戶提交一條交易資訊,其他用戶進行投票,當獲得一定數目投票后,大家同意將交易資訊進行保存,-----保證所有結點存盤相同的交易賬單,
- 多重身份攻擊/女巫攻擊:多重身份意味著多重投票的權利,且位元幣作為無中心登記的匿名服務,創建多重身份代價極低,
- 可以實行多重身份,從而允許惡意者的雙花行為
- 對策:取代用身份投票的機制,采用資源成本進行投票,提高作惡代價,
1.4.5.3位元幣的作業量證明機制是什么
位元幣共識的思路:作業量證明(Proof of work):不容易完成,極易驗證,
位元幣的共識機制:基于“作業量證明”的挖礦
挖礦:是新塊被加入到區塊鏈中的程序,
通過消耗資源解決一個問題獲得投票資格(即記賬權),記賬權必須通過花費計算資源來獲得,比如說通過蠻力解決一個問題,通過記賬獎勵鼓勵投入資源,

POW難題設計必須滿足以下條件:
- 不容易完成(表明需要作業量)
- 容易驗證(其他節點可以快速確認確實付出了作業量)
- 作業程序公平(任何節點沒有完成作業的捷徑)
- 具有隨機性(能力越強,只能保證率先完成概率越大)
區塊鏈的共識機制:一種多方協作機制,用于協調多參與方達成共同接受的唯一結果,且保證此程序難以被欺騙,且保持穩定運行,
1.5 挖礦與區塊鏈分叉
1.5.1 挖礦背后的數學
1.5.1.1 挖礦的概率分析
全網miners的伯努利試驗:是一個泊松程序,
當10分鐘之后沒有出塊,全網所有礦工結點之后再經過多久可以出塊?----還是10分鐘.(保證了挖礦的公平性)
算力強的礦級和算力弱的礦機在每一次嘗試解題的程序中,要具有相同的成功幾率,
1.5.1.2 挖礦的難度設定
難度:是挖到一個新塊的難度的一個測量,
難度越高暗示著將花費更多的算力來挖同樣數量的區塊-----使網路對抗攻擊更安全,
難度的調整與檢測到的挖礦算力相關,每隔2016個塊將會調整一次,來強制2個連續塊之間的平均時間保持在十分鐘左右,
通過調整挖礦難度,使得出塊時間相對穩定,讓分叉攻擊更難,
1.5.2 分叉
1.5.2.1 一般的分叉
假如全網同時有兩個合法提案在網路中進行廣播,收到的用戶進行驗證后,會基于用戶認為的最長鏈基礎上繼續難題的計算,因此,系統
中可能出現鏈的分叉(Forking)
解決方案:位元幣網路最長鏈機制,
1.5.2.2 硬軟分叉
硬分叉:區塊鏈產生永久性分歧,在新共識規則發布后,部分沒有升級的節點無法驗證已經升級的節點產生的區塊,通常硬分叉就會產生,(規則改變:產生一個不同的分鏈)
軟分叉:當新共識規則發布后,沒有升級的節點會因為不知道新共識規則下而產生不合法的區塊,就會產生臨時性分叉,
1.5.2.3 惡意分叉
分叉攻擊------最長鏈機制帶來的副作用,(為了double spending發動51%攻擊)
1.5.3 位元幣安全機制的保障
1.5.3.1 挖礦的安全性分析
1.5.3.2 自私挖礦
自私挖礦:一個自私的礦工隱藏了他剛剛開采的新區塊,并在這個隱藏的區塊之后繼續開采下一個區塊,
這樣就只有他自己直到新開采了一個塊,而別人都在按照舊的前一個區塊進行挖礦,一旦發布出去之后,大家都會在新區塊后邊平等地開始競爭,
危險是:不發布的快有可能被浪費掉,所以還u如趕緊發布出去獲得當前的出塊獎勵,如果一個礦工他的算力超過全網的三分之一,他很可能為了更多的收益而選擇私自挖礦,
1.5.3.3 分叉攻擊分析
發動分叉攻擊只有在算力超過半數以上才可能成功,
1.6 bitcoin 社區 與 獎勵
1.6.1 位元幣社區
位元幣網路是一個點對點的網路,
節點的作用:
- 驗證新區塊
- 存盤和保存區塊的交易歷史記錄
- 更新區塊鏈中的其他節點以確保區塊鏈上的所有節點都具有最新資訊,
兩種典型的節點:
- full nodes(全節點)
- 托管整個區塊鏈歷史記錄的單個副本,包括交易,時間戳和所有創建的塊,
- 負責全部功能:錢包,礦工,全區塊鏈存盤和網路路由功能
- 需要更先進的計算能力和能量
- SPV(輕節點/簡單付款驗證節點)
- 下載錢包并連接到完整節點,以進一步驗證存盤在區塊鏈上的資訊
- 它們的大小要小得多,并且僅保存部磁區塊鏈歷史的資訊,
- 僅執行錢包和網路路由功能,
- SPV客戶端只需要下載所有區塊的區塊頭,并進行簡單的定位和計算作業就可以給出驗證結論
- SPV nodes能夠以較小的代價判斷某個支付交易是否已經被驗證過了,以及得到了多少算力保護
- 礦工節點
- 挖礦節點只負責創建要添加到區塊鏈中的區塊,他們不負責未來區塊的維護或有效性,
挖礦節點與全節點的關鍵不同之處:
- 礦工
- 通常通過coinbase獲得獎勵
- 不一定托管所有歷史交易以識別新的交易的有效性
- 一個急功近利的miner有可能為了競爭出塊獎勵而打包"空塊"(不包含任何交易的block)
- 全節點
- 沒有獎勵
- 是P2P網路的志愿者
- 他們被激勵去保存和進一步分散區塊鏈,
- 一個全節點不需要礦工的存在,

位元幣社區:礦池:采礦程序消耗能源,礦工在購買所需的計算機電源時通常具有很高的啟動成本,- 這導致了礦池的普及,其存在是為了匯集來自多個來源/用戶的哈希率,
因為有礦池的存在,所以社區中的礦工們匯聚起較高的哈希率,更有可能挖到礦,
1.6.2 挖礦的激勵與策略
礦工得出塊獎勵包含兩部分:
- 出塊獎勵blobk reward(6.25 bitcoin)
- 交易手續費:所有在新提出的塊的交易費用
挖礦的策略:
- 打包哪些交易:礦工可以選擇將哪些交易放進他的區塊里,默認的規則是選擇那些交易費用比較高的交易
- 對哪一個區塊進行挖礦運算:礦工可以選擇在哪個區塊上進行挖礦,默認的做法是在最長的那條區塊鏈上繼續挖下去
- 如何在同一高度的多個區塊中做選擇: 如果兩個不同的區塊在同一時間被宣布發現,這就造成了一個區塊的分叉,每個分叉的區塊都是可以被延續下去的,因為它們都 符合最長區塊鏈原則,礦工必須選擇其中一個區塊接龍下去,默認的做法是選擇最先被監聽到的那一個區塊,
- 什么時候宣布新的區塊?礦工找到一個有效區塊之后,他們要決定什么時候向位元幣網路宣布這一個區塊, – 默認的做法是立刻宣布,但他們也可以選擇等一下 —— 自私挖礦 or block withholding attack
如何防范51%攻擊:
6個確認機制:
- 如果真有這樣的51%攻擊,建議是收款方等到全網的 6 個區塊確認之后再交付商品,按照10分鐘一個區塊的速度,只需一個小時就可以保證你的錢是否基本肯定收到
- 6個區塊后再對全網進行篡改的難度很高
- A tradeoff: 確認的塊數不一定是6,可以為了更安全而采取更大的確認塊
數,但是需要等待的時間也越長
1.7 匿名監管網路
1.7.1 位元幣網路
區塊鏈建立在三項關鍵技術之上:密碼學,P2P網路,博弈論,
P2P 網路結構:
結構化網路:
- 結構化網路的主要優勢:快速搜索特定的資訊,
- 結構化P2P網路通過分布式哈希表(DHT)克服了非結構化網路的局限性,
Distributed Hash Table (DHT)
- DHT就是一種分布式的存盤和尋址技術,
- 通過DHT資料結構它把KEY 和 VALUE用某種方式對應起來,使用hash()函式把一個KEY值映射到一個index上:hash(KEY) = index,這樣就可 以把一個KEY值同某個index對應起來,然后把與這個KEY值對應的 VALUE存盤到index所標記的存盤空間中,
- 尋址程序:每次想要查找KEY所對應的VALUE值時,只需要做一次hash()運算就可以找到了,
位元幣:非結構化點對點網路
- DHT不適用于位元幣:DHT要求所有節點都需要(或多或少)完整資訊
- 非結構化網路:圍護結構沒有開銷
- 不能保證flooding可以找到具有所需資料的對等體
- flooding還會導致網路中出現大量流量,因此,此類網路通常具有非常差的搜索效率
在不靠譜的P2P網路上位元幣節點的操作:


1.7.2 匿名
位元幣賬戶的地址:公鑰哈希值,
位元幣使用匿名的原因:位元幣是一個公鏈系統,一旦暴露身份,所有隱私不保,
1.7.3 監管
2. 以太坊(重頭戲)
智能合約簡介不用太仔細看,主要關注資料結構,跟位元幣資料結構有什么不一樣的
以太坊的狀態樹,用來干嘛的;交易樹之類的;基本架構原理
以太坊的共識機制
跟位元幣的nonce不一樣,不一樣的在哪里
以太坊的pow跟位元幣的共識機制有什么不一樣-----哈希演算法不一致:具體什么不一樣,具體怎么作業的!!!!必考
2.1 以太坊簡介
位元幣和以太坊是兩種最主要的加密貨幣,位元幣是區塊鏈1.0,以太坊是區塊鏈2.0
智能合約依賴于環境的可靠性
應用在區塊鏈上的智能合約: 區塊鏈是一種能使多方間達成狀態一致的有效手段,那么將智能合約應用到區塊鏈上就能使得智能合約具備更高的可靠性,
以太坊上的智能合約:以太坊在多個節點組成的點對點網路中,維護共同的區塊鏈資料,通過區塊鏈上的交易來進行智能合約的創建、呼叫、 結束等操作,由于多個節點所維護的區塊鏈狀態是一致的,因此,多個節點上所運行的智能合約的程序和結果也是一致的
以太坊是第一個支持智能合約的區塊鏈系統,使用Ether作為加密數字貨幣,是生態社區最活躍的區塊鏈系統,
2.2 以太坊區塊資料結構
以太坊區塊資料結構分為:區塊頭和區塊體,打包一批執行后的交易,
區塊頭內容:
- 記錄以太坊狀態的狀態根
- 交易串列,收據串列和叔塊串列對應的哈希值
- 最長不超過100KB的額外資料
區塊體內容:
- 交易組成的交易串列
- 由交易執行資訊組成的收據串列
- 用于改進以太坊共識程序的叔塊串列
2.3 以太坊的賬戶模型
賬本狀態在所有區塊鏈節點分布式存盤
地址的生成:對公要使用KECCAK256哈希演算法,計算得到一個64位的16進制哈希值,截取這個哈希值的最后40位作為一個以太坊的地址,
賬戶結構:用戶賬戶結構保存了用戶地址對應賬戶的資料資訊,包括:
- 余額:記錄了當前地址持有的以太幣的數額,單位是Wei
- Nonce:記錄了這個地址創建以來累計發起的交易次數,
Nonce的作用:
- 在以太坊的模型中,交易的合法性檢驗在于轉賬發起者的賬戶余額,
- 如果沒有其他手段來使得發起過的交易失效,那么這個交易將可以被無限次的重新發起而不需要發起者的同意,因為發起者的簽名對于交易始終是有效的,
Nonce計數器:計算 交易的次數和序列
- 只有賬戶的Nonce和交易的Nonce能夠對應的情況下,交易才是合法的
- 當一個交易執行完畢后,賬戶的Nonce值增加,原本執行完畢的交易中的Nonce值就無法與現在賬戶的Nonce值相匹配,
- 修改相對應的Nonce值意味著原有的交易的簽名失效,需要發起者的重新簽名,
Nonce的其他作用:
- 控制賬戶發起的交易的順序,從而實作一些相對復雜的功能,
- 通過重復提交一個相同Nonce值的交易來使得一個已經提交但是尚未被確認的交易是不合法的,從而實作一定程度的撤銷功能,
以太坊有兩種賬戶:
- 外部賬戶:有賬戶余額,無代碼,能觸發交易,由私鑰控制
- 合約賬戶:有賬戶余額,有代碼,能被觸發執行智能合約代碼,在智能合約創建后自動執行,
位元幣的UTXO模型更有利于隱私保護,為什么以太坊還要使用賬戶模型呢?
- 以太坊之所以要使用賬戶模型是為了支持智能合約,要求參與者要有穩定的身份,
- 比如智能合約可以實作一些金融衍生品,利于參與者進行投資,
2.4 以太坊的狀態樹
以太坊的賬戶狀態:
- Nonce:累計發起的交易次數
- Balance:賬戶余額
- CodeHash:智能合約代碼的哈希指
- StorageRoot:合約存盤樹的根節點哈希值(維護智能合約狀態)
合約存盤樹:
- 合約賬戶下的存盤也是一個映射表,它記錄了從存盤地址到存盤值的一個映射關系
- 在合約賬戶的資料結構中存盤了這個映射表的哈希值,這個哈希值被稱為存盤根,它同樣是由一顆MPT來維護和計算的,
以太坊狀態如何維護?
Merkle Patricat Trie(MPT)
背景:如果把單詞和箭頭換成哈希值,然后計算每個中間節點的哈希值,便得到了MPT,
MPT的構造:
- 按照所有資料的地址(或者鍵值)來構建一顆 壓縮前綴樹,
- 由于地址是以16進制為編碼的,我們使用0123456789abcdef作為每個編碼的單元
- 按照構建得到的壓縮前綴樹,從葉子節點開始,逐步計算每一額層的哈希值,并將其匯合到父親節點中,與Merkle Tree的計算程序類似,
以太坊用來記錄各個賬號的狀態的樹,樹的鍵是賬戶地址,值是賬戶的詳細資訊,
以太坊采用Modified Mekkle Patricia Trie,引入三種節點,
區域更新:只改變對應分支的狀態,
當新區塊形成時,區塊鏈節點存盤的是:
- 生成的是一個新的狀態樹
- 而不是修改原來的狀態樹
- 其中大部分節點的內容是共享的,
目的是:有利于解決分叉時,對狀態的回滾
- 與位元幣不同,位元幣的轉賬可以簡單地反向推算,
- 而以太坊有智能合約,實作的功能功能很復雜,很難推算出之前的狀態,所以為了回滾,必須保存之前的狀態,
2.5 以太坊的交易樹,收據樹,Bloom Filter
收據:收據是對應交易的資料結構,代表了交易執行的一些中間狀態的寫入和交易的執行結果等資訊,
收據的內容:
- 以太坊的智能合約向虛擬機輸出的一些執行日志
- 智能合約運行的Gas資訊
- 單個交易執行完畢后以太坊的狀態根
- 一個交易創建智能合約的時候,如果執行成功會把新建合約的地址寫到一個收據中,
交易樹和收據樹:
- 與位元幣中的 Merkle Tree 類似的,對于以太坊區塊中的所有 交易 和 交易的收據,都可以使用 MPT 進行組織和證明
- MPT 的構建不再是通過賬戶地址來進行,而是通過交易或者收據在區塊中的序號來構建 MPT
- 收據樹和交易的資訊一一對應,主要是考慮到智能合約的執行比較復雜,收據樹可以有利于快速查詢,證明交易結果,
為什么使用 MPT,而不是普通的 Merkle Tree?
- 代碼復用:以太坊其他資料結構都采用 MPT, 代碼統一,利于管理
- 查找效率高,
Bloom Filter
Bloom Filter (布隆過濾器)的用途
- 以太坊中通過布隆過濾器對收據的日志進行索引,比如:
- Client 找到過去十天和某個智能合約有關的交易
- Client 找到過去十天當中符合某種型別的所有事件(e.g., 眾籌事件 or 發行新幣的事件)
● 優點
- 布隆過濾器可以用于檢索一個值是否在一個集合中,在容忍一定的誤識別率的條件下,它有著遠超過一般演算法的空間效率和時間效率,
● 原理
- 通過多個哈希函式將鍵值映射到位圖之中,并在位圖中合并集合中所有鍵值的映射結果,
- 對于一個鍵值,如果經過同樣的哈希函式映射之后,出現了在位圖中沒有出現的標記位,那么這個鍵值必定不存在于集合之中,
實體:在進行 哈希方式B 之后,若日志地址 Y 的哈希出現了新的標記位,那么日志地址Y必然不存在于原有四個日志地址之中
- 性質:可以保證某個元素一定不在集合里,但不能保證元素一定在集合中,即會誤報,但不會漏報,
- 好處:client 可以快速過濾,迅速查找(說在的不一定在,但是說不在的必定不在)
2.6 以太坊基本架構及原理------狀態模型
- 在賬戶模型中,用戶的余額通過地址上的賬戶資料來表示,具體為賬戶資料結構中的一個余額的數值
- 在轉賬交易的程序中,通過轉賬預先定義好的語意,在發起者的賬戶中減去交易中定義好的轉賬金額,在接受者的賬戶中增加相應的金額
- 可以把賬戶的余額泛化成一種賬戶的狀態,而把轉賬交易當作是改變狀態的一個方法
狀態轉移:由交易來驅動的狀態機
- 在區塊N執行前狀態為S,經過區塊N的交易進行狀態轉換后,轉換為狀態 S’,再經過區塊N+1的轉換后,轉換為狀態S’’,
智能合約:作用于該狀態機轉換的代碼,
以太坊虛擬機:執行狀態轉換代碼的虛擬機
以太坊基本結構及原理----共識問題:
- 相比位元幣的UTXO模型,狀態轉換模型雖然使得智能合約的各種變數存盤、傳參等變得更加靈活,但也帶來了多方共識上的困難,如發生分叉時的處理
- 在以太坊的狀態轉換模型中,如果發生分叉,需要回到分叉前的狀態,重新驗證另一條分支上的區塊
- 以太坊狀態的存盤采用了狀態樹結構,其根哈希記錄在區塊頭中,記為 stateRoot,從而使得狀態能夠在全網得到共識確認,并在分叉時能夠快速回滾,

交易執行概述:
- 每個節點獨立維護資料
- 節點獨立地在EVM中執行合約
- 將執行結果寫回區塊鏈資料
- 節點之間執行共識機制,達成共識,
實體:交易執行具體程序
1. 每個節點獨立維護資料,這些節點可以是張三、李四、趙四、影院主管等人
2. “張三買電影票”的交易在所有節點中被獨立驗證
3. 以太坊虛擬機的執行結果將以某種方式寫回到區塊鏈資料中,比如張三的余額、影院的余票等,每個區塊中會保留一段摘要,這段摘要為執行完區塊中交易 后以太坊狀態的 stateRoot,任一子狀態的不同都將導致 stateRoot 的不同
4. 如果張三控制的節點受到非法攻擊或篡改,則執行結果及區塊鏈資料將與網路中其他節點(如李四、趙四、影院的節點)不符,無法參與到網路的下一步共識中
2.7 以太坊交易
在以太坊中,交易承載了賬戶轉賬和合約創建,呼叫合約等功能,
TX資料的內容大體可以分成三個部分:基本的交易,驅動智能合約,交易的簽名
- 基本交易內容:
- from:交易發送者的地址,發送者地址可以通過合約的簽名資訊<r, s, v>計算得到,實作上交易的資料結構中并不會存盤發送者地址
- to:交易接收者的地址,在進行轉賬時是接受轉賬金額的地址,在創建合約時設定為0x0000…000,在呼叫合約時則是合約的地址
- value:交易的金額,單位是Wei,Wei是以太幣最小單位,我們常說的1個以太幣是單位Ether,1 Ether =10^18 Wei
- 驅動智能合約
- input data:交易附帶資料,傳遞創建合約的代碼和建構式,或呼叫合約的函式及引數
- nonce:交易發送者累計發出的交易數量,用于區分一個賬戶的不同交易及順序
- gasPrice:發送者支付給礦工的gas的價格,用于實作從Gas到以太坊貨幣單位的轉換,從而計算使用的Gas的總價格
- gasLimit:該交易允許消耗的最大的gas,用于解決智能合約不能停機的問題
- 交易內容:
- hash:由以上欄位生成的哈希值,也作為交易的id
- r,s,v:用于ECDSA驗證的引數,由發送者的私鑰對交易的哈希做數字簽名生成,用于確認轉賬的合法性,
以太坊交易的周期:發起,廣播,打包與執行,驗證與執行,



2.8 以太坊共識機制
以太坊采用的哈希演算法:ethash演算法,對記憶體有要求,
將來要過渡到POS(proof of stake)-----如何過渡
POS:權益證明
這種機制通過計算你持有的幣數占總幣數的百分比,包括你占有幣數的時間來決定獲得本次記賬權利的概率,持有越多,獲得記賬權利概率越大,
優點:相比POW縮短了達成共識的時間,節省能源
缺點:容易分叉;易中心化(馬太效應)
由于以太坊出塊時間在15s左右,所以新的區塊很大可能還沒有擴散到整個區塊鏈網路,導致以太坊的分叉是常態,
為了鼓勵分叉的合并,以太坊引入Ghost協議,
叔父塊:
- 以太坊定義了不在主鏈但被主鏈區塊記錄的滿足難度的區塊為叔塊,
- 在以太坊中叔父不是嚴格意義上的叔父,以太坊中規定在當前區塊的7代以內有共同祖先的都可以認為是叔父塊,
作用:
- 在盡可能減少兩個相鄰區塊產生時間的條件下,盡量收縮和統一整個區塊鏈的主鏈,同時通過叔父塊的獎勵來維護礦工的積極性,
叔父塊的特點:
- 某個區塊最多只能接納2個叔父塊,也可以不接納任何叔父塊
- 叔父塊必須是區塊的前2層~前7層的祖先的直接子塊
- 被接納過的叔父塊不能再重復接納了
- 接納了n個叔父塊的區塊,可以獲得出塊獎勵的 n*1/32
- 被參考了的叔父塊,隨著距離越遠,得到的獎勵遞減1/8
叔父塊中的交易不會被執行,只檢查這個叔父是不是符合挖礦難度要求的合法區塊,
2.9 以太坊挖礦難度調整
每個新區塊的難度都是在父區塊難度的基礎上進行調整的

3. 位元幣與以太坊的區別(主要關注)
位元幣:
主要關注 密碼學,資料結構,共識機制;
其他的生態方面的涉及不多
以太坊
智能合約簡介不用太仔細看,主要關注資料結構,跟位元幣資料結構有什么不一樣的
以太坊的狀態樹,用來干嘛的;交易樹之類的;基本架構原理
以太坊的共識機制
跟位元幣的nonce不一樣,不一樣的在哪里
以太坊的pow跟位元幣的共識機制有什么不一樣-----哈希演算法不一致:具體什么不一樣,具體怎么作業的!!!!必考
位元幣與以太坊在資料結構方面有什么不同
位元幣:
區塊頭(block header):
- 定義與作用:
- 存放區塊資訊
- 作為區塊的摘要在網路間進行傳輸
- 組成:
- 區塊版本 4B
- 前一個區塊的哈希 32B
- 交易哈希:交易串列的哈希值 32B
- 產生的時間 4B
- 難度資訊:區塊產生的門檻難度 4B
- Nonce值:用于動態調整以產生滿足門檻條件的合法區塊 4B
區塊身:交易串列,組織成默克爾樹形式,
以太坊:
區塊頭內容:
- 記錄以太坊狀態的狀態根
- 交易串列,收據串列和叔塊串列對應的哈希值
- 最長不超過100KB的額外資料
區塊體內容:
- 交易組成的交易串列
- 由交易執行資訊組成的收據串列
- 用于改進以太坊共識程序的叔塊串列
位元幣的共識機制,以太坊的共識機制,二者有什么不同
位元幣的共識機制:基于“作業量證明”的挖礦
通過消耗資源解決一個問題獲得投票資格(即記賬權),記賬權必須通過花費計算資源來獲得,比如說通過蠻力解決一個問題,通過記賬獎勵鼓勵投入資源,
位元幣使用的hash演算法是:SHA256演算法
具體挖礦程序:參與者綜合上個區塊的 Hash 值,上一個區塊生成之后的新的驗證過的交易內容的Markle Root值,加上猜測的一個亂數Nonce, 再加上時間,一起打包到一個候選新區塊,讓新區塊的 Hash值小于位元幣網路中給定的一個數,
挖礦成功:SHA(Markle Root+ 上一個區塊Hash值+時間+Nonce)<target
以太坊的共識機制也是基于POW,使用的是ethash演算法,對記憶體有要求,抑制硬體挖礦
以太坊將來的共識機制:POS(權益證明):持有越多,獲得記賬權利概率越大
優點:縮短了達成共識的時間
缺點:容易分叉,易中心化
所以為了鼓勵合并,加入了ghost協議,定義了叔父塊,盡量收縮和統一整個區塊鏈的主鏈,
以太坊的狀態樹
以太坊的交易樹,收據樹



以太坊,位元幣基本架構原理
位元幣的基本架構及原理----UTXO
以太坊的基本架構及原理-----狀態轉換模型
位元幣和以太坊的nonce有什么區別
位元幣的nonce:在挖礦時用于動態調整以產生滿足門檻條件的合法區塊,
以太坊的nonce:累計發起的交易次數
Nonce計數器:計算 交易的次數和序列
只有賬戶的Nonce和交易的Nonce能夠對應的情況下,交易才是合法的
當一個交易執行完畢后,賬戶的Nonce值增加,原本執行完畢的交易中的Nonce值就無法與現在賬戶的Nonce值相匹配,
修改相對應的Nonce值意味著原有的交易的簽名失效,需要發起者的重新簽名,
Nonce的其他作用:
控制賬戶發起的交易的順序,從而實作一些相對復雜的功能,
通過重復提交一個相同Nonce值的交易來使得一個已經提交但是尚未被確認的交易是不合法的,從而實作一定程度的撤銷功能,
以太坊的pow與位元幣的共識機制有什么不一樣,哈希演算法不一樣,具體是怎么作業的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/413537.html
標籤:區塊鏈
