主頁 > 區塊鏈 > 區塊鏈學習筆記之位元幣(一)

區塊鏈學習筆記之位元幣(一)

2021-02-04 14:02:17 區塊鏈

區塊鏈學習筆記

  • 一、位元幣
    • 1.密碼學基礎
      • 1.1 哈希
      • 1.2 簽名
    • 2.位元幣資料結構
      • 2.1 哈希指標
      • 2.2 Merkle Tree
    • 3.位元幣的共識協議
      • 3.1 數字貨幣&&位元幣
      • 3.2 位元幣中的共識協議(consensus in BitCoin)

一、位元幣

1.密碼學基礎

位元幣被稱為加密貨幣crypto-currency,區塊鏈上內容都是公開的,包括區塊的地址,轉賬的金額,位元幣主要用到了密碼學中的兩個功能: 1. 哈希 2.簽名

1.1 哈希

密碼學中用到的哈希函式被稱為cryptographic hash function,它有兩個重要的性質:
(1)collision(這里指哈希碰撞) resistance :例如x≠y H(x)=H(y) 兩個不同的輸入,輸出卻是相等的,這就稱哈希碰撞,它是不可避免的,因為輸入空間總大于輸出空間,給出x,很難找到y,除非蠻力求解(brute-force),

  • 該性質的作用:對一個message求digest,比如message取m, m的哈希值是H(m)=digest 如果有人想篡改m值而H(m)不變,則無法做到,
  • 哈希碰撞無法人為制造,無法驗證,是根據實踐經驗得來的
  • 關于這個性質的應用:上傳一個檔案到cloud,如何防止該檔案被篡改?用這個檔案作為一個輸入input,計算這個input的哈希值H(input)存在本地并把檔案上傳,之后將cloud上的檔案下載下來再計算其哈希值,比較兩個哈希值是否一致即可知道檔案是否被篡改,
  • MD5,曾經很流行的一個哈希函式,但是目前已經知道如何去制造一個MD5的哈希碰撞

(2)hiding:哈希函式的計算程序是單向的,不可逆的,(從H(x)無法推匯出x) hiding性質前提是輸入空間足夠大,分布比較均勻,如果不是足夠大,一般在x后面拼接一個亂數,如H(x||nonce),該性質的作用:和collision resistance(耐碰撞) 結合在一起,用來實作digital commitment(數字承諾)(又稱為digital equivalent of a sealed envelope數字等效的密封信封)把預測結果作為輸入x,算出一個哈希值,將哈希值公布,hiding讓人們知道哈希值而不知道預測值,最后再將x公布,因為有collision resistance的性質,預測結果是不可篡改的,

除了密碼學中要求的這兩個性質外,位元幣中用到的哈希函式還有第三個性質:
(3)puzzle friendly 指哈希值的預算事先是不可預測的,假如哈希值是00…0XX…X,一樣事先無法知道哪個值更容易算出這個結果,還是要一個一個帶入,

  • 位元幣挖礦的程序中實際就是找一個nonce,nonce跟區塊的塊頭里的其他資訊合一起作為輸入,得出的哈希值要小于等于某個指定的目標預值,H(block header)≤target,block header 指塊頭,塊頭里有很多域,其中一個域是我們可以設定的亂數nonce,挖礦的程序是不停的試亂數,使得block header取哈希后落在指定的范圍之內,
  • puzzle friendly是指挖礦程序中沒有捷徑,為了使輸出值落在指定范圍,只能一個一個去試,所以這個程序還可以作為作業量證明(proof of work),挖礦很難,驗證很容易,(difficult to solve ,but easy to verify),位元幣中用的哈希函式叫作SHA-256(secure hash algorithm )以上三個性質它都是滿足的,

1.2 簽名

