比特幣交易模型——UTXO技術分析

比特幣交易模型——UTXO技術分析

主題:比特幣交易模型UTXO技術分析

時間:6月2月(週六)晚9點-10點

主持人:佩瑤

特約嘉賓:胡華傑

資料:交易費用的官方說明 https://en.bitcoin.it/wiki/Transaction_fees

討論內容:

雙花問題:因為比特幣網絡會有一個天然的問題,就是所謂分叉問題,總是可能會出現多個比特幣礦工挖出合法區塊,然後再這個鏈上產生了分叉,那麼這個時候,為了解決這個問題,規定最長的鏈被保留,這個時候會產生所謂的雙花問題。

SPV:這個詞的意思叫做簡單支付驗證,重點在於支付驗證,不是交易驗證。只是確認下這筆支付是否存在。這裡面就有一個核心的技術概念,即merkle tree這麼一個數據結構。比特幣的區塊分為區塊頭,這是一個80個字節的定長,這個區塊頭包含有merkle tree的根結點。這個根節點有什麼用呢,它可以用來驗證是否含有此筆交易。具體怎麼驗證呢,首先定位這筆交易存在哪個區塊上,然後獲取這個區塊上交易所在的,merkle樹的驗證路徑,然後通過哈希計算出merkle的root節點的值是否相等就可以知道這個交易是否存在。這種方式有什麼好處呢,因為每個區塊頭都是固定的80個字節,即便按照現在的交易量,存儲一百年的交易頭數據,也不過幾百兆,估計400兆左右,並不是很大。

UTXO模型的技術知識:它不用傳統的基於account的記賬模式,傳統的交易模型都是採用這個模型存儲用戶的數據,因為基於傳統的關係數據庫,有事務的支持可以很輕鬆的實現。而在區塊鏈網絡上,不可能採用這種中心化數據庫的方式來解決的。它換了一個思路,就是記錄交易的流轉過程,就想以前看過那種從山上利用竹管接水,引到山下。傳統的賬戶模式,本質上是隻記錄結果。這種方式不但複雜,且容易出錯。比特幣的思想,本身就是,數據不可篡改,不可篡改最重要的實現就是記錄整個流轉過程,就像時間一樣,任何事情都是有序的,git的版本原理,任何的修改都會被記錄下來。用編程的術語可以理解為:面向過程,重視過程而不只是結果。因為有了過程自然就有結果。

討論實錄

顏顏:大家好,週六晚9點,HiBlock區塊鏈社區特別欄目《眾說區塊鏈》準時和大家見面啦,我是主持人佩瑤,非常感謝大家對社區的支持。

據媒體報道,半月前一名惡意礦工以獲得了51%的算力支持的方式對比特幣黃金(BTG)網絡成功實施了雙花攻擊,並謀取了暴利。比特幣黃金作為第27大加密貨幣損失,此次雖對個人用戶未造成損失,如果攻擊者還擁有足夠算力的話,不排除攻擊還會發生的可能。

雙花問題、交易驗證問題、51%算力攻擊到底是什麼意思?最長鏈是否會被追上,SPV機制是否完美,雙花攻擊到底如何有效防止?

本期《眾說區塊鏈》討論的主題是“比特幣交易模型UTXO技術分析”,大家可以圍繞這個主題分享自己的看法和見解。

接下來歡迎本期特約嘉賓胡華傑,帶領大家一起聊聊UTXO技術~~~

@胡華傑:今天聊聊比特幣的底層技術之一,UTXO模型,包括SPV等

@胡華傑:我之前參加過一個活動,有一位大神說51%供給的問題,這位大神是怎麼說的呢?他說,如果前三大礦工被控制住的話,那麼比特幣網絡就完蛋啦,怎麼個完蛋法呢?他說這樣他們就掌握了51%的算力,這樣,就可以把你們的錢都轉到他們的賬戶上

@胡華傑:我相信,大家一定看出問題所在了吧。我就不吐槽了。直接說吧,其實所謂算力攻擊問題,即便是沒有51%也一樣有可能出現。所謂算力攻擊,和篡改數據根本就不是一個概念。數據的篡改是由密碼學保證的,是由一整套的機制來決定的。哪怕一個節點,你也沒法篡改數據,最有可能是整個數據丟失掉而已。

@何強:掌握了51%算力到底意味著什麼?

@Victor H 樂天:意味著決定哪些塊可以上鍊。也可以拋棄掉哪些塊。

