Solidity智能合約開(kāi)發(fā)技術(shù)與實(shí)戰(zhàn)PPT完整全套教學(xué)課件_第1頁(yè)
Solidity智能合約開(kāi)發(fā)技術(shù)與實(shí)戰(zhàn)PPT完整全套教學(xué)課件_第2頁(yè)
Solidity智能合約開(kāi)發(fā)技術(shù)與實(shí)戰(zhàn)PPT完整全套教學(xué)課件_第3頁(yè)
Solidity智能合約開(kāi)發(fā)技術(shù)與實(shí)戰(zhàn)PPT完整全套教學(xué)課件_第4頁(yè)
Solidity智能合約開(kāi)發(fā)技術(shù)與實(shí)戰(zhàn)PPT完整全套教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩1323頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

以太坊Solidity智能合約開(kāi)發(fā)教程授課教師:職務(wù):全套PPT課件第1章區(qū)塊鏈技術(shù)基礎(chǔ)學(xué)前提示區(qū)塊鏈可以說(shuō)是近幾年炙手可熱的IT新技術(shù)。它不僅奠定了比特幣和以太坊等傳奇品牌的技術(shù)基礎(chǔ),而且已經(jīng)上升為中國(guó)的國(guó)家戰(zhàn)略。本課程的主題是用以太坊推出的Solidity語(yǔ)言開(kāi)發(fā)智能合約。作為開(kāi)篇第一章,首先介紹關(guān)于區(qū)塊鏈技術(shù)的基礎(chǔ)知識(shí),為后面的學(xué)習(xí)奠定基礎(chǔ)。知識(shí)要點(diǎn)1.1從比特幣說(shuō)起1.2區(qū)塊鏈的工作原理及底層技術(shù)1.1從比特幣說(shuō)起1.1.1比特幣的發(fā)展歷史1.1.2什么是比特幣系統(tǒng)1.1.3共識(shí)算法和比特幣的挖礦1.1.4雙花問(wèn)題1.1.5區(qū)塊鏈技術(shù)賦予比特幣價(jià)值1.1.1比特幣的發(fā)展歷史2008年11月1日,一個(gè)自稱(chēng)“中本聰”的神秘人物在網(wǎng)站的密碼學(xué)郵件列表中發(fā)表了一篇名為《比特幣:一種點(diǎn)對(duì)點(diǎn)式的電子現(xiàn)金系統(tǒng)》的論文。其中描述了一個(gè)完全不依賴(lài)任何第三方金融系統(tǒng)的、點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)。這被視為是比特幣的白皮書(shū),也有人稱(chēng)之為區(qū)塊鏈的創(chuàng)世圣經(jīng)。中本聰對(duì)比特幣網(wǎng)絡(luò)的工作原理做了如下的描述(1)我們可以把每一臺(tái)參與比特幣系統(tǒng)的計(jì)算機(jī)稱(chēng)為節(jié)點(diǎn)。(2)每個(gè)節(jié)點(diǎn)將新交易收集到一個(gè)塊中。(3)節(jié)點(diǎn)可以創(chuàng)建鏈上的下一個(gè)區(qū)塊,并使用當(dāng)前區(qū)塊的哈希值作為新區(qū)塊的“前一個(gè)哈希”字段值。區(qū)塊鏈的示意圖創(chuàng)世區(qū)塊(GenesisBlock)2009年1月3日,中本聰挖出了比特幣的第一個(gè)區(qū)塊,也就是創(chuàng)世區(qū)塊(GenesisBlock),并得到了設(shè)計(jì)中的50個(gè)比特幣的獎(jiǎng)勵(lì),這也意味著比特幣從理論變成了現(xiàn)實(shí)。比特幣最大的特色比特幣最大的特色就是沒(méi)有任何特定金融機(jī)構(gòu)發(fā)行比特幣,也沒(méi)有任何機(jī)構(gòu)為比特幣的價(jià)值背書(shū)。比特幣系統(tǒng)每隔一段時(shí)間會(huì)產(chǎn)生一個(gè)區(qū)塊,用于記錄所發(fā)生的交易,記錄和驗(yàn)證交易會(huì)得到一定數(shù)額的比特幣獎(jiǎng)勵(lì),這個(gè)過(guò)程被形象地稱(chēng)為挖礦,記錄和驗(yàn)證交易的參與者被稱(chēng)為礦工。比特幣系統(tǒng)是開(kāi)放的,任何人下載安裝比特幣客戶端都可以參與挖礦,賺取比特幣。比特幣的價(jià)值最初的比特幣礦工大多是技術(shù)社區(qū)里的技術(shù)人員和愛(ài)好者。由于參與的人并不多,因此挖到比特幣相對(duì)很容易。但是那時(shí)的比特幣幾乎是沒(méi)有價(jià)值的。最初的比特幣開(kāi)發(fā)者之一嘉文·安德森為了宣傳和推廣比特幣,還創(chuàng)辦了一個(gè)比特幣網(wǎng)站,只要訪問(wèn)網(wǎng)站的人都可以得到5個(gè)比特幣。2010年5月22日是比特幣發(fā)展歷程中具有里程碑意義的一天,在這一天,早期的比特幣礦工拉茲洛·漢尼用10000比特幣給自己的女兒買(mǎi)了2個(gè)披薩,大約相當(dāng)于41美元。這標(biāo)志著比特幣第一次有了實(shí)際的價(jià)值。這些比特幣如果留到今天,價(jià)值1億多美元。一百萬(wàn)億津巴布韋元紙幣2011年,津巴布韋發(fā)生了嚴(yán)重的通貨膨脹。當(dāng)時(shí)的津巴布韋政府發(fā)行了據(jù)稱(chēng)是人類(lèi)歷史上最大面額的紙幣——一百萬(wàn)億津巴布韋元。津巴布韋人民對(duì)政府的金融體系喪失了信心,轉(zhuǎn)而追捧比特幣。進(jìn)一步推高了比特幣的價(jià)值。2013年11月1個(gè)比特幣的價(jià)格飆升到1000美元。比特幣的歷史上,也經(jīng)歷過(guò)一些黑暗時(shí)刻,2014年2月,世界上最大的比特幣交易商MT.Gox(昵稱(chēng)門(mén)頭溝)被黑客攻擊,損失了85萬(wàn)個(gè)比特幣。按當(dāng)時(shí)的市值算,價(jià)值超過(guò)4.5億美元。隨后MT.Gox宣布破產(chǎn)。此次事件影響了人門(mén)對(duì)比特幣的信心,導(dǎo)致比特幣大規(guī)模地貶值。越來(lái)越多的國(guó)家和企業(yè)接受、認(rèn)可比特幣?德國(guó)財(cái)政部認(rèn)可比特幣為合法的私有資產(chǎn),擁有者可以使用比特幣繳納稅金或用作其他用途。?日本允許使用比特幣來(lái)支付水電費(fèi)。?微軟、戴爾、維基百科和Paypal等知名企業(yè)陸續(xù)宣布接受比特幣。中本聰打造的比特幣系統(tǒng)已經(jīng)成長(zhǎng)為一個(gè)龐大的數(shù)字貨幣帝國(guó)。1.1.2什么是比特幣系統(tǒng)比特幣系統(tǒng)就是一個(gè)去中心化的賬本。1.去中心化2.比特幣的賬本1.去中心化中心化系統(tǒng)去中心化系統(tǒng)中心化系統(tǒng)還有一個(gè)弊端數(shù)據(jù)隱私和數(shù)據(jù)壟斷的問(wèn)題。在中心化系統(tǒng)中,用戶的數(shù)據(jù)都集中在運(yùn)營(yíng)商的服務(wù)器中,運(yùn)營(yíng)商可以利用信息的壟斷,分析用戶的消費(fèi)習(xí)慣、誤導(dǎo)用戶消費(fèi);甚至可能泄露用戶數(shù)據(jù),侵犯用戶隱私。在去中心化的系統(tǒng)中,數(shù)據(jù)雖然保存在不同的節(jié)點(diǎn)上。但是大多數(shù)數(shù)據(jù)是加密存儲(chǔ)的,除了用戶本人和相關(guān)用戶外,其他用戶是無(wú)法看到的。2.比特幣的賬本比特幣系統(tǒng)的交易信息記錄在區(qū)塊上,一個(gè)區(qū)塊就相當(dāng)于比特幣的一頁(yè)賬本,其中可以記錄多個(gè)交易的數(shù)據(jù)。在比特幣系統(tǒng)中,區(qū)塊鏈的結(jié)構(gòu)比特幣區(qū)塊的結(jié)構(gòu)比特幣區(qū)塊中各部分的具體說(shuō)明字節(jié)字段說(shuō)明4區(qū)塊的大小該字段后面的區(qū)塊大小,單位為字節(jié)80區(qū)塊頭區(qū)塊頭的結(jié)構(gòu)如表1-2所示1-9交易計(jì)數(shù)器區(qū)塊中包含的交易數(shù)量,包括coinbase(幣基)交易。每個(gè)區(qū)塊的第一個(gè)交易被稱(chēng)為coinbase交易不固定交易記錄區(qū)塊中的交易數(shù)據(jù)包含4個(gè)交易的比特幣區(qū)塊的結(jié)構(gòu)

區(qū)塊頭的結(jié)構(gòu)字節(jié)字段說(shuō)明4版本區(qū)塊版本號(hào)32父區(qū)塊哈希值前一個(gè)區(qū)塊的哈希值32Merkle根區(qū)塊中交易的Merkle樹(shù)根的哈希值。Merkle樹(shù)是區(qū)塊鏈的重要數(shù)據(jù)結(jié)構(gòu),它的作用是快速歸納和校驗(yàn)區(qū)塊數(shù)據(jù)的存在性和完整性4時(shí)間戳記錄區(qū)塊產(chǎn)生的時(shí)間,是精確到秒的UNIX時(shí)間戳4難度目標(biāo)該區(qū)塊工作量證明算法的難度目標(biāo)。區(qū)塊工作量證明的目的是礦工完成一定難度的技術(shù)任務(wù)從而爭(zhēng)奪記賬權(quán),具體情況將在1.1.3節(jié)介紹4Nonce為了找到滿足難度目標(biāo)而設(shè)定的隨機(jī)數(shù),具體情況同樣將在1.1.3節(jié)介紹MD5MD5被稱(chēng)為單向加密算法,因?yàn)镸D5算法的處理結(jié)果并不能被解密出原始數(shù)據(jù)。很多所謂的MD5解密工具實(shí)際上是將已知的MD5處理結(jié)果保存在字典中,然后根據(jù)字典中的結(jié)果數(shù)據(jù)反推原始數(shù)據(jù),也就是暴力破解。MD5處理數(shù)據(jù)的結(jié)果實(shí)際上是得到原始數(shù)據(jù)的唯一特征值。這個(gè)特征值通常被稱(chēng)為數(shù)字指紋。它可以標(biāo)識(shí)原始數(shù)據(jù)是否被修改,因?yàn)楣:瘮?shù)具有很強(qiáng)的抗碰撞能力。也就是說(shuō),2個(gè)不同的數(shù)據(jù),它們具有相同數(shù)字指紋的可能性非常小。一組對(duì)數(shù)據(jù)進(jìn)行MD5處理的結(jié)果待處理消息摘要數(shù)據(jù)123456E10ADC3949BA59ABBE56E057F20F883E123456789701234567890D726DA56936D0A63A2B4D8D3ECA0D07B123202CB962AC59075B964B07152D234B701C4CA4238A0B923820DCC509A6F75849BabcdefghijklmnopqrstuvwxyzC3FCD3D76192E4007DFB496CCA67E13B比特幣系統(tǒng)中采用SHA-256算法計(jì)算區(qū)塊的摘要信息。FD80DEDA69B71529B1BC7A275FD00A45為了演示哈希摘要算法的效果。打開(kāi)瀏覽器,訪問(wèn)如下網(wǎng)址可以在線查看對(duì)數(shù)據(jù)進(jìn)行MD5處理的效果。