(1)在位元幣系統中開賬戶:在本地創立一個公私鑰匙對(public key ,private key),這就是一個賬戶,公私鑰匙對是來自于非對稱的加密技術(asymmetric encryption algorithm),什么叫做非對稱加密,先讓我們來了解一下對稱加密,兩人之間資訊的交流可以利用密鑰(encryption key),A將資訊加密后發給B,B收到后用密鑰解密,因為加密和解密用的是同一個密鑰,所以叫對稱加密,前提是有渠道可以安全地把密鑰分發給通訊的雙方,因此對稱加密的缺點就是密鑰的分發不方便,因為在網路上很容易被竊聽,非對稱密鑰是用一對密鑰而不是一個,加密用公鑰,解密用私鑰,加密和解密用的都是接收方的公鑰和私鑰,公鑰是不用保密的,私鑰要保密但是私鑰只要保存在本地就行,不用傳給對方,公鑰相當于銀行賬號,別人轉賬只要知道公鑰就行,私鑰相當于賬戶密碼,知道私鑰可以把賬戶上錢轉走,公鑰用來驗證,私鑰是用來簽名,如下圖:

在這里插入圖片描述在這里插入圖片描述
注意:在位元幣區塊鏈中,私鑰代表了對位元幣的控制權,交易發起方用私鑰對交易(包括轉賬金額何轉賬地址)簽名,并將簽名后的交易和公鑰公布,各節點接收到交易后可以用公鑰驗證交易是否合法,在這個程序中,交易發起方無需暴露自己的私鑰,從而實作保密目的,

(2)假如A想向B轉10個位元幣,A把交易放在區塊鏈上,別人怎么知道這筆交易是A發起的呢?這就需要A要用自己的私鑰給交易簽名,其他人收到這筆交易后,要用A的公鑰去驗證簽名,簽名用私鑰,驗證用公鑰,用的仍然是同一個人的,創建賬戶產生相同公私鑰的可能性微乎其微,所以大量創建賬戶來竊取其他人賬戶是不可行的,

(3)我們假設產生公私鑰時有一個好的隨機源(a good source of randomness),產生公私鑰是隨機的,如果隨機源不好,就有可能產生相同的公私鑰,位元幣中用的簽名演算法,不僅是生成公私鑰的時候要有好的隨機源,之后每一次簽名時也要有好的隨機源,只要有一次簽名用的隨機源不好的話,就有可能泄露私鑰,

2.位元幣資料結構

2.1 哈希指標

(1)普通指標存盤的是某個結構體在記憶體中的地址,假如P是指向一結構體的指標,那么P里面存放的就是該結構體在記憶體中的起始位置,而哈希指標除了要存地址之外,還要保存該結構體的哈希值H(),好處是:從哈希值這個哈希指標,不僅可以找到該結構體的位置,同時還能夠檢測出該結構體的內容有沒有被篡改,因為我們保存了它的哈希值,如下圖:
在這里插入圖片描述
在這里插入圖片描述

(2)位元幣中最基本的結構就是區塊鏈,區塊鏈就是一個一個區塊組成的鏈表,那么區塊鏈和普通的鏈表相比有什么區別:

  • ①用哈希指標代替了普通指標(Block chain is a linked list using hash pointers),區塊鏈第一個區塊叫作創世紀塊(genesis block), 最后一個區塊是最近產生的區塊(most recent block) 每一個區塊都包含指向前一個區塊的哈希指標 ,一個區塊的哈希指標怎么算:是把前面整個區塊的內容,包括里面的hash pointer ,合在一起取哈希值,通過這種結構,可以實作tamper-evident log(防篡改日志),如果有人改變了一個區塊的內容,后面一個區塊的哈希指標就對不上,因為后一個區塊哈希指標是根據前一個區塊的內容算出來的,所以后一個哈希指標也得改,以此類推,我們保留的是最后一個哈希值也會變化,如下圖:
    在這里插入圖片描述
    在這里插入圖片描述
  • ②普通鏈表可以改變任意一個元素,對鏈表中其他元素是沒有影響的,而區塊鏈是牽一發而動全身,因為只需要保存最后一個哈希值,就可以判斷區塊鏈有沒有改變,在哪里改變了,因此位元幣沒有要保存所有區塊的內容,可以只保留最近的幾千個區塊,如果要用到以前的區塊,可以向系統中其他節點要這個區塊,有些節點是有惡意的,怎么判斷?這里要用到哈希值一個性質,如下:其他節點給你一個區塊,如何判斷它是正確的?算出它的哈希值,與保留的區塊的哈希值對比,即可,下面是一個區塊鏈實體:
    在這里插入圖片描述

