Solidity智能合約開發(fā)技術(shù)與實戰(zhàn)-以太坊和智能合約_第1頁
Solidity智能合約開發(fā)技術(shù)與實戰(zhàn)-以太坊和智能合約_第2頁
Solidity智能合約開發(fā)技術(shù)與實戰(zhàn)-以太坊和智能合約_第3頁
Solidity智能合約開發(fā)技術(shù)與實戰(zhàn)-以太坊和智能合約_第4頁
Solidity智能合約開發(fā)技術(shù)與實戰(zhàn)-以太坊和智能合約_第5頁
已閱讀5頁,還剩149頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

新建的CentOS虛擬機

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

安裝openssh組件yuminstallopenssh-server然后啟動sshd服務(wù)并關(guān)閉防火墻:systemctlrestartsshdsystemctldisablefirewalld打開“虛擬機設(shè)置”窗口在左側(cè)窗格中選中“網(wǎng)絡(luò)”,在右側(cè)的網(wǎng)卡2選項卡中,選中“啟用網(wǎng)絡(luò)連接”復選框,將連接方式選擇為“僅主機(Host-Only)網(wǎng)絡(luò)”,然后單擊OK按鈕。配置好后,可以在宿主機(安裝VirtualBox的計算機)中可以看到一個名稱為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ù),應用新的網(wǎng)絡(luò)配置systemctlrestartnetworkPutty配置窗口Putty終端窗口如果Putty不能連接到CentOS,可以執(zhí)行下面命令安裝openssh組件yuminstallopenssh-server然后啟動sshd服務(wù)并關(guān)閉防火墻:systemctlrestartsshdsystemctldisablefirewalld6.使用WinSCP工具在宿主機與CentOS服務(wù)器之間傳輸文件可以通過下面的網(wǎng)址下載WinSCP。/WinSCP登錄對話框WinSCP主窗口7.在CentOS虛擬機上搭建網(wǎng)站首先執(zhí)行如下命令安裝Apache。yum-yinstallhttpd執(zhí)行下面的命令啟動Apache服務(wù)。systemctlstarthttpd執(zhí)行下面的命令設(shè)置開機自動啟動Apache服務(wù)。systemctlenablehttpdApache的網(wǎng)站根目錄為/var/www/html。在下面創(chuàng)建一個index.html<html><body><h1>HelloWorld!</body></html>

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

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

Objective-C、

Fortran、Java、Ada和Go語言前端,也包括了這些語言的庫。在編譯以太坊的GO語言源代碼時需要依賴gcc。因此需要執(zhí)行以下命令提前安裝。yum-yinstallgccgcc-c++kernel-devel3.設(shè)置下載代理在安裝以太坊節(jié)點的過程中,需要從一些境外服務(wù)器下載一些組件,為了保證安裝過程順利進行,需要設(shè)置下載代理。有效的下載代理經(jīng)常變化,筆者使用的是。設(shè)置下載代理的命令如下:goenv-wGOPROXY=4.下載GO版本的以太坊源碼cd/usr/localgitclone/ethereum/go-ethereumGitGit是目前應用最廣泛的分布式版本控系統(tǒng),利用Git可以記錄程序或文檔的不同版本,也就是記錄每一次對文件的改動。如果沒有安裝git,可以執(zhí)行下面的命令安裝:yuminstall-ygit5.安裝GO版本的以太坊源碼對源碼進行編譯的命令如下: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","difficulty":"0x40000","extraData":"","gasLimit":"0xffffffff","nonce":"0x0000000000000042","mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x00","alloc":{}}{"config":{"chainId":10,"homesteadBlock":0,"eip155Block":0,"eip158Block":0},"alloc":{},"coinbase":"0x0000000000000000000000000000000000000000","difficulty":"0x02000000","extraData":"","gasLimit":"0x2fefd8","nonce":"0x0000000000000042","mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x00"}genesis.json中的參數(shù)參數(shù)說明chainId以太坊區(qū)塊鏈網(wǎng)絡(luò)Id。以太網(wǎng)主鏈的chainid為1,此處只要不與主鏈沖突即可homesteadBlock發(fā)布以太坊Homestead版本時的區(qū)塊高度eip155BlockEIP155HFblock,以太坊于2016年增加的,用于防重放攻擊,即防止測試網(wǎng)中的代幣發(fā)送到主網(wǎng)中去。升級的目的在于在計算哈希值時加上簽名數(shù)據(jù)和chainIdeip158BlockEIP158HFblock,為了配合EIP155HFblock所進行的第2次升級,旨在清除狀態(tài)coinbase挖礦礦工的賬戶difficulty挖礦的難度值extraData附加信息,根據(jù)需要隨意填寫gasLimit執(zhí)行交易所需花費的Gas上限值nonce用于挖礦的隨機數(shù)mixhash與nonce配合用于挖礦,由上一個區(qū)塊的一部分生成的哈希值parentHash父區(qū)塊的哈希值,因為是創(chuàng)世塊,所以這個值是0timestamp創(chuàng)建創(chuàng)始區(qū)塊的時間戳alloc預置賬號以及賬號的以太幣數(shù)量初始化創(chuàng)世區(qū)塊cd/usr/local/go-ethereum/build/bin./geth--datadir"./ethchain"init./ethdev/genesis.json參數(shù)說明?--datadir,指定以太坊私鏈存放數(shù)據(jù)的目錄。?init,初始化創(chuàng)世區(qū)塊的命令。2.3.4創(chuàng)建開發(fā)者賬戶./geth--datadir"./ethchain"-devaccountnew參數(shù)說明如下:?--datadir,指定以太坊私鏈存放數(shù)據(jù)的目錄。?-dev,指定以開發(fā)者模式執(zhí)行命令。?accountnew,創(chuàng)建新賬戶。創(chuàng)建開發(fā)者賬戶2.3.5以開發(fā)者模式啟動私有鏈cd/usr/local/go-ethereum/build/bin./geth--datadirethchain--nodiscoverconsole2>>eth_output.log-dev--dev.period1--password'./password.txt'參數(shù)說明?--datadir:指定以太坊私鏈存放數(shù)據(jù)的目錄。?--nodiscover:指定這是一個私有鏈,不會在公網(wǎng)上被發(fā)現(xiàn)。?console:指定啟動命令行模式,可以在Geth中執(zhí)行命令。?-dev:指定以開發(fā)者模式執(zhí)行命令。?--dev.period:指定開發(fā)者模式下的挖礦周期,默認為0,指定被動挖礦模式

溫馨提示

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

最新文檔

評論

0/150

提交評論