比特幣的挖礦

1 挖礦的特點

  • 無記憶性:每一次挖礦的時間都是獨立的,就是說在挖礦的過程中突然監聽到新的區塊已經成功發佈了。
  • 安全性:密碼學的簽名保證了安全,地址不是直接是公鑰,是公鑰的hash值。
  • 匿名性:賬戶其實就是公私鑰對,只要不花錢基本上就沒有途徑猜出是誰。

2 挖礦的工具

  • 挖礦的工具演變過程:CPU→GPU→ASIC芯片
  • 挖礦工具的趨勢:專業化,效益最大化,只能用於某一種貨幣,同時伴隨着礦機的時效性短。

2019年11月19日更新:

在不斷的學習後我思考一個問題,一直往避免算力中心化,例如以太坊是memory hard的目的是達到ASIC resistance的狀態,那麼就說想讓普通電腦都有機會挖礦,就是說挖礦整體成本降低了,但是另一方來講是不是發動攻擊的成本也降低了呢?我直接可以用服務器挖礦,我也不用直接買礦機挖礦了,這樣會不會變得更不安全?

3 礦池

3.1 礦池的定義

一個全結點驅動很多其他礦機,一個礦主(pool manager)監聽網上交易,負責打包出區塊,然後作爲任務分配者,把計算nonce值的任務分配給礦工(miner)同時監聽有沒有新結點搶先發布區塊。miner計算nonce,miner根據和礦主的通信協議進行通信,當挖出礦後共享區塊獎勵。礦主可以從中抽取管理費和交易費達到礦池的正常運營。

3.2 礦池的優點

因爲單個礦工的算力不強,通過合作,解決收入不穩定的難題,有了收益一起分配。

3.3 收益分配的難題

因爲每一個人都可以有挖礦的分配,既然做多做少都會有費用,在某種程度上會限制了礦工的積極性,礦工可以偷懶,不去挖礦只是收取區塊獎勵。所以就要有一個工作量的證明,礦主就會降低挖礦的難度,增大閾值target,每當一個礦工達到該閾值範圍內就可以提交給礦主作爲信用憑證,降低挖礦難度挖到一個結果稱爲share,最接近的值的區塊作爲工作量憑證,但是share沒有真正的用途,僅僅是記錄每個礦工有多少個share對最後的獎金進行按勞分配,share值也不可能發不到區塊裏面,因爲它並不是合法的。

3.4 礦主和礦工的矛盾

3.4.1 礦工知道礦主的目的?

礦工並不知道礦主在幹什麼,礦工只是負責計算hash值,所以礦主是有可能集中算力對鏈進行51%attack,當某一個礦池有超過半數的算力時或者說接近半數算力的話,基本上就可以滿足51%attack,基本上礦工都是喫瓜羣衆,他不知道自己在幹什麼。

礦池既然有如此大的算力,那麼除了51%attack還可以進行fork attack強行創造分支並且讓其他交易回滾,還有可能是boycott attack,和分支不一樣,他並不會等待最長鏈,它是儘快生成一個新的區塊和另外的合法區塊進行競爭,爭取儘早上鍊,那麼其他的善意結點還是會幫這一筆交易上交到合法的鏈上,但是攻擊者會每一次都阻止這一筆合法交易上鍊。

3.4.2  礦工可以私自發布區塊?

假如我是一個礦工,我已經找到一個合適的閾值,然後我可以私自發布區塊,不提交給礦主,挖到礦我自己收,平時還可以舔到別人的區塊獎勵這樣合法嗎?不可能,礦主組裝區塊,收款地址是礦主的,礦工不能拿到區塊獎勵,取不出來錢,假如要改coinbase域中的數據改變,就算是礦工自己組裝區塊,因爲coinbase域發生了變化,礦主是不會認的。但是可以搗亂,挖到區塊丟棄不給礦主,當然自己也會丟失區塊獎勵,所以礦工和礦主是利益共同體的關係。

3.4.3 礦池的缺點

  • 礦工和礦主之間的關係是透明的,礦工不知道礦主的目的。
  • 當礦池的算力接近半數的時候就有可能發動攻擊,打擊礦工的積極性。

4 挖礦難度

區塊產出的時間都會穩定在10min左右,這相對與中心化的電商交易,簡直是相差太大了。但是爲了抵禦fork attack,就只能在把挖礦時間邊長。舉一個例子,假如我是1s出一個區塊,假如惡意礦工就可以在鏈上製造分叉並且可以延伸分叉鏈,使其成爲最長的合法鏈,輕結點只能校驗和自己相關的交易,並不能校驗全部交易的合法性,《輕結點和全結點的區別》。會造成交易的不斷回滾,善意結點會不斷的分散算力。

挖礦的難度調整的公式:

next_ difficulty= previous_ difficulty*(2 weeks) / (time to mine last 2016 blocks )

每到2016個區塊添加到鏈上大約每兩週會進行一次調解挖礦的複雜度。假如此時挖出的區塊時間很大

(2 weeks) / (time to mine last 2016 blocks )>0,挖礦的複雜度會降低,相對的假如(2 weeks) / (time to mine last 2016 blocks )>0那麼複雜度會增大,所以挖礦的複雜度是動態變化的。挖礦難度和閾值target是成反比的,target越小難度越高,target的公式正好和difficulty的公式是相反的。

next_target=last_target * (actual_time/apected_time)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章