2.2 Merkle Tree

(1)位元幣中的另外一個結構是:Merkle tree,如下圖,其中最下面一層是資料塊(data blocks),上面三層內部節點都是哈希指標(hash pointers),第一層是根節點,根節點的區塊也可以取個哈希,叫根哈希(root hash),這里我們提一個另外一個概念:binary tree(二叉樹),學過資料結構的人都知道,這里不做贅述,這種Merkle tree結構的好處:只要記住根哈希值,就能檢測出對樹中任何部位的修改,
注意:它們的區別:①用哈希指標代替了普通指標,
在這里插入圖片描述
注:上圖中TX為transaction(交易),H()為取哈希,

(2)位元幣當中各區塊之間用哈希指標連接在一起,每個區塊所包含的交易組織成merkle tree的形式,最下面一行data blocks每個區塊實際上是一個交易,每個區塊分為兩部分,分別是塊頭和塊身(block header ,block body),塊頭里面有根哈希值,每個區塊所包含的所有交易組成的merkle tree的根哈希值存在于區塊的塊頭里面,但是,塊頭里沒有交易的具體內容,只有一個根哈希值,塊身里面是有交易的串列的,

(3)merkle tree 的作用:①提供merkle proof ,位元幣中的節點分為兩類:全節點(保存整個區塊的內容,即塊頭塊身都有,有交易的具體資訊)和輕節點(例如手機上的位元幣錢包,只有塊頭),這時存在一個問題:如何向一個輕節點證明某個交易是寫入區塊鏈的?

  • 這時需要用到merkle proof :找到交易所在的位置(最底行的其中一個區塊),這時該區塊一直往上到根節點的路徑就叫merkle proof,

  • 實體如下圖:最上面一行是小型的區塊鏈,該圖展現的是一個區塊的merkle tree,最下面一行是包含的交易,假設某個輕節點想知道圖中黃色的交易,是否包含在了merkle tree里面,該輕節點沒有包含交易串列,沒有這顆merkle tree的具體內容,只有一個根哈希值,這時輕節點向一個全節點發出請求,請求證明黃色的交易被包含在這顆merkle tree里面的merkle proof,全節點收到這個請求之后,只需要將圖中標為紅色的這三個哈希值發給輕節點即可,有了這些哈希值之后,輕節點可以在本地計算出圖中標為綠色三個哈希值,首先算出黃色交易的哈希值,即它正上方的那個綠的哈希值,然后跟旁邊紅色的哈希值拼接起來,可以算出上層節點綠色的哈希值,然后再拼接,再算出上層綠色哈希值,再拼接,就可以算出整棵樹的根哈希值,輕節點把這個根哈希值和block header里的根哈希值比較一下,就能知道黃色的交易是否在這顆merkle tree里,
    在這里插入圖片描述

  • 全節點在merkle proof里提供的這幾個哈希值,就是從黃色的交易所在的節點的位置到樹根的路徑上用到的這些哈希值,輕節點收到這樣一個merkle proof之后,只要從下往上驗證,沿途的哈希值都是正確的即可,(驗證時只能驗證該路徑的哈希值,其他路徑是驗證不了的,即該圖中紅色的哈希值是驗證不了的)

(4)這樣是否不安全呢?假如黃色交易被篡改,它的哈希值發生了變化,那能不能調整旁邊紅色的哈希值,使得它們拼接起來的哈希值是不變的呢?

  • 不行,根據collision resistance,這是不可行的,
  • merkle proof可以證明merkle tree里面包含了某個交易,所以這種證明又叫proof of membership或 proof of inclusion,
  • 對于一個輕節點來說,驗證一個merkle proof 復雜度是多少?假設最底層有n個交易,則merkle proof 復雜程度是θ(log(n))