/md5/F3BD79298E7CE4187D34F9BEC81E50BC一個(gè)重要的字段,即“區(qū)塊中交易的Merkle樹(shù)根的哈希值”這么做的意義在于:可以在區(qū)塊頭中包含區(qū)塊中所有交易的數(shù)字指紋。一旦區(qū)塊中的交易數(shù)據(jù)被篡改,在校驗(yàn)數(shù)字指紋是就會(huì)被發(fā)現(xiàn),從而無(wú)法通過(guò)校驗(yàn)。交易的Merkle樹(shù)根Merkle樹(shù)是一個(gè)二叉樹(shù)。學(xué)習(xí)過(guò)數(shù)據(jù)結(jié)構(gòu)課程的讀者應(yīng)該了解,二叉樹(shù)是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹(shù)的樹(shù)結(jié)構(gòu)。這兩個(gè)子樹(shù)分別被稱(chēng)為左子樹(shù)和右子樹(shù)。二叉樹(shù)通常用于快速查詢數(shù)據(jù)。在比特幣系統(tǒng)中,使用Merkle樹(shù)保存交易數(shù)據(jù)?葉子節(jié)點(diǎn):保存交易數(shù)據(jù)。?中間節(jié)點(diǎn):葉子節(jié)點(diǎn)的上級(jí)節(jié)點(diǎn)中存儲(chǔ)其子節(jié)點(diǎn)的哈希值,再往上一層的中間節(jié)點(diǎn)中存儲(chǔ)的是它的兩個(gè)子節(jié)點(diǎn)中的數(shù)據(jù)再進(jìn)行哈希運(yùn)算,以此類(lèi)推。?根節(jié)點(diǎn):包含了整個(gè)區(qū)塊中所有交易的數(shù)字指紋信息,也就是區(qū)塊頭中保存的Merkle樹(shù)根的哈希值。1.1.3共識(shí)算法和比特幣的挖礦比特幣系統(tǒng)是一個(gè)去中心化的分布式系統(tǒng),有分布在世界各地的很多礦工參與記賬,那么怎么在所有礦工之間形成共識(shí)、防止礦工在記賬時(shí)作假,就很重要。共識(shí)算法就可以解決這個(gè)問(wèn)題,實(shí)現(xiàn)不同節(jié)點(diǎn)上數(shù)據(jù)的一致性和正確性。分布式系統(tǒng)是一個(gè)不穩(wěn)定的系統(tǒng),其中的節(jié)點(diǎn)隨時(shí)可能掉線或死機(jī)。而且,不能排除節(jié)點(diǎn)惡意作假,因此共識(shí)算法應(yīng)具有容錯(cuò)性。1.拜占庭將軍問(wèn)題與共識(shí)算法人類(lèi)對(duì)共識(shí)算法的需求不只是在分布式系統(tǒng)中才有的。事實(shí)上在古羅馬時(shí)代就面臨這樣的問(wèn)題。拜占庭帝國(guó),即東羅馬帝國(guó),是歐洲歷史上最悠久的君主制國(guó)家,共歷經(jīng)12個(gè)朝代,93位皇帝,有著1000多年的歷史。拜占庭帝國(guó)幅員遼闊,鼎盛時(shí)期的疆域橫跨歐亞非三洲,版圖包括巴爾干半島、敘利亞、小亞細(xì)亞、亞美尼亞、巴勒斯坦、兩河流域和埃及等地區(qū)。為了防御領(lǐng)土,拜占庭帝國(guó)將軍隊(duì)部署在全國(guó)各地。不同軍隊(duì)之間距離遙遠(yuǎn),且通信很不方便。在爆發(fā)戰(zhàn)爭(zhēng)的情況下,很有可能存在叛變的將軍,在這種復(fù)雜的環(huán)境下,各支部隊(duì)如何形成共識(shí),協(xié)同抗敵,這就是著名的拜占庭將軍問(wèn)題。拜占庭容錯(cuò)算法BFT(ByzantineFaultTolerance)假定錯(cuò)誤可以是如下兩種情況。(1)拜占庭類(lèi)型:指可以是任意類(lèi)型(比如作惡、說(shuō)謊等)的錯(cuò)誤,也可以存在死機(jī)節(jié)點(diǎn);(2)宕機(jī)類(lèi)型:只接受節(jié)點(diǎn)死機(jī),不接受節(jié)點(diǎn)發(fā)送假消息。拜占庭容錯(cuò)算法描述(1)有效的善良節(jié)點(diǎn)的數(shù)量必須超過(guò)作惡節(jié)點(diǎn)總數(shù),即L1>F;(2)有效的善良節(jié)點(diǎn)的數(shù)量必須超過(guò)故障的善良節(jié)點(diǎn)的數(shù)量,即L1>L2;因此可以將F視為等于L2。又因?yàn)長(zhǎng)1=N-L2–F,可以將L1>F替換為如下表達(dá)式:N-F–F>F也就是說(shuō)當(dāng)N>3F(即占庭類(lèi)型的節(jié)點(diǎn)數(shù)不超過(guò)1/3)時(shí),拜占庭容錯(cuò)算法有效。拜占庭將軍問(wèn)題的共識(shí)流程包括request(請(qǐng)求)、pre-prepare(預(yù)準(zhǔn)備)、prepare(準(zhǔn)備)、commit(提交)和reply(回復(fù))等5個(gè)階段。其中pre-prepare、prepare、commit等3個(gè)階段屬于共識(shí)流程。流程圖中有5條水平線C代表客戶端,0~3代表分布式系統(tǒng)中的節(jié)點(diǎn),0為主節(jié)點(diǎn),1、2和3為備份節(jié)點(diǎn)。當(dāng)某個(gè)節(jié)點(diǎn)作為主節(jié)點(diǎn)時(shí),成為系統(tǒng)的一個(gè)視圖(View)。如果節(jié)點(diǎn)出現(xiàn)問(wèn)題,則會(huì)隨機(jī)選擇另一個(gè)節(jié)點(diǎn)擔(dān)任主節(jié)點(diǎn)。此時(shí)會(huì)進(jìn)行視圖更新。共識(shí)流程的執(zhí)行過(guò)程(1)客戶端向系統(tǒng)發(fā)送請(qǐng)求,由主節(jié)點(diǎn)接受并處理請(qǐng)求;(2)主節(jié)點(diǎn)接收到請(qǐng)求m后,會(huì)驗(yàn)證客戶端請(qǐng)求消息的簽名是否正確。通過(guò)驗(yàn)證后,給請(qǐng)求m分配一個(gè)序號(hào)n,并將請(qǐng)求m廣播一條PRE-PREPARE消息給其他節(jié)點(diǎn);(3)其他節(jié)點(diǎn)收到PRE-PREPARE消息后,將進(jìn)行簽名驗(yàn)證和視圖(View)驗(yàn)證等一系列驗(yàn)證,通過(guò)驗(yàn)證后接受該消息,然后廣播PREPARE消息,進(jìn)入prepare階段;(4)節(jié)點(diǎn)(包括主節(jié)點(diǎn))在接收到PREPARE消息后也需要進(jìn)行一系列的驗(yàn)證,如果節(jié)點(diǎn)收到了2F+1個(gè)通過(guò)驗(yàn)證的PREPARE消息,則廣播一條COMMIT消息;(5)節(jié)點(diǎn)(包括主節(jié)點(diǎn))收到commit消息后也需要進(jìn)行一系列驗(yàn)證。如果節(jié)點(diǎn)收到2F+1個(gè)通過(guò)驗(yàn)證的commit消息,則說(shuō)明當(dāng)前網(wǎng)絡(luò)中大部分節(jié)點(diǎn)已經(jīng)達(dá)成共識(shí),可以運(yùn)行客戶端請(qǐng)求的操作,然后向客戶端發(fā)送REPLY消息。2.比特幣的挖礦在比特幣系統(tǒng)中,共識(shí)算法需要解決如下2個(gè)問(wèn)題:(1)確定選擇記賬節(jié)點(diǎn)的機(jī)制;(2)確保賬本數(shù)據(jù)在全網(wǎng)中保持正確性和一致性。這個(gè)過(guò)程就是比特幣的挖礦挖礦既是比特幣系統(tǒng)的記賬過(guò)程,也是比特幣的發(fā)行機(jī)制。在比特幣系統(tǒng)中,平均每10分鐘會(huì)產(chǎn)生一個(gè)區(qū)塊。由礦工將最近發(fā)生的交易記錄在新區(qū)塊中。那么,在比特幣的挖礦機(jī)制中同樣存在2個(gè)問(wèn)題(1)礦工為什么要參與記賬。(2)在眾多的參與者中選擇誰(shuí)來(lái)記賬。第一個(gè)問(wèn)題與比特幣的發(fā)行機(jī)制有關(guān)每產(chǎn)生一個(gè)區(qū)塊,都會(huì)同時(shí)生成一定數(shù)量的比特幣作為給礦工的記賬獎(jiǎng)勵(lì)。而且發(fā)起交易的賬戶也需要支付一定的手續(xù)費(fèi)給記賬的礦工。正是這些經(jīng)濟(jì)利益激勵(lì)著眾多礦工爭(zhēng)奪記賬權(quán)。給礦工的獎(jiǎng)勵(lì)記錄在coinbase(幣基)交易中,也就是說(shuō)每個(gè)區(qū)塊的第一筆交易就是給礦工的獎(jiǎng)勵(lì)。工作量證明(PoW,ProofofWork)。這是一種簡(jiǎn)單、粗暴的共識(shí)算法。就是誰(shuí)的算力大,就由誰(shuí)記賬。當(dāng)產(chǎn)生新的區(qū)塊時(shí),網(wǎng)絡(luò)中所有在線礦工都會(huì)參與爭(zhēng)奪記賬權(quán),這個(gè)過(guò)程就是挖礦。表示運(yùn)算過(guò)程的公式result=SHA256(SHA256(區(qū)塊頭數(shù)據(jù)))最先算出小于難度目標(biāo)值的result的礦工取得記賬權(quán)。比特幣挖礦的流程節(jié)點(diǎn)在算出正確答案后,會(huì)立即廣播打包的區(qū)塊。收到被打包的區(qū)塊后,網(wǎng)絡(luò)中的節(jié)點(diǎn)會(huì)按如下步驟進(jìn)行處理(1)對(duì)打包的區(qū)塊進(jìn)行驗(yàn)證,驗(yàn)證的過(guò)程比較復(fù)雜,這里就不做展開(kāi)介紹了。(2)如果未通過(guò)驗(yàn)證,則丟棄該區(qū)塊,不做處理。比特幣系統(tǒng)規(guī)定只有經(jīng)過(guò)6個(gè)確認(rèn)的交易才被認(rèn)為是真實(shí)的交易。這樣,即使有些礦工作弊,也會(huì)因?yàn)榈貌坏酱_認(rèn)而無(wú)法得逞。(3)如果通過(guò)驗(yàn)證,做說(shuō)明工作量證明已經(jīng)結(jié)束,節(jié)點(diǎn)放棄競(jìng)爭(zhēng)記賬權(quán)的計(jì)算,將該區(qū)塊記錄在自己的賬本中。PoW工作量證明算法保證了全網(wǎng)只有一個(gè)節(jié)點(diǎn)將一個(gè)區(qū)塊添加到賬本中,其他節(jié)點(diǎn)都是復(fù)制賬本中該區(qū)塊的數(shù)據(jù)。從而保證了比特幣賬本的全網(wǎng)一致性和唯一性。3.挖礦的難度目標(biāo)確定和難度調(diào)整每個(gè)區(qū)塊頭中都有一個(gè)難度目標(biāo)字段,這是工作量證明的目標(biāo),在產(chǎn)生區(qū)塊時(shí)由系統(tǒng)生成。生成難度目標(biāo)的公式如下:目標(biāo)值=最大目標(biāo)值/難度值最大目標(biāo)值是固定的常量,值如下:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF新難度值=舊難度值*(過(guò)去2016個(gè)區(qū)塊花費(fèi)時(shí)長(zhǎng)/20160分鐘)新難度值=舊難度值*(過(guò)去2016個(gè)區(qū)塊花費(fèi)時(shí)長(zhǎng)/20160分鐘)4.挖礦形式的演變?cè)诒忍貛啪W(wǎng)絡(luò)剛剛建立的時(shí)候,參與挖礦的人很少,中本聰本人也要親自參與挖礦,才能維持比特幣系統(tǒng)的運(yùn)轉(zhuǎn)。那時(shí)候只需要用普通的PC機(jī)就可以挖到比特幣。GPU礦機(jī)ASIC礦機(jī)ASIC芯片是一種專(zhuān)門(mén)為某種特定用途設(shè)計(jì)的芯片。例如比特幣采用SHA256算法,那么比特幣ASIC礦機(jī)芯片就被設(shè)計(jì)為僅能計(jì)算SHA256。架設(shè)了大量礦機(jī)的礦場(chǎng)礦機(jī)出現(xiàn)后,普通計(jì)算機(jī)已經(jīng)很難挖到比特幣了。還有一些公司大量購(gòu)置礦機(jī),組成礦場(chǎng),憑借規(guī)模優(yōu)勢(shì)提高挖礦的成功率。礦池礦場(chǎng)和少量擁有礦機(jī)的個(gè)人可以聯(lián)合起來(lái),將算力合并、并聯(lián)合運(yùn)作。以這種方法搭建的網(wǎng)站就是礦池。1.1.4雙花問(wèn)題在電子金融領(lǐng)域中,有一個(gè)很重要的問(wèn)題——雙花(DoubleSpending)問(wèn)題。所謂雙花并不是兩枝花,而是要防止一筆錢(qián)重復(fù)支付。在現(xiàn)實(shí)生活中,紙幣的雙花幾乎不可能,除非印制假鈔,但這是犯罪行為。但是在電子商務(wù)中,從在線支付到確認(rèn)收貨要經(jīng)歷漫長(zhǎng)的等待。如果處理不得當(dāng),賣(mài)家很可能會(huì)把已經(jīng)支付的錢(qián)重復(fù)使用。這不是比特幣特有的問(wèn)題,支付寶和微信支付等平臺(tái)也面臨同樣的問(wèn)題。付寶是怎么解決雙花問(wèn)題的

