區塊鏈個人筆記,潦草,個人草稿。

一個十九歲的小孩兒,喜歡玩魔獸世界,直到有一天,暴雪公司把魔獸裏一個他喜歡的技能給去掉了,他非常生氣,多次找暴雪公司反饋,沒有得到任何滿意的結果,他一氣之下就不玩了,後來他就想爲什麼會出現這種情況。本質上是因爲,這個遊戲是一箇中心化平臺上的遊戲,決定權在公司。所以他決定要創建一個去中心化的平臺,用戶不滿意,就有選擇分叉的權利。美國金融危機的時候,美聯儲搞量化寬鬆,發行了大量的貨幣,增加貨幣供給量,美國很多老百姓是不滿意的,尤其是退休的老人,因爲錢變得不值錢了。在一個去中心化的系統裏,就可以分叉出現一個新的貨幣,若以太坊的團隊,哪一天搞量化寬鬆,大規模增加以太幣的供給量,引起很多人的不滿,那這些人就可以分叉出來,繼續維護原來的以太坊,所以存在分叉的選項,恰恰是民主的一種體現。
有了比特幣,就不需要錢和銀行了。可挖礦難度越來越大,它又不適合作貨幣。如黃金不適合作貨幣,總量基本變化不大,黃金總量的增加遠比不上社會財富的增速,在少數人手中,後面的人的努力就沒有意義。貨幣需要在一定時期多發一些。

區塊鏈 一個去中心化的賬本。
UTXO Unspent Transaction Outputs 未花費的交易輸出。

密碼學原理

collision resistance 比如你上傳一個很大的文件,存到某個雲存儲服務上,將來用到的時候再把它下載回來,怎麼知道下載的版本和當初上傳的版本是一樣的呢,在上傳文件時算一個哈希值出來,這個哈希值存在本地,將來下載之後再算一個哈希值,如果一樣,說明文件沒有被篡改。
hiding x -> H(x)
puzzle friendly 哈希值的計算事先是不可預測的,光看輸入很難看出哈希值是什麼,
digital commitment
digital equivalent of a sealed enveloup

difficult to solve,but easy to verify
SHA-256

比特幣中的數據結構

指針,結構體在內存中的起始位置,哈希指針除了存貯地址之外,還要保存這個結構體的地址,一般用H(x),從這個哈希指針,不光可以找到這個結構體的位置,同時還能檢測出結構體的內容有沒有被篡改。
在這裏插入圖片描述
genesis 創世 tamper 篡改

Merkle tree 用哈希指針代替普通的指針。
在這裏插入圖片描述
在這裏插入圖片描述
sorted merkle tree 不存在證明

BTC協議

double spending attack 花兩次攻擊
貨幣是否在你手裏

在這裏插入圖片描述
它的輸出裏面有A的公鑰的哈希,轉賬交易說明的,這個A的公鑰,要跟幣的來源的裏面說明的A的公鑰的哈希要對應的上。要是對不上的話,說明幣的來源是不對的。如果有人冒名頂替,把自己的公鑰說成A的公鑰,驗證不通過。

輕節點沒有參與區塊鏈的構造和維護,它只是利用了區塊鏈的一些信息,做一些查詢之類。

CAP Theorem Consistency、Availability、Partition tolerance

sybil attack 女巫攻擊
hyperledger 超級賬本
根據 hash of prev block 知道插在哪兒

coinbase transaction 是唯一產生一個新的幣的途徑
比特幣很早和實體世界產生聯繫的時候,用2萬個比特幣買了個披薩餅。
得到記賬權,挖礦。

比特幣網絡

simple,robust,but not efficent

BTC挖礦

1、分叉攻擊
2、Boycott

比特幣腳本