(5)如何證明merkle tree里面沒有包含某個交易?即proof of non-membership,

  • 可以把整棵樹傳給輕節點,輕節點收到后驗證樹的構造都是對的,每一層用到的哈希值都是正確的,說明樹里只有這些葉節點,要找的交易不在里面,就證明了proof of non-membership,問題在于,它的復雜度是線性的θ(n),是比較笨的方法,

  • 如果對葉節點的排列順序做一些要求,比如按照交易的哈希值排序,每一個葉節點都是一次交易,對交易的內容取一次哈希,按照哈希值從小到大排列,要查的交易先算出一個哈希值,看看如果它在里面該是哪個位置,比如說在第三個第四個之間,這時提供的proof是第三個第四個葉節點都要往上到根節點,如果其中哈希值都是正確的,最后根節點算出的哈希值也是沒有被改過的,說明第三、四個節點在原來的merkle tree里面,確實是相鄰的點,要找的交易如果存在的話,應該在這兩個節點中間,但是它沒有出現,所以就不存在,其復雜度也是log形式,代價是要排序,排好序的叫作sorted merkle tree,位元幣中沒有用到這種排好序的merkle tree,因為位元幣中不需要做不存在證明,

(6)小結:這節講了位元幣中兩種最基本的結構:區塊鏈和merkle tree,都是用哈希指標來構造的,除了這兩種之外,哈希指標還能用于另一個方面,只要一個資料結構是無環的(非回圈鏈表),都能用哈希指標代替普通指標,有環的話存在一個問題,他們的哈希值沒法計算,沒法確定一個哈希值固定的區塊,

3.位元幣的共識協議

3.1 數字貨幣&&位元幣

(1)首先我們引入一個問題,央行CB如何發行數字貨幣?
方案一:asymmetric encryption algorithm(非對稱加密演算法),央行發行一張貨幣如下,發行的貨幣都有央行的私鑰簽名,央行的公鑰是公開的,任何人都可以通過公鑰來認證數字貨幣的真偽,
在這里插入圖片描述

  • 注意:這種方案無法防止Double Spending Attack(雙花攻擊),即一張貨幣被多次花費

方案二:在方案一的基礎上,加一張表,記錄每一張貨幣目前在誰手中,在交易前驗證這張數字貨幣是否是支付者的,這種方式是中心化的,每次交易都要經過央行驗證,所謂去中心化,即將這種驗證的職責,從由央行承擔改為由大眾來承擔,

在這里插入圖片描述

  • 這種方案沒有問題,但是每次交易都需要央行驗證

(2)由上面分析我們可以知道,數字貨幣和紙質貨幣區別是,數字貨幣可以復制并且被多次花費,叫作雙花攻擊 即double spending attack,那么去中心化貨幣要解決兩個問題:①數字貨幣的發行②怎么驗證交易的有效性,防止double spending attack,回答如下:

  • ①位元幣的發行是由挖礦決定的
  • ②依靠區塊鏈的資料結構