整個(gè)網(wǎng)購(gòu)過(guò)程如下(1)買(mǎi)家選擇商品,去支付,使用支付寶在線付款。(2)支付寶會(huì)將這筆錢(qián)轉(zhuǎn)入支付寶在銀行的賬戶中暫時(shí)凍結(jié)起來(lái);這么做既能防止買(mǎi)家雙花,也能防止提前支付給賣(mài)家,賣(mài)家不負(fù)責(zé)任的情形。(3)從賣(mài)家發(fā)貨到買(mǎi)家確認(rèn)收貨的環(huán)節(jié)可以忽略。(4)買(mǎi)家確認(rèn)收貨后,支付寶會(huì)把之前凍結(jié)在自己賬戶的貨款轉(zhuǎn)賬到賣(mài)家的銀行賬戶里面。作為中心化的平臺(tái),支付寶在交易過(guò)程中起到了中介和擔(dān)保的作用。而比特幣系統(tǒng)是去中心化的,由誰(shuí)來(lái)?yè)?dān)保呢?答案很簡(jiǎn)單,是技術(shù)本身提供的保障。1.UTXOUTXO是UnspentTransactionOutput的縮寫(xiě),也就是未花費(fèi)的交易輸出。比特幣系統(tǒng)中并沒(méi)有賬戶的概念,每個(gè)比特幣錢(qián)包中都包含若干個(gè)大小不一的UTXO。這些UTXO都是之前交易時(shí),轉(zhuǎn)賬過(guò)來(lái)的,可能是挖礦所得,也可能是通過(guò)其他交易得到的。比特幣錢(qián)包的余額等于其中包含的所有UTXO的金額之和。無(wú)論UTXO的金額是多少,它都不能被分隔。UTXO被鎖住并記錄在區(qū)塊中。因此,一個(gè)用戶的比特幣,實(shí)際上是以UTXO的形式分散在若干個(gè)區(qū)塊中,有的區(qū)塊可能記錄一個(gè)用戶的多個(gè)UTXO一個(gè)用戶的比特幣以UTXO的形式分散在若干個(gè)區(qū)塊中如果小明要支付1個(gè)比特幣給小強(qiáng),則整個(gè)過(guò)程如下(1)從小明的UTXO中找是否可以湊夠1個(gè)比特幣的交易。如果存在,則發(fā)起一個(gè)交易,將它們發(fā)送給小強(qiáng)。(2)小強(qiáng)接收后,將1個(gè)比特幣從小明的UTXO中解鎖,然后進(jìn)入小強(qiáng)的UTXO。(3)當(dāng)比特幣網(wǎng)絡(luò)中的一個(gè)節(jié)點(diǎn)接收到一筆交易信息時(shí),會(huì)在UTXO數(shù)據(jù)庫(kù)中查詢。如果不存在,則會(huì)將其忽略。記賬節(jié)點(diǎn)會(huì)因?yàn)槭詹坏阶銐虻拇_認(rèn)信息,而無(wú)法記賬。如果查詢到相關(guān)的UTXO記錄,會(huì)繼續(xù)檢查它的交易收款人(也就是擁有者,這里的交易指上次支付這筆比特幣給小明的交易)是不是小明。如果通過(guò)檢查,節(jié)點(diǎn)會(huì)發(fā)出確認(rèn)信息。記賬節(jié)點(diǎn)收集了足夠的確認(rèn)信息后,就可以將交易記錄在區(qū)塊中。(4)如果小明的UTXO中沒(méi)有小于1個(gè)比特幣的歷史交易,則會(huì)選擇一個(gè)金額超過(guò)1個(gè)比特幣的UTXO支付給小強(qiáng),系統(tǒng)會(huì)將1個(gè)比特幣記錄在小強(qiáng)的UTXO中,將余額發(fā)起一個(gè)退回交易,再次鎖定在小明的UTXO中。這就是比特幣的找零機(jī)制。2.時(shí)間戳在比特幣的區(qū)塊頭中,有一個(gè)時(shí)間戳字段,它是由比特幣系統(tǒng)中的時(shí)間戳服務(wù)器產(chǎn)生的。引入時(shí)間戳概念的目的是為每一個(gè)比特幣交易賦予一個(gè)全網(wǎng)統(tǒng)一的打包時(shí)間。這個(gè)時(shí)間既不是交易者本地計(jì)算機(jī)的時(shí)間,也不是記賬礦工提供的時(shí)間,這就可以有效的防止在交易時(shí)間上造假。這樣在整個(gè)區(qū)塊鏈上所有區(qū)塊的時(shí)間戳就會(huì)是順序的,前面區(qū)塊的時(shí)間戳一定是小于后面區(qū)塊時(shí)間戳的。而且在區(qū)塊頭中還保存著前一個(gè)區(qū)塊的哈希值。如果一個(gè)區(qū)塊的時(shí)間戳被惡意修改過(guò),或者在兩個(gè)區(qū)塊之間插入新的假區(qū)塊,那么在對(duì)其進(jìn)行驗(yàn)證時(shí),就會(huì)被發(fā)現(xiàn)。時(shí)間戳在解決雙花問(wèn)題時(shí)也起著重要的作用。如果一個(gè)UTXO被兩次支付,節(jié)點(diǎn)會(huì)選擇記錄時(shí)間戳小的交易,而忽視時(shí)間戳大的交易。3.分叉如果有一個(gè)用戶在很短的時(shí)間內(nèi),用一個(gè)UTXO進(jìn)行支付,那么很有可能會(huì)被兩個(gè)節(jié)點(diǎn)分別記賬。因?yàn)樵谟涃~時(shí),礦工很可能不知道有另一筆交易存在。這樣不就是雙花了嗎?其實(shí)并不會(huì),因?yàn)檫@兩個(gè)礦工并不會(huì)接受對(duì)方記賬的區(qū)塊。從而造成了比特幣的分叉。也就是從這兩個(gè)區(qū)塊開(kāi)始,比特幣的區(qū)塊鏈分裂成兩個(gè)鏈比特幣區(qū)塊鏈的分叉1.1.5區(qū)塊鏈技術(shù)賦予比特幣價(jià)值1.傳統(tǒng)互聯(lián)網(wǎng)為什么不能承載價(jià)值2.比特幣為什么可以承載價(jià)值1.傳統(tǒng)互聯(lián)網(wǎng)為什么不能承載價(jià)值(1)數(shù)據(jù)可任意復(fù)制。(2)數(shù)據(jù)可以篡改和偽造。(3)用戶行為的可抵賴(lài)性。(4)資源不稀有。2.比特幣為什么可以承載價(jià)值黃金為什么值錢(qián)?因?yàn)辄S金具備如下幾個(gè)特性:稀有性穩(wěn)定性(安全性)