基於棧的語言
在這裏插入圖片描述
locktime 生效時間,0是立即生效。
在這裏插入圖片描述
txid 之前的這個交易的哈希值
vout 這個交易的第幾個輸出
在這裏插入圖片描述
value 交易的金額,給對方轉多少錢。
0.22684000個比特幣 or 兩千兩百六十八萬四千聰
n是序號,表示這個交易的第幾個輸出。
reqSigs 指需要多少個簽名才能兌現。
addresses 輸出的地址
在這裏插入圖片描述
驗證這個交易的合法性,把B轉給C這個交易裏的輸入腳本,跟A轉給B的輸出,拼接在一起執行。
在這裏插入圖片描述
第一條,把輸入腳本里提供的簽名壓入棧。
第二條,把輸出裏提供的公鑰壓入棧。
第三條,把棧頂的這兩個元素彈出來,用公鑰檢查一下這個簽名是否正確。
在這裏插入圖片描述
第二種形式,輸出腳本里沒有直接給出收款人的公鑰,給出的是公鑰的哈希,公鑰是在輸入腳本里給出的。輸入腳本既要給出簽名,也要給出公鑰。
輸出腳本里的一些操作,比如DUP,HASH160,都是爲了驗證簽名的正確性。這種形式是最常用的一種形式。
在這裏插入圖片描述
前兩條語句來自輸入腳本,後面的語句來自輸出腳本。
第一條把簽名壓入棧,第二條把公鑰壓入棧,第三條DUP把公鑰複製一遍。
HASH160把棧頂元素彈出來,取哈希,然後把哈希再壓入棧,所以棧頂變成了公鑰的哈希值,下面那條語句,是把輸出腳本里提供的公鑰的哈希值壓入棧,這個時候棧頂有兩個哈希值,上面這個哈希是輸出腳本提供的,收款人的公鑰的哈希,發佈這個交易的時候,這個錢轉給誰的。下面這個哈希,是你要花這個錢的時候,在輸入腳本里給出的公鑰,然後前面那個操作,HASH160取哈希後得到的。EQUALVERIFY是彈出棧頂的兩個元素,比較它們是否相等,目的是防止有人冒名頂替。用它自己的公鑰冒充收款人的公鑰。假設這兩個哈希值是相等的,就從棧頂消失了。最後CHECKSIG,彈出棧頂的兩個元素,用公鑰檢查這個簽名,是否正確,假設簽名是正確的,整個腳本順利結束,棧頂留下的是TRUE。如果執行過程中任何一個環節發生錯誤,比如輸入裏給出的公鑰,跟輸出裏給出的哈希值,對不上,或者是輸入裏給出的簽名,跟給出的公鑰對不上,那麼這個交易就是非法的。
在這裏插入圖片描述
最後一種,也是最複雜的一種。這種形式的輸出腳本給出的不是收款人的公鑰的哈希,而是收款人提供的一個腳本的哈希,這個腳本叫做redeemScript,將來花這個錢的時候,輸入腳本里要給出這個redeemScriptScript這個贖回腳本的具體內容,同時還要給出讓這個贖回腳本能夠正確運行所需要的簽名,驗證的時候分爲兩步,
在這裏插入圖片描述
在這裏插入圖片描述
這裏的輸入腳本就是給出簽名,再給出序列化的贖回腳本,贖回腳本的內容就是給出公鑰,然後用這個CHECKSIG檢查簽名。下面這個輸出腳本是用來驗證,輸入腳本里給出的贖回腳本是否正確。
在這裏插入圖片描述
P2SH的執行過程,開始的時候也是把輸入腳本和輸出腳本拼接在一起,前兩行來自輸入腳本,後面三行來自輸出腳本。首先把輸出腳本里的Sig壓入棧,然後把贖回腳本壓入棧,然後是取哈希的操作,得到贖回腳本的哈希,RSH是指redeemScriptHash,贖回腳本的哈希值,接下來還要把輸出腳本里給出的哈希值壓入棧,這個時候棧裏就有兩個哈希值了,最後用EQUAL比較兩個哈希是否相等。
在這裏插入圖片描述
第二階段的驗證,首先要把輸入腳本里提供的序列化的贖回腳本進行反序列化,反序列化的操作圖片沒有展現出來,這是每個節點自己要完成的,然後呢,執行這個贖回腳本,首先把這個PubKey壓入棧,然後用CHECKSIG驗證一下輸入腳本里給出的這個Sig的正確性,驗證結束之後,整個P2SH纔算完成。

BTC分叉

1、state fork
2、protocol fork :hard fork、soft fork

不要把51%的域值當作是一個絕對的門檻,達到51%就可以發動攻擊,不到51%就不能發動攻擊,這個其實都是概率。而且每個礦石所佔算力比重本身也是一個估計而已,而且是在不斷變化的,這是第一種分叉攻擊。

BTC匿名性

pseudonymity 使用假名
零知識證明 同態隱藏

BTC思考