實體如下圖:
在這里插入圖片描述

  • 位元幣的發行者A擁有鑄幣權(createcoin) 假如發行10個位元幣 A(10)分別給B和C各五個B(5)C(5) 該交易需要有A的簽名,證明經A同意(Signed by A),同時還要說明花掉的10個位元幣從哪來的,圖中第二個方框中的錢是從第一個框內鑄幣交易中來的,

  • 位元幣系統中每個交易都包含輸入(input)和輸出(output)兩部分,輸入部分要說明幣的來源以及支付者公鑰,輸出部分要給出收款人公鑰的哈希,有的交易部分比較復雜,如C的貨幣來源是第二個框和第三個方框,要標識清楚,

  • 上圖就構成了一個小型的區塊鏈,這里有兩種哈希指標,一種哈希指標是連接在各個區塊之間的,把它們串起來構成一個鏈表,前面學的就是這種哈希指標,而在該圖中還有第二種哈希指標,是指向前面某個交易的指標,用來指明幣的來源,為什么要說明幣的來源:證明幣不是憑空捏造的是有記錄的,同時也是防范double spending,

  • 現在來看第二個方框里A向B的轉賬,該交易需要A的簽名和B的地址,位元幣系統里收款的地址是通過公鑰推算出來的,比如B的地址就是B的公鑰取哈希然后經過一些轉換得到的,

  • 關于上圖的一些問題
    ①A如何知道B的地址?
    ----位元幣系統中沒有查詢對方地址的功能,必須通過其他渠道,比如某個電商網站,接受位元幣支付,就可以公開它的地址或公鑰,
    ②A需要知道B的地址,B需要知道A的什么資訊嗎?
    ----B其實也要知道A的公鑰,這代表A的身份,不僅是B,所有節點都需要知道A的公鑰,而簽名是用私鑰簽名,公鑰驗證(注意不要跟前面知識弄混了,加密是用接收人的公鑰加密私鑰解密),所以區塊鏈上每個節點都要獨立驗證,
    ③那如何才能知道A的公鑰?
    ----實際上交易里就包含了,輸入時不僅要輸入幣的來源,還要輸入公鑰,那就存在了安全漏洞,假如B的同伙偽造了這次交易呢?其實第一個方框里鑄幣交易的輸出就有A的公鑰的哈希,所以第二個方框交易里A的公鑰要跟前面哈希對的上,
    ④如果有個B’宣稱自己是A,使用A的公鑰發起交易,如何防范?
    ----前面我們講到了,位元幣系統中每個交易都包含輸入(input)和輸出(output)兩部分,輸入部分要說明幣的來源以及支付者公鑰,輸出部分是要給出收款人公鑰的哈希,即第一個框中A的鑄幣交易(coinbase tx)輸出有A公鑰的哈希,如果B’發起轉賬交易,那么交易中使用的A的公鑰要和前面A的公鑰的哈希要對的上,否則就說明這比交易非法,

  • 在位元幣系統當中,前面這些驗證程序,是通過執行腳本來實作的,每個交易的輸入是一段腳本,包括給出公鑰的程序,公鑰也是在輸入的腳本里指定的,每個交易的輸出也是一段腳本,驗證其的合法性,就需要把當前交易的輸入腳本跟前面交易(提供幣來源的交易)的輸出腳本拼在一起,然后看看能不能順利執行,如果能執行說明是合法的,位元幣腳本(BitCoin Script),后面詳細說明,

  • 該圖對交易系統進行了簡化,實際上每個區塊(對應圖中的每個方框)可以有很多交易,這些交易就組成merkle tree,每個區塊分為塊頭和塊身,塊頭包含的是區塊的宏觀資訊,比如:用的是位元幣哪個版本(version)的協議,區塊鏈當中指向前一個區塊的指標(hash of previous block header),整顆merkle tree 的根哈希值(merkle root hash),還有兩個域是跟挖礦相關的,一個是挖礦的難度目標預值(target),另一個是亂數nonce,這里的target,就是前面講到的,整個塊頭的哈希要小于這個預值,即H(block header)≤target,block header里存的就是這個目標預值的編碼(nBits),這里需要注意,前一個區塊的哈希只算的是前一個區塊的塊頭,所以前面畫的,一個區塊引出一個箭頭指向另一個區塊中間,是不正確的,所以有的書箭頭是指向前一個區塊的上面,取哈希時是把塊頭的所有部分都取哈希,這是因為只有block header才有哈希指標篡改權,如下圖,其中塊身(block body)里面有交易串列(transaction list),塊頭中的Merkel root hash就已經能夠保證block body里面的transaction list不被篡改,在這里插入圖片描述

(3)前面我們提到,每個節點都需要驗證所有的交易,實際上系統中的節點分全節點(full node)和輕節點(light node),全節點是保存區塊鏈所有的資訊的,驗證每一個交易,所以全節點又叫fully validating node,輕節點只保存block header的資訊,一般來說輕節點沒法獨立驗證交易的合法性,

  • 比如一個交易是不是double spending,輕節點沒有存以前的交易資訊所以它沒法驗證,系統中大多數節點是輕節點,本節內容主要針對全節點,因為輕節點沒有參與區塊鏈的構造和維護,只是利用了區塊鏈的一些資訊做一些查詢,