@範璟瑋:這個我也沒搞懂算力的定義,我覺得只要我比網絡中所有人都快,我就可以實現雙重支付了

@何強:快不是決定性的因素@範璟瑋 

@胡華傑:所謂雙花問題是這樣的,因為比特幣網絡會有一個天然的問題,就是所謂分叉問題,總是可能會出現,多個比特幣礦工挖出合法區塊,然後再這個鏈上產生了分叉,那麼這個時候,為了解決這個問題,規定最長的鏈被保留,這個時候會產生所謂的雙花問題

@胡華傑:比如第一次顯示我的交易進了區塊鏈了,但是過段時間,可能因為分叉問題,花掉的錢又回來了,因為這個時候產生了分叉,導致了我交易所在的那個區塊被丟失掉。如果這個時候,商家已經確認支付了,發現錢沒了。

@範璟瑋:@何強 為啥?我最快出塊不就能控制分叉了嗎?

@何強:@範璟瑋 出塊只是第一步。你還得在整個鏈上記賬完成。這就像接力跑,你是一個團隊,光一個人跑的快沒用

@範璟瑋:出塊同時不就廣播出去了嗎?其他節點只做合法驗證收到我的塊就記錄了呀,網絡傳播速度相同的話還是能保證我能控制分叉吧?

@胡華傑:接下來說SPV吧,這個詞的意思叫做簡單支付驗證,重點在於支付驗證,不是交易驗證。只是確認下這筆支付是否存在?這裡面就有一個核心的技術概念,即merkle tree這麼一個數據結構。比特幣的區塊分為區塊頭,這是一個80個字節的定長,這個區塊頭包含有merkle tree的根結點。這個根節點有什麼用呢,他可以用來驗證是否含有此筆交易

@乾乾無咎:360說的所謂史詩級,到底什麼鬼

@胡華傑:具體怎麼驗證呢,首先定位這筆交易存在哪個區塊上,然後獲取這個區塊上交易所在的,merkle樹的驗證路徑,然後通過哈希計算出merkle的root節點的值是否相等就可以知道這個交易是否存在。這種方式有什麼好處呢,因為每個區塊頭都是固定的80個字節,即便按照現在的交易量,存儲一百年的交易頭數據,也不過幾百兆,估計400兆左右,並不是很大。

@胡華傑:現在是時候開始真正的表演了!聊聊UTXO的模型的技術知識,我認為這是區塊鏈技術上,最了不起的一個發明,很多人都覺得比特幣是各種已經有的技術的組合,其實裡面還有不少技術是聰哥本人的發明,這就是其中之一。很多其他區塊鏈想當然的修改了或者取消UTXO的模型,搞了自己獨步天下的鏈,實際上有不少最後又改回來了。

@胡華傑:來自一張btc coin的官網的圖

比特幣交易模型——UTXO技術分析

@何強:UTXO是SPV的一種實現?

@胡華傑:UTXO是交易模型的內容,spv是一種簡單支付驗證的技術

@何強:UTXO和現在的常見的交易方式哪種比較像?

@胡華傑:為什麼說這個設計的很巧妙呢?就是它不用傳統的基於account的記賬模式,傳統的交易模型都是採用這個模型存儲用戶的數據,因為基於傳統的關係數據庫,有事務的支持可以很輕鬆的實現。而在區塊鏈網絡上,不可能採用這種中心化數據庫的方式來解決的。它換了一個思路,就是,記錄交易的流轉過程,就想以前看過那種從山上利用竹管接水,引到山下。傳統的賬戶模式,本質上是隻記錄結果。這種方式不但複雜,且容易出錯。比特幣的思想,本身就是,數據不可篡改,不可篡改最重要的實現就是記錄整個流轉過程,就像時間一樣,任何事情都是有序的,git的版本原理,任何的修改都會被記錄下來。用編程的術語可以理解為:面向過程,重視過程而不只是結果。因為有了過程自然就有結果。但是隻記錄結果,你並不知道結果是怎麼來的。

@胡華傑:這裡提下比特幣,別看只有2100萬枚,實際上比特幣的最小單位是satoshis,1個比特幣=100,000,000satoshis

@何強:但是現在的銀行交易,不管從哪個維度去看,也都可以按照時間線來記錄整個流轉過程的啊? 比如我往銀行存了錢,實際上銀行也知道這個錢會走向哪裡。

