提示:以下內容只是個人在學習過程中記錄的筆記,圖片均是肖老師課程的截圖,可供參考。如有錯誤或不足之處,請大家指正。
一、BTC網絡
比特幣網絡傳播的工作原理(the BitCoin network):
比特幣工作在應用層(application layer),底層是P2P的overlay network(覆蓋網絡)。
比特幣的P2P網絡結構非常簡單,所有節(jié)點都是對等的,沒有超級節(jié)點/主節(jié)點(super node / master node),所有節(jié)點都是平等的,要加入這個網絡,首先要知道至少有一個種子節(jié)點(seed node),然后和種子節(jié)點聯系,種子節(jié)點會告訴它所知道的節(jié)點信息。節(jié)點之間是通過TCP協議通信的,有利于穿透防火墻。節(jié)點要離開網絡不需要任何操作通知其他節(jié)點,只需要退出應用程序即可。其他節(jié)點一段時間內沒有接收到某個退出網絡的節(jié)點的消息,會自動將該節(jié)點從網絡中刪除。
比特幣網絡的設計原則:
simple(簡單),robust(魯棒) ,but not efficient(而不是高效)。
每個節(jié)點維護一個鄰近節(jié)點的集合,消息傳播在網絡中flooding采取方式。節(jié)點第一次聽到消息后,把消息傳播給其他鄰近節(jié)點,同時記錄此消息已被記錄,下次再接收到該消息就不用再轉發(fā)給鄰近節(jié)點。
鄰近節(jié)點的選取是隨機的,沒有考慮底層的拓撲結構。
現實節(jié)點網絡IP地址不同可以增強魯棒性,但是犧牲了效率。
比特幣系統中每個節(jié)點要維護等待上鏈的交易的集合。當節(jié)點第一次監(jiān)聽到某個交易時,把這個交易加入等待上鏈的交易集合中,并且轉發(fā)該交易給鄰近節(jié)點,再一次收到該交易就無需轉發(fā),可以避免交易在網絡中無限傳播。
轉發(fā)交易的前提是交易合法。
新發(fā)布的區(qū)塊在網絡中傳播的方式和新發(fā)布的交易是類似的,每個節(jié)點除要檢查區(qū)塊交易內容合法性之外,還要檢查是否在最長合法鏈上。
越大的區(qū)塊,傳播速度越慢(區(qū)塊大小限制:1M)。
比特幣網絡采用的傳播方式非常耗帶寬,帶寬是瓶頸。
比特幣網絡傳播屬于best effort (盡力而為)。一個交易發(fā)布到比特幣網絡上,不一定所有節(jié)點都能接收到,每個節(jié)點收到的交易順序也不一樣,網絡傳播存在延遲,有的節(jié)點不一定按照協議要求進行轉發(fā)交易,導致某些合法交易收不到,有些節(jié)點會轉發(fā)不合法交易消息,這是去中心化面臨的一個問題。
回滾交易不等于后一個交易對前一個交易的退款。
二、BTC-挖礦難度
挖礦就是不斷嘗試nonce值小于等于給定的目標預值。目標預值越小,挖礦難度越大。調整挖礦難度就是調整目標空間在整個輸出空間中所占的比例。
比特幣使用的哈希算法:SHA-256 。產生的哈希值是256位,整個輸出空間是2的256次方的可能的取值,調整這個比例,通俗的說就是哈希值前面要有多少個0。目標預值并不是哈希值前面都是0,后面從某一位是其他數字或字母。
挖礦難度和目標預值成反比。挖礦難度最小為1,對應的目標預值數很大。
不調整挖礦難度會出現的情況:總算力越來越強,挖礦難度不變,出塊時間會減短。
出塊時間太短會容易出現分叉,這種分叉會成為常態(tài),會出現多分叉,如二分叉、十分叉。
分叉出現過多不利于系統達成共識,會危害到系統的安全性。系統中總算力越強,安全性越好。
51%攻擊:惡意節(jié)點掌握系統中51%以上的節(jié)點,就會做出對系統不利的操作。
如果系統中有很多分叉,系統總算力會被分散,誠實節(jié)點根據網絡中位置的不同,可能會沿著分叉繼續(xù)擴展,某個分叉的惡意節(jié)點可能會集中算力進行拓展,逐漸拓展成最長合法鏈,當算力被分散后,51%的攻擊 的比例可能會更低。
出塊時間要有一個常數的波動范圍,不能無限地減小。
以太坊出塊時間是每隔15秒一個塊,出塊時間大大減少后,以太坊設置了ghost共識協議。
分叉產生了orphan block,這些區(qū)塊不能簡單丟棄,需要給一些獎勵uncle reward。以太坊中也需要調整出塊難度保持穩(wěn)定。
無論出塊時間設置成多少,都要保持穩(wěn)定,不能無限減少。
比特幣中調整挖礦難度:
每隔2016區(qū)塊調整一次挖礦難度,大概是兩個星期。
調整目標預值公式:
如果實際調整時間超過兩個星期,說明出塊時間超過十分鐘間隔,挖礦難度應該調低;如果實際調整時間不超過兩個星期,說明出塊時間小于十分鐘間隔,速度塊,應該調高挖礦難度。
實際調整難度代碼中,上調下調難度都有四倍的限制,假如實際調整時間超過了八個星期,也按照八個星期計算調整,目標預值增大最多也只增加四倍,不會一次性超過四倍,主要是為了系統中出現意外情況導致目標預值有特別大的活動。
如何讓所有礦工同時調整目標預值?
調整計算目標預值的方法寫在比特幣系統中的代碼里,每挖到2016個區(qū)塊會自動進行調整。
代碼是開源的,如果某個惡意節(jié)點不進行調整,該惡意節(jié)點發(fā)布的區(qū)塊會不被誠實節(jié)點接受。
nBits域是target編碼的版本,在塊頭沒有直接存儲target域,target域需要32字節(jié),nBits是4字節(jié),也可以說nBits是target的壓縮編碼。如果惡意節(jié)點不進行調整目標預值,檢查區(qū)塊的合法性會不能通過。因為每一個區(qū)塊要獨立驗證合法性,檢查內容包括nBits目標預值是否正確,如果不一致發(fā)布的區(qū)塊會不被其他節(jié)點接受。
以太坊調整挖礦難度是每個新出的區(qū)塊都有可能會進行調整,而且調整方法也比比特幣更為復雜。
比特幣成功,從某種意義上說是因為它更不實用,比特幣沒有任何真正法幣背書,沒有底層的保證應用,是憑空造出來的貨幣。比特幣的設計比較保守,也是后面有很多新的加密貨幣發(fā)展出來的原因之一。
2009-2018年比特幣系統總算力的變化情況(圖片來源于肖臻老師視頻截圖): 2009-2018年比特幣系統挖礦難度的變化情況(圖片來源于肖臻老師視頻截圖):
比特幣系統2017年11月-2018年5月半年期間的難度變化曲線(圖片來源于肖臻老師視頻截圖):
上圖說明挖礦的人越來越多,設備越來越先進,反映出大家對比特幣的熱情越來越高。
如果是相反情況,說明大家對這種幣熱情減少。
比特幣系統2010-2018年每天的出塊時間(圖片來源于肖臻老師視頻截圖):
上圖可以看出總體上出塊時間穩(wěn)定在十分鐘左右上下波動,說明難度調整達到預期目的
比特幣系統2018上半年的出塊時間(圖片來源于肖臻老師視頻截圖):
計算挖礦難度代碼:
(實際比特幣代碼中使用的是計算目標預值公式)(圖片來源于肖臻老師視頻截圖):
三、BTC-挖礦
驗證其合法性三方面:
- 區(qū)塊內每個交易都要合法
- 每兩周調整挖礦難度
- 檢查區(qū)塊是在延伸最長合法鏈
輕節(jié)點無法檢測鏈上區(qū)塊都是合法的。
輕節(jié)點假設礦工都是有理智的,不會沿著不合法的鏈挖下去。
挖礦過程(缺省情況下):
1、沿著最長合法鏈挖下去
2、選擇最先監(jiān)聽的分叉
在挖礦過程中,如果監(jiān)聽到其他節(jié)點發(fā)布了一個區(qū)塊,這個區(qū)塊是合法的,也是在延伸最長合法鏈,此時應該停止已有的挖礦,在本地重新組裝一個候選區(qū)塊,然后重新進行挖礦。
原因:沿著新發(fā)布區(qū)塊往下挖,本地所組裝的區(qū)塊中所包含的交易就會發(fā)生變化,有些區(qū)塊可能已經被包含在新發(fā)布區(qū)塊中,塊頭也會發(fā)生變化。
挖礦的性質是無記憶性,無論是停止挖礦重新組裝后重新挖礦還是繼續(xù)挖礦,只要還未找到符合的nonce值,成功的概率都是一樣的,對最后的結果沒有影響。
比特幣是如何保證安全性的?
從兩方面保證,一是密碼學上的保證,另一方面是共識機制。
密碼學上的保證是別人沒有自己的私鑰就沒有辦法偽造自己的簽名,前提是系統中擁有的大多數礦工是好的,是遵守協議的,不會接受沒有合法簽名的協議。
挖礦的演化趨勢:
1、挖礦設備趨于專業(yè)化,從通用變成越來越專用
(1)CPU、通用計算機:性價比太低
(2)GPU:用于通用并行計算
(3)ASIC芯片
ASIC:專門為挖礦設計的芯片,沒有多余的電路邏輯,就是為了計算哈希值,比特幣挖礦而設計。(性價比最高,ASIC芯片研發(fā)周期很長)
為某一種加密貨幣設計的芯片只能挖那一種加密貨幣,不能挖其他的,除非都是使用同一種mining puzzle,可以吸引更多人挖礦(merge mining)。
設計alternative puzzle的出發(fā)點:抗ASIC芯片化resistance,目的是為了讓通用的計算機也能參與挖礦。
2、挖礦的另一個趨勢是大型礦池的出現。單個礦工的收入是不穩(wěn)定的。單個礦工還要承擔全節(jié)點的其他責任。
礦池是把礦工組織起來作為一個整體。礦池的架構是一個全節(jié)點會驅動很多礦主pool manager ,礦機礦主下連著很多礦工,礦工只負責計算哈希值,全節(jié)點的其他職責都由pool manager承擔,把交易組織打包成候選區(qū)塊,監(jiān)聽其他節(jié)點有沒有發(fā)布新區(qū)塊。
礦池出現的另一個目的:解決收入不穩(wěn)定。
挖礦收益該如何分配?
一般來說,礦池有兩種組織形式。一種是像大型數據中心那樣,另一種是分布式,礦工和礦主不在一個地方,礦工要加入礦池就是按照礦池規(guī)定的通訊協議與礦主進行聯系,礦主把要計算哈希值的任務分配給礦工,礦工計算完后把結果返回給礦主,有出塊獎勵時一起參與分紅。
如果礦工是來自世界各地,收益該如何分配?
按照礦工貢獻大小分配,工作量證明。
降低挖礦難度后挖到的叫做share(almost valid block)。礦工挖到share后提交給
礦主,礦主記錄礦工提交的share數目,可以用這個證明礦工的工作量,等挖到新
的區(qū)塊后,用share數目分配收益。
每個礦工挖到的概率取決于挖到的nonce數,和share成正比。
如果礦工挖到后不提交給礦主發(fā)不出去,收款地址是礦主的地址,礦工無法取出
收益,是無用的。只要礦工按照礦主分配的任務分區(qū)塊獎勵,就不可能能偷出塊
獎勵。
如果礦工搗亂,不提交真正挖到的結果,這樣對礦工沒有經濟上的好處。
礦池在各個國家的分布比例:
礦池的算力的分布比例(2014年6月12日):
礦工轉換礦池很容易。
大型礦池會使得51%的攻擊更加容易。
占據51%以上算力的礦池可以發(fā)布的攻擊:(不是只要達到51%預值就可以發(fā)動攻擊。)
1、分叉攻擊。
2、封鎖禁令boycott:把封鎖的賬戶的有關系的交易都不讓上鏈,當其他節(jié)點把這個交易發(fā)布到區(qū)塊上,會立刻分叉,讓這個交易所在的鏈不能成為最長合法鏈。(和回滾的區(qū)別:不用等多個區(qū)塊被確認 )
3、盜幣(不可能實現的,沒有其他賬戶的私鑰)文章來源:http://www.zghlxwxcb.cn/news/detail-801438.html
強行把不合法的交易打包到區(qū)塊,會造成分叉。文章來源地址http://www.zghlxwxcb.cn/news/detail-801438.html
到了這里,關于《區(qū)塊鏈技術與應用》北大肖臻老師——課程筆記【6-8】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!