區塊鏈里的內容是如何寫到區塊鏈里面的呢?

  • 每個節點,每個賬戶都可以發布交易,交易是廣播給所有節點的,有些交易是合法的,有些是非法的,誰來決定哪些交易應該被寫入下一個區塊中呢?按照什么順序寫呢?如果每個節點自己決定可以嗎?如果每個人在本地維護一個區塊鏈,那區塊鏈的統一性得不到保證,而賬本的內容是要取得分布式的共識(distributed consensus),

下面的內容是有關分布式的,幫助更好理解區塊鏈,

①分布式的共識一個簡單的例子就是分布式的哈希表(distributed hash table),比如系統里有很多臺機器,共同維護一個全域的哈希表,

- 這里需要取得共識的內容是什么?
哈希表中包含了哪些鍵值對(key valve pair),假如有人在自己電腦上插入一個鍵值對,'xiao’這個pair對應的是12345,即’xiao’→12345,那么別人在另一臺讀的時候也要能把這個讀出來,這就叫一個全域的哈希表,

②關于分布式系統有很多不可能結論(impossibility result),其中最著名的是FLP,這三個字母是三個專家的名字縮寫,他們的結論是:在一個異步的(asynchronous)系統里,(網路傳輸遲延沒有上限就叫異步系統),即使只有一個成員是有問題的(faulty),也不可能取得共識,

③還有一個著名結論:CAP Theorem,(CAP是指分布式系統的三個我們想要的性質,Consistency【系統狀態的一致性】 Availability【別人都可以用】 Partition tolerance【磁區容錯性】),該理論內容是:任何一個分布式系統,比如分布式哈希表,這三個性質中,最多只能滿足兩個,假如想要前兩個性質,那么就不會得到第三個性質,

④分布式共識一個著名的協議是Paxos,該協議能夠保證一致性,即第一個性質,如果該協議打成了共識,那么這個共識一定是一致的,即每個成員所認為的共識都是相同的,但是,某些情況下,該協議可能永遠無法達成共識,這種可能性比較小但是客觀存在的,

3.2 位元幣中的共識協議(consensus in BitCoin)

位元幣中的共識協議(consensus in BitCoin):位元幣中共識要解決的一個問題是,有些節點可能是有惡意的,我們假設系統中大多數節點是好的,那么該如何設計一個共識協議?
(1)第一種方案是投票,首先應該確定哪些區塊有投票權,有些membership是有嚴格要求的,這種情況下基于投票的方案是可行的,但位元幣系統創建賬戶是很容易的,甚至一個人產生了公私鑰對別人都無法得知,只有轉賬時別人才知道,所以有些人可以不停的創建賬戶,當超過賬戶總數的一半時就有了控制權,這種稱為女巫攻擊(sybil attack),因此簡單的直接投票方法不可取,
(2)位元幣賬戶巧妙的解決了這個問題,不是按照賬戶數目投票,而是按照計算力來投票,每個節點都可以在本地組裝出一個候選區塊,把它認為合法的交易放在里面,然后開始嘗試各種nonce值(占4 byte),看哪一個能滿足不等式H(block header)≤target的要求,如果某個節點找到了符合要求的nonce,它就獲得了記賬權

  • 所謂的記賬權,就是往位元幣賬本里寫入下一個區塊的權利,只有找到這個nonce,獲得記賬權的節點才有權利發布下一個區塊,其他節點收到這個區塊之后,要驗證這個區塊的合法性,
  • 比如括號里block header的內容填的對不對;block header里面有一個域,叫nBits域,實際上它是目標預值的一個編碼檢查一下nBits域設定的是不是符合位元幣協議中規定的難度要求;該不等式是否成立,假設都符合要求,然后檢查block body 里面的交易串列,驗證一下每個交易都是合法的:①要有合法的簽名 ,②以前沒有被花過,如果有一項不符合要求,這個區塊就是不能被接受的,如果所有條件都符合,也不一定接受(后面詳細解釋),