爲什麼比特幣系統能夠繞過分佈式共識中的那些不可能結論?
比特幣系統沒有達到真正意義上的共識。
電話線 撥號上網。
不要被學術界的思維限制了頭腦,不要被程序員的思維限制了想象力。知識改變命運,但對知識的一知半解有可能使命運變得更差。
區塊戀。
稀缺性,一個好的貨幣是要有通貨膨脹的功能的。每年黃金產量增加的速度,遠遠趕不上社會新創造財富的速度。
量子計算,與其擔心量子計算對比特幣的衝擊,還不如擔心量子計算對傳統金融的衝擊。
取哈希的過程一般會造成信息的損失,哈希函數一般都是不可逆的。從這個哈希值沒有辦法推導出原來的數是什麼。
SHA-256 比特幣中用的哈希算法,算出的哈希是256位的,不論這個輸入有多大,這樣的運算顯然是不可逆的,否則,變成一個超級無敵的壓縮算法。
比特幣系統中,僅僅是爲了收錢的話,沒必要把公鑰暴露出來,只暴露一個公鑰的哈希生成的地址就行了,取錢的時候需要一個公鑰和私鑰產生的一個簽名。

以太坊概述

增加了smart contract
比特幣出塊時間10分鐘,以太坊10幾秒,萊特幣2分半。
以太坊memory hard mining puzzle,目的是,在一定程度上限制了ASIC芯片的使用,叫做ASIC resistance。
proof of work ->proof of stake 工作證明 -> 權益證明。
smart contract 智能合約。
BitCoin :decentralized currency
Ethereum :decentralized contract
BTC 單位 Satoshi 一聰
ETH 單位 Wei

ETH賬戶

account based ledger
以太坊對double spending attack 有天然的防禦作用
double spending attack 花錢的人不誠實
replay attack 收錢的人不誠實 解決辦法 nonce 隨機數 計數器 記錄一共發生多少次交易
externally owned account 外部賬戶 balance nonce
smart contract account 合約賬戶 code storage
financial derivative 金融衍生

有沒有可能收款人的地址,這個節點,以前從沒聽說過? 以太坊跟比特幣是一樣的,創建賬戶的時候,是不需要通知其他人的,只有這個賬戶第一次收到錢的時候,其他的節點纔會知道這個賬戶的存在。這個時候要在狀態樹中新插入一個節點。

ETH狀態樹

trie樹 retrieval 檢索
Patricia tree 經過路徑壓縮的前綴樹。

地址空間 2^160 爲什麼不縮短一些,訪問效率還快?
以太坊中的普通賬戶創建方法跟比特幣系統是一樣的,沒有一箇中央的節點,每個用戶自己獨立創建賬戶,在本地產生一個公私鑰對兒,就是一個賬戶,怎麼防止兩個人的賬戶正好碰撞呢,這種可能性是存在的,但是比地球爆炸的可能性還要小,怎麼達到這樣的概率,就是地址要足夠長,要分佈足夠稀疏,纔不會產生碰撞,看上去有點兒浪費,但這是一個去中心化的系統防止賬戶衝突的唯一辦法。

genesis 開端,創世
patricia tree/trie 樹變淺
鍵值稀疏的時候用路徑壓縮比較好
merkle patricia tree MPT 以太坊中用的是modified MPT
protocol buffer / protobuf 做序列化的庫

能不能證明某個賬戶是不存在的,MPT中的某個鍵值是不存在的?
sorted Merkle tree 的好處是可以證明nonmembership。跟sorted Merkle tree類似,如果存在的話,在什麼樣的分支,把這個分支作爲merkle proof發過去。

狀態樹中保存的是(key,value)pair,key就是地址,賬戶的狀態是怎麼存儲的,實際上它要經過一個序列化的過程,RLP,用這個編碼做序列化,之後再存儲。Recursive Length Prefix,

ETH-GHOST

unclehash 可能比 parenthash 大好多輩分
orpham block stale block
centralization bias
uncle block 得到7/8的出塊兒獎勵
鼓勵分叉之後及早進行合併
比特幣是人爲地製造稀缺性,以太坊是爲了調整挖礦難度。
人們一般把比特幣看作數字黃金;以太坊看作石油,用來消耗的,這個不說很恰當。
把叔父區塊包含進來的時候,要不要執行?
檢查叔父的合法性,交易是否合法不檢查。

只有分叉後的第一個區塊可以得到分叉獎勵,後面的都不行。
在這裏插入圖片描述

ETH挖礦算法

bug bounty 賞金

16M Cache 1G dataset DAG
保存輕節點 只有需要挖礦的礦工保存1G的數據集

假設要對比特幣系統進行攻擊,需要買入大量的資金買入.

比特幣交易一次耗一千度電,以太坊67千瓦時。

Infiticide 扼殺在搖籃裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章