比特幣
挖礦
什么是比特幣
都 2020 年了莱睁,比特幣這個(gè)詞兒大家肯定不陌生炫掐。經(jīng)過各方面的宣傳炒作,比特幣這個(gè)概念本身已經(jīng)被賦予了很多玄乎的職能表鳍。有關(guān)比特幣具體的技術(shù)細(xì)節(jié)有很多团甲,這次我們只探討“挖礦”相關(guān)的部分逾冬。
要想解釋清楚挖礦,你首先要知道伐庭,比特幣是一個(gè)去中心化的分布式自治網(wǎng)絡(luò)粉渠》指裕或者可以這么理解,比特幣是個(gè)大型賬本霸株,還是個(gè)分布式的賬本雕沉,也就是說,比特幣網(wǎng)絡(luò)上有許許多多的節(jié)點(diǎn)去件,每個(gè)節(jié)點(diǎn)的任務(wù)就是記賬坡椒。
為什么比特幣要挖礦
因?yàn)楸忍貛攀莻€(gè)去中心化的分布式網(wǎng)絡(luò),而且大家都能加入這個(gè)網(wǎng)絡(luò)中尤溜,所以就可能存在惡意節(jié)點(diǎn)倔叼,這些節(jié)點(diǎn)就是不按規(guī)矩來搗亂的。
必須有個(gè)辦法來增加搗亂的成本宫莱,讓惡意節(jié)點(diǎn)自己覺得不值得丈攒,這樣才能使整個(gè)網(wǎng)絡(luò)正常發(fā)展下去。
比特幣網(wǎng)絡(luò)中增加搗亂成本的方案就是“挖礦”授霸。
怎么挖礦
這里不討論比特幣是怎么做節(jié)點(diǎn)發(fā)現(xiàn)的巡验,假設(shè)這個(gè)分布式網(wǎng)絡(luò)已經(jīng)運(yùn)行起來了,節(jié)點(diǎn)之間可以進(jìn)行消息廣播碘耳。當(dāng)有人想要轉(zhuǎn)賬显设,那么就需要把轉(zhuǎn)賬信息在節(jié)點(diǎn)之間進(jìn)行廣播,節(jié)點(diǎn)收到之后就會把轉(zhuǎn)賬信息記下來辛辨。
挖礦馬上就要開始了 --- 節(jié)點(diǎn)剛收到轉(zhuǎn)賬信息(下文稱為交易)后捕捂,僅僅是放在內(nèi)存池里,真正想讓交易生效斗搞,需要經(jīng)過一系列步驟
- 先從內(nèi)存池中取出一些交易指攒,計(jì)算這些交易的 hash 值
- 將交易 hash 值與一個(gè)隨機(jī)數(shù)一起進(jìn)行 hash,也就是
hash(hash(交易) + 隨機(jī)數(shù))
- 判斷上一步 hash 的結(jié)果的開頭幾位是不是有很多 0僻焚,具體要有多少個(gè) 0 是動(dòng)態(tài)調(diào)整的
- 如果 0 的數(shù)量不夠幽七,則換一個(gè)隨機(jī)數(shù),不斷重復(fù)嘗試溅呢,直到 0 的個(gè)數(shù)足夠多
- 找到隨機(jī)數(shù)之后,將這個(gè)隨機(jī)數(shù)與交易的 hash 值猿挚,以及交易本身咐旧,一起打包成一個(gè)數(shù)據(jù)包,稱之為一個(gè)區(qū)塊绩蜻,把區(qū)塊廣播出去
- 各個(gè)節(jié)點(diǎn)收到后铣墨,也來拿這個(gè)隨機(jī)數(shù) hash 驗(yàn)證一下是不是真的有那么多 0,如果驗(yàn)證成功办绝,則記錄下來
這個(gè)過程一般都叫它交易打包伊约,或者說挖出了一個(gè)區(qū)塊姚淆。可以看出來這個(gè)操作是比較累的屡律,為了不讓節(jié)點(diǎn)白干活腌逢,在交易列表中會有一筆特殊的轉(zhuǎn)賬,內(nèi)容就是從天而降一筆比特幣超埋,轉(zhuǎn)給打包的節(jié)點(diǎn)搏讶。
所以挖礦是個(gè)形象的比喻,隨機(jī)數(shù)嘗試的過程就好比在礦坑中亂挖霍殴,運(yùn)氣好就能敲到礦媒惕,所以你現(xiàn)在知道有人說挖礦賺了多少多少是什么意思了吧。
區(qū)塊鏈
為了增加篡改難度来庭,前一個(gè)區(qū)塊的 hash 值也需要記錄在區(qū)塊中妒蔚,相應(yīng)的碰撞隨機(jī)數(shù)的算法就會改進(jìn)成 hash(hash(交易) + 前一個(gè)區(qū)塊的 hash + 隨機(jī)數(shù))
,
這樣新的區(qū)塊指向前一個(gè)區(qū)塊月弛,所有的區(qū)塊看起來就串成了一個(gè)鏈肴盏。
如果有人想篡改區(qū)塊鏈中的某個(gè)區(qū)塊中的交易,那么交易 hash 值就會發(fā)生變化尊搬,那么原來的隨機(jī)數(shù)就不能滿足要求叁鉴,篡改者就要重新計(jì)算隨機(jī)數(shù),整個(gè)區(qū)塊的 hash 自然也會跟著改變佛寿,
由于后一個(gè)區(qū)塊頭里記錄著前一個(gè)區(qū)塊正確的 hash幌墓,所以篡改者還要把后面所有的區(qū)塊都篡改了,重新去計(jì)算所有的隨機(jī)數(shù)冀泻,成本大大增加常侣。
所以在挖礦過程中,如果有人搶先挖出一個(gè)區(qū)塊弹渔,那么你就得停下計(jì)算胳施,因?yàn)樯弦粋€(gè)區(qū)塊的 hash 已經(jīng)過時(shí)了,需要把新的區(qū)塊作為上一個(gè)區(qū)塊肢专,然后能繼續(xù)開始嘗試舞肆。
礦挖完了怎么辦
為了避免比特幣無限制的增加,在經(jīng)過一定時(shí)間后博杖,比特幣的出塊獎(jiǎng)勵(lì)將會減半椿胯,最終不再有挖礦獎(jiǎng)勵(lì)。
不過雖然挖出區(qū)塊的獎(jiǎng)勵(lì)沒有了剃根,但是區(qū)塊是依然能夠繼續(xù)挖出來的哩盲,那礦工怎么賺錢呢,這個(gè)時(shí)候就只能靠手續(xù)費(fèi)了。
每一筆交易都會設(shè)定一個(gè)手續(xù)費(fèi)廉油,成功打包的礦工將獲取這次打包交易中的手續(xù)費(fèi)惠险,所以礦工打包的時(shí)候肯定是先挑內(nèi)存池中手續(xù)費(fèi)高的出來進(jìn)行打包,
為了每次打包賺得更多抒线,可以一次打包很多的交易班巩,不過打包的交易多了,計(jì)算 hash 的速度就會慢十兢,區(qū)塊大了網(wǎng)絡(luò)中傳輸?shù)乃俣纫矔たⅲ赡茉谀阌?jì)算的時(shí)候,別人搶先打出一個(gè)小區(qū)塊你就白忙活了旱物,
所以最終選擇打包多少交易遥缕,就是個(gè)平衡的結(jié)果。
計(jì)算機(jī)性能提升對挖礦有啥影響
隨著計(jì)算機(jī)硬件的發(fā)展宵呛,計(jì)算 hash 的時(shí)間肯定會越來越短单匣,為了讓每次碰撞成功的時(shí)間大致相同,0 的個(gè)數(shù)具體是多少個(gè)就需要根據(jù)最近一段時(shí)間內(nèi)出塊的速度進(jìn)行動(dòng)態(tài)調(diào)整宝穗。
當(dāng)前全網(wǎng)計(jì)算機(jī)的算力越強(qiáng)户秤,那么難度就會提升,也就是需要的 0 的個(gè)數(shù)就會越多逮矛,碰撞的難度就會越高鸡号。結(jié)果就是不管你算的多快,難度系數(shù)的上升會讓出塊時(shí)間維持在同一個(gè)水平须鼎。
結(jié)尾
上面說到的算法只是個(gè)大概說個(gè)原理鲸伴,并不是比特幣實(shí)際使用的算法。
本人也是剛接觸這塊知識晋控,還處于學(xué)習(xí)過程中汞窗,文中難免出現(xiàn)錯(cuò)誤,歡迎各位指正赡译。
有機(jī)會可以再來探討下這些問題仲吏,
如何判斷你的比特幣是不是屬于你?智能合約是個(gè)啥蝌焚?
比特幣為啥要等待多個(gè)交易確認(rèn)裹唆?分叉重組是啥?