(3)假如生成了一個新區塊,怎么知道新區塊插在了哪里呢?
根據前一個區塊的指標便可知,可根據hash of prev block header,有可能就存在一個問題,如下圖,這兩個交易指A轉賬給B,以及A轉賬給自己,這種情況不是double spending,判斷一個交易是不是double spending ,是看從當前區塊到幣的來源之間,中間這些區塊有沒有花過這些幣,如圖,從1號區塊到3號和3’區塊,幣都沒有花過,所以這個交易是合法的,雖然該交易是合法的,但是它不在最長合法鏈(longest valid chain)上,這種稱為分叉攻擊(forking attack),所以接收的區塊應該是擴展最長合法鏈,
在這里插入圖片描述

(4)區塊鏈在正常情況下也可能出現分岔:兩個節點同時獲得記賬權,每個節點在本地自己組裝一個它認為合適的區塊,然后去試各種nonce,如果兩個節點在差不多同一個時間找到了符合要求的nonce,就都可以把區塊發布,這時會出現兩個等長的分岔,這兩條都是最長合法鏈,那該接受那條呢?位元幣協議當中,在預設(默認的意思)情況下,每個節點是接受它最早收到的那個,所以不同節點根據在網路上的位置不同,有的節點先聽到新生成的其中一個區塊,那就接受這個區塊;有些節點先聽到另一個區塊,那就接受另一個區塊,

(5)如何判斷接收了一個區塊?
位元幣協議中用到了implicit consign,如果沿著這個區塊往下繼續擴展,就算認可了這個發布的區塊,比如在新生成的其中一個區塊后面又拓展一個區塊,表明就認可了這個新區塊,區塊鏈會出現分叉,等長的臨時性的分岔會維持一段時間,直到一個分岔勝出,也就是哪一個鏈搶先一步生成了新的區塊,哪一條就是最長合法鏈,另一個作廢的就叫orphan block,這兩個新區塊有可能會各自拉攏,兩個區塊鏈看誰的算力強,有時候也是看誰的運氣好,就會勝出,

(6)競爭記賬權的好處:首先獲得記賬權的節點本身有一定的權力,可以決定哪些交易寫到下一個區塊里,但這些不應該被設定為競爭記賬權的動力,所以巧妙地建立了一個機制:出塊獎勵(block reward),位元幣協議中規定獲得記賬權的節點在發布的區塊里可以有一個特殊的交易:鑄幣交易,在這個交易里可以發布一定數量的位元幣,

  • 這里要回到前面的問題,誰來決定貨幣的發行?
    coinbase transaction鑄幣交易是位元幣系統中發行新的位元幣的唯一方法,后面的交易都是位元幣的轉移,這個交易不用指出幣的來源,

  • 那么能造多少幣呢?
    開始時位元幣剛上線的時候,每一個發布的區塊可以產生50BTC(BTC就是位元幣的符號),協議中規定,21萬個區塊以后,初塊獎勵就要減半,就變成了25BTC,再過21萬個區塊,又要減半,

  • 如果出現了分叉,因此當一個區塊勝出后,另一個作廢的區塊(orphan block)得到的出塊獎勵是沒有作用的,大多數誠實的結點是不會承認的,

(7)本章小結:

  • 位元幣系統中要取得什么共識?
    去中心化的賬本的內容要取得共識,
  • 誰又能決定賬本的內容呢?
    只有獲得記賬權的節點才能寫東西,
  • 怎么獲得記賬權呢?
    就是求解一個puzzle,即H(block header)≤target,按照算力投票,算力可以用每秒能試多少nonce值的數目表示,即hash rate,
  • 那怎樣防范女巫攻擊(sybil attack)呢?
    按算力記票,即使創建再多的賬戶,也無法使算力增強,
  • 位元幣爭奪記賬權的程序叫作挖礦(mining),位元幣被稱為數字黃金(digital gold),爭奪記賬權的節點被稱為礦工(miner),礦工獲得記賬權就說是挖到礦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/256421.html

標籤:區塊鏈

上一篇:運算子優先級

下一篇:macOS終端(Terminal)歷史命令查詢

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more