廣泛的群眾基礎(chǔ)(1)稀有性比特幣雖然只是硬盤(pán)里面的數(shù)字,但是它并不能隨意復(fù)制。正如1.1.4節(jié)介紹的,一個(gè)比特幣是不能雙花的。另外,比特幣的發(fā)行機(jī)制,決定了比特幣是非常稀有。前面已經(jīng)介紹過(guò),比特幣系統(tǒng)平均每10分鐘產(chǎn)生一個(gè)區(qū)塊,與區(qū)塊一起誕生的是給記賬礦工的獎(jiǎng)勵(lì)金。在2009年1月比特幣誕生的時(shí)候,每個(gè)區(qū)塊的獎(jiǎng)勵(lì)是50個(gè)比特幣。以后每4年半,挖礦獎(jiǎng)勵(lì)會(huì)減半。到2012年底,每個(gè)區(qū)塊的獎(jiǎng)勵(lì)變成了25個(gè)比特幣。2016年7月10日,每個(gè)區(qū)塊的獎(jiǎng)勵(lì)減為12.5個(gè)比特幣,以此類(lèi)推。比特幣會(huì)越來(lái)越稀有,到2140年的時(shí)候,2100萬(wàn)個(gè)比特幣將被開(kāi)采完畢。礦工記賬的獎(jiǎng)勵(lì)將只剩下交易者支付的手續(xù)費(fèi)。這就是1個(gè)比特幣可以兌換1萬(wàn)多美元的原因,因?yàn)樗∮辛?。?)穩(wěn)定性(安全性)比特幣網(wǎng)絡(luò)是由遍布全球的節(jié)點(diǎn)構(gòu)成的去中心化分布式系統(tǒng),其賬本由眾多節(jié)點(diǎn)共同見(jiàn)證。要想作假,至少要有全網(wǎng)51%以上的算力。這是很難做到的。如果真的有誰(shuí)擁有這么大的算力,那他不如靠挖礦賺錢(qián)。他維護(hù)比特幣系統(tǒng)正常運(yùn)行得到的利益要遠(yuǎn)遠(yuǎn)大于破壞秩序。因此,比特幣系統(tǒng)是非常安全和穩(wěn)定的。比特幣自產(chǎn)生以來(lái)雖然也發(fā)生了一些安全事件,但都發(fā)生在中心化的交易所。比特幣系統(tǒng)的安全性至今還是無(wú)懈可擊的。(3)群眾基礎(chǔ)比特幣有著眾多的信仰者。很多人為了比特幣和區(qū)塊鏈技術(shù)的普及和推廣而不懈努力。在社會(huì)學(xué)中有這樣一種現(xiàn)象:當(dāng)一群人虔誠(chéng)的信仰一件事時(shí),就會(huì)引發(fā)更多人的圍觀和關(guān)注,從而形成熱點(diǎn)事件。此時(shí),就會(huì)有另外一些人,看到其中蘊(yùn)藏的商機(jī)。這就是比特幣的群眾基礎(chǔ)。(4)誰(shuí)為比特幣背書(shū)前面提到法幣的價(jià)值由發(fā)行它的政府背書(shū),那么比特幣的價(jià)值由誰(shuí)來(lái)背書(shū)呢?中本聰嗎?他是誰(shuí)都是一個(gè)不解之謎,更無(wú)從擔(dān)保什么。筆者認(rèn)為,是區(qū)塊鏈技術(shù)在為比特幣背書(shū)。它保證了比特幣系統(tǒng)的安全可靠,也保證了比特幣的稀有性。這正是區(qū)塊鏈技術(shù)的價(jià)值所在。1.2區(qū)塊鏈的工作原理及底層技術(shù)1.2.1分布式系統(tǒng)的概念1.2.2區(qū)塊鏈的架構(gòu)設(shè)計(jì)1.2.3加密算法1.2.4區(qū)塊鏈的分類(lèi)1.2.5區(qū)塊鏈為什么會(huì)成為國(guó)家戰(zhàn)略1.2.6區(qū)塊鏈技術(shù)的發(fā)展歷程1.2.7區(qū)塊鏈的編程語(yǔ)言1.2.1分布式系統(tǒng)的概念比特幣系統(tǒng)是一個(gè)去中心化的分布式系統(tǒng)。實(shí)際上,所有的區(qū)塊鏈應(yīng)用都是分布式系統(tǒng)。所謂分布式系統(tǒng)是指建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。但是不能簡(jiǎn)單地把分布式系統(tǒng)理解為使用網(wǎng)絡(luò)的軟件系統(tǒng)。傳統(tǒng)意義上的網(wǎng)絡(luò)應(yīng)用,都是一個(gè)一個(gè)的獨(dú)立運(yùn)行。系統(tǒng)與系統(tǒng)之間往往只是進(jìn)行簡(jiǎn)單地?cái)?shù)據(jù)交互。而在分布式系統(tǒng)中一組獨(dú)立的計(jì)算機(jī)按照統(tǒng)一的規(guī)則,各司其職、密切配合,呈現(xiàn)給用戶的是一個(gè)統(tǒng)一的整體。就好像只有一個(gè)服務(wù)器一樣。6.使用WinSCP工具實(shí)現(xiàn)向CentOS服務(wù)器上傳文件的功能可以通過(guò)下面的網(wǎng)址下載WinSCP。/1.2.2區(qū)塊鏈的架構(gòu)設(shè)計(jì)1.存儲(chǔ)層存儲(chǔ)層主要實(shí)現(xiàn)區(qū)塊鏈的存儲(chǔ)功能,其中涉及數(shù)據(jù)存儲(chǔ)(存儲(chǔ)格式、區(qū)塊大小)和加密算法等技術(shù)細(xì)節(jié)。關(guān)于加密算法將在1.2.3節(jié)介紹。2.網(wǎng)絡(luò)層實(shí)現(xiàn)分布式網(wǎng)絡(luò)編程,涉及網(wǎng)絡(luò)通信協(xié)議(點(diǎn)對(duì)點(diǎn)通信)和共識(shí)算法等技術(shù)細(xì)節(jié)。共識(shí)算法除了比特幣使用的工作量證明(PoW),還有以太坊采用的權(quán)益證明(PoS),在分布式系統(tǒng)中,還有一個(gè)很常用的共識(shí)算法,就是投票,由節(jié)點(diǎn)投票形成共識(shí)。3.?dāng)U展層擴(kuò)展層是對(duì)經(jīng)典區(qū)塊鏈技術(shù)的補(bǔ)充和擴(kuò)展,是對(duì)區(qū)塊鏈技術(shù)的發(fā)展。智能合約側(cè)鏈技術(shù)企業(yè)級(jí)應(yīng)用:聯(lián)盟鏈4.應(yīng)用層金融交易存證溯源數(shù)字資產(chǎn)公益1.2.3加密算法1.對(duì)稱(chēng)加密算法2.非對(duì)稱(chēng)加密算法3.國(guó)密算法1.對(duì)稱(chēng)加密算法常見(jiàn)的對(duì)稱(chēng)加密算法包括DES、3DES和AES等。對(duì)稱(chēng)加密算法的優(yōu)點(diǎn)是算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。缺點(diǎn)是一旦密鑰丟失,加密的信息將被公開(kāi)。而且也無(wú)法證明信息是誰(shuí)發(fā)送的。因?yàn)殡p方都擁有同樣的密鑰。通常,區(qū)塊鏈應(yīng)用中不會(huì)使用對(duì)稱(chēng)加密算法。2.非對(duì)稱(chēng)加密算法非對(duì)稱(chēng)加密算法,顧名思義,就是加密和解密雙方使用不同的密鑰。這一對(duì)密鑰分別稱(chēng)為公鑰和私鑰。私鑰是保密的,只有它的擁有者才知道。公鑰由私鑰生成,可以公開(kāi),公鑰和私鑰是匹配的一對(duì)。非對(duì)稱(chēng)加密算法包括下面兩種應(yīng)用方法(1)當(dāng)向一個(gè)用戶A發(fā)送數(shù)據(jù)時(shí),可以使用他的公鑰對(duì)數(shù)據(jù)進(jìn)行加密。然后將加密數(shù)據(jù)發(fā)送給用戶A。用戶A收到加密數(shù)據(jù)后,使用私鑰進(jìn)行解密。因?yàn)槭鞘褂糜脩鬉的公鑰加密的,所以只能使用與公鑰相匹配的私鑰解密。其他人即使截獲了加密數(shù)據(jù)也無(wú)法解密。從而實(shí)現(xiàn)了數(shù)據(jù)傳輸?shù)陌踩浴5?,用戶A的公鑰是公開(kāi)的很多人都知道。用公鑰加棉的數(shù)據(jù)不能證明發(fā)送者的身份。這也就引入了非對(duì)稱(chēng)加密算法的第2種應(yīng)用方法——數(shù)字簽名。(2)當(dāng)向一個(gè)用戶A發(fā)送數(shù)據(jù)時(shí),可以首先對(duì)數(shù)據(jù)進(jìn)行哈希加密,然后再使用發(fā)送者B自己的私鑰對(duì)哈希摘要數(shù)據(jù)進(jìn)行二次加密。使用發(fā)送者B的私鑰對(duì)數(shù)據(jù)進(jìn)行加密,所有擁有其公鑰的用戶都可以解密。但是解密得到的是原始數(shù)據(jù)的哈希摘要,而哈希摘要是不可逆的,因此這么做并不能泄露原始數(shù)據(jù)。但是其他人使用發(fā)送者B的公鑰可以解密數(shù)據(jù),就證明了這條數(shù)據(jù)是B發(fā)送的,因?yàn)橹挥兴麚碛兴借€。這就是數(shù)字簽名的過(guò)程。非對(duì)稱(chēng)加密算法的應(yīng)用方法3.國(guó)密算法在《中華人民共和國(guó)網(wǎng)絡(luò)安全法》第21條規(guī)定“國(guó)家實(shí)行網(wǎng)絡(luò)安全等級(jí)保護(hù)制度。網(wǎng)絡(luò)運(yùn)營(yíng)者應(yīng)當(dāng)按照網(wǎng)絡(luò)安全等級(jí)保護(hù)制度的要求,履行下列安全保護(hù)義務(wù),保障網(wǎng)絡(luò)免受干擾、破壞或者未經(jīng)授權(quán)的訪問(wèn),防止網(wǎng)絡(luò)數(shù)據(jù)泄露或者被竊取、篡改:(一)制定內(nèi)部安全管理制度和操作規(guī)程,確定網(wǎng)絡(luò)安全負(fù)責(zé)人,落實(shí)網(wǎng)絡(luò)安全保護(hù)責(zé)任;(二)采取防范計(jì)算機(jī)病毒和網(wǎng)絡(luò)攻擊、網(wǎng)絡(luò)侵入等危害網(wǎng)絡(luò)安全行為的技術(shù)措施;(三)采取監(jiān)測(cè)、記錄網(wǎng)絡(luò)運(yùn)行狀態(tài)、網(wǎng)絡(luò)安全事件的技術(shù)措施,并按照規(guī)定留存相關(guān)的網(wǎng)絡(luò)日志不少于六個(gè)月;(四)采取數(shù)據(jù)分類(lèi)、重要數(shù)據(jù)備份和加密等措施;(五)法律、行政法規(guī)規(guī)定的其他義務(wù)。”國(guó)密算法的基本情況如下·SM1:對(duì)稱(chēng)加密算法,密鑰長(zhǎng)度為128比特,算法不公開(kāi),固化在芯片中?!M2:開(kāi)源的非對(duì)稱(chēng)加密算法,可以用于數(shù)據(jù)的加解密和數(shù)字簽名?!M3:開(kāi)源的哈希算法,用于祭祀數(shù)據(jù)的摘要。·SM4:開(kāi)源的對(duì)稱(chēng)分組加密算法,,密鑰長(zhǎng)度為128比特?!M7:對(duì)稱(chēng)分組加密算法,密鑰長(zhǎng)度為128比特,適用于非接觸式IC卡?!M9:標(biāo)識(shí)密碼算法,標(biāo)識(shí)密碼將用戶的標(biāo)識(shí)(如郵件地址、手機(jī)號(hào)碼、QQ號(hào)碼、微信賬號(hào)等)作為公鑰,省略了交換數(shù)字證書(shū)和公鑰的過(guò)程,使得安全系統(tǒng)變得易于部署和管理,非常適合端對(duì)端離線安全通訊?!UC祖沖之算法:中國(guó)自主研究的流密碼算法,是運(yùn)用于移動(dòng)通信網(wǎng)絡(luò)中的國(guó)際標(biāo)準(zhǔn)密碼算法。1.2.4區(qū)塊鏈的分類(lèi)1.公有鏈2.私有鏈3.聯(lián)盟鏈1.公有鏈任何人都可以參與公有鏈的運(yùn)作,包括如下操作:(1)讀取區(qū)塊中的數(shù)據(jù);(2)發(fā)起交易;(3)作為礦工參與挖礦。2.私有鏈私有鏈?zhǔn)怯商囟ńM織控制的區(qū)塊鏈,整個(gè)網(wǎng)絡(luò)由該組織的成員機(jī)構(gòu)組成。共識(shí)算法由指定的一組節(jié)點(diǎn)完成。私有鏈只是一定限度的去中心化。通常用于企業(yè)內(nèi)部的經(jīng)營(yíng)和管理。私有鏈可以有效地保護(hù)企業(yè)的商業(yè)秘密;因?yàn)閰⑴c共識(shí)過(guò)程的節(jié)點(diǎn)比較少,所以交易速度很快;而且也不需要給礦工支付交易的手續(xù)費(fèi),成本較低。3.聯(lián)盟鏈聯(lián)盟鏈?zhǔn)菣C(jī)構(gòu)之間共同搭建的區(qū)塊鏈,適用于商業(yè)伙伴之間的交易、結(jié)算和清算等B2B應(yīng)用場(chǎng)景。比較著名的聯(lián)盟鏈項(xiàng)目是HyperledgerFabric。1.2.5區(qū)塊鏈為什么會(huì)成為國(guó)家戰(zhàn)略1.區(qū)塊鏈技術(shù)可以撼動(dòng)美元的壟斷地位2.區(qū)塊鏈可以建立全新的社會(huì)信用體系1.區(qū)塊鏈技術(shù)可以撼動(dòng)美元的壟斷地位布雷頓森林體系SWIFT(環(huán)球同業(yè)銀行金融電訊協(xié)會(huì))通過(guò)SWIFT實(shí)現(xiàn)跨境支付的流程如果沒(méi)有SWIFT,那么各國(guó)銀行間的跨境支付將會(huì)非常繁瑣區(qū)塊鏈成為撼動(dòng)美元霸權(quán)地位的底層基礎(chǔ)技術(shù)區(qū)塊鏈作為點(diǎn)對(duì)點(diǎn)的去中心化系統(tǒng),如果應(yīng)用于跨境支付,則不需要經(jīng)過(guò)任何中心化機(jī)構(gòu)確認(rèn)和處理,非常高效。2018年,支付寶在香港上線了全球首個(gè)基于區(qū)塊鏈的電子錢(qián)包跨境匯款服務(wù)AlipayHK。使用AlipayHK從香港向菲律賓跨境支付僅需要3秒鐘。高度的安全性加上高效的支付速度,無(wú)疑使區(qū)塊鏈成為撼動(dòng)美元霸權(quán)地位的底層基礎(chǔ)技術(shù)。2.區(qū)塊鏈可以建立全新的社會(huì)信用體系可以解決很多存在多年的社會(huì)問(wèn)題。例如:·在互聯(lián)網(wǎng)應(yīng)用中,圖片和字體等資源經(jīng)常會(huì)被無(wú)償使用,從而侵犯原作者的知識(shí)產(chǎn)權(quán)。應(yīng)用區(qū)塊鏈技術(shù),可以將被保護(hù)的資源上鏈,并自動(dòng)將資源與Web應(yīng)用中的相關(guān)資源進(jìn)行比對(duì),同時(shí)將侵權(quán)證據(jù)上鏈存證。從而降低知識(shí)產(chǎn)權(quán)的成本,達(dá)到保護(hù)知識(shí)產(chǎn)權(quán)的目的?!ぴ谏唐妨魍I(lǐng)域中,應(yīng)用區(qū)塊鏈技術(shù)可以將商品流通的各個(gè)環(huán)節(jié)數(shù)據(jù)上鏈,從而實(shí)現(xiàn)商品溯源的功能,從源頭上避免假冒偽劣商品?!ぴ诠婊顒?dòng)領(lǐng)域,也可以使用區(qū)塊鏈技術(shù)將善款的來(lái)源和流向數(shù)據(jù)上鏈,避免可能發(fā)生的欺詐行為。1.2.6區(qū)塊鏈技術(shù)的發(fā)展歷程(1)區(qū)塊鏈1.0:以比特幣為代表的數(shù)字貨幣時(shí)代是區(qū)塊鏈1.0的經(jīng)典應(yīng)用。這個(gè)階段區(qū)塊鏈技術(shù)的應(yīng)用場(chǎng)景基本上局限在與數(shù)字貨幣或金融相關(guān)的應(yīng)用,比如數(shù)字貨幣錢(qián)包和交易所。而且很多數(shù)字貨幣只是在比特幣源代碼的基礎(chǔ)上做了簡(jiǎn)單升級(jí)。(2)區(qū)塊鏈2.0:以太坊的誕生,拉開(kāi)了區(qū)塊鏈2.0的帷幕,智能合約的概念拓展了區(qū)塊鏈的應(yīng)用場(chǎng)景。使用區(qū)塊鏈技術(shù)可以應(yīng)用到社會(huì)生活的各個(gè)領(lǐng)域。關(guān)于以太坊和智能合約的基本概念,將在第2章中介紹。(3)區(qū)塊鏈3.0:區(qū)塊鏈1.0和2.0時(shí)期的應(yīng)用大多數(shù)都是公有鏈項(xiàng)目,企業(yè)使用區(qū)塊鏈技術(shù)的成功案例并不多。區(qū)塊鏈3.0是實(shí)現(xiàn)完備權(quán)限控制和安全保障的企業(yè)級(jí)區(qū)塊鏈——聯(lián)盟鏈。聯(lián)盟鏈可以解決企業(yè)間的信用問(wèn)題,由產(chǎn)業(yè)鏈中相關(guān)企業(yè)共同開(kāi)發(fā)建設(shè),信息上鏈,不可隨意修改。只要對(duì)相關(guān)企業(yè)做好科普工作,就可以大大提高企業(yè)間配合的效率,打通一個(gè)個(gè)信息孤島,最終可以形成行業(yè)大數(shù)據(jù)。聯(lián)盟鏈的代表項(xiàng)目是Hyperledger(超級(jí)賬本),它由Linux基金會(huì)管理,微軟、摩根大通、世界銀行和國(guó)內(nèi)的阿里、華為、百度、騰訊都參與Hyperledger社區(qū)??梢哉f(shuō)巨頭云集。1.2.7智能合約智能合約(smartcontract)的概念最早于1996年由法律學(xué)者尼克·薩博(NickSzabo)提出。他對(duì)智能合約的定義為:“智能合約”是一系列以數(shù)字的形式定義的承諾,相關(guān)各方可以在其(智能合約)上面執(zhí)行這些承諾的協(xié)議。4個(gè)主要要素1.可遵守性2.可驗(yàn)證性3.隱私性4.可執(zhí)行性1.2.8區(qū)塊鏈的編程語(yǔ)言SolidityJavaGOJavaScriptPythonC#C++以太坊Solidity智能合約開(kāi)發(fā)教程授課教師:職務(wù):第2章以太坊和智能合約學(xué)前提示在區(qū)塊鏈的發(fā)展歷程中,以太坊的誕生具有里程碑式的意義。它意味著區(qū)塊鏈技術(shù)不但可以實(shí)現(xiàn)數(shù)字貨幣,還可以將現(xiàn)實(shí)生活中的合約上鏈,從而打造言出必行的高度互信的體系。知識(shí)要點(diǎn)2.1以太坊的發(fā)展歷史與特色2.2以太坊的工作原理2.3搭建以太坊私有鏈2.1以太坊的發(fā)展歷史與特色2.1.1以太坊的誕生和發(fā)展2.1.2以太坊與比特幣系統(tǒng)的對(duì)比2.1.1以太坊的誕生和發(fā)展以太坊的創(chuàng)始人維塔利克·布特林(Vitalik

