學習視頻源鏈接:
https://www.bilibili.com/video/BV1Vt411X7JF/
本文是根據肖老師的視頻進行的筆記記錄
bitcoin 1.0 區塊鏈 以太坊 2.0區塊鏈
以太坊 設置了 memory hard mining puzzle ,這造成了asic resistance,
后續 proof of work (工作證明)將改成 proof of stake (權益證明)
Mining Puzzle (挖礦謎題)
還增加了對智能合約的支持: 智能合約 (Smart Contract)
bitcoin : decentralized currency 去中心化的貨幣 ——取代了政府的發幣權力
ethereum : decentralized contract 去中心化的協議 —— 取代了合同權力
btc: satoshi
eth: wei
去中心化的貨幣有什么好處? 跨過轉賬 快,手續少,交易費少
為什么有去中心化的合同?如果合同的簽署方來自世界各地,用司法維護合同可用性比較困難。
1 eth 賬戶
bitcoin 為了維護隱私,打一槍換一個地方
Eth 使用了 account- based ledger ,對double spending attack 有天然的防范作用,也不用記錄幣的來源。
有人篡改賬戶余額怎么辦? 發布交易的時候,不需要說明自己的余額,余額是狀態樹維護的。
但是對應double spending attack (是付款方不誠實 —— 在bitcoin能出現, eth不能出現)
replay attack (是收款方不誠實,在bitcoin能出現,eth 上需要加一個計數器,交易次數 nonce ,記錄這個賬戶有史以來發布過多少次數)
交易次數 nonce 受到發布者簽名保護,
重放攻擊 (Replay Attack)
1.1 externally owned account
類似 bitcoin : 用公私鑰 控制
組成:
balance 余額
nonce 計數器(應該叫counter)
1.2 smart contract account
合約賬戶不能主動發起交易
組成:
code
storage
合約: 要求有比較穩定的身份。
- Eth 狀態樹
以太坊的區塊鏈結構與比特幣有一些不同。以太坊不是使用簡單的二叉樹,而是采用了一種稱為"區塊頭"(block header)的結構來連接區塊。
在以太坊中,每個區塊頭包含以下關鍵字段:
parentHash: 父區塊的哈希,這是區塊鏈的主要連接方式
ommersHash: 叔塊(uncle blocks)列表的哈希
stateRoot: 狀態樹(state trie)的根哈希
transactionsRoot: 交易樹(transaction trie)的根哈希
receiptsRoot: 收據樹(receipts trie)的根哈希
以太坊的區塊頭哈希(也就是區塊的標識符)是通過對上述區塊頭字段以及其他字段(如nonce, difficulty, number等)進行Keccak-256(也稱為SHA-3)哈希計算得出的。
以太坊不像比特幣那樣使用簡單的鏈式結構,而是使用了一種稱為"Patricia Merkle Trie"的數據結構來管理狀態、交易和收據。這些"樹"的根哈希被包含在區塊頭中。
在以太坊的代碼實現中,可以查看core/types/block.go文件,其中定義了區塊頭的結構和哈希計算方法。
addr -> state的 映射
地址是 160 bits 40個 16進制的數
區塊鏈刪除東西比較難,不合適。
數據結構: trie(branching factory) Trie 數據結構詳解
branching factory 0-f
查找效率取決于key的長度
不會出現碰撞(hash肯定會有沖突,但是這個不會)
在健值稀疏時,如果可以合并key,就可以提高效率,引入了 patricia trie (tree) 路經壓縮后的 trie
以太坊中的MPT (Merkle Patricia Trie)
為啥要把賬戶地址弄這么稀疏? 2的 160次方 。
防止碰撞
每次出現一個區塊,都要新建一個mtp,但是很多都是共享的。
智能合約是圖靈完備的,
Bitcoin與以太坊區塊鏈回滾機制對比
單筆交易回滾
以太坊狀態樹與RLP編碼詳解
3. 交易樹 & 收據樹
交易數和收據樹 節點一一對應。 他們都是mpt ,支持查找操作,而且數據結構得到了統一。
mpt 也是一種merkler tree 但是
收據樹為了智能合約比較復雜,可以快速查詢一些結果
每個交易樹和 收據樹都是獨立的,不會像狀態樹一樣共享節點。
交易樹/收據樹 可以證明 merkle proof
布隆過濾器在以太坊中的應用
bloom filter 有可能出現 false positive ,可能出現誤報,但是不可能出現漏報
bloom filter。不支持刪除操作,如果支持刪除的話,那個位置不能是0、1 ,需要變成計數器,但是計數器也要防止越界。
先查一下哪個塊頭在不在bloom filter,如果有的話,再去對交易樹,到底有沒有。
三棵樹的根hash值都在塊頭里
以太坊運行過程,可以看成是交易驅動的狀態機 transaction- driven state machine,這個狀態機的狀體就是所有賬戶的狀態,就是狀態樹。交易是什么? 每次發布的區塊里包含的交易。
通過執行這些交易,可以通過系統從當前狀態驅動到下一個狀態。
Btc 也可以認為是transaction- driven state machine ,但是狀態是utxo ,發布的區塊驅動現在的狀態轉移到下一個狀態。
btc 和以太坊中的狀態轉移都必須是確定性的,因為所有的礦工都要執行相同的狀態轉移。
收據就是這個,
區塊塊頭數據結構
這個bloom是由每個收據的bloom 合并得到的
createbllom :合并每個收據的bloom ,生成區塊的bloom
logsbloom :生成每個收據的bloom,
bloom9: bloomfilter 中使用的hash 函數,
- GHOST 共識協議
出塊速度快的好處是什么? 提高系統的throughput(吞吐) ,降低系統反應時間 。
bitcoin和 以太坊本質上都是應用層的共識協議,底層運行在 overlay network ,底層運行時間比較長,十幾秒出一個新塊,且底層運行的網絡比較慢,所以分支是常態,這對共識協議有什么挑戰呢?
會出現以下問題:
挖礦中心化(Mining Centralization)
中心化偏見 (Centralization Bias)
如何解決呢? 采用基于ghost 協議的機制
bitcoin :只有在最長合法鏈 才有初塊獎勵,其他的分叉的初塊獎勵是作廢的。
ghost: 挖到礦,這個鏈條作廢了,我們給你一定的補償(uncle block )
uncle block 得到 7/8 *3 的初塊獎勵, 一個主鏈塊 最多合并兩個uncle block,他能得到2(兩個) x 1/32 x 3 + 3 個初塊獎勵
他合并的是uncle block,挖的時候,已經知道uncle block 的存在, 然后把它們包在 block header 上 。
有沒有什么缺陷?
如果礦工處于競爭關系,就不包含
僅能包含叔叔輩的
怎么辦呢?
不論資排輩,不管是叔叔輩、爺爺輩、只要能合并就合并,只要給錢就合并。只在當前這個區塊在七代內有共同 主線,才能算uncle 為什么這么設計? 如果不限制叔叔的備份,這個實現起來對全節點來說,維護的東西太多了。 而且,設計最多隔著七代,而且獎勵對前面的逐步減少,所以鼓勵出現分叉之后盡早合并 。不管你包含的是哪一個輩分的叔叔,
以太坊中的區塊獎勵與燃料費
gas fee (tx fee)—— 比較低 (曾經約為1%)
以太坊中沒有規定定期初塊獎勵 減半。
以太坊中的5個以太幣,變成3個億臺幣,是為了挖礦難度調整,挖礦炸彈難度大幅下降,然后block 從5->3
以太坊的燃燒機制詳解
需要查uncle block是不是符合挖礦難度要求的,符合就認為是合法的叔叔區塊。至于這個叔叔區塊里面的交易是否合法,我們是不檢查的,因為可能和主鏈交易是沖突的。
以太坊防止分叉攻擊的綜合機制
只有分叉后的第一個區塊才能得到uncle reward,所以降低了分叉攻擊的風險。
- 挖礦算法
對于基于工作量證明的區塊鏈系統 來說,挖礦是保證安全的:block chain is secured by mining.
bug bounty。 bitcoin 的 bug bounty 經受了考驗,但是bitcoin 有個漏洞是,只有專業設備才能挖到礦,也與最開始bitcoin 論文 one cpu,one vote 背道而馳。
所以bitcoin 出現了很多加密貨幣,包括以太坊,一個設計原則就是 asic resistance 。
如何實現 這個設計原則呢? 要實現 memory hard mining puzzle
eg. liteCoin , puzzle 基于 scrypt 。開設很大數組,增加對內存讀取,特別像普通計算機對內存的需求。
好的:mining 的時候是 memory hard
壞的: 對輕節點 驗證時 也是 memory hard。。。。
導致: litecoin真正使用時, 對內存設置不能太大。。。所以實際上litcoin使用時,seed 僅有128k
但是,對冷啟動的時候是很有幫助的。早期的設計理念對于聚集人氣是很重要的。。。
與bitcoin 的對比:除了出塊速度 兩分半,是bitcoin 的四倍,
5.2 以太坊怎么設計的?
小的 16 m cache (輕節點用這個就行):從seed 節點運算,把整個數組從前往后填滿整個偽隨機數。
然后生成一個更大的數組。按照偽隨機的原則從小的cache 讀取一些元素,
大的 1gb dataset DAG (由小的生成)
以太坊如何生成 Dataset (DAG)
部分偽代碼
5.3 轉向 pow -> pos
從工作量證明轉向權益證明
類似股份制公司。對于asic 的廠商是個嚴重的威脅。
轉入權益證明后就不挖礦了。
以太坊上采用了預挖礦 —— pre-mining 預留一部分給以太坊的開發者。
pre-sale : 類似風投
工作量證明導致asic 才能挖礦,這樣不公平?
但是另一個角度來說,通用計算機挖礦可能導致云廠商被租用,導致大面積攻擊,也有可能不公平。
6 難度調整算法。
當難度炸彈開始發揮的時候,正好是工作量證明轉向權益證明的時機
權益證明不那么完美,所以工作量證明還是繼續挖,(想轉沒法轉)但
北京時間9月15日,OKLink數據顯示,世界上最活躍的區塊鏈網絡以太坊在區塊高度15537393觸發合并機制,并產出首個PoS區塊(高度為15537394),自此以太坊共識正式從PoW轉為PoS機制,完成了此次“The Merge”升級。 最新行情數據顯示,以太坊報價來到了1630美元,合并升級對其價格沒有立刻產生影響。
比特幣改進提案 (BIP: Bitcoin Improvement Proposal)
- 權益證明 proof of stake
礦工為什么要挖礦? 初塊獎勵,收益
為什么要給他們這些收益: 為了激勵礦工,挖礦去維護區塊鏈
采用權益證明的加密貨幣,會采用virtual mining
虛擬挖礦(Virtual Mining)詳解
infanticiside :如果一個加密貨幣采用工作證明,如果惡意算力攻擊,很容易對初創貨幣造成infanticiside
pos 必須首先搞到足夠多的幣,才能發動攻擊。所以pos是一個閉環。
有的加密貨幣 pow和 pos 甚至是結合的。
casper the friendly finality gadset (ffg)
Casper FFG (Friendly Finality Gadget): 以太坊最終性機制詳解
區塊鏈中的 Epoch(紀元)詳解
包含在finality的交易是不會被推翻的嗎?
8 智能合約
智能合約是運行在區塊鏈上的一段代碼,代碼的邏輯定義了合約的內容
智能合約賬戶保存了合約當前的運行狀態
balance:當前余額
nonce:交易次數
code:合約代碼
storage:存儲,數據結構是一棵mpt
solidity 是智能合約最常用的語言,語法上與javascript很接近
拍賣的時候,也得上交鎖定的保證金。
外部賬戶如何調用智能合約?
創建一個交易,接受地址為要調用的那個智能合約的地址,data域填寫要調用的函數及其參數的編碼值。
一個合約調用另一個合約
以太坊智能合約中的函數
以太坊智能合約的創建與運行
以太坊Gas費用詳解
evm和 jvm類似,也是加一層虛擬機,為智能合約的運行提供一層同一環境。
evm 尋址空間: 256位
汽油費不夠的話, 執行的狀態會回滾,但是gas fee 是不退的。
因為擔心造成 惡意攻擊。
公共數據是免費的。
智能合約中的連鎖回調問題
bitcoin 的每一個交易最多1m
但是以太坊的很復雜,所以根據操作復雜度
gaslimit :這個區塊所有交易能消耗的上限。
每一個礦工可以對gaslimit 進行微調 1/1024
以太坊交易收據(Transaction Receipt)數據結構
所有的全節點都需要在本地執行轉賬交易。(分布式共識機制)
所以汽油費是怎么扣的?
三棵樹在全節點在本地維護的樹
狀態樹:每個賬戶的狀態(包括余額) : 收到
先挖礦還是先執行? 先執行,沒有辦法先挖礦。
問題:如果執行完了,沒挖到礦,有啥補償?
汽油費是給挖到礦的。 所有的都是免費的,有點像陪太子讀書,挖礦慢的就很吃虧。
就不會出現因為沒有汽油費,而不驗證的情況? —— 危害區塊鏈安全。(區塊鏈安全——所有全節點獨立驗證。)
如果他跳過驗證步驟,以后就沒法挖礦了。因為不驗證,本地的三棵樹狀態就不對了,自己算出來的根hash值別人認為是不對的。
為什么必須執行驗證步驟才能更新這三棵樹,因為發布出來的東西沒有這三棵樹的內容,真是塊頭里面有根hash值,只有通過驗證步驟,才能更新三棵樹
發布到區塊鏈上的交易是不是全都成功進行的? 如果智能合約執行中出現了錯誤,要不要也發不到區塊鏈上?
因為要扣掉汽油費,所以需要發布到區塊鏈上,形成共識。
以太坊,就是交易驅動的狀態機(共識),因為所有全節點需要到達同一個狀態。
所以以太坊不支持多核,除了多線程外,所有可能有不確定性的結果的,都不支持
以太坊的智能合約,不能產生真正意義上的隨機數。
多線程的問題:多個核對內存訪問順序不同,執行結果有可能不確定
地址類型:
addr.balance :這個地址的余額
addr.transfer(12345) :當前這個合約,往address上轉入的錢
以太坊中的隨機性問題
發送eth 的三種方法:
以太坊轉賬ETH的三種方法及其區別
寫完一個智能合約,發布到區塊鏈里,
智能合約的發布與調用流程
寫一個solidy 的程序,然后線下宣傳,然后
auctionEnd 只有某個人調用,才能執行
沒辦法設置為拍賣調用結束,自動調用。
但是不存在ended 并發執行,因為沒有并發執行
答案:
紅框中通過循環退款有問題: 調用時忘記 fullback函數了
code is law : 智能合約的規則是由代碼決定的,一旦發布到區塊鏈上就無法修改了——無人能修改規則,但是規則中有漏洞也改不了了。
智能合約如果設計不好,容易拿不出去。
智能合約鎖倉是個常用操作。。。
有點類似于不可撤銷信托。
需要多次測試,在專門測試網站上測試好了再來。
這個遞歸重復取錢會持續到什么時候? gas不夠、錢包不夠、調用棧溢出了。
這個如何修改呢? 先清零,在轉賬。
重放攻擊
decentralized 不等于 distribute
大部分的分布式基本都是為了更快。但是以太坊、比特幣要求的是state machine (狀態機)
狀態機不是為了塊,而是為了容錯。 最初的狀態機應用是 mission critical application
9 . ETH-TheDAO
通用概念:
DAO: decentralized Autonomous Organization
DAC: decentralized Autonomous Corporation .
案例:
The DAO :運行在以太坊上的智能合約
一共存活三個月。
怎么取回收益呢?
splitDAO 拆分完后得到 childDAO,極端的就是一個人的childDAO,然后就是取回
有七天的討論期
有28天鎖定期。
但是問題在哪? splitDAO代碼有問題
這個代碼先賺錢,然后再把余額減去相應數量,再把調用者賬戶清零。
應該先把調用者賬戶清零,再轉賬
splitDAO代碼漏洞分析
10 eth 反思
智能合約其實不智能,就是一個代碼合同
智能合約發布后,沒辦法阻止被調用。
nothing is irrevoable
用腳投票——區塊鏈用挖礦投票
分叉恰恰是去中心化的,存在分叉,恰恰是民主的體現。
decentralized 不等于 distribute
狀態機的目的不是比速度快,而是為了容錯。
這個不是分布式系統的常態。
不要把智能合約當成是大規模計算/大規模存儲的服務,智能合約是用來編寫控制邏輯的,只有那些需要在互不信任的實體之間建立信任,才需要智能合約。
- 美鏈 beauty chain
有可能紅框部分會棧溢出,導致扣了很少的貨幣,但是發了正常數量的代幣。
所以代幣直接通貨膨脹了
預防措施: safemath庫
12 總結:
應用:
比特幣雖然是非中心化的,但是采用比特幣這個非中心化支付模式,不一定只能用在非中心化的領域。比方說亞馬遜是中心化的,但是可以采用bitcoin
1 . bitcoin 不應該和已有支付方式競爭。
bitcoin : world wide currency
新的加密貨幣在支付效率已經大大提高了
bitcoin 1m 字節,10分鐘一個塊
評價支付方式效率好壞,要放到時代背景下看
物理世界中的智能合約 ATM
不是一種最完美的制度,但是是一種進步。