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ī)從宇宙開始至今找到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)、二叉樹(Merkle樹)
-
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è)到
-
Merkle樹
Merkle樹就是用Hash指針的二叉樹帽馋,data都是葉子節(jié)點(diǎn)搅方,每?jī)蓚€(gè)葉子節(jié)點(diǎn)組成的父節(jié)點(diǎn)包含兩個(gè)相應(yīng)的Hash指針,如下圖
根據(jù)blockchain绽族,Merkle樹也是能夠檢測(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)洞翩。
注意Bob在不在線不會(huì)影響到他是否接收這筆錢
很多用戶都在廣播這些交易到整個(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ū)塊⊥髌裕現(xiàn)在一個(gè)區(qū)塊就包含了一系列交易、上一個(gè)區(qū)塊的hash值庐冯、以及一個(gè)nounce值孽亲,由于puzzle‐friendliness屬性,想要找到這個(gè)nounce值只能一個(gè)個(gè)去試展父。