搞懂區(qū)塊鏈,你是不是先該看看中本聰?shù)恼撐模?2)

第2部分:一些基本概念以及它們?cè)诒忍貛胖惺窃趺从玫?/h2>

2.1 什么是比特幣系統(tǒng)旨别?

廣義上的比特幣是指比特幣系統(tǒng)诗赌,也就是指中本聰設(shè)計(jì)的這套電子支付系統(tǒng)。比特幣系統(tǒng)本質(zhì)上就是一個(gè)電子記賬簿秸弛。從這一點(diǎn)上說(shuō)铭若,比特幣的電子賬簿系統(tǒng)其實(shí)和現(xiàn)代商業(yè)銀行的后臺(tái)賬簿系統(tǒng)非常相似:你有多少余額洪碳,從哪收過(guò)款,給誰(shuí)匯過(guò)錢……這些內(nèi)容都可以在這個(gè)后臺(tái)賬簿中找到對(duì)應(yīng)的數(shù)字和記錄奥喻,并以其為準(zhǔn)偶宫。只不過(guò)對(duì)于傳統(tǒng)賬簿來(lái)說(shuō),記賬權(quán)由商業(yè)銀行等某個(gè)中心化機(jī)構(gòu)所擁有环鲤,所有交易細(xì)節(jié)也不必公開(kāi)和永久保留纯趋,只要保證每個(gè)賬戶余額不錯(cuò)就沒(méi)問(wèn)題;而比特幣的思路是“所有人共同維護(hù)同一個(gè)賬簿冷离,公開(kāi)透明且人手一份吵冒,賬簿的記賬權(quán)由分布在全網(wǎng)各處的大伙共同擁有,進(jìn)而從根本上杜絕中心化操作帶來(lái)的弊端和風(fēng)險(xiǎn)西剥。

由于記賬權(quán)是分布式的痹栖,一些對(duì)于中心化方式來(lái)說(shuō)非常簡(jiǎn)單的問(wèn)題,比如賬簿一致性瞭空、交易安全性揪阿、交易時(shí)序性、如何記賬咆畏、怎么激勵(lì)等南捂,對(duì)于比特幣系統(tǒng)來(lái)說(shuō)都要重新設(shè)計(jì)。因此旧找,為保障這個(gè)分布式的記賬系統(tǒng)能夠安全穩(wěn)定的運(yùn)行溺健,比特幣系統(tǒng)采用了大量密碼學(xué)原理和一些獨(dú)特的機(jī)制。

2.2 什么是比特幣钮蛛?

狹義上的比特幣是指中本聰?shù)倪@套支付系統(tǒng)中所使用的貨幣的名稱鞭缭,用BTC(BitCoin)表示。在比特幣世界中魏颓,比特幣是通過(guò)“挖礦”創(chuàng)造出來(lái)的岭辣,這些新產(chǎn)生的比特幣,以挖礦獎(jiǎng)勵(lì)的交易形式發(fā)放給成功挖礦的人甸饱,然后再通過(guò)自由交易的方式擴(kuò)散到普通用戶手中:“某年某月某日某時(shí)易结,系統(tǒng)獎(jiǎng)勵(lì)礦工張三12.5個(gè)比特幣;某年某月某日某時(shí)柜候,張三又把挖礦攢的10000比特幣給了李四(可能是換了兩個(gè)披薩餅)搞动;某年某月某日某時(shí),王五把麻六和趙七分別給他的10個(gè)和6.789個(gè)比特幣分別給了周大11.789個(gè)和孫二5個(gè)……”渣刷,這些一條條代碼化了的轉(zhuǎn)賬記錄(也稱為交易記錄)就組成了比特幣世界中的賬簿鹦肿。這些交易記錄就構(gòu)成了比特幣(具體定義見(jiàn)后續(xù)UTXO章節(jié))。比特幣中的賬簿之所以只記錄交易細(xì)節(jié)而不合并成賬戶余額的原因辅柴,主要是為了保留每一筆花費(fèi)的歷史線索箩溃,這樣既便于追溯驗(yàn)證瞭吃,也能防止篡改。而且涣旨,只要確保所有的交易信息都能記清楚歪架,那么大家各自有多少錢很容易就能算出來(lái)了,因此這些交易記錄中也不必單獨(dú)設(shè)立“余額”的部分霹陡。

由于比特幣系統(tǒng)中沒(méi)有中心機(jī)構(gòu)統(tǒng)一記賬和蚪,這些交易記錄是由大家共同驗(yàn)證和認(rèn)可后,并由一些人通過(guò)競(jìng)爭(zhēng)的方式最終計(jì)入賬簿的烹棉,因此這個(gè)賬簿就具有最高的權(quán)威性攒霹。每個(gè)人有多少錢,某筆交易算不算數(shù)浆洗,只能賬簿說(shuō)了算催束。某筆錢只要在這個(gè)統(tǒng)一賬簿中有記錄,那么大家就認(rèn)可這筆錢的所有權(quán)轉(zhuǎn)移伏社,如果找不到該記錄抠刺,就相當(dāng)于這筆交易從未發(fā)生過(guò),其中涉及的比特幣也就不會(huì)被轉(zhuǎn)移摘昌。因此速妖,確認(rèn)自己的交易在不在一個(gè)合法的大賬本上,是確認(rèn)比特幣是否成功轉(zhuǎn)移的唯一方式第焰。

