比特幣學(xué)習(xí)

1.密碼學(xué)以及加密貨幣簡(jiǎn)單介紹

我們知道加密貨幣是基于密碼學(xué)的,密碼學(xué)運(yùn)用了一些很巧妙的但是很高深的數(shù)學(xué)理論,而比特幣只是使用了相對(duì)簡(jiǎn)單的密碼學(xué)的知識(shí),哈希和數(shù)字簽名。

1.1 Hash函數(shù)

Hash函數(shù)有以下幾點(diǎn)屬性:

  • 輸入可以是任意大小的string
  • 輸出大小是固定的
  • 計(jì)算n位字符串耗時(shí)O(n)

對(duì)于比特幣的Hash函數(shù)(比特幣用的SHA - 256,輸出大小是256位):

  • collision‐resistance
    collision:兩個(gè)不同的x、y,H(x) == H(y)
    ?collision‐resistance是指沒(méi)人能找到collision ,但是collision是存在的
    ?為了找到collision,計(jì)算機(jī)需要計(jì)算2^256 +1次(最壞情況),2^128 次(平均情況)
    ?這是什么概念?把所有計(jì)算機(jī)從宇宙開(kāi)始至今找到collision的幾率都非常低
    ?但是沒(méi)有任何一個(gè)hash 函數(shù)被證明是collision‐resistance的,因?yàn)楦怕侍貏e低,所以我們可以認(rèn)為它是collision‐resistance
    ?例子:兩個(gè)文件的hash值相同,我們就可以認(rèn)為是同一個(gè)文件
  • hiding
    假設(shè)r取值范圍是非常發(fā)散的,給定y = H(r||x),找到x是不太可行的(||串聯(lián))
  • puzzle‐friendliness
    假設(shè)r取值范圍是非常發(fā)散的,給定y = H(r||x),y是n位輸出,在時(shí)間小于O(2^n)不可能找到x
    ?這意味著想要hash函數(shù)輸出一個(gè)特定的值,如果隨機(jī)選取x,那么找到特定值是非常困難的

目前有很多種Hash函數(shù),比特幣使用的是SHA - 256 算法:

1.2 Hash指針

Hash指針不僅能獲取信息,也能驗(yàn)證該信息是否被改變
在普通使用指針的數(shù)據(jù)結(jié)構(gòu)中,都可以把指針替換為Hash指針,例如,鏈表(blockchain)、二叉樹(shù)(Merkle樹(shù))

  • blockchain
    blockchain的一個(gè)有用的使用場(chǎng)景是防篡改日志,當(dāng)前只會(huì)保存創(chuàng)世塊的Hash指針,假設(shè)a塊被篡改為a1塊,此時(shí)b塊存貯a塊的Hash值就會(huì)不一致,因?yàn)閏ollision‐resistance,因?yàn)閍!=a1 所以H(a) != H(a1),此時(shí)就會(huì)檢測(cè)到不一致,如果還想成功篡改,那么就需要篡改b塊的數(shù)據(jù),以此類推會(huì)一直到創(chuàng)世塊,但是創(chuàng)世塊的Hash值是已經(jīng)被記錄的,所以篡改始終會(huì)被檢測(cè)到


    image.png
  • Merkle樹(shù)
    Merkle樹(shù)就是用Hash指針的二叉樹(shù),data都是葉子節(jié)點(diǎn),每?jī)蓚€(gè)葉子節(jié)點(diǎn)組成的父節(jié)點(diǎn)包含兩個(gè)相應(yīng)的Hash指針,如下圖


    image.png

    根據(jù)blockchain,Merkle樹(shù)也是能夠檢測(cè)到篡改的,只需要記錄根節(jié)點(diǎn)的Hash指針

1.3 數(shù)字簽名

比特幣使用的是ECDSA,橢圓曲線數(shù)字簽名算法,是一種非對(duì)稱加密的算法
公鑰的主要作用:加密;驗(yàn)證簽名。私鑰的主要作用:簽名;解密。
通過(guò)私鑰可以計(jì)算出公鑰,反之則不行。
公鑰加密:公鑰加密的內(nèi)容可以用私鑰來(lái)解密——只有私鑰持有者才能解密。
私鑰簽名:私鑰簽名的內(nèi)容可以用公鑰驗(yàn)證。公鑰能驗(yàn)證的簽名可以認(rèn)為是私鑰簽名的。

