欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

如何快速學習了解區塊鏈

黃文隆2年前22瀏覽0評論

如何快速學習了解區塊鏈?

答:本文邀請thomas來回答,他會從基礎數據結構展開,對構建簡易區塊鏈所涉及的幾個知識點做一個簡單梳理~

1、區塊與交易數據結構

如下圖是官網給出簡化區塊鏈結構圖,一個區塊有區塊頭和交易組成,每一個區塊頭部主要包含前一區塊hash,merkle root data,時間戳,計算器等值,可用于工作量證明。

大部分簡易區塊鏈的文章中都簡化了這部分設計,實際把交易結構直接放入區塊中(也可以是其他數據),而不會有區塊/區塊頭之分。

再看交易結構,交易作為比特幣的核心部分,根據官網給出示列可以看出交易在區塊鏈中的流轉過程。

首先,先歸納出交易相關數據結構:

其實理解交易的整個流轉過程并不難。每一筆交易有輸入輸出組成,輸入會引用之前交易的輸出,交易的輸出包含了資產實際存儲值。為了方便理解,我們假設有甲乙兩人(可理解為地址)發生交易,甲 向 乙 轉入100k(甲有足夠資金),產生交易訂單:TX0;input0為引用甲之前交易的輸出output(引用甲需要的資金>=100k);output0為甲剩余資金;output1為乙獲得資金。

在結合官網給的結構圖發現每次交易缺少10k satoshi,官網解釋為對挖出區塊的礦工的獎勵(實際這是一種激勵形式,后續有介紹)。個人理解其表現形式應該也為一項有效交易的輸出。這筆交易一旦成功并加入區塊,實際上這筆交易所引用的輸出就要作廢。因為在這里每一筆交易引用的輸出在整個鏈路中只能出現使用一次,這是為了防止雙花即同一輸出多次使用的結果發生。所以這里還會還涉及幾個概念, 后面繼續介紹。

2、utxo集

utxo(unspent transactions outputs)集,字面意思未花費交易輸出。一筆交易的輸入需要獲取以往交易的輸出來獲取余額信息,當整個區塊鏈達到一定高度時,每次交易便利整個區塊鏈時不可取的。引入utxo集,將未被任何交易輸入所引用的輸出集合管理,加快交易的相關操作。在構建簡易區塊鏈實現中,較簡單通過遍歷整個鏈路過濾出符合要求的未花費集合。這里符合要求可理解為與己相關,可被自己解鎖的且未被其他輸入所引用的輸出(上面提到的防止雙花),這樣以保證未花費輸出被惡意消費。

3、merkle樹

前面提到區塊中存儲的merkle root data。每個區塊包含一個或者多個交易記錄,為了驗證某筆交易難免會遍歷或下載區塊及交易數據。針對這中情況,比特幣中采用merkle樹,merkle root data被存儲在區塊頭中, 交易數據hash后兩兩合并在hash(如果區塊中交易數為單數,則取最后一筆交易湊足雙數節點),直到歸并為一個hash節點merkle root data。其過程如下圖所示。

比特幣中的簡單支付驗證(SPV)部分,是通過從Merkle根節點進行遍歷,只需取得所需的交易hash和待驗證交易hash就可完成驗證,這樣就無需下載整個交易區塊數據。列入上圖中,證明D交易被添加到這個區塊中,一個SPV客戶端只需要拷貝merkle樹路徑中C、AB和EEEE 哈希到Merkle根節點,而客戶端不需要知道其他的交易的任何信息。

4、密鑰 地址 簽名

在整個比特幣交易過程中,比特幣的所有權是通過密鑰、地址以及數字簽名來確立的。在交易中必須要知道交易的發送方和接收方才能完成交易。只需知道一方的地址便可以向這個地址發送貨幣產生交易。首先,密鑰是成對出現的,由私鑰和公鑰所組成,在比特幣中被存儲在錢包文件中。公鑰可對外公開,但是私鑰是證明所有者身份的存在,只有所有者知道。如果丟失,那就失去了名下所有交易的所有權于控制權。

4.1 密鑰

比特幣實現中使用橢圓曲線算法生成密鑰對,使用ECDSA對交易數據簽名,算法原理暫不介紹。其代碼實現如下:

4.2 地址

比特幣中的地址實際上由1字節version,20字節的公鑰hash以及4字節checksum組成,人們可見的地址是有實際地址經過base58編碼后得到的可讀地址。其中version取值為0x00。

其生成規則與代碼實現如下:

base58(version+公鑰hash+checksum)(位數不固定)因為base58編碼格式與十六進制格式轉換結果位數不確定。

4.3 簽名生成

為了保證交易數據的有效,當前交易所有者需要在交易中提交其公鑰和簽名(每次交易的簽名都不同,但均從同一個私鑰生成)。比特幣網絡中的所有人都可以通過所提交的公鑰和簽名進行驗證,并確認該交易是否有效,即確認支付者在該時刻對所交易的比特幣擁有所有權。私鑰生成簽名signature(privkey + txdata).公鑰驗證 pubkey+txdata 是否有效。

這里有必要介紹一下P2PKH(Pay-to-Public-Key-Hash),比特幣中大部分交易以p2pkh交易腳本實現,用scriptpubkey鎖定腳本,script解鎖。在以上實現中,直接用公鑰,公鑰hash,簽名實現鎖定與解鎖的過程,簡化了script腳本語言這一過程。

也正是因為這樣的腳本語言,可以表達出無數的條件變種,也使得智能合約成為可能。

5、共識pow

當交易完成,一切必要數據均以生成,區塊生成就可以直接加入區塊鏈中嗎?在比特幣中,在去中心情況下各節點需要對這個交易的有效性達成共識,才能真正加入區塊鏈中。

比特幣實現這個共識的方法主要包括兩個部分:

(1)激勵:通過每個區塊產生一定量的新比特幣來激勵參與者;

(2)工作量證明(pow):礦機需要證明自己生成區塊的工作有效。

這種有效激勵及證明,維護了整個網絡的正常運轉,保證區塊安全的加入到區塊鏈中。其實現過程簡單來說是對給定數據data與計數器nonce組合進行SHA256哈希運算,如果得到滿足規定的哈希結果(滿足規定個數的0開頭的hash值),則驗證通過。為了得到有效結果,我們需要不停的遞增nonce計數器值進行sha256計算,直到結果有效。

在比特幣實現中采用的是hashcash算法。其實算法的思路簡單較易實現,各節點間只需通過驗證計數器nonce即可達成共識。當然這里也暴露出一些安全問題,如果只要有足夠的挖礦算力(超過整個系統算力的51%)就能對系統成功進行攻擊。所以這里也衍生了其他的一些共識機制,比如權益證明pos(proof of stake)這里就不介紹了。

6、網絡

說道網絡組成,我們都知道比特幣的網絡部分屬于去中心化的p2p網絡。每一個網絡節點客戶機器根據其功能有不同的劃分。比如包含區塊鏈完整數據的全節點,負責挖礦的礦工節點,客戶端節點等。初始節點加入網絡,通過種子節點連接到網絡中其他節點,連接建立后通過getblock,getaddr,getdata等消息于其他節點交換信息,比如發現新節點,交換數據數據等等。

總結:

對基本概念有所了解后,不考慮網絡實現實際可以動手實現一個簡易程序。網絡實現部分在開源社區也有很多解決方案,有基于go-libp2p實現網絡部分的區塊鏈demo,但是相關概念不算豐富,但是卻給了一個實現方式的思路,可以基于go-libp2p完善這部分的結構。

java簽名,如何快速學習了解區塊鏈