Buterin,人稱(chēng)V神)在區(qū)塊鏈界可以說(shuō)是僅次于中本聰?shù)膫髌嫒宋铩?.以太坊的誕生2013年末,維塔利克發(fā)布了以太坊(Ethereum)初版白皮書(shū),吸引到一批認(rèn)可以太坊理念的合作伙伴,啟動(dòng)了項(xiàng)目。2014年,以太坊陸續(xù)發(fā)布了幾個(gè)版本的測(cè)試網(wǎng)絡(luò),從POC3、POC4、POC5到POC6,并且發(fā)起了為期42天的以太幣預(yù)售,共募集到3531個(gè)比特幣,按照當(dāng)時(shí)的比特幣匯率,相當(dāng)于1843萬(wàn)美元。2015年7月,以太坊網(wǎng)絡(luò)正式發(fā)布了,標(biāo)志著以太坊區(qū)塊鏈上線運(yùn)行了。2.以太坊的4個(gè)發(fā)展階段(1)邊境(Frontier)(2)家園(Homestead)(3)大都會(huì)(Metropolis)(4)寧?kù)o(Serenity)3.DeFiDeFi(decentralizedfinance,去中心化的金融)是近來(lái)區(qū)塊鏈領(lǐng)域非?;鸬囊粋€(gè)名詞。大多數(shù)的DeFi應(yīng)用程序都構(gòu)建在以太坊網(wǎng)絡(luò)上。以太坊的創(chuàng)始人維塔利克·布特林早在2013年發(fā)表的《以太坊白皮書(shū)》中就重點(diǎn)論述了一些復(fù)雜的去中心化金融應(yīng)用案例。目前比較流行的DeFi應(yīng)用包括去中心化的交易所(DEXs)穩(wěn)定幣(Stablecoins)借貸平臺(tái)WBTC預(yù)測(cè)市場(chǎng)4.以太坊和Solidity語(yǔ)言在國(guó)際、國(guó)內(nèi)的發(fā)展和應(yīng)用情況2021年2月5日,中國(guó)電子信息產(chǎn)業(yè)發(fā)展研究院(賽迪研究院)發(fā)布第22期賽迪全球公有鏈技術(shù)評(píng)估指數(shù),對(duì)全球37條知名公有鏈從技術(shù)維度進(jìn)行綜合評(píng)估并給出排名。在排行榜中,以太坊以總指數(shù)140.5位居綜合排名第2名。其中應(yīng)用性和創(chuàng)新力評(píng)分都位居第1。以太坊在國(guó)際上得到廣泛的應(yīng)用,在國(guó)內(nèi)的應(yīng)用并不火熱(1)國(guó)內(nèi)的區(qū)塊鏈技術(shù)尚處于科普和基礎(chǔ)設(shè)施建設(shè)階段,真正落地應(yīng)用的區(qū)塊鏈項(xiàng)目還并不是非常多,應(yīng)用場(chǎng)景相對(duì)有限。(2)數(shù)字貨幣的應(yīng)用在國(guó)內(nèi)并不普及,而部署和運(yùn)行以太坊應(yīng)用都需要花費(fèi)以太幣,這也給以太坊在國(guó)內(nèi)的落地應(yīng)用造成影響。(3)在區(qū)塊鏈的發(fā)展過(guò)程中,國(guó)家更重視和鼓勵(lì)使用自主知識(shí)產(chǎn)權(quán)的技術(shù)。在這樣的大環(huán)境下,從事區(qū)塊鏈技術(shù)開(kāi)發(fā)的公司,更愿意從零開(kāi)始使用自主研發(fā)的技術(shù)開(kāi)發(fā)區(qū)塊鏈應(yīng)用。例如,螞蟻區(qū)塊鏈的專(zhuān)利申請(qǐng)數(shù)連續(xù)三年全球第一。在國(guó)內(nèi)Solidity語(yǔ)言的主要應(yīng)用場(chǎng)景(1)基于以太坊私有鏈開(kāi)發(fā)智能合約應(yīng)用。從而在企業(yè)內(nèi)部應(yīng)用區(qū)塊鏈技術(shù)。(2)一些BaaS平臺(tái)支持使用Solidity作為智能合約開(kāi)發(fā)語(yǔ)言。BaaS(BlockchainasaService,區(qū)塊鏈即服務(wù))將區(qū)塊鏈框架嵌入云計(jì)算平臺(tái),為開(kāi)發(fā)者提供便捷、高性能的區(qū)塊鏈開(kāi)發(fā)環(huán)境和配套服務(wù)。例如阿里云的螞蟻區(qū)塊鏈合約平臺(tái)支持使用Solidity語(yǔ)言來(lái)實(shí)現(xiàn)合約的編寫(xiě)和編譯。(3)很多區(qū)塊鏈應(yīng)用涉及跨境合作,如果需要對(duì)接的境外區(qū)塊鏈應(yīng)用基于以太坊,則在合作開(kāi)發(fā)的過(guò)程中也需要使用Solidity語(yǔ)言開(kāi)發(fā)基于以太坊的智能合約。2.1.2以太坊與比特幣系統(tǒng)的對(duì)比都屬于公有鏈,開(kāi)放源代碼,任何人都可以參與挖礦。數(shù)字貨幣不是以太坊系統(tǒng)的全部以太坊還有一個(gè)最大的特點(diǎn),就是它是一個(gè)開(kāi)放的開(kāi)發(fā)平臺(tái),每個(gè)人都可以在以太坊平臺(tái)中部署自己的應(yīng)用。這一點(diǎn)與安卓系統(tǒng)很類(lèi)似。2.2以太坊的工作原理2.2.1以太坊節(jié)點(diǎn)2.2.2以太坊的狀態(tài)機(jī)2.2.3以太坊網(wǎng)絡(luò)的總體架構(gòu)2.2.4DApp2.2.5DApp瀏覽器2.2.6以太坊的數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)方式2.2.7以太坊的分叉2.2.8Gas和以太幣2.2.9以太坊賬戶、錢(qián)包和交易2.2.10以太坊的PoS共識(shí)算法2.2.1以太坊節(jié)點(diǎn)以太坊網(wǎng)絡(luò)由世界各地的以太坊節(jié)點(diǎn)組成,號(hào)稱(chēng)是“世界計(jì)算機(jī)”,截止2020年5月,以太坊在全球共有7,451個(gè)活動(dòng)主網(wǎng)節(jié)點(diǎn)??梢哉f(shuō)以太坊是一個(gè)開(kāi)源的、永不停機(jī)的、遍布全球的基礎(chǔ)計(jì)算設(shè)施。以太坊客戶端軟件以太坊節(jié)點(diǎn)計(jì)算機(jī)上需要安裝以太坊客戶端軟件。比較知名的以太坊客戶端軟件是GO語(yǔ)言版本的客戶端軟件Geth。保存以太坊網(wǎng)絡(luò)的區(qū)塊數(shù)據(jù)根據(jù)保存區(qū)塊鏈數(shù)據(jù)的多少,可以將以太坊節(jié)點(diǎn)分為全節(jié)點(diǎn)和輕節(jié)點(diǎn)兩種類(lèi)型。全節(jié)點(diǎn)指存儲(chǔ)了從創(chuàng)世區(qū)塊到最新區(qū)塊的所有區(qū)塊數(shù)據(jù)的節(jié)點(diǎn),這些區(qū)塊中包含了所有的以太坊歷史交易記錄。通常礦工的節(jié)點(diǎn)都是全節(jié)點(diǎn);輕節(jié)點(diǎn)只包含區(qū)塊頭形成的鏈,為節(jié)省空間,不保存區(qū)塊體。輕節(jié)點(diǎn)主要用于電子錢(qián)包,電子錢(qián)包通常安裝在瀏覽器或手機(jī)中,不可能存儲(chǔ)整個(gè)區(qū)塊鏈的數(shù)據(jù),因此只能采用輕量級(jí)的輕節(jié)點(diǎn)。當(dāng)輕節(jié)點(diǎn)需要獲取本地沒(méi)有的數(shù)據(jù)時(shí),可以向網(wǎng)絡(luò)中的全節(jié)點(diǎn)發(fā)出請(qǐng)求。輕節(jié)點(diǎn)的優(yōu)勢(shì)在于可以快速的啟動(dòng)和運(yùn)行,比較適合運(yùn)行在計(jì)算能力和存儲(chǔ)空間都有限的設(shè)備上,例如手機(jī)。2.2.2以太坊的狀態(tài)機(jī)本質(zhì)上,以太坊是一個(gè)基于交易的狀態(tài)機(jī)。1.什么是狀態(tài)機(jī)2.以太坊狀態(tài)機(jī)

