區(qū)塊鏈綜述
區(qū)塊鏈本質(zhì)上是一種分布式的數(shù)據(jù)庫,這個數(shù)據(jù)庫的基本單位就是區(qū)塊纬黎。
這個數(shù)據(jù)庫被網(wǎng)絡(luò)中的所有節(jié)點(diǎn)一起維護(hù)幅骄,所有的節(jié)點(diǎn)都是公平的,任何人都有資格查看所有的交易信息本今。任何人如果想更改數(shù)據(jù)拆座,必須擁有大于全網(wǎng)50%的算力,確保它生成區(qū)塊的速度超過其他所有節(jié)點(diǎn)之和冠息。所以挪凑,只要擁有足夠的用戶和正常的礦工,那么這個區(qū)塊鏈就不可能出現(xiàn)異常交易铐达。高度
區(qū)塊鏈?zhǔn)且粭l由一個個區(qū)塊組成的鏈岖赋,每個區(qū)塊都存有上一個區(qū)塊的hash值檬果,所以也可以理解成一條有序的鏈瓮孙。而高度就是指一個區(qū)塊到最新區(qū)塊的距離。挖礦
區(qū)塊鏈中比較重要的一個環(huán)節(jié)就是挖礦选脊,所謂挖礦杭抠,其實(shí)就是生成區(qū)塊的過程。礦工的任務(wù)是收集網(wǎng)絡(luò)上未處理的交易信息恳啥,然后將這些信息生成一個區(qū)塊偏灿,最先生成合法區(qū)塊的礦工視為挖礦成功,獲得挖礦獎勵和這個區(qū)塊的手續(xù)費(fèi)钝的。礦工的獎勵是整個區(qū)塊鏈唯一產(chǎn)出比特幣的地方翁垂,但是這個獎勵會逐年遞減铆遭,最終2140年之后不再產(chǎn)生新的比特幣,總量維持在2100W枚沿猜。-
工作量證明
任何人都可以成為礦工枚荣,但是為了維護(hù)秩序,必須加大挖礦的門檻啼肩,防止有人惡意生成區(qū)塊橄妆。比特幣就采用了一種工作量證明機(jī)制。
區(qū)塊頭結(jié)構(gòu).png
比特幣的工作量證明機(jī)制其實(shí)很簡單祈坠,就是通過不斷替換區(qū)塊頭中nonce字段的值害碾,使得最后整個區(qū)塊的hash值小于一個數(shù)值,這個數(shù)值就是難度赦拘,為了防止出現(xiàn)因?yàn)閚once字段長度過低導(dǎo)致無法生成區(qū)塊的情況慌随,時間戳字段和區(qū)塊中第一筆交易信息都可以更改 。
產(chǎn)生一個合法的區(qū)塊頭需要進(jìn)行大量的計算躺同,但是驗(yàn)證一個合法的區(qū)塊只需要一次計算儒陨,因此雖然大部分節(jié)點(diǎn)不參與挖礦,但是可以快速的驗(yàn)證合法區(qū)塊笋籽,達(dá)成共識蹦漠,然后把合法的區(qū)塊廣播出去,通知其他正在挖礦的節(jié)點(diǎn)本輪結(jié)束车海,快速開始下一輪挖礦笛园。
為了穩(wěn)定區(qū)塊的生成速度在10分鐘每塊,比特幣的難度每過2016塊改變一次侍芝。
- 分叉
因?yàn)楸忍貛攀且粋€分布式的網(wǎng)絡(luò)研铆,同時可能有多個礦工在挖礦,如果兩個礦工幾乎同時都完成了一個區(qū)塊的生成州叠,也就是說這兩個礦工在對方挖礦成功的消息到達(dá)自己這里之前棵红,把自己挖礦成功的消息廣播了出去。這個時候咧栗,有些節(jié)點(diǎn)會收到了兩條挖礦成功的消息逆甜,實(shí)際上這個區(qū)塊鏈也就被分成了兩個分支。在這兩個分支長度相同的時候致板,這兩個分支暫時都是合法的交煞,礦工可以在任何一個分支上繼續(xù)挖礦,直到一條分支的長度長于另一條斟或,所有節(jié)點(diǎn)都會選擇較長的那個分支作為主分支素征。
所以,一筆交易被確認(rèn)之后,并不意味著這筆交易一定生效御毅,很可能這筆交易被放在了分叉的分支上根欧,最終被淘汰了,因此比特幣建議當(dāng)確認(rèn)數(shù)大于6的時候端蛆,再處理交易成功之后的操作咽块。
-
默克爾樹
默克爾樹算法允許輕節(jié)點(diǎn)的出現(xiàn),即節(jié)點(diǎn)只維護(hù)區(qū)塊鏈的頭信息欺税,在確認(rèn)的時候侈沪,再下載需要的信息即可,無需維護(hù)所有的交易信息晚凿,保證了客戶端的輕巧和方便亭罪。
默克爾樹算法中,這棵樹可以是一個多叉樹歼秽,但是在區(qū)塊鏈應(yīng)用中应役,維護(hù)的是一棵二叉樹。
spv1.png
這個二叉樹的每個葉子節(jié)點(diǎn)是具體的值燥筷,每個非葉子節(jié)點(diǎn)箩祥,是根據(jù)它的子節(jié)點(diǎn)的值通過某種hash算法得到的,這樣一層一層的直到根節(jié)點(diǎn)肆氓。
在區(qū)塊鏈頭信息里袍祖,就包含了這樣的一個根節(jié)點(diǎn)的值,這樣只要下面的交易信息稍有改動谢揪,算出來的根節(jié)點(diǎn)的值就會改變蕉陋,這時候校驗(yàn)一下就可以確認(rèn)數(shù)據(jù)的正確性。
更重要的是校驗(yàn)的時候拨扶,只需要拿到這棵樹的一部分信息凳鬓,就可以確認(rèn)一筆交易的正確性。拿到一個葉子節(jié)點(diǎn)和另一個兄弟葉子節(jié)點(diǎn)的值患民,計算得到他們父節(jié)點(diǎn)的值缩举,然后再拿到父節(jié)點(diǎn)的兄弟節(jié)點(diǎn)的值,繼續(xù)向上計算匹颤,如果最終的結(jié)果是正確的仅孩,那么也就確認(rèn)了這筆交易是合法的。
- utxo
utxo可以說是區(qū)塊鏈交易的最基本單位了惋嚎。和常規(guī)的交易不同杠氢,比特幣中并沒有賬戶這個概念站刑,而是由很多個未花費(fèi)的交易輸出即utxo組成另伍。這個未花費(fèi)的交易輸出是指,之前有交易的交易輸出是這個地址,且這個交易還沒有被其他交易使用過摆尝。
也就是說温艇,在我們生成交易信息的時候,存儲的并不是從一個賬戶到另一個賬戶堕汞,而是一筆或者多筆之前的交易輸出勺爱,到一個或多個地址。如果一筆交易中讯检,所有交易輸入的和大于交易輸出的和琐鲁,那么多余的比特幣就會當(dāng)做手續(xù)費(fèi)轉(zhuǎn)給礦工。
比如人灼,如果我有一筆utxo是10個比特幣围段,我想轉(zhuǎn)5個給addr1,那么我就要生成一個交易信息投放,輸入是我那筆utxo奈泪,而輸出是兩個,一個是給addr1的5比特幣灸芳,另一個是給自己的找零涝桅。
經(jīng)過很多的交易之后,會生成很多零散的utxo烙样,這時候冯遂,一筆交易很可能會有很多的輸入。因此谒获,想要完成交易债蜜,必須要記錄下自己所有的utxo,而不僅僅是自己的地址究反。
節(jié)點(diǎn)在驗(yàn)證交易的過程中寻定,需要維護(hù)一個utxo的列表,從而驗(yàn)證每筆utxo是否是有效的輸入精耐,防止重復(fù)支付狼速。
使用utxo還有一個優(yōu)點(diǎn)就是保護(hù)隱私。之前提到過卦停,區(qū)塊鏈?zhǔn)且粋€開發(fā)的數(shù)據(jù)庫向胡,因此如果使用賬戶交易,那么很容易就可以分析出一個人的交易習(xí)慣惊完。但是如果使用utxo就可以避免這個問題僵芹,我們可以提前生成好很多的地址,在找零的時候小槐,隨機(jī)轉(zhuǎn)入一個新的地址拇派,這樣賬戶之間的依賴關(guān)系幾乎不存在荷辕,如果想查找分析某個用戶的用戶習(xí)慣,幾乎是不可能的件豌。代價就是需要更多的空間來維護(hù)utxo疮方。
總結(jié)
綜上就是我對比特幣的初步研究,比特幣是區(qū)塊鏈貨幣的先行者茧彤,其中有很多創(chuàng)新的地方骡显,utxo的概念、基于工作量證明的共識等等曾掂,不過它也有它的缺點(diǎn)惫谤,比如確認(rèn)時間間隔過長、每個區(qū)塊存儲信息過少等等珠洗,都是限制它發(fā)展的因素∈遥現(xiàn)在很多數(shù)字貨幣,都在比特幣的基礎(chǔ)上進(jìn)行了所謂的改進(jìn)险污,不管之后數(shù)字貨幣何去何從痹愚,比特幣的地位是不可動搖的。