區塊鏈學習筆記4——BTC實作
學習視頻:北京大學肖臻老師《區塊鏈技術與應用》
筆記參考:北京大學肖臻老師《區塊鏈技術與應用》公開課系列筆記——目錄導航頁
UTXO
區塊鏈是一個去中心化的賬本,位元幣采用了基于交易的賬本模式 ,然而,系統中并沒有記錄賬戶所包含的位元幣數,需要通過交易記錄進行推算,在位元幣系統中,全節點需要維護一個名為 UTXO(Unspent Transaction Output 還沒有被花掉的交易輸出) 的資料結構,
A轉給B五個BTC,轉給C三個BTC,B將5個BTC花掉,則該交易記錄不保存在UTXO中,C沒有花掉,則該交易記錄保存在UTXO中
UTXO中的每個元素包括產生這個輸出的交易的哈希值以及它在這個交易里是第幾個輸出就可以定位到這個輸出
作用
檢測交易是否合法,要花的幣必須在UTXO中,便于快速檢測double spending
每個交易會消耗輸出,也會產生新的輸出
如圖,A轉給B五個BTC,之后B將其轉給D,則UTXO中會刪掉A->B這一交易記錄,同時會添加B->D這一交易記錄,
如果一個人的位元幣一直都不花,那他就會永久的保存在utxo中,
Transaction fee
交易可以有多個輸入也可以有多個輸出,但輸入之和要等于輸出之和(total inputs = total outputs),
有一些交易的total inputs會略大于total outputs,這個差額就是transaction fee,給了獲得記賬權的結點,
之前有提到過會不會存在節點只想發布區塊獲得出塊獎勵而不想打包交易?
因此,BTC系統設計了Tranction fee(交易費),對于獲得記賬權節點來說,除了出塊獎勵之外,還可以得到打包交易的交易費,但目前來說,交易費遠遠小于出塊獎勵,等到未來出塊獎勵變少,可能區塊鏈的維護便主要依賴于交易費了,
平均每隔十分鐘產生一個新區塊,每21萬個區塊,出塊獎勵減半,大約每隔四年出塊獎勵就會減半,
基于賬戶的模式
位元幣是基于交易的模式,與之對應,還有一種基于賬戶的模式(如:以太坊),基于賬戶的模式要求,系統中顯示記錄賬戶余額,也就是說,可以直接查詢當前賬戶余額是多少貨幣,可以看到,位元幣這種模式,隱私性較好,但其也付出一定代價,在進行交易時,因為沒有賬戶這一概念,無法知道賬戶剩余多少BTC,所以必須說明幣的來源(防止雙花攻擊),而基于賬戶的模式,則天然地避免了這種缺陷,轉賬交易就是對一個(多個)賬戶余額的數字減和另一個(多個)賬戶余額的數字加
鑄幣交易(coinbase交易)
區塊頭中的nonce是一個32位無符號整數,在挖礦時候是通過不斷調整nonce進行的,但可以看到,nonce的取值最多為232種,但并非將這些nonce全部遍歷一遍,就一定能找到符合要求的nonce,由于近年來,挖礦人員越來越多,挖礦難度已經調整的比較大了,而2^32這一搜索空間太小,所以僅調整nonce很大可能找不到正確的結果,
那么,還能修改哪些值呢?

從上圖可以看出,只有Merkle Tree的根哈希值可以進行修改,對根哈希值的修改主要是通過修改coinbase實作的,
每個發布區塊者可以得到出塊獎勵,也就是可以在區塊中發布一個 鑄幣交易(coinbase交易) ,這也是BTC系統中產生新位元幣的唯一方式,下為一個鑄幣交易的內容:

可以看到,有一個CoinBase域,其中可以寫入任何內容,在這里寫什么都沒有影響,所以可以在這里添加一些任意資訊,便可以實作無法篡改(也無法洗掉),(例如:提前寫入股票預測結果的哈希值)
所以,只要我們改變了寫入內容,便可以改變Merkle Tree 的根哈希值,
下圖為一個小型的區塊鏈,假定左下角交易為coinbase交易,可以看到,該交易發生改變會逐級向上傳遞,最終導致Merkle Tree根哈希值發生改變,