signature = sign(sk, msg) //sk: secret key
isValid = verify(pk, msg, signature) // pk: public key
ECDSA算法:
    Private key: 256位
    Public key, uncompressed: 512位
    Public key, compressed: 257位
    Message to be signed: 256位(限制大小、提高效率; 經(jīng)過(guò)RSA-256算法哈希過(guò)的message就是256位)
    Signature: 512位

技巧:1.msg大小是任意的,所以可以簽名H(msg)。 2.簽名Hash指針,這樣整個(gè)區(qū)塊都會(huì)被保護(hù)(可以只簽名blockchain 的最后一個(gè)區(qū)塊的Hash指針,這樣整個(gè)blockchain都被保護(hù))

公鑰的Hash作為身份標(biāo)識(shí)(比特幣的地址)

2.比特幣如何實(shí)現(xiàn)去中心化

比特幣實(shí)現(xiàn)去中心化是通過(guò)技術(shù)與激勵(lì)機(jī)制結(jié)合實(shí)現(xiàn)的,但是沒(méi)有真正意義上的去中心化

2.1 比特幣去中心化的5個(gè)問(wèn)題
2.2 分布式共識(shí)

比特幣基于p2p網(wǎng)絡(luò)的,當(dāng)Alice向Bob支付Btc的時(shí)候,實(shí)際上會(huì)廣播這一筆交易到所有的比特幣網(wǎng)絡(luò)節(jié)點(diǎn)。


image.png

注意Bob在不在線不會(huì)影響到他是否接收這筆錢(qián)
很多用戶都在廣播這些交易到整個(gè)網(wǎng)絡(luò),各個(gè)節(jié)點(diǎn)必須完成共識(shí)這些交易的的合法性,以及發(fā)生的順序,這樣系統(tǒng)會(huì)有一個(gè)全局的賬本,為了提高效率,把很多交易打包成塊,基于這些區(qū)塊完成共識(shí)就行了,賬本記錄了已經(jīng)達(dá)成共識(shí)的區(qū)塊組成一條blockchain
每個(gè)節(jié)點(diǎn) 都有一個(gè)池子,保存了收到的未完成的交易(還沒(méi)有被包含進(jìn)blockchain)因?yàn)槭莗2p網(wǎng)絡(luò),每個(gè)節(jié)點(diǎn)池子里的交易可能不一樣,那么所有的節(jié)點(diǎn)怎么共識(shí)確定一個(gè)block呢?
一種方法:假設(shè)每間隔固定時(shí)間(10分鐘),每個(gè)節(jié)點(diǎn)從自己的池子里打包一些交易作為block,輸入某種共識(shí)協(xié)議中,最終會(huì)輸出一個(gè)合法的、已經(jīng)共識(shí)確認(rèn)的block作為blockchain的最后一個(gè)block,剩余未打包的交易,等待下次block確認(rèn)就行了
上面方法和比特幣有點(diǎn)類似,但比特幣并不是這么工作的。因?yàn)槟承┕?jié)點(diǎn)可能會(huì)崩潰,或者是惡意的;而且p2p網(wǎng)絡(luò)不是完美的,延遲等各種問(wèn)題讓所有節(jié)點(diǎn)運(yùn)行某種共識(shí)協(xié)議不太可行

  • 比特幣的共識(shí)機(jī)制(Proof Of Work)
    因?yàn)楸忍貛啪W(wǎng)絡(luò)所有節(jié)點(diǎn)都沒(méi)有身份標(biāo)識(shí)的,所以沒(méi)有辦法懲罰那些惡意節(jié)點(diǎn)(eg包含非法交易、二次消費(fèi)),但是正因?yàn)楸忍貛攀且环N貨幣,所以可以通過(guò)獎(jiǎng)勵(lì)比特幣的方式來(lái)獎(jiǎng)勵(lì)誠(chéng)實(shí)的節(jié)點(diǎn),所有的節(jié)點(diǎn)在不斷地競(jìng)爭(zhēng)計(jì)算機(jī)的算力,去解決一個(gè)hash 謎題,找到一個(gè)nounce值,連接前一個(gè)區(qū)塊的hash以及本區(qū)塊的交易,然后hash計(jì)算得出一個(gè)值,這個(gè)值需要小于某個(gè)targe
H(nonce || prev_hash || tx || tx || ... || tx) < target

這樣就找到個(gè)下一個(gè)區(qū)塊?,F(xiàn)在一個(gè)區(qū)塊就包含了一系列交易、上一個(gè)區(qū)塊的hash值、以及一個(gè)nounce值,由于puzzle‐friendliness屬性,想要找到這個(gè)nounce值只能一個(gè)個(gè)去試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容