1.什么是狀態(tài)機(jī)涉及狀態(tài)機(jī)的4個(gè)概念(1)狀態(tài)(State):比如自動(dòng)門(mén)的Open和Close狀態(tài);(2)事件(Event):指執(zhí)行某個(gè)操作,例如對(duì)于自動(dòng)門(mén)而言,按下開(kāi)門(mén)按鈕或走到門(mén)前(對(duì)于自動(dòng)感知的自動(dòng)門(mén))就是一個(gè)事件;(3)動(dòng)作(Action),指觸發(fā)事件后所執(zhí)行的動(dòng)作。例如按下開(kāi)門(mén)按鈕會(huì)執(zhí)行開(kāi)門(mén)的動(dòng)作。在編寫(xiě)程序時(shí)可以通過(guò)函數(shù)執(zhí)行動(dòng)作。(4)狀態(tài)的變換(Transition),指從一個(gè)狀態(tài)切換到另一個(gè)狀態(tài)的過(guò)程。例如開(kāi)門(mén)和關(guān)門(mén)的過(guò)程就是變換。2.以太坊狀態(tài)機(jī)在以太坊狀態(tài)機(jī)中,前面提到的4個(gè)概念具體體現(xiàn)如下(1)狀態(tài)(State):以太坊網(wǎng)絡(luò)狀態(tài)是一個(gè)比較抽象的表述,實(shí)際上它是由以太坊中所有賬戶的狀態(tài)組成的。(2)事件(Event):指太坊網(wǎng)絡(luò)中發(fā)生的交易,比如賬戶A轉(zhuǎn)賬1個(gè)以太幣到賬戶B,就會(huì)導(dǎo)致賬戶A和賬戶B的狀態(tài)變化。(3)動(dòng)作(Action):指以太坊賬戶之間發(fā)生的轉(zhuǎn)賬操作。(4)狀態(tài)的變換(Transition):指以太坊交易的過(guò)程。2.2.3以太坊網(wǎng)絡(luò)的總體架構(gòu)以太坊的總體架構(gòu)可以分為存儲(chǔ)層、網(wǎng)絡(luò)層、合約層和應(yīng)用層(1)存儲(chǔ)層,實(shí)現(xiàn)以太坊數(shù)據(jù)的存儲(chǔ)

以太坊數(shù)據(jù)存儲(chǔ)在LevelDB數(shù)據(jù)庫(kù)中。LevelDB是Google推出的非常高效的鍵值對(duì)數(shù)據(jù)庫(kù),目前能夠支持十億級(jí)別的數(shù)據(jù)量,而且還可以在此基礎(chǔ)上保持非常高的性能。以太坊中共有3個(gè)LevelDB數(shù)據(jù)庫(kù),分別是BlockDB、StateDB和ExtrasDB。BlockDB用于保存區(qū)塊的主體內(nèi)容,包括區(qū)塊頭和區(qū)塊體;StateDB保存了賬戶的狀態(tài)數(shù)據(jù);ExtrasDB保存了收據(jù)信息和其他輔助信息。

