比特幣系統(tǒng)給礦工出的難題就是讓礦工找出符合要求的隨機數(shù)。礦工構(gòu)造區(qū)塊,確定區(qū)塊頭中其他5個字段,另一個需要不斷試錯的變量就是隨機數(shù)。只有符合要求的隨機數(shù)才能召喚“神龍”。符合要求的意思是:對整個區(qū)塊頭取哈希值,使得該哈希值小等于難度目標(準確的說是小于目標值Target)。
我們今天主要來回答比特幣系統(tǒng)挖礦難度目標是什么,它是怎么調(diào)整的?
什么是難度目標?
難度目標是比特幣系統(tǒng)中調(diào)控挖出區(qū)塊所用平均時間的參數(shù),是區(qū)塊頭中6個字段之一。
比特幣挖礦難度(Difficulty),是對挖礦困難程度的度量,挖礦難度越大,挖出區(qū)塊就越困難。目標值(Target)與挖礦難度成反比。難度越高,目標值越小。而難度目標是目標值通過轉(zhuǎn)化得到,是一個只有4個字節(jié)的字段(為了便于理解,本文將難度目標等同目標值處理)。比特幣系統(tǒng)正是通過調(diào)整區(qū)塊頭中難度目標來控制挖出區(qū)塊所需平均時間的。
目標值是個長度為256比特的字符串,換句話說目標值約有2^256種可能的取值。調(diào)整難度目標就是調(diào)整目標值在整個輸出空間的占比。
舉例說明:挖礦就如射擊,所有射出去的子彈都會落在一個很大的靶子上。難度目標就是這個大靶子上圈出一個范圍,這個范圍越小,被射中的難度就越高。調(diào)節(jié)難度目標,就是調(diào)節(jié)這個圈在整個靶子上的占比。
挖礦算力增大,單位時間射擊的次數(shù)就越多,目標范圍被射中所需的時間就越短。反之,挖礦算力減小,目標范圍被擊中所需的時間就越長。而比特幣系統(tǒng)追求的平均出塊時間為10分鐘,這時候就需要調(diào)整難度目標來實現(xiàn)。
如何調(diào)整難度目標?
比特幣系統(tǒng)是怎樣調(diào)整難度目標的呢?在《白話區(qū)塊鏈入門080 |數(shù)說比特幣,了解比特幣必須知道這10個數(shù)字》一文中,我們介紹了比特幣系統(tǒng)每過2016區(qū)塊(大約為14天時間),會自動調(diào)整一次難度目標。所有區(qū)塊高度為2016整數(shù)倍的區(qū)塊,系統(tǒng)就會自動調(diào)整難度目標。如果上一個難度目標調(diào)整周期(也就是之前2016個區(qū)塊),平均出塊時間大于10分鐘,說明挖礦難度偏高,需要降低挖礦難度,增大難度目標(準確地說是目標值);反之,前一個難度目標調(diào)整周期,平均出塊時間小于10分鐘,說明挖礦難度偏低,需要縮小難度目標。
難度目標的可調(diào)范圍
比特幣系統(tǒng)設(shè)定,難度目標上調(diào)和下調(diào)的范圍都有4倍的限制。舉例說明:假設(shè)上一個難度目標調(diào)整周期內(nèi)的2016個區(qū)塊,由于算力暴漲,只用7天就全部挖出來了,通過難度目標調(diào)整,將難度目標縮小一倍,可以將平均出塊時間維持在10分鐘左右,但如果算力暴漲,前2016個區(qū)塊全部挖出只用了1天,那么難度目標最小只能調(diào)整為原來的四分之一。
總結(jié)
比特幣的算力是持續(xù)波動的,比特幣系統(tǒng)通過難度目標的調(diào)整,使得平均出塊時間維持在10分鐘左右。難度目標和挖礦難度成反比,挖礦難度越大,難度目標越小。當區(qū)塊高度為2016的整數(shù)倍時,比特幣系統(tǒng)就會在該區(qū)塊上,自動調(diào)整難度目標。如果上一個難度目標調(diào)整周期內(nèi),平均出塊時間超過10分鐘,那么降低挖礦難度,增大難度目標;反之則提高挖礦難度,減小難度目標。難度目標上調(diào)和下調(diào)的范圍都有4倍的限制。
比特幣每2016個區(qū)塊(大約14天)調(diào)整一次挖礦難度,相比于BCH每個區(qū)塊都調(diào)整(大約10分鐘調(diào)整一次),有明顯的滯后性。你認為是哪種調(diào)整方式更合理呢?為什么呢?