以上就是比特幣的核心思想买优,但是要實(shí)現(xiàn)以上的這些功能妨马,不能簡(jiǎn)單的依靠約定或法令挺举,而需要由一套復(fù)雜的數(shù)學(xué)原理和程序機(jī)制來(lái)保障。因此烘跺,比特幣并不僅僅是一個(gè)簡(jiǎn)單奇思妙想湘纵,而是建立在了一套復(fù)雜的專業(yè)知識(shí)之上的。事實(shí)上滤淳,中本聰本人就是一位同時(shí)精通密碼學(xué)梧喷、經(jīng)濟(jì)學(xué)理論、以及懂編程的天才極客脖咐;而且铺敌,比特幣世界的的很多重要理論和基礎(chǔ)其實(shí)早在之前就已經(jīng)有人作出了深入的研究和成果∑ㄉ茫可以說(shuō)偿凭,比特幣的機(jī)制是一個(gè)多學(xué)科知識(shí)融匯交織組合創(chuàng)新的綜合體系,有一定復(fù)雜性派歌。因此想要弄清楚比特幣的基本原理弯囊,在進(jìn)行中本聰?shù)恼撐姆治鲋疤瞪冢覀冞€需要了解一些基礎(chǔ)概念和相關(guān)知識(shí)。

好在這些基本知識(shí)并不復(fù)雜匾嘱,也不需要多么深厚的專業(yè)功底斤斧。接下來(lái),我們將對(duì)這些基本概念及其在比特幣中是怎么應(yīng)用的做簡(jiǎn)要介紹霎烙,為后續(xù)深刻理解和體會(huì)中本聰?shù)谋忍貛虐灼?shū)做好鋪墊撬讽。為了確保通俗性,我們將忽略嚴(yán)謹(jǐn)性吼过,只抓相關(guān)內(nèi)容的主要方向锐秦。

2.3 哈希函數(shù)

哈希函數(shù)(Hash?Function),也稱為散列函數(shù)盗忱,是比特幣理論中最重要的一類函數(shù)酱床。哈希函數(shù)有一個(gè)非常神奇的功能:可以將任意長(zhǎng)度的一段字符(稱為源文或明文)抽提為一串固定長(zhǎng)度的二進(jìn)制碼(哈希值)。根據(jù)抽提規(guī)則不同趟佃,目前主要包括MD4扇谣、MD5、SHA1闲昭、SHA256罐寨、RIPEMD160、TIGER等序矩。在比特幣中常用的哈希函數(shù)主要有SHA256和RIPEMD160等鸯绿。

有了哈希函數(shù),我們就可以將任意長(zhǎng)度的文字“壓縮”成一個(gè)特定長(zhǎng)度的字符串簸淀,并且在二者之間形成一種映射關(guān)系瓶蝴。在很多時(shí)候,我們甚至可以用這串壓縮后的字符作為那個(gè)長(zhǎng)篇文字的替身或者標(biāo)簽來(lái)使用租幕。從哈希函數(shù)的功能和原理舷手,我們能推導(dǎo)出這個(gè)函數(shù)所具有的五個(gè)神奇性質(zhì):

2.3.1 性質(zhì)1——單值性(只能一對(duì)一)

同一種哈希計(jì)算規(guī)則下,只要明文確定劲绪,則必有且僅有一個(gè)哈希值與之對(duì)應(yīng)男窟,也就是說(shuō)一個(gè)明文只會(huì)生成一個(gè)哈希值。

但是這里要說(shuō)明的是贾富,這個(gè)值雖然只有一個(gè)歉眷,但其呈現(xiàn)形式并不是唯一的:采用不同的表示方法的話,同一個(gè)哈希值的樣子看起來(lái)也會(huì)不一樣颤枪,但本質(zhì)上依然還是那個(gè)值汗捡,大小沒(méi)有變。以SHA256這類哈希函數(shù)為例汇鞭,其哈希結(jié)果是一個(gè)由0和1組成的256位數(shù)值凉唐,由于256位二進(jìn)制數(shù)實(shí)在太長(zhǎng)了庸追,表示起來(lái)很不方便,因此哈希值也常常采用十六進(jìn)制表示台囱,這樣256位就可以縮減到64位淡溯,字符也從0、1兩種變?yōu)?-9簿训、a咱娶、b、c强品、d膘侮、e、f共十六種的榛。

比如大寫(xiě)字母“A”經(jīng)哈希函數(shù)(SHA256)計(jì)算后琼了,其結(jié)果用二進(jìn)制表示的話是:

SHA256(A)=0101010110011010111010101101000010000010011001001101010101111001010111010011100100001001011100011000110011011101000001011010101111010100100101010111001011101000010011111110010101010101100100001110111011110011000110101000100010100000100011111101111111111101

而用十六進(jìn)制表示的話是:

SHA256(A)=559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd

再比如,中本聰?shù)恼撐臉?biāo)題“Bitcoin: A Peer-to-Peer?Electronic Cash System”這句話經(jīng)哈希函數(shù)(SHA256)計(jì)算后的哈希值為:

SHA256(Bitcoin: A Peer-to-Peer?Electronic Cash System)=

efb5c6729d8ce3e03fd03aec340540b24a788454d45e717089b1e59243e16f43

2.3.2?性質(zhì)2——單向性(反推不出明文)

哈希函數(shù)的單向性是指:不論明文多么簡(jiǎn)單或者多復(fù)雜夫晌,找到其哈希值是非常容易的雕薪,只需要對(duì)該明文做哈希運(yùn)算即可,但如果想從哈希值反推出對(duì)應(yīng)的明文則是不可能的晓淀。也就是說(shuō)所袁,我們不能從任意一個(gè)哈希結(jié)果反推出其函數(shù)的輸入值。這點(diǎn)類似于就算我們知道了“100個(gè)人中有40個(gè)穿了紅色外套凶掰,另外60個(gè)戴了藍(lán)色帽子這個(gè)結(jié)果信息之后燥爷,依然無(wú)法反推出這100個(gè)人分別叫什么名字”一樣。

說(shuō)到底懦窘,哈希函數(shù)只是對(duì)明文的抽提和摘要前翎,而不包括明文的具體信息,因此是無(wú)法從哈希值反推出明文內(nèi)容的奶赠。哈希值的單向性為比特幣內(nèi)很多基本要素的安全不可逆提供了保障鱼填。