事件是以太坊網(wǎng)絡(luò)用于實(shí)現(xiàn)鏈內(nèi)、鏈外之間的溝通而建立機(jī)制。以太坊的日志代表對(duì)事件的存儲(chǔ)。本課程將在第7章中介紹以太坊的事件和日志。區(qū)塊以太坊的區(qū)塊同樣由區(qū)塊頭和區(qū)塊體組成,區(qū)塊中使用類(lèi)似Merkle樹(shù)的MPT樹(shù)來(lái)存儲(chǔ)交易數(shù)據(jù)。本課程將在2.2.6節(jié)中介紹以太坊的區(qū)塊結(jié)構(gòu)。特性與比特幣系統(tǒng)一樣,以太坊區(qū)塊鏈也需要借助非對(duì)稱(chēng)加密算法和數(shù)字簽名來(lái)實(shí)現(xiàn)防篡改、不可抵賴(lài)等特性,并且將區(qū)塊串聯(lián)成區(qū)塊鏈。(2)網(wǎng)絡(luò)層用于實(shí)現(xiàn)以太坊的網(wǎng)絡(luò)通信。作為區(qū)塊鏈項(xiàng)目的基本特征,以太坊基于P2P網(wǎng)絡(luò)。以太坊可以通過(guò)HTTP、RPC、LES、ETH和Wisper等網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信。除HTTP外,其他幾個(gè)網(wǎng)絡(luò)協(xié)議簡(jiǎn)要說(shuō)明如下:?RPC(RemoteProcedureCallProtocol,遠(yuǎn)程過(guò)程調(diào)用協(xié)議):是進(jìn)程間調(diào)用的常用方式。RPC調(diào)用的過(guò)程如圖2-5所示。?LES(LightEthereumSubprotocol,以太坊客戶端的輕量級(jí)的子協(xié)議):規(guī)定只需要下載區(qū)塊頭,其他詳細(xì)信息可以按需獲取。?RLPX:以太坊的底層網(wǎng)絡(luò)協(xié)議套件,包括P2P加密通信,節(jié)點(diǎn)發(fā)現(xiàn)等功能。?Whisper:一種簡(jiǎn)單的基于點(diǎn)對(duì)點(diǎn)身份的消息傳遞系統(tǒng)。RPC調(diào)用的過(guò)程(3)合約層在以太坊的合約層中,有一個(gè)很重要的概念——EVM(EthereumVirtualMachinecode,以太坊虛擬機(jī)代碼)。EVM所謂虛擬機(jī)是通過(guò)軟件模擬一個(gè)具有完整硬件系統(tǒng)功能的獨(dú)立運(yùn)行的計(jì)算機(jī)系統(tǒng)。因?yàn)橐蕴皇欠植际较到y(tǒng),全網(wǎng)由很多節(jié)點(diǎn)組成,這些節(jié)點(diǎn)的操作系統(tǒng)可能各不相同。與比特幣節(jié)點(diǎn)不同,以太坊節(jié)點(diǎn)上需要運(yùn)行智能合約,而且必須滿足這樣的前提條件:“在任何操作系統(tǒng)的節(jié)點(diǎn)下,在任何情況下,運(yùn)行同一個(gè)智能合約必須得到相同的結(jié)果?!盓VM可以在各種操作系統(tǒng)上安裝和運(yùn)行,從而為智能合約提供一個(gè)一致的、穩(wěn)定的運(yùn)行環(huán)境。也就是說(shuō),在以太坊網(wǎng)絡(luò)中,智能合約運(yùn)行在EVM之上,通過(guò)API接口服務(wù)與EVM對(duì)接。EVM字節(jié)碼Solidity程序并不是EVM可以理解的語(yǔ)言。EVM有自己的專(zhuān)屬語(yǔ)言,即“EVM字節(jié)碼”,而Solidity是便于程序員閱讀、理解和使用的高級(jí)語(yǔ)言。當(dāng)編譯Solidity程序時(shí),會(huì)將Solidity程序轉(zhuǎn)換成EVM字節(jié)碼,然后在EVM上運(yùn)行。EVM和智能合約的關(guān)系(4)應(yīng)用層智能合約只是一些腳本程序,只實(shí)現(xiàn)業(yè)務(wù)邏輯,沒(méi)有用戶界面。因此,要想讓普通用戶使用智能合約,就需要有應(yīng)用層的存在。應(yīng)用層由基于智能合約的以太坊應(yīng)用(DApp)組成。在DApp中,可以通過(guò)Web3.js來(lái)調(diào)用智能合約。2.2.4節(jié)將介紹DApp的基本情況。2.2.4DAppDApp是DecentralizationApplication的縮寫(xiě),即去中心化應(yīng)用。去中心化正是區(qū)塊鏈技術(shù)的核心思想。因此,也可以將DApp理解為區(qū)塊鏈的客戶端應(yīng)用。1.Swarm一個(gè)分布式存儲(chǔ)平臺(tái)以及內(nèi)容分發(fā)服務(wù),它的最主要目標(biāo)是為以太坊DApp代碼、數(shù)據(jù)以及區(qū)塊數(shù)據(jù)提供一個(gè)足夠去中心化以及足夠重復(fù)的存儲(chǔ)機(jī)制。它將文件存放在以太坊客戶端節(jié)點(diǎn)的存儲(chǔ)空間里,并且獎(jiǎng)勵(lì)給客戶端相應(yīng)的費(fèi)用(以太幣)。2.WhisperWhisper是一個(gè)簡(jiǎn)單的基于點(diǎn)對(duì)點(diǎn)身份的消息傳遞系統(tǒng),是一個(gè)結(jié)合了分布式哈希表(DHT)和P2P通信技術(shù)、用來(lái)實(shí)現(xiàn)以太坊節(jié)點(diǎn)之間通信的協(xié)議。通過(guò)Whisper協(xié)議,以太坊節(jié)點(diǎn)可以將信息發(fā)送給某個(gè)特定節(jié)點(diǎn),或者通過(guò)附加在信息中的標(biāo)簽、主題將信息發(fā)送給多個(gè)節(jié)點(diǎn),主要用于大規(guī)模的點(diǎn)對(duì)點(diǎn)數(shù)據(jù)發(fā)現(xiàn)、信號(hào)協(xié)商、最小傳輸通信、完全隱私保護(hù)的DApp而設(shè)計(jì)的。3.MetaMaskMetaMask是個(gè)開(kāi)源的以太坊錢(qián)包,可以在Chrome和Firefox等瀏覽器安裝MetaMask插件,從而方便地管理自己的以太坊數(shù)字資產(chǎn)。4.DAIDAI是第一個(gè)完全去中心化的穩(wěn)定貨幣。它基于一套自動(dòng)的智能合約系統(tǒng),可以根據(jù)市場(chǎng)的環(huán)境動(dòng)態(tài)調(diào)整,并保證Dai的穩(wěn)定性,一個(gè)Dai價(jià)值一美元。5.CryptoKitties收藏和養(yǎng)育數(shù)字貓的游戲,上線之初即廣受喜愛(ài),一度造成以太坊網(wǎng)絡(luò)的擁堵。6.SelfKey一個(gè)基于區(qū)塊鏈的數(shù)字身份系統(tǒng),它允許個(gè)人和公司真正擁有、并且可以控制和管理自己的數(shù)字身份。7.StatusStatus是一個(gè)為安卓和iOS開(kāi)發(fā)的開(kāi)源輕客戶端,包括一個(gè)聊天(messenger)系統(tǒng)和一個(gè)瀏覽器,為智能手機(jī)用戶使用DApp提供一個(gè)入口,同時(shí)為DApp開(kāi)發(fā)者獲得新用戶提供了一個(gè)簡(jiǎn)單途徑。8.GitcoinGitcoin是一個(gè)基于以太坊網(wǎng)絡(luò)構(gòu)建的去中心化協(xié)作平臺(tái)。其核心功能是采用二階投票的方式對(duì)項(xiàng)目進(jìn)行眾籌。9.TheDAODAO(DecentralizedAutonomousOrganization,去中心化的自治組織)是用投票的方式來(lái)管理的眾籌資金,而這筆資金全部用于投資和支持以太坊的開(kāi)發(fā)項(xiàng)目。TheDAO籌集到了1170萬(wàn)以太幣(價(jià)值約2.45億美元)。2.2.5DApp瀏覽器1.DApp瀏覽器的工作原理2.常用DApp瀏覽器1.DApp瀏覽器的工作原理DApp瀏覽器的底層框架2.常用DApp瀏覽器MistMetaMaskCoinbaseWalletTrustWalletimTokenStatusCipher2.2.6以太坊的數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)方式?狀態(tài)數(shù)據(jù):以太坊賬戶相關(guān)的狀態(tài)數(shù)據(jù)。以太坊使用StateDB存儲(chǔ)和管理賬戶,每個(gè)賬戶都是一個(gè)StateObject。?區(qū)塊鏈:區(qū)塊鏈?zhǔn)且蕴坏暮诵臄?shù)據(jù)。與比特幣區(qū)塊類(lèi)似,以太坊的區(qū)塊也由區(qū)塊頭和區(qū)塊體組成。?底層數(shù)據(jù):存儲(chǔ)全部的以太坊數(shù)據(jù)。以太坊的底層數(shù)據(jù)以鍵值對(duì)的形式存儲(chǔ)在LevelDB中。以太坊的數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)方式1.狀態(tài)數(shù)據(jù)狀態(tài)數(shù)據(jù)以MPT樹(shù)的形式存儲(chǔ)在StateDB中。MPT是MerklePatriciaTrie的縮寫(xiě),它是集成兼具M(jìn)erkleTree和PatriciaTree特點(diǎn)的一種新型樹(shù)狀結(jié)構(gòu)。MPT樹(shù)的特點(diǎn)如下:?可以存儲(chǔ)任意長(zhǎng)度的鍵值對(duì)。?具備Merkle樹(shù)的特性,可以用于階段的快速校驗(yàn)。?能夠很快根據(jù)鍵查詢到對(duì)應(yīng)的值。MPT樹(shù)包含shortNode、fullNode、valueNode和hashNode等4種類(lèi)型的節(jié)點(diǎn)。shortNode和fullNode是枝干節(jié)點(diǎn),可以有子節(jié)點(diǎn),shortNode只有一個(gè)子節(jié)點(diǎn);而fullNode有多個(gè)子節(jié)點(diǎn),這些子節(jié)點(diǎn)擁有相同的鍵前綴。valueNode和hashNode是葉子節(jié)點(diǎn),valueNode用于存儲(chǔ)數(shù)據(jù),值為從root到當(dāng)前節(jié)點(diǎn)的路徑上所有節(jié)點(diǎn)的鍵之和;hashNode用于存儲(chǔ)數(shù)據(jù)庫(kù)中其他節(jié)點(diǎn)的哈希。2.區(qū)塊鏈區(qū)塊頭由如下字段組成?ParentHash:父區(qū)塊的哈希值。?CoinBase:幣基地址,也就是挖出區(qū)塊的礦工的賬戶地址。?UncleHash:叔區(qū)塊的哈希值。?Root:StateDB中MPT樹(shù)的根哈希。MPT樹(shù)中存儲(chǔ)著所有以太坊賬戶的數(shù)據(jù)。?TxHash:記錄所有交易數(shù)據(jù)的MPT樹(shù)的根哈希。?ReceiptHash:記錄所有收據(jù)數(shù)據(jù)的MPT樹(shù)的根哈希。收據(jù)是交易概要信息,包括交易被哪個(gè)區(qū)塊打包了、這筆交易最終花費(fèi)了多少gas、以及執(zhí)行交易時(shí)創(chuàng)建的一些日志等。?Bloom:用于快速搜索和判斷一個(gè)日志是否存在于收據(jù)MPT樹(shù)中的數(shù)據(jù)。?Difficulty:工作量證明共識(shí)算法中的挖礦難度系數(shù)。?Nonce:記錄發(fā)起交易的賬戶已執(zhí)行交易總數(shù)。和mixHash結(jié)合在一起,相當(dāng)于挖礦的隨機(jī)數(shù)。?Number:區(qū)塊號(hào)。?Time:生成區(qū)塊的時(shí)間戳。?GasLimit:區(qū)塊中包含的所有交易所消耗的Gas的理論上限。?GasUsed:區(qū)塊中所有交易所消耗的Gas總量。?extraData:留給區(qū)塊的創(chuàng)建者,記錄該區(qū)塊的一些自定義的信息。長(zhǎng)度小于32字節(jié)。以太坊的交易由如下的字段組成:??GasPrice:Gas的價(jià)格,單位為wei。GasPrice越高,會(huì)越優(yōu)先被礦工打包。?GasLimit:Gas的上限。?Recipient:交易收據(jù)。?Amount:交易的金額。?Payload:交易攜帶的數(shù)據(jù)。?V,R,S:交易的簽名數(shù)據(jù)。2.2.7以太坊的分叉在以太坊的發(fā)展過(guò)程中,出于不斷完善算法和應(yīng)用的考慮,進(jìn)行了多次硬分叉。所謂硬分叉指區(qū)塊鏈發(fā)生永久性分歧而造成的分叉。比如,新版本發(fā)布后,部分沒(méi)有升級(jí)的節(jié)點(diǎn)無(wú)法驗(yàn)證已經(jīng)升級(jí)的節(jié)點(diǎn)所產(chǎn)生的區(qū)塊。以太坊硬分叉意味著以太坊底層協(xié)議的改變,繼續(xù)使用以太坊的用戶都需要升級(jí)以太坊客戶端,從而兼容新的版本。DAOTHEDAO(DecentralizedAutonomousOrganization,去中心化自治組織)是以太坊上的一個(gè)眾籌項(xiàng)目,是以太坊創(chuàng)始人維塔利克˙布特林提出的概念。THEDAO總共籌到了超過(guò)1200萬(wàn)個(gè)以太幣,占當(dāng)時(shí)以太幣總量的14%,按當(dāng)時(shí)的市價(jià)計(jì)算超過(guò)1.5億美金,參與眾籌的人數(shù)超過(guò)11000人。THEDAO的成功吸引了黑客的關(guān)注,黑客利用DAO代碼中的遞歸漏洞不停地從THEDAO的資金池里分離資產(chǎn)。此次攻擊造成以太坊的價(jià)格暴跌。為了挽回?fù)p失,以太坊決定采取硬分叉,把所有的資金都退回去,投資者不會(huì)有什么損失,而且不需要回滾。2.2.8Gas和以太幣以太坊的手續(xù)費(fèi)有一個(gè)很特別的名詞——Gas(燃料)。Gas的直譯為燃?xì)?,就好像開(kāi)動(dòng)汽車(chē)需要耗費(fèi)燃料一樣,Gas就是以太坊網(wǎng)絡(luò)運(yùn)轉(zhuǎn)的燃料。除了ETH和Wei其他的以太幣單位以太幣單位別

名與Wei的換算公式KweiBabbage1Kwei=1000WeiMweiLovelace1Mwei=106WeiGweiShannon1Mwei=109WeiMicroetherSzabo1Microether=1012WeiMillietherFinney1Millietherr=1015WeiGas的價(jià)值可以通過(guò)以太幣來(lái)衡量比特幣的匯率為1個(gè)以太幣≈$500GasLimit指定一個(gè)智能合約的燃料上限。Gas本身也可以理解成以太坊手續(xù)費(fèi)的單位,類(lèi)似于標(biāo)識(shí)汽油容量的“升”??梢哉f(shuō)本次操作的手續(xù)費(fèi)是幾個(gè)Gas,GasLimit指定是用戶愿意為執(zhí)行某個(gè)操作或確認(rèn)交易支付的最大Gas量(最少為21,000個(gè)Gas)。不同時(shí)期、不同的操作都可以設(shè)置不同的GasLimit。GasPrice指用戶愿意花費(fèi)于每個(gè)Gas單位的價(jià)錢(qián),單位為Gwei。1Gwei≈0.00000002ETH,因此可以得到執(zhí)行一次以太坊操作的最少手續(xù)費(fèi)可以按如下公式計(jì)算:最少手續(xù)費(fèi)=GasLimit×GasPrice=21,000×0.00000002ETH=0.00042ETH如果按照1ETH≈$500的匯率計(jì)算,執(zhí)行一次以太坊操作的最少手續(xù)費(fèi)約為$0.21。以太坊智能合約Solidity操作消耗Gas的情況操