在實際的挖礦中,包括兩層回圈,外層回圈調整coinbase域(可以規定只將其中前x個位元組作為另一個nonce),算出block header中根哈希值后,內層回圈再調整nonce,
普通轉賬交易

如果將輸入腳本和輸出腳本拼接起來可以順利執行不出現錯誤,則說明交易合法,
挖礦程序的概率分析
挖礦本質上是不斷嘗試各種nonce,來求解這樣一個puzzle,每次嘗試nonce,可以視為一次伯努利試驗,最典型的伯努利試驗就是投擲硬幣,正面和反面朝上概率為p和1-p,在挖礦程序中,一次伯努利試驗,成功的概率極小,失敗的概率極大,挖礦便是多次進行伯努利試驗,且每次隨機,這些伯努利試驗便構成了a sequence of independent Bernoulli trials(一系列獨立的伯努利試驗),根據概率論相關知識知道,伯努利試驗本身具有無記憶性,也就是說,無論之前做多少大量試驗,對后續繼續試驗沒有任何影響 對于挖礦來說,便是多次伯努利試驗嘗試nonce,最終找到一個符合要求的nonce,在這種情況下,可以采用泊松分布進行近似,由此通過概率論可以推斷出,系統出塊時間服從指數分布,(需要注意的是,出塊時間指的是整個系統出塊時間,并非挖礦的個人)

指數分布本身也具有無記憶性,也就是說,對整個系統而言,已經過去10min,仍然沒有人挖到區塊,那么平均仍然還需要等10min(很不符合人的直覺),也就是說,將來要挖多久和已經挖多久無關,
位元幣總數計算:
Geometric series
21萬×50+21萬×25+21萬×12.5+…
=21萬×50×(1+1/2+1/4+…)
=21萬×50×1/(1-1/2)
=2100萬 -> 位元幣總數
BitCoin is secured by mining
1.可否將其他賬戶上位元幣轉給自己?
答案:
不能,因為轉賬交易需要簽名,惡意節點無法偽造他人簽名,
如果惡意結點強行把一個非法的交易加到區塊鏈中,其他的誠實結點檢測到這個區塊含有非法交易就不會接到這個區塊鏈之后,并且另外形成一條最長合法鏈,這樣惡意結點所添加的區塊不在最長合法鏈上,惡意節點不僅無法偷幣,而且無法獲得出塊獎勵,

2.可否將已經話過的幣再花一遍?
如下圖1,若M已經將錢轉給B,現在想再轉給自己,假設其獲得記賬權,若按照圖1方式,很明顯為一個非法區塊,不會被其他節點承認,
所以,M只能選擇圖2方式,將M轉賬給B的記錄回滾掉,這樣就有了兩條等長合法鏈,取決于哪一個會勝出,

如果在M->B這個交易之后還延續有幾個區塊,如下圖所示,則大多數誠實節點不會承認下面的鏈,所以,便變成了惡意節點挖下面的鏈,其他節點挖上面的鏈的算力比拼,由于區塊鏈中大多數節點為善意節點,則最終上面鏈會勝出,而惡意節點的鏈會不被認可,從而導致投入成本白費,

一種簡單防范防范便是多等幾個確認區塊,位元幣協議中,預設需要等6個確認區塊,此時才認為該記錄是不可篡改的,平均出塊時間10min,六個確認區塊便需要1小時,
Selfish mining
如圖所示,假使挖到2號時候先不發布,則其他人仍然需要挖1號區塊,若其算力足夠強,能保證別人挖出1之后可以挖出3.可以此時將2和3一起發布,從而將1區塊所在鏈最長合法鏈擠掉(減少了別人和自己競爭挖3號區塊),
但這樣存在風險,如果別人已經挖出1,自己還沒挖出3,則需要盡快發布2和別人競爭最長合法鏈地位,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386685.html
標籤:區塊鏈