2.3.3?性質(zhì)3——高敏性(防篡改)

對(duì)于哈希函數(shù)的明文來(lái)說(shuō)药有,即便是產(chǎn)生了一點(diǎn)微小的變化毅戈,其新哈希值也會(huì)和原哈希值完全不同。同樣愤惰,我們以中本聰?shù)恼撐臉?biāo)題為例苇经,僅將其中的“:”修改成“,”后,變?yōu)椤癇itcoin, A

Peer-to-Peer Electronic Cash System”宦言,對(duì)這個(gè)明文求哈希值(SHA256)后得到:

SHA256(Bitcoin, A?Peer-to-Peer Electronic Cash System)=

0e868099b04b14a4ce70f1ce5d5fc03efd071596ba8798036dc823e0abcb2257

可以看出扇单,盡管只是對(duì)原有明文做了極微小的改動(dòng)蜘澜,得到的這個(gè)新哈希值和2.1.1中的原哈希值也會(huì)完全不同瞪醋。哈希函數(shù)的高敏性可以應(yīng)用在對(duì)明文是否被篡改過(guò)的識(shí)別上,進(jìn)而保護(hù)明文的初始性和真實(shí)性宾巍。在比特幣中,對(duì)交易內(nèi)容的哈希運(yùn)算就是為了確保交易單上的重要內(nèi)容不會(huì)在傳播過(guò)程中被修改确丢,或者說(shuō),只要有人修改了某個(gè)交易單上的內(nèi)容描函,交易單的內(nèi)容就和其哈希值對(duì)不上了,該交易單就會(huì)被作為無(wú)效交易單而拋棄,不會(huì)被錄入篡撵。

2.3.4?性質(zhì)4——抗碰撞(很難多對(duì)一)

不同的兩個(gè)明文,經(jīng)過(guò)相同哈希函數(shù)后產(chǎn)生的哈希值居然一模一樣膛檀,這種現(xiàn)象稱為哈希碰撞泳炉。

從理論上來(lái)說(shuō),如果明文的字符量很大時(shí)(比如一整部書(shū)的內(nèi)容),其字符變化的全部可能性肯定會(huì)遠(yuǎn)遠(yuǎn)多于其哈希值的全部可能性(畢竟哈希結(jié)果的位數(shù)是有限的),因此根據(jù)“抽屜原理”(抽屜原理:5個(gè)蘋(píng)果放進(jìn)4個(gè)抽屜锻狗,則一定至少有一個(gè)抽屜里裝了兩個(gè)以上的蘋(píng)果),理論上是存哈希碰撞的可能性的。即兩個(gè)完全不同的明文經(jīng)過(guò)哈希運(yùn)算后崇众,其哈希值居然完全一樣的情況是有可能出現(xiàn)的。不過(guò)眯漩,我們可以從另一個(gè)計(jì)算中得出這樣的概率究竟有多低:

以SHA256為例,其哈希值是一個(gè)256位的二進(jìn)制數(shù)灼狰,因此其全部可能性有2256種,這個(gè)數(shù)字有多大呢,大概為1.16*1077,也就是說(shuō)這個(gè)數(shù)寫(xiě)出來(lái)后吸重,總共有78位那么長(zhǎng)烦秩。我們?cè)賮?lái)看看整個(gè)宇宙中所有已知的普通物質(zhì)的數(shù)量有多少教馆,包括所有星系、黑洞椎镣、恒星、行星、衛(wèi)星以及我們地球上所有的物質(zhì)(生物译断、空氣巡语、水和巖石等……)荤堪,組成所有這些人類已知物質(zhì)的總原子數(shù)量拥知,加起來(lái)大概為7.31*1079肮塞,這是個(gè)非常龐大的數(shù)字,大到已經(jīng)很難在現(xiàn)實(shí)生活中給超過(guò)它的數(shù)字找到物理意義了。而哈希算法的可能性竟然和這個(gè)數(shù)字相差不多。另外糠睡,如果以目前運(yùn)算速度已達(dá)到9.1億億次/秒的超級(jí)計(jì)算機(jī)神威.太湖之光為例,如果想要窮盡哈希運(yùn)算的全部可能性其掂,至少也要需要1052年的時(shí)間,也就是說(shuō),直至算到太陽(yáng)系毀滅(大約還剩5*109年)也才剛剛開(kāi)了個(gè)頭沽讹。因此洞坑,對(duì)于人類現(xiàn)有計(jì)算能力來(lái)說(shuō)排拷,出現(xiàn)哈希碰撞的幾率是非常非常非常小的藤违,小到幾乎不會(huì)發(fā)生璧榄。

2.3.5?性質(zhì)5——近似隨機(jī)性(擲骰子)

哈希函數(shù)的結(jié)果雖然只有唯一一個(gè)搓蚪,但這個(gè)結(jié)果在計(jì)算之前是無(wú)法推測(cè)和估計(jì)出來(lái)的搜骡。這種對(duì)結(jié)果無(wú)法預(yù)先做出任何預(yù)先猜測(cè)的性質(zhì)记靡,讓哈希函數(shù)在很多時(shí)候甚至被當(dāng)成隨機(jī)函數(shù)來(lái)使用谈竿。由于這種隨機(jī)性從數(shù)學(xué)上來(lái)說(shuō),畢竟不是嚴(yán)格的隨機(jī)性摸吠,因此稱為偽隨機(jī)性空凸,或者近似隨機(jī)性。

在比特幣的“工作量證明”(POW)機(jī)制中寸痢,就是通過(guò)不斷的改變明文中的幾個(gè)字符來(lái)檢查哈希運(yùn)算的結(jié)果是否達(dá)到了某種要求的呀洲。這一點(diǎn)很像擲骰子——雖然最終一定會(huì)停在一個(gè)點(diǎn)數(shù)上,但在投之前是無(wú)法知道的啼止,只不過(guò)擲骰子結(jié)果的可能性只有六種道逗,而哈希函數(shù)的結(jié)果可能性則有1077之多。比特幣就是利用了這個(gè)特性來(lái)衡量工作量證明的献烦,同時(shí)控制比特幣產(chǎn)出的難度和速度滓窍。

2.3.6 WHY SHA256?

正是基于以上哈希函數(shù)這些獨(dú)特的性質(zhì),在比特幣世界中巩那,哈希函數(shù)吏夯,尤其是SHA256函數(shù)被廣泛應(yīng)用到數(shù)據(jù)索引、簽名驗(yàn)證即横、工作量證明等多個(gè)環(huán)節(jié)噪生,可以說(shuō)哈希函數(shù)是比特幣世界中最重要的密碼學(xué)原理之一。在眾多哈希算法中令境,中本聰最終主要選擇了SHA256杠园,主要是因?yàn)樵?008年SHA256被公認(rèn)為當(dāng)時(shí)最安全的哈希算法,即便經(jīng)過(guò)十年時(shí)間舔庶,SHA256依然經(jīng)受住了無(wú)數(shù)應(yīng)用的考驗(yàn)抛蚁,證明了其安全性。盡管后來(lái)出現(xiàn)了SHA-3惕橙,SCRYPT等其他算法瞧甩,在目前人類的計(jì)算條件下,SHA256算法依然不可逆弥鹦,具有很高的安全性肚逸。即便未來(lái)量子計(jì)算取得突破,在多次SHA256面前也依然是安全的彬坏。

總之朦促,由于比特幣內(nèi)的很多機(jī)制都是對(duì)哈希函數(shù)各種性質(zhì)的實(shí)際應(yīng)用,因此可以說(shuō)栓始,哈希函數(shù)對(duì)比特幣系統(tǒng)至關(guān)重要务冕,理解哈希函數(shù)對(duì)于理解比特幣的基本原理十分關(guān)鍵。

2.4 非對(duì)稱加密

2.4.1 什么是非對(duì)稱加密

自從人類掌握了信息通訊技術(shù)幻赚,為了保護(hù)信息安全禀忆,防止第三方看懂甚至篡改所傳輸?shù)男畔㈦瘢覀兙托枰獙?duì)信息進(jìn)行加密。過(guò)去的加密方式一般采用對(duì)稱加密的方式箩退,簡(jiǎn)單的說(shuō)离熏,就是A向B發(fā)送的一段信息,其中加密和解密運(yùn)算都選用了同一個(gè)秘鑰(通常為一串字符)戴涝,這樣在不知道這個(gè)秘鑰的情況下滋戳,任何人即便截獲這段信息也完全看不懂,更無(wú)從篡改了喊括。這種方式在一定程度上緩解了信息盜取的風(fēng)險(xiǎn)胧瓜,但仍然不完美矢棚。這是因?yàn)橹J玻珺想要看懂信息也需要知道秘鑰是什么,因而秘鑰也需要從A傳輸給B蒲肋,在這個(gè)過(guò)程中依然存在被監(jiān)聽(tīng)和盜取的風(fēng)險(xiǎn)蘑拯。一旦秘鑰被盜取,之前監(jiān)聽(tīng)到的信息依然可以被破解兜粘。因此申窘,采用對(duì)稱加密還是無(wú)法保證信息傳輸?shù)慕^對(duì)安全傳輸。為了解決這個(gè)問(wèn)題孔轴,1976年由密碼學(xué)家Whitfield Diffie和Martin Hellman博士聯(lián)名發(fā)表了論文”New directions in cryptography”剃法,這一論文通常被認(rèn)為是非對(duì)稱密碼的開(kāi)端。

與對(duì)稱加密不同路鹰,非對(duì)稱加密的秘鑰不是單一的一個(gè)字符串贷洲,而是一個(gè)“秘鑰對(duì)”,包含一對(duì)兒不同的秘鑰晋柱,分別稱為私有秘鑰和公開(kāi)秘鑰优构。其中私有秘鑰可以自行選取,而公開(kāi)秘鑰則是由私有秘鑰計(jì)算產(chǎn)生的雁竞。一段信息如果用公開(kāi)秘鑰加密后只能用私有秘鑰才能解開(kāi)钦椭;反之,用私有秘鑰加密的信息也只有公開(kāi)秘鑰才能進(jìn)行驗(yàn)證碑诉。

采用非對(duì)稱加密后彪腔,如果A想要向B發(fā)送一個(gè)秘密信息,B就可以大大方方的先把自己的公開(kāi)秘鑰發(fā)給A作為加密秘鑰进栽,即使被別人截獲也沒(méi)關(guān)系(公開(kāi)秘鑰也解不開(kāi)用自己加密了的信息)德挣。然后,A就可以用B發(fā)來(lái)的公開(kāi)秘鑰將要發(fā)送的信息加密泪幌,再將加密后的信息直接發(fā)給B盲厌。在這個(gè)過(guò)程中署照,即便別人全程截獲所有信息也不怕,因?yàn)锽的公開(kāi)秘鑰只能加密不能解密吗浩,世界上能解密該加密信息的東西只有一個(gè)建芙,就是B的私有秘鑰,而這個(gè)私有秘鑰由始至終只有B擁有懂扼,從沒(méi)有向外有過(guò)任何透露禁荸。這樣,對(duì)稱加密技術(shù)時(shí)代存在的“秘鑰傳輸不安全問(wèn)題”就得到了圓滿解決阀湿。

2.4.2 非對(duì)稱加密在比特幣中是咋用的

在比特幣世界中赶熟,因?yàn)閭鬏數(shù)牟粌H是信息,還包括價(jià)值(比特幣)陷嘴,因此需要加密技術(shù)保障安全映砖,同時(shí)比特幣交易還有一個(gè)額外的好處,即:比特幣中轉(zhuǎn)賬并不需要知曉并核對(duì)收款人的詳細(xì)信息灾挨,來(lái)防止“千萬(wàn)別匯錯(cuò)了人”這件事邑退,付款人只需要按雙方約定,將比特幣轉(zhuǎn)賬給一個(gè)特定的地址(實(shí)際上是收款人公鑰哈希值)就可以了劳澄。但是這里會(huì)存在一個(gè)問(wèn)題:由于比特幣中的所有交易信息都是全網(wǎng)公開(kāi)的地技,且不存在一個(gè)像支付寶這樣的中心機(jī)構(gòu),誰(shuí)都沒(méi)有權(quán)利給任何人的賬號(hào)余額上加錢或減錢秒拔。那么如何確認(rèn)收款人已經(jīng)收到錢了呢莫矗?又如何防止別人冒領(lǐng)的呢?

比特幣機(jī)制里設(shè)計(jì)了一個(gè)非常巧妙的方法:付款人在把錢轉(zhuǎn)賬給收款人地址之后砂缩,并不需要確認(rèn)收款人是不是收到了作谚,而是在轉(zhuǎn)賬的同時(shí)附加了一個(gè)測(cè)試題目及其解題操作方法(scriptPubKey),就算完事兒了梯轻。這么做的目的是在說(shuō):“請(qǐng)大家見(jiàn)證哈食磕,我已經(jīng)把錢轉(zhuǎn)賬給xxx(收款人)了,這筆錢已經(jīng)不是我的了喳挑,但為了防止別人冒領(lǐng)彬伦,這個(gè)xxx想花這筆錢的時(shí)候還不能直接花,而是先必須按照我提出的操作方法完成測(cè)試伊诵,通過(guò)了才可以单绑,否則他也無(wú)權(quán)花這筆錢。我出的那個(gè)測(cè)試題目其實(shí)人人都可以試哈曹宴,不過(guò)我猜你們通不過(guò)搂橙!”

采用出測(cè)試題驗(yàn)證身份的這種方法聽(tīng)著不靠譜,但事實(shí)上付款人知道笛坦,只有擁有與他所轉(zhuǎn)給的那個(gè)公鑰哈希值所對(duì)應(yīng)的私有秘鑰的那個(gè)人才能通過(guò)測(cè)試区转,而那把私有秘鑰始終安全的保存在收款人手里苔巨,其他人由于沒(méi)有這把私鑰,無(wú)論怎么試都通不過(guò)废离,因此這個(gè)方法很安全侄泽。

在比特幣中應(yīng)用非對(duì)稱加密原理主要為了讓大家驗(yàn)證“交易信息加密用的那個(gè)私有秘鑰和公開(kāi)秘鑰確實(shí)是一對(duì)兒”,也就是上一小節(jié)“反之”后的那部分蜻韭。這里的秘鑰對(duì)兒在比特幣中實(shí)際上就是收款人的比特幣私鑰(以下簡(jiǎn)稱私鑰)和比特幣公鑰(以下簡(jiǎn)稱公鑰)悼尾。由于私鑰和公鑰是成對(duì)的,并且私鑰永遠(yuǎn)自己保管肖方,用私鑰加密的信息只能用唯一對(duì)應(yīng)的公鑰解開(kāi)闺魏,而且如果同時(shí)證明了這個(gè)公鑰對(duì)應(yīng)的人擁有這筆比特幣的所有權(quán),那么就證明這筆交易是合理合法的俯画。其具體方式會(huì)在后續(xù)簽名/驗(yàn)證析桥、論文解析和流程推演環(huán)節(jié)中詳細(xì)涉及。

2.5 私鑰活翩、公鑰烹骨、公鑰哈希翻伺、地址材泄、簽名及驗(yàn)證

2.5.1 一個(gè)小提示

標(biāo)題中的這些內(nèi)容其實(shí)本質(zhì)上都是一些二進(jìn)制數(shù)值。和所有數(shù)值一樣吨岭,在實(shí)際書(shū)寫(xiě)的時(shí)候選擇的格式不一樣拉宗,其表達(dá)形態(tài)就不同。比如用二進(jìn)制表示時(shí)每個(gè)字符就是1個(gè)bit(位)辣辫,用十六進(jìn)制表示時(shí)旦事,每個(gè)字符可以表示4個(gè)bit,而用標(biāo)準(zhǔn)字節(jié)表示數(shù)值長(zhǎng)度的話急灭,每個(gè)字節(jié)表示8個(gè)bit姐浮,每個(gè)十六進(jìn)制字符占半個(gè)字節(jié)長(zhǎng)度。以后面要介紹的公鑰哈希為例葬馋,用二進(jìn)制表示是160個(gè)字符(僅含0和1)卖鲤;十六進(jìn)制表示的話當(dāng)然就是40個(gè)字符(160/4=40,這里的字符僅由0-9畴嘶、a蛋逾、b、c窗悯、d区匣、e、f這十六個(gè)組成)蒋院;而換算為標(biāo)準(zhǔn)字節(jié)長(zhǎng)度時(shí)就變成了20個(gè)字節(jié)(160/8=20亏钩,比特幣中沒(méi)有所謂的標(biāo)準(zhǔn)字符莲绰,一般只用標(biāo)準(zhǔn)字節(jié)來(lái)衡量某個(gè)數(shù)值的長(zhǎng)度)」贸螅“字節(jié)數(shù)”和“字符個(gè)數(shù)”是兩個(gè)不同的概念钉蒲,后續(xù)介紹中,由于很多數(shù)值位數(shù)較多彻坛,容易弄混顷啼,給理解和學(xué)習(xí)帶來(lái)一些干擾,可稍加留意昌屉。

此外钙蒙,比特幣中的“私鑰”和“地址”還會(huì)采用了一種BASE58格式(可以理解成一種58進(jìn)制的表示方法)。與常用的字符類型相比间驮,BASE58字符由1-9(不含0)躬厌、a-k、m-z(不含l)竞帽、A-H扛施、J-N、P-Z(不含O和I)組成屹篓,且不含+和/等疙渣,共58個(gè)字符組成,也就是說(shuō)堆巧,所有容易認(rèn)錯(cuò)和隔斷雙擊復(fù)制的字符都不含妄荔。不過(guò)“私鑰”和“地址”等數(shù)值一般也不會(huì)直接轉(zhuǎn)成BASE58格式,而是在轉(zhuǎn)化前谍肤,還要再加上了一些額外數(shù)值(此時(shí)其二進(jìn)制數(shù)值已經(jīng)發(fā)生變化了)啦租。以對(duì)“公鑰哈希“進(jìn)行BASE58運(yùn)算后得到“地址”為例荒揣,公鑰哈希本身20字節(jié)篷角,轉(zhuǎn)化前需要再加上1字節(jié)版本和4字節(jié)校驗(yàn)位共25字節(jié),對(duì)這25字節(jié)數(shù)值BASE58運(yùn)算系任,轉(zhuǎn)化后得到的字符總數(shù)一般為27-34個(gè)恳蹲,就是我們常說(shuō)的比特幣地址,后續(xù)會(huì)介紹到赋除。

盡管不同的表示方法下阱缓,同一個(gè)數(shù)值看起來(lái)非常不一樣,但其實(shí)本質(zhì)上他們很多都是同一個(gè)數(shù)举农,大小也完全相同荆针,并且都可可逆的轉(zhuǎn)換為同一個(gè)由0、1組成的二進(jìn)制數(shù)值。在本文中航背,“公鑰”喉悴、“公鑰哈暇撩模”箕肃、“簽名”一般為十六進(jìn)制表示,“私鑰”和“地址”一般以BASE58形式表示今魔。

2.5.2 私鑰

比特幣私鑰(簡(jiǎn)稱私鑰)就是一段256位的二進(jìn)制數(shù)字勺像,通常是隨機(jī)產(chǎn)生的。這個(gè)數(shù)字在后續(xù)依照不同算法可以依次生成公鑰错森、公鑰哈希吟宦、地址、以及簽名等其他重要內(nèi)容涩维,是用戶花費(fèi)其下比特幣的唯一憑證殃姓,因此私鑰是比特幣用戶最最重要的內(nèi)容,需要嚴(yán)格保存防止泄露瓦阐。

私鑰一般有三種表示方法:直接十六進(jìn)制表示(64位)蜗侈、BASE58非壓縮(以5開(kāi)頭)和BASE58壓縮(以K或L開(kāi)頭)。這些不同的表示方法本質(zhì)上還是由那段256位的二進(jìn)制碼直接格式轉(zhuǎn)化而成的睡蟋,不過(guò)是對(duì)其附加上了一些附加變換和校驗(yàn)計(jì)算(BASE58)踏幻,目的是為了便于肉眼識(shí)別,手動(dòng)輸入時(shí)不至于寫(xiě)錯(cuò)薄湿,同時(shí)萬(wàn)一輸錯(cuò)了叫倍,系統(tǒng)也會(huì)發(fā)現(xiàn)(因?yàn)樾r?yàn)碼會(huì)對(duì)不上)。其中BASE58壓縮格式為目前主要的表示方式豺瘤,比如:

KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88就是一個(gè)BASE58壓縮格式的私鑰,其計(jì)算公式如下:

私鑰=BASE58(version+256位隨機(jī)數(shù)+是否支持壓縮)

在比特幣中听诸,私鑰的作用有兩個(gè):

1坐求、生成公鑰;

2晌梨、對(duì)任意一段信息(如某個(gè)交易的哈希值)進(jìn)行簽名桥嗤,也就是進(jìn)行非對(duì)稱加密。(詳見(jiàn)2.5.6 簽名和驗(yàn)證)

2.5.3 公鑰

比特幣公鑰(簡(jiǎn)稱公鑰)是由私鑰生成的仔蝌。其生成算法為橢圓曲線數(shù)字簽名算法(SECP256K1泛领,不懂這個(gè)算法對(duì)理解比特幣基本原理影響不大,反正就是不可逆敛惊,很安全)渊鞋。這個(gè)過(guò)程和哈希函數(shù)有些類似,也是單向的,即:私鑰可以生成公鑰锡宋,但反過(guò)來(lái)用公鑰是無(wú)法推出私鑰的儡湾。其計(jì)算公式如下:

公鑰=SECP256K1(私鑰)

與上述的私鑰形式相對(duì)應(yīng),公鑰也包括兩種形式:壓縮型和非壓縮型(壓縮型是比特幣開(kāi)發(fā)人員后來(lái)意識(shí)到的执俩,根據(jù)橢圓曲線算法徐钠,原來(lái)的公鑰值的一部分實(shí)際上是冗余的,因此可以通過(guò)壓縮節(jié)省空間役首,進(jìn)而減少交易信息長(zhǎng)度尝丐,為了兼容舊的冗余版本,而重新引入了壓縮型的公鑰形式)衡奥,二者可以隨時(shí)相互轉(zhuǎn)換摊崭。早期的公鑰為非壓縮型公鑰,以“04”開(kāi)頭杰赛,長(zhǎng)度為65字節(jié)(十六進(jìn)制表示下是130個(gè)字符)呢簸;目前新的比特幣客戶端均默認(rèn)采用壓縮型,其公鑰字節(jié)長(zhǎng)度為33字節(jié)(十六進(jìn)制表示下是66位)乏屯,以“02”或“03”開(kāi)頭根时。如:0324c073fa0616619b0b28b6933b08ef888492c18810774b1f340c0fe6b0bb3b75就是一個(gè)公鑰。這里公鑰主要是用十六進(jìn)制表示的辰晕,不必采用BASE58編碼主要是因?yàn)楣€很少需要用戶直接辨認(rèn)或操作蛤迎,因此不必經(jīng)過(guò)BASE58轉(zhuǎn)化。

在比特幣中含友,公鑰的作用主要有兩個(gè):

1替裆、 收款人使用某筆錢時(shí),需要提供自己的公鑰來(lái)證明之前別人給他的錢到底是不是給他的窘问;

2辆童、驗(yàn)證私鑰簽名(加密)后的交易信息。(簽名/驗(yàn)證功能)

公鑰也是比較重要的信息惠赫,盡管公開(kāi)公鑰不會(huì)造成用戶的比特幣被盜取把鉴,但別人就可以很方便的查到該用戶以往的交易記錄,容易造成用戶隱私的泄露儿咱。也因此庭砍,才會(huì)出現(xiàn)后續(xù)的公鑰哈希和地址。這里收款地址不直接使用公鑰而使用了公鑰的哈希值的目的主要是為了進(jìn)一步保護(hù)收款人的公鑰不被泄露混埠。

2.5.4 公鑰哈希

“公鑰哈系「祝”既是一個(gè)專有名詞,也可以理解為是對(duì)公鑰進(jìn)行多重哈希計(jì)算后的得到的值钳宪。具體來(lái)說(shuō)揭北,它是對(duì)公鑰先進(jìn)行一次SHA256扳炬,然后再進(jìn)行一次RIPEMD160,最終形成一個(gè)20字節(jié)的字符串罐呼,比如:“46af3fb481837fadbb421727f9959c2d32a36829”這段用十六進(jìn)制表示下的字符鞠柄,就是著名的“比特幣披薩交易”中的收款人的公鑰哈希,是由其公鑰0434417dd8d89deaf0f6481c2c160d6de0921624ef7b956f38eef9ed4a64e36877be84b77cdee5a8d92b7d93694f89c3011bf1cbdf4fd7d8ca13b58a7bb4ab0804計(jì)算而來(lái)的嫉柴。

其具體計(jì)算公式如下:

公鑰哈希=HASH160(公鑰)=RIPEMD160(SHA256(公鑰))厌杜;

這個(gè)計(jì)算也是單向而不可逆的,即:將公鑰經(jīng)HASH160計(jì)算可以很輕易的得出公鑰哈希计螺,而從公鑰哈希不論怎樣都得不出公鑰值夯尽。

公鑰哈希的作用主要就是代替公鑰作為轉(zhuǎn)賬地址,從而可以盡可能的隱藏和保護(hù)公鑰不被公開(kāi)登馒。

2.5.5 地址

地址和公鑰哈希其實(shí)是一回事兒:就是在公鑰哈希的基礎(chǔ)上加上了版本號(hào)和校驗(yàn)碼匙握,從20字節(jié)變?yōu)榱?5字節(jié)。同時(shí)由于地址是需要用戶常常輸入的部分陈轿,因此還需要再經(jīng)過(guò)一個(gè)BASE58轉(zhuǎn)化圈纺,便于識(shí)別。地址和公鑰哈下笊洌可以隨時(shí)相互轉(zhuǎn)化蛾娶。其計(jì)算公式如下:

地址=BASE58(version+公鑰哈希+雙SHA256校驗(yàn))

=BASE58(version+公鑰哈希+GET_FOUR(SHA256(SHA256(公鑰哈希))))

如:17SkEw2md5avVNyYgj6RiXuQKNwkXaxFyQ就是2.3.4中的公鑰哈希所對(duì)應(yīng)的地址潜秋,二者可以相互轉(zhuǎn)化蛔琅。

綜上,可以看出峻呛,公鑰罗售、公鑰哈希、地址都是由私鑰經(jīng)過(guò)某些運(yùn)算生成的钩述,它們彼此之間的轉(zhuǎn)化關(guān)系如下圖所示:


2.5.6 簽名和驗(yàn)證

付款人在制作交易單時(shí)會(huì)在其中附上兩樣?xùn)|西:

一個(gè)是付款人對(duì)這個(gè)交易單上內(nèi)容的簽名寨躁,另一個(gè)就是自己公鑰。簽名就是加密切距,附上的公鑰是解密鑰匙朽缎,目的是為了讓所有人都能很方便的幫他驗(yàn)證他簽名的交易是否合法。因?yàn)橹挥斜淮蠹因?yàn)證過(guò)的交易單才會(huì)被計(jì)入賬簿谜悟,而交易只有被成功計(jì)入賬簿,才意味著交易單上轉(zhuǎn)賬的金額正式完成北秽。

2.5.6.1 簽名

簽名就是付款人用自己的私鑰對(duì)交易內(nèi)容進(jìn)行確認(rèn)并加密葡幸,簽名只能由付款人自己來(lái)完成。在比特幣中的簽名過(guò)程實(shí)際上就是運(yùn)行了一個(gè)簽名函數(shù)(SIGN)贺氓,這個(gè)函數(shù)的自變量有兩個(gè):一個(gè)是付款人的私鑰蔚叨,一個(gè)是交易內(nèi)容的哈希值,公式為:

簽名=SIGN(私鑰,交易內(nèi)容的哈希值)蔑水。

簽名的核心目的是為了明確兩件事:

1邢锯、內(nèi)容——“我同意這個(gè)交易單上的內(nèi)容,但僅限這上面的內(nèi)容”——內(nèi)容一旦有改動(dòng)搀别,這個(gè)交易單就作廢丹擎;

2、身份——“我是這個(gè)公鑰的所有人歇父,因?yàn)橹挥形液灻男畔⒛苡眠@個(gè)公鑰解開(kāi)”——確定簽名人有權(quán)花這個(gè)公鑰里的錢蒂培。

2.5.6.2 驗(yàn)證

比特幣世界中的任何人都可以對(duì)當(dāng)下任何交易單進(jìn)行驗(yàn)證,驗(yàn)證的人越多越好榜苫。驗(yàn)證的內(nèi)容包括主要包括兩部分护戳。第一部分:一個(gè)是驗(yàn)證某個(gè)公鑰下是否有足夠的錢;第二部分:另一個(gè)就是對(duì)交易內(nèi)的簽名進(jìn)行垂睬。兩部分分別是為了確認(rèn)以下兩件事:

1媳荒、第一部分:“他有錢”——付款人提供的公鑰和當(dāng)初別人匯錢給他時(shí)寫(xiě)的那個(gè)公鑰,二者對(duì)的上驹饺。也就是說(shuō)钳枕,匯款人支付的這筆錢確實(shí)是之前別人給過(guò)他,并且已經(jīng)成為其資產(chǎn)的逻淌,而不是憑空捏造出來(lái)的么伯。也就是說(shuō),要驗(yàn)證的是付款人提供的公鑰下余額是否足夠卡儒。這一部分不是通過(guò)非對(duì)稱加密來(lái)實(shí)現(xiàn)的田柔,而是通過(guò)單純的比對(duì)同一個(gè)UTXO在不同的兩個(gè)交易中所對(duì)應(yīng)的公鑰哈希是不是同一個(gè)來(lái)實(shí)現(xiàn)的,這部分內(nèi)容我們會(huì)在后續(xù)的UTXO骨望、MerkleTree和SPV環(huán)節(jié)中有所涉及硬爆。

2、第二部分:“他愿意”——這部分驗(yàn)證就是利用非對(duì)稱加密的方法來(lái)實(shí)現(xiàn)的擎鸠。付款人用私鑰對(duì)交易進(jìn)行簽名(加密)就是表達(dá)愿意支付這部分錢缀磕。如果再能證明這個(gè)簽名和有錢的那個(gè)公鑰是一對(duì)兒,就說(shuō)明公鑰所有人和付款人是同一個(gè)人劣光,而且他愿意做出這筆支付袜蚕。對(duì)這部分來(lái)說(shuō),要驗(yàn)證的就是用提供的公鑰能否解開(kāi)簽名內(nèi)容绢涡。其驗(yàn)證方法與上一節(jié)中的簽名是相互對(duì)應(yīng)的牲剃,具體方式為:任何人都可以先對(duì)交易內(nèi)容執(zhí)行一次哈希運(yùn)算得到一個(gè)值,用β表示雄可;同時(shí)再根據(jù)非對(duì)稱加密原理凿傅,利用交易單中付款人提交的公鑰對(duì)這個(gè)簽名進(jìn)行解密缠犀,解密后得到付款人自己當(dāng)初對(duì)該交易內(nèi)容做過(guò)的一次哈希運(yùn)算的值β’。大家來(lái)驗(yàn)證這兩個(gè)值是否相等聪舒。如果:β=β’辨液,則說(shuō)明:

1) ?大家收到的交易單中的內(nèi)容和當(dāng)初付款人制作交易單時(shí)的內(nèi)容完全一致,中間沒(méi)有人動(dòng)過(guò)手腳箱残;

2) ?交易單中包含的這個(gè)公鑰和付款人的私鑰是一對(duì)兒(因?yàn)橛眠@個(gè)公鑰能解開(kāi)該簽名)滔迈,由于私鑰別人不會(huì)有,所以公鑰的主人也就是付款人疚宇。(比特幣系統(tǒng)只認(rèn)私鑰不認(rèn)人亡鼠,因此私鑰絕對(duì)不能丟)

總結(jié)一下,這兩個(gè)部分所要驗(yàn)證的邏輯就是敷待,先看看付款人提供的公鑰下是否有錢间涵,再看看該公鑰能否解轉(zhuǎn)賬人加密了的交易單。如果以上兩部分都沒(méi)問(wèn)題榜揖,大家就認(rèn)為付款人擁有這個(gè)公鑰下的錢的支配權(quán)勾哩,同時(shí)也愿意把這部分錢花出去給另外一個(gè)人。這樣举哟,大家就會(huì)把付款人提交的這個(gè)交易單打包到新的區(qū)塊里思劳,永久記錄在案,交易就完成了妨猩,這筆錢也成了收款人的了(但是他想花出去的時(shí)候潜叛,也得類似來(lái)這么一遍)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壶硅,一起剝皮案震驚了整個(gè)濱河市威兜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庐椒,老刑警劉巖椒舵,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異约谈,居然都是意外死亡笔宿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門棱诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泼橘,“玉大人,你說(shuō)我怎么就攤上這事迈勋〗募樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵粪躬,是天一觀的道長(zhǎng)担败。 經(jīng)常有香客問(wèn)我,道長(zhǎng)镰官,這世上最難降的妖魔是什么提前? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮泳唠,結(jié)果婚禮上狈网,老公的妹妹穿的比我還像新娘。我一直安慰自己笨腥,他們只是感情好拓哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脖母,像睡著了一般士鸥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谆级,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天烤礁,我揣著相機(jī)與錄音,去河邊找鬼肥照。 笑死脚仔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舆绎。 我是一名探鬼主播鲤脏,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吕朵!你這毒婦竟也來(lái)了猎醇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤边锁,失蹤者是張志新(化名)和其女友劉穎姑食,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茅坛,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡音半,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贡蓖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曹鸠。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斥铺,靈堂內(nèi)的尸體忽然破棺而出彻桃,到底是詐尸還是另有隱情,我是刑警寧澤晾蜘,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布邻眷,位于F島的核電站眠屎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肆饶。R本人自食惡果不足惜改衩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驯镊。 院中可真熱鬧葫督,春花似錦、人聲如沸板惑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冯乘。三九已至洽胶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間往湿,已是汗流浹背妖异。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领追,地道東北人他膳。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绒窑,于是被迫代替她去往敵國(guó)和親棕孙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容