作消耗Gas的情況在智能合約內(nèi)部調(diào)用view/pure的函數(shù)。關(guān)于view/pure的含義將在第5章介紹。view標(biāo)識(shí)函數(shù)不向區(qū)塊鏈上寫(xiě)入數(shù)據(jù),只讀取數(shù)據(jù);pure標(biāo)識(shí)函數(shù)不讀寫(xiě)區(qū)塊鏈約幾十個(gè)Gas在智能合約內(nèi)部調(diào)用向區(qū)塊鏈上寫(xiě)入數(shù)據(jù)的函數(shù)約幾百個(gè)Gas從智能合約外部調(diào)用view/pure的函數(shù)約2000~3000個(gè)Gas從智能合約外部調(diào)用向區(qū)塊鏈上寫(xiě)入數(shù)據(jù)的函數(shù)約3000~4000個(gè)Gas向區(qū)塊鏈上寫(xiě)入一個(gè)uint數(shù)據(jù)約20000多個(gè)Gas在區(qū)塊鏈上修改一個(gè)定長(zhǎng)數(shù)組元素的值約20000多個(gè)Gas在區(qū)塊鏈上向一個(gè)map中插入一個(gè)元素約20000多個(gè)Gas在區(qū)塊鏈上向一個(gè)變長(zhǎng)數(shù)組中push一個(gè)元素約40000多個(gè)Gas在進(jìn)行智能合約編程的過(guò)程中,注意以下幾點(diǎn)可以減少Gas的消耗:?盡量不要向區(qū)塊鏈上寫(xiě)入數(shù)據(jù);?如果不是必要,不要在區(qū)塊鏈上使用變長(zhǎng)數(shù)組;?盡量減少外部調(diào)用。2.2.9以太坊賬戶、錢(qián)包和交易1.賬戶在以太坊網(wǎng)絡(luò)中,賬戶用來(lái)存放以太幣。以太坊支持外部賬戶和合約賬戶2種賬戶。外部賬戶可以被一個(gè)以太坊用戶所擁有,在創(chuàng)建賬戶時(shí)可以生成一個(gè)私鑰,只有提供私鑰才能控制外部賬戶。用戶可以從一個(gè)外部賬戶轉(zhuǎn)賬至另一個(gè)外部賬戶,也可以在執(zhí)行智能合約時(shí)按照合約的規(guī)定向合約賬戶轉(zhuǎn)賬。合約賬戶與智能合約的代碼相關(guān)聯(lián)??梢灾付▓?zhí)行某段代碼的用戶需要向合約賬戶轉(zhuǎn)賬,也可以從其他合約賬戶中進(jìn)行轉(zhuǎn)賬。2.錢(qián)包要方便地對(duì)賬戶進(jìn)行管理和操作還需要借助錢(qián)包。錢(qián)包可以是瀏覽器的一個(gè)插件,也可以是一個(gè)Windows應(yīng)用程序或者手機(jī)App。3.交易在以太坊網(wǎng)絡(luò)中,交易并不單純指轉(zhuǎn)賬。嚴(yán)格地說(shuō),交易指一個(gè)數(shù)據(jù)包在區(qū)塊鏈上從一個(gè)外部賬戶發(fā)送至另一個(gè)賬戶的過(guò)程。這個(gè)數(shù)據(jù)包必須由發(fā)送者使用私鑰進(jìn)行簽名,交易數(shù)據(jù)包中包含一組消息。2.2.10以太坊的POS共識(shí)算法POS類(lèi)似于股東機(jī)制。擁有的股份越多,獲得記賬權(quán)的幾率越大??梢酝ㄟ^(guò)一個(gè)叫做幣齡的概念來(lái)衡量股權(quán)的多少,每個(gè)幣每天產(chǎn)生一個(gè)幣齡。假設(shè)小明持有1個(gè)以太幣,共持有100天,那么他的幣齡就是100;假設(shè)小紅持有10個(gè)以太幣,共持有5天,她的幣齡就是50。盡管小明只有一個(gè)以太幣,但他持有的時(shí)間久,因此比持有10個(gè)以太幣的小紅具有優(yōu)先的記賬權(quán)。每發(fā)現(xiàn)一個(gè)POS區(qū)塊,礦工的幣齡將被清0。這可以防止擁有以太幣多的人總能獲得記賬權(quán)。2.3搭建以太坊私有鏈2.3.1搭建測(cè)試環(huán)境2.3.2安裝以太坊客戶端Geth2.3.3初始化創(chuàng)世區(qū)塊2.3.4創(chuàng)建開(kāi)發(fā)者賬戶2.3.5以開(kāi)發(fā)者模式啟動(dòng)私有鏈2.3.6私有鏈賬戶管理2.3.7在私有鏈中挖礦2.3.8轉(zhuǎn)帳操作2.3.1搭建測(cè)試環(huán)境1.安裝OracleVirtualBox訪問(wèn)OracleVirtualBox的官網(wǎng)可以下載最新的安裝包。/2.在OracleVirtualBox中安裝CentOS虛擬機(jī)新建虛擬電腦對(duì)話框

“設(shè)置內(nèi)存大小”對(duì)話框

新建的CentOS虛擬機(jī)

設(shè)置虛擬機(jī)的存儲(chǔ)屬性選中提前準(zhǔn)備好的CentOS7安裝光盤(pán)鏡像查看CentOS的版本信息3.設(shè)置CentOS虛擬機(jī)的靜態(tài)IP地址首先打開(kāi)VirtualBox,右擊CentOS虛擬機(jī)圖標(biāo),在快捷菜單中選擇“設(shè)置”打開(kāi)“虛擬機(jī)設(shè)置”窗口。在左側(cè)窗格中選中“網(wǎng)絡(luò)”,在右側(cè)的“網(wǎng)卡1”選項(xiàng)卡中,選中“啟用網(wǎng)絡(luò)連接”復(fù)選框,然后將連接方式選擇為“橋接網(wǎng)卡”,在“網(wǎng)卡2”選項(xiàng)卡中,選中“啟用網(wǎng)絡(luò)連接”復(fù)選框,然后將連接方式選擇為“網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)”,最后單擊OK按鈕。查看CentOS系統(tǒng)的網(wǎng)卡名字默認(rèn)的網(wǎng)絡(luò)配置參數(shù)cd/etc/sysconfig/network-scriptsviifcfg-enp0s3設(shè)置如下的配置項(xiàng)?將BOOTPROTO設(shè)置為static,表示使用靜態(tài)IP地址。默認(rèn)值為dhcp,表示使用由系統(tǒng)分配的動(dòng)態(tài)IP地址。?新增IPADDR=01,設(shè)置虛擬機(jī)的靜態(tài)IP地址為01。讀者需要根據(jù)自己的網(wǎng)絡(luò)環(huán)境進(jìn)行設(shè)置。?設(shè)置NETMASK為子網(wǎng)掩碼,通常為。?設(shè)置GATEWAY為網(wǎng)關(guān)的IP地址,讀者需要根據(jù)自己的網(wǎng)絡(luò)環(huán)境進(jìn)行設(shè)置。?將ONBOOT設(shè)置為yes,表示網(wǎng)卡啟動(dòng)方式為開(kāi)機(jī)啟動(dòng)。4.設(shè)置CentOS虛擬機(jī)的主機(jī)名執(zhí)行以下命令可以將CentOS虛擬機(jī)的主機(jī)名設(shè)置為centos1:hostnamectlset-hostnamecentos1執(zhí)行下面命令可以查看主機(jī)名。hostnamectlstatus從Windows下可能會(huì)ping不通。原因是需要安裝Sambayuminstallsamba然后啟動(dòng)nmb服務(wù):systemctlstartnmbsystemctlenablenmb配置并重啟防火墻:firewall-cmd--permanent--zone=public--add-service=sambafirewall-cmd--reload5.使用Putty工具遠(yuǎn)程連接CentOS虛擬機(jī)Putty是一款免費(fèi)的基于SSH和Telnet遠(yuǎn)程連接工具。訪問(wèn)如下網(wǎng)址可以下載Putty。.uk/~sgtatham/putty/Putty配置窗口Putty終端窗口

安裝openssh組件yuminstallopenssh-server然后啟動(dòng)sshd服務(wù)并關(guān)閉防火墻:systemctlrestartsshdsystemctldisablefirewalld打開(kāi)“虛擬機(jī)設(shè)置”窗口在左側(cè)窗格中選中“網(wǎng)絡(luò)”,在右側(cè)的網(wǎng)卡2選項(xiàng)卡中,選中“啟用網(wǎng)絡(luò)連接”復(fù)選框,將連接方式選擇為“僅主機(jī)(Host-Only)網(wǎng)絡(luò)”,然后單擊OK按鈕。配置好后,可以在宿主機(jī)(安裝VirtualBox的計(jì)算機(jī))中可以看到一個(gè)名稱(chēng)為VirtualBoxHost-OnlyEthernetAdapter的虛擬網(wǎng)絡(luò)連接。查看虛擬連接的IP地址ifcfg-enp0s8的內(nèi)容如下TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticIPADDR=00NETMASK=DNS1=0DNS2=GATEWAY=DEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=enp0s8UUID=b86ee2d0-57a8-4e49-8eaf-803edd59d4dfDEVICE=enp0s8ONBOOT=yes重啟network服務(wù),應(yīng)用新的網(wǎng)絡(luò)配置systemctlrestartnetworkPutty配置窗口Putty終端窗口如果Putty不能連接到CentOS,可以執(zhí)行下面命令安裝openssh組件yuminstallopenssh-server然后啟動(dòng)sshd服務(wù)并關(guān)閉防火墻:systemctlrestartsshdsystemctldisablefirewalld6.使用WinSCP工具在宿主機(jī)與CentOS服務(wù)器之間傳輸文件可以通過(guò)下面的網(wǎng)址下載WinSCP。/WinSCP登錄對(duì)話框WinSCP主窗口7.在CentOS虛擬機(jī)上搭建網(wǎng)站首先執(zhí)行如下命令安裝Apache。yum-yinstallhttpd執(zhí)行下面的命令啟動(dòng)Apache服務(wù)。systemctlstarthttpd執(zhí)行下面的命令設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng)Apache服務(wù)。systemctlenablehttpdApache的網(wǎng)站根目錄為/var/www/html。在下面創(chuàng)建一個(gè)index.html<html><body><h1>HelloWorld!</body></html>

瀏覽CentOS虛擬機(jī)中部署的網(wǎng)頁(yè)8.在CentOS虛擬機(jī)上安裝圖形化界面首先執(zhí)行下面的命令,安裝XWindows。yumgroupinstall"XWindowSystem"執(zhí)行下面命令,安裝GNOME桌面。yumgroupinstall-y"GNOMEDesktop"在VirtualBox虛擬機(jī)終端中執(zhí)行下面命令啟動(dòng)桌面init5登錄后的CentOS圖形界面2.3.2安裝以太坊客戶端Geth(1)安裝Golang;(2)安裝gcc;(3)設(shè)置下載代理;(4)下載GO版本的以太坊源碼;(5)安裝以太坊節(jié)點(diǎn)。1.安裝GolangGO語(yǔ)言中文網(wǎng)的下載頁(yè)面網(wǎng)址如下:/dl執(zhí)行下面的命令,下載最新版本的Golangcd/usr/local/wget/dl/golang/go1.15.3.linux-amd64.tar.gz安裝wgetyuminstall-ywget(2)解壓縮GO語(yǔ)言版本的以太坊源碼到/root目錄tar-C/root-xzfgo1.15.3.linux-amd64.tar.gz(3)設(shè)置GO語(yǔ)言的環(huán)境變量。cd/rootvi~/.bashrc在vi編輯器中添加如下代碼exportGOPATH=/root/GoexportGOROOT=/root/goexportPATH=$PATH:$GOROOT/bin保存退出后,執(zhí)行下面的命令編譯.bashrc文件source~/.bashrc查看GO語(yǔ)言的版本goversion如果輸出如下信息,則說(shuō)明安裝成功。

goversiongo1.15.3linux/amd642.安裝gccgcc(GNUCompilerCollection,GNU編譯器套件)是由GNU開(kāi)發(fā)的編程語(yǔ)言譯器。GNU編譯器套件包括C、C++、

Objective-C、

Fortran、Java、Ada和Go語(yǔ)言前端,也包括了這些語(yǔ)言的庫(kù)。在編譯以太坊的GO語(yǔ)言源代碼時(shí)需要依賴(lài)gcc。因此需要執(zhí)行以下命令提前安裝。yum-yinstallgcc

gcc-c++kernel-devel3.設(shè)置下載代理在安裝以太坊節(jié)點(diǎn)的過(guò)程中,需要從一些境外服務(wù)器下載一些組件,為了保證安裝過(guò)程順利進(jìn)行,需要設(shè)置下載代理。有效的下載代理經(jīng)常變化,筆者使用的是。設(shè)置下載代理的命令如下:goenv-wGOPROXY=4.下載GO版本的以太坊源碼cd/usr/localgitclone/ethereum/go-ethereumGitGit是目前應(yīng)用最廣泛的分布式版本控系統(tǒng),利用Git可以記錄程序或文檔的不同版本,也就是記錄每一次對(duì)文件的改動(dòng)。如果沒(méi)有安裝git,可以執(zhí)行下面的命令安裝:yuminstall-ygit5.安裝GO版本的以太坊源碼對(duì)源碼進(jìn)行編譯的命令如下:cdgo-ethereummakegethGeth被安裝在/usr/local/go-ethereum/目錄下。執(zhí)行下面的命令編輯~/.bash_profile文件。vi~/.bash_profile在~/.bash_profile文件的最后添加如下代碼exportPATH=$PATH:/usr/local/go-ethereum/build/bin

保存并退出后執(zhí)行下面的命令使~/.bash_profile文件的內(nèi)容生效。

source~/.bash_profile查看Geth的版本gethversion返回結(jié)果:GethVersion:1.9.24-unstableGitCommit:97fc1c3b1d054a1345934e18fa6c3489e9119666GitCommitDate:20201105Architecture:amd64ProtocolVersions:[656463]GoVersion:go1.15.3OperatingSystem:linuxGOPATH=/root/GoGOROOT=/root/go2.3.3初始化創(chuàng)世區(qū)塊{"config":{"chainId":100,"homesteadBlock":0,"eip155Block":0,"eip158Block":0},"coinbase":"0x0000000000000000000000000000000000000000","

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論