@胡華傑:比特幣分成普通支付交易和coinbase交易,比特幣是的源頭是通過礦工挖出來的,因此除了coinbase交易之外,其他的所有交易都是必有input也有outinput,輸入和輸出的差就是礦工的手續費。每一筆交易發生之後,就相當於一筆資金從上一個水龍頭打開留到這筆交易上,因此支付給的這筆錢,就相當於是臨時存在你這裡隨時等待流出的一筆錢而已。這樣驗證那句話,錢就是用來花的。

@風靜縠紋平:@何強 你問的很有水平。以太坊中就是有賬戶的,以太坊的解決方案是把賬戶狀態和交易數據全都保存下來,這樣就可以對照交易數據和最終影響的賬戶狀態是否一致(正確)。這就和一般意義上的銀行記賬方式是一樣的了。在比特幣網絡中,沒有賬戶,通過UTXO,也就是交易流水可以達到一樣的效果。

@何強:@風靜縠紋平 清楚了。

@何強:輸入和輸出的差就是礦工的手續費===這個是預先設定好的不能改的還是後期可以動態調整的?

@胡華傑:這個礦工手續費是這樣的,通常情況你可以選擇免費,但是實際上,一些錢包默認的時候會選擇小額的手續費,有的礦工會選擇手續費高的交易進行優先打包,其實這個是複雜的問題,有博弈的問題在裡面

@風靜縠紋平:所以其實還是可以手工指定的

@胡華傑:https://en.bitcoin.it/wiki/Transaction_fees

@胡華傑:這裡有官方的說明,Every Bitcoin transaction spends zero or more bitcoins to zero or more recipients. The difference between the amount being spent and the amount being received is the transaction fee (which must be zero or more).

@何強:@胡華傑 瞭解了。

@風靜縠紋平:wiki裡的解釋是說會根據市場情況,包括區塊大小、供需比例動態調整的,具體細節估計要看代碼了

@胡華傑:關於比特幣的技術就先分享到這裡,總體來說的話,我建議應該直接去官網閱讀官方的wiki和開發手冊,包括源碼,才能真正理解和掌握比特幣以及區塊鏈的底層技術,有助於提升對區塊鏈的技術研發能力。

@回憶的。。。:如果採用傳統的記賬方式,一旦一個人的賬戶餘額發生了變化,為了防止雙花,就得同時更新全網賬戶的餘額,這樣效率很低,也容易造成數據冗餘,比如我賬戶的btc沒用動,但是因為別人的賬戶發生了變化,我的賬號也得跟著更新,想象一下,每天我的賬戶要被動更新多少次,而每次更新的數據記錄下來,這個數據量估計用不了多久連google的數據庫都會被撐爆炸。。。。而btc穩定運行了這麼多年,數據量才幾百個g,就是因為採用UTXO的模式,把數據存儲和雙花問題都完美的解決了,真是個天才的設計

@Cynthia:其實對於UTXO之前很多人都沒搞明白,這次胡老師以分享為主,給大家帶來了很多幹貨,都明白了嗎?有什麼問題可以提出了一起交流,這期延長半小時討論時間。

@回憶的。。,:所以有人說中本聰是應該獲得諾貝爾經濟學獎和圖靈獎的第一人。

@胡華傑:極簡的設計完美記錄了交易的流轉過程,這是一個UTXO設計的很棒的地方

@何強:不過我一直覺得中本聰後面是一個團隊和公司。。不是一個人。。。像比特幣中像UTXO這樣讓人眼前一亮的設計還有哪些呢?

@胡華傑:很簡單啊,不需要事務啊,不需要複雜的各種鎖啊,單向聯通,關注過程,不需要關注結果

@何強:具體能給出一些點麼? 這樣去學習的時候好更有針對性一些

@胡華傑:比如:A轉100塊錢給B,我的傳統思維是認為,A同時減少了100,B同時增加了100,把它想象成一個同時發生的行為,並且是相互傷害,你多了就是我少了。而UTXO的記錄方式就是很簡單,A-》B,這個過程記錄,不需要事務,不需要什麼原子操作。而且還抓住了事物的本質,很容易理解這個轉賬行為。錢並沒有多也沒有少,只是換了個主人而已。世界還是很美好的

@風靜縠紋平:比特幣的核心創新大概就是UTXO了,其他相關技術都不是什麼新鮮東西。

@顏顏:感謝胡華傑老師的分享和各位的參加,今天先聊到這裡,大家可以繼續消化一下。討論的內容會沉澱下來發布在公眾號,還有想問的可以在文末留言哦~


分享到:


相關文章: