學(xué)習(xí)區(qū)塊鏈有一段時(shí)間了益愈,涉及到的相關(guān)技術(shù)比較多梢灭,因此想通過(guò)寫(xiě)文章來(lái)進(jìn)行一個(gè)技術(shù)總結(jié)。同時(shí)蒸其,會(huì)寫(xiě)幾個(gè)教程敏释,讓對(duì)區(qū)塊鏈有興趣的童鞋們更好的入門(mén)。
從介紹以太坊的架構(gòu)作為起點(diǎn)摸袁,本文分為三部分钥顽,第一部分介紹以太坊以及以太坊區(qū)塊鏈的整體架構(gòu),第二部分詳細(xì)介紹組成以太坊各個(gè)部分的概念靠汁,第三部分介紹以太坊生態(tài)的開(kāi)發(fā)工具和技術(shù)蜂大。
Part 1? ? 以太坊與以太坊區(qū)塊鏈整體架構(gòu)
區(qū)塊鏈(BlockChain):
????本質(zhì)上是一個(gè)應(yīng)用了密碼學(xué)技術(shù)的分布式數(shù)據(jù)庫(kù)系統(tǒng)。
以太坊(Ethereum):
????是一個(gè)基于區(qū)塊鏈技術(shù)的去中心化平臺(tái)蝶怔,允許任何人在這個(gè)平臺(tái)上開(kāi)發(fā)去中心化應(yīng)用和使用它們奶浦。2014年 Vitalik Buterin 發(fā)布了白皮書(shū)?https://github.com/ethereum/wiki/wiki/White-Paper
很多人即使看了許多相關(guān)的技術(shù)資料,仍然難以清晰的理解什么是以太坊踢星,為了讓你更加簡(jiǎn)單直白的理解什么是以太坊澳叉,我們以傳統(tǒng)的Client/Server的架構(gòu)來(lái)作對(duì)比。
圖1.1????傳統(tǒng)的Web應(yīng)用一般都由兩部分組成斩狱,客戶(hù)端(Client)和服務(wù)器端(Server)耳高。
用戶(hù)通過(guò)客戶(hù)端的應(yīng)用例如(瀏覽器,curl/wget 命令行工具)與服務(wù)器端的web應(yīng)用交互所踊。這種情景下泌枪,服務(wù)器端是中心化的,所有的客戶(hù)端都是通過(guò)訪問(wèn)這個(gè)唯一的中心化服務(wù)器獲取資源以及進(jìn)行用戶(hù)想要實(shí)現(xiàn)的功能操作秕岛。
這里需要記住兩個(gè)概念碌燕。
1. 中心化系統(tǒng)(即傳統(tǒng)的Client/Server架構(gòu))
2. 去中心化系統(tǒng)(以太坊)
圖1.2 可以把以太坊想象成一個(gè)由來(lái)自全世界成千上萬(wàn)的一個(gè)個(gè)計(jì)算機(jī)節(jié)點(diǎn)組成的一個(gè)超大計(jì)算機(jī)平臺(tái),你可以在這個(gè)平臺(tái)上面開(kāi)發(fā)去中心化應(yīng)用(Dapp)继薛,編寫(xiě)智能合約(Smart Contract)修壕,執(zhí)行轉(zhuǎn)賬交易等。所有的節(jié)點(diǎn)相互連接并且每個(gè)節(jié)點(diǎn)可以擁有整個(gè)平臺(tái)的代碼和區(qū)塊鏈數(shù)據(jù)的完整備份遏考。由于節(jié)點(diǎn)數(shù)量眾多慈鸠,只要你開(kāi)發(fā)的應(yīng)用已經(jīng)在以太坊上面成功部署,那你的應(yīng)用幾乎是永遠(yuǎn)可以被隨時(shí)訪問(wèn)的(即使有部分節(jié)點(diǎn)宕機(jī)或出現(xiàn)故障灌具,仍有很多其他的節(jié)點(diǎn)在維持網(wǎng)絡(luò)的運(yùn)行青团。這個(gè)是傳統(tǒng)的中心化系統(tǒng)(C/S架構(gòu))無(wú)法做到的譬巫,只要系統(tǒng)的中心服務(wù)器出現(xiàn)一點(diǎn)小故障,都可能導(dǎo)致客戶(hù)端無(wú)法訪問(wèn)服務(wù)器的資源)督笆。
圖1.3????以太坊架構(gòu)與以太坊區(qū)塊鏈
沒(méi)有中心化的服務(wù)器端芦昔,所有客戶(hù)端通過(guò)與節(jié)點(diǎn)上的實(shí)例化應(yīng)用進(jìn)行交互。
那么娃肿,什么是以太坊區(qū)塊鏈呢咕缎?以太坊區(qū)塊鏈主要由2部分組成。
1. 數(shù)據(jù)庫(kù): 以太坊網(wǎng)絡(luò)的所有交易都會(huì)儲(chǔ)存在區(qū)塊鏈里料扰,部署一個(gè)Dapp凭豪,就算是一次交易。舉個(gè)實(shí)際應(yīng)用例子记罚,比如我們開(kāi)發(fā)一個(gè)投票的應(yīng)用墅诡,每個(gè)用戶(hù)都可以給候選人投票,那么每次投票給候選人就可以當(dāng)作是一次交易桐智。所有這些交易記錄都是公開(kāi)可見(jiàn)末早,可被驗(yàn)證并且無(wú)法篡改。那么以太坊是怎么實(shí)現(xiàn)這些功能并且保證整個(gè)網(wǎng)絡(luò)的安全性呢说庭?這就涉及到密碼學(xué)技術(shù)以及分布式系統(tǒng)的共識(shí)機(jī)制(后面會(huì)有文章再專(zhuān)門(mén)講解)然磷。
2. 代碼: 除了儲(chǔ)存所有的交易記錄,以太坊區(qū)塊鏈還會(huì)儲(chǔ)存所有智能合約代碼刊驴。目前姿搜,絕大多數(shù)的智能合約都是用 Solidity語(yǔ)言編寫(xiě)開(kāi)發(fā),Solidity Compiler 會(huì)把智能合約代碼編譯成 Ethereum Byte Code 然后把這些 Byte Code 部署到區(qū)塊鏈捆憎,再在 EVM(Ethereum Virtual Machine 以太坊虛擬機(jī))上執(zhí)行這些Byte Code舅柜。(后面會(huì)再專(zhuān)門(mén)講解)
圖1.3 里面的Web3js 是一個(gè)js庫(kù),通過(guò)這個(gè)庫(kù)可以讓Dapp的前端與區(qū)塊鏈里的智能合約進(jìn)行交互躲惰。
Part 2? ? 組成以太坊各個(gè)部分的概念
2.1????智能合約(Smart Contract)
第一部分里我們講過(guò)致份,用 Solidity 語(yǔ)言編寫(xiě)開(kāi)發(fā)并部署到以太坊區(qū)塊鏈上面的應(yīng)用,稱(chēng)為智能合約础拨。作為剛開(kāi)始學(xué)習(xí)以太坊的你氮块,肯定會(huì)覺(jué)得懵逼,為什么這些應(yīng)用會(huì)叫做智能合約诡宗?通常意義上滔蝉,合約是雙方或者多方之間擬定的具有法律效應(yīng)的協(xié)議。當(dāng)我們把這些協(xié)議通過(guò)代碼來(lái)呈現(xiàn)并把他們發(fā)布到區(qū)塊鏈上塔沃,我們就有了數(shù)字合約蝠引。以太坊區(qū)塊鏈運(yùn)用技術(shù)手段來(lái)保證這些數(shù)字合約,一旦達(dá)成條件,就一定會(huì)按照協(xié)議強(qiáng)制執(zhí)行立肘,這就是為什么這些數(shù)字合約會(huì)被稱(chēng)為智能合約边坤。
那么這些代碼是如何強(qiáng)制執(zhí)行的名扛?發(fā)布到區(qū)塊鏈上的智能合約谅年,是無(wú)法修改的,并且條件達(dá)成時(shí)肮韧,一定會(huì)執(zhí)行相應(yīng)的代碼融蹂。
舉個(gè)實(shí)際的應(yīng)用例子,比如我要開(kāi)發(fā)一個(gè)領(lǐng)養(yǎng)寵物的應(yīng)用弄企,需要募集2萬(wàn)元(通過(guò)以太幣的形式)來(lái)開(kāi)發(fā)這個(gè)應(yīng)用超燃,對(duì)這個(gè)應(yīng)用感興趣的用戶(hù)都可以捐助10-1000元。那么這個(gè)智能合約可以這樣寫(xiě)拘领,假如最后我在預(yù)期時(shí)間內(nèi)完成了應(yīng)用的開(kāi)發(fā)意乓,那募集的所有儲(chǔ)存在以太坊區(qū)塊鏈上面的以太幣就會(huì)轉(zhuǎn)到我的以太坊賬戶(hù)上,反之约素,則會(huì)相應(yīng)的轉(zhuǎn)回給每個(gè)用戶(hù)的以太坊賬戶(hù)上届良。這種情景下,使用智能合約就擁有以下4個(gè)優(yōu)點(diǎn):
1. 所有用戶(hù)捐助的以太幣都儲(chǔ)存在以太坊區(qū)塊鏈的智能合約里圣猎,我或者用戶(hù)都無(wú)法隨意拿走這些以太幣士葫。
2. 一旦在預(yù)期時(shí)間內(nèi)完成了應(yīng)用開(kāi)發(fā),智能合約就會(huì)執(zhí)行相應(yīng)代碼把以太幣轉(zhuǎn)到我的賬戶(hù)上送悔。
3. 假如在預(yù)期時(shí)間內(nèi)沒(méi)有完成慢显,智能合約就會(huì)執(zhí)行相應(yīng)代碼把以太幣轉(zhuǎn)給相應(yīng)的用戶(hù)。
4. 智能合約一旦發(fā)布到以太坊區(qū)塊鏈上欠啤,所有的代碼都無(wú)法被修改或者篡改荚藻。
2.2????以太幣和它的不同單位
圖 2.1? 以太幣以及它的不同單位的換算
好比現(xiàn)實(shí)世界里,每個(gè)國(guó)家都有自己的貨幣比如人民幣洁段,美金应狱,英鎊,歐元眉撵。以太坊也有自己的貨幣侦香,以太幣。
點(diǎn)擊這里??可以查看實(shí)時(shí)的以太幣價(jià)格纽疟。
拿人民幣作為例子罐韩,1元等于10角,1角等于10分污朽。以太幣也有相應(yīng)的換算單位散吵,Ether 以及 Wei。
2.3? ? 以太坊地址
當(dāng)我們登錄銀行網(wǎng)站時(shí),需要輸入用戶(hù)名和密碼進(jìn)行驗(yàn)證矾睦,在銀行網(wǎng)站里晦款,用戶(hù)名就是我們的身份標(biāo)識(shí)。那么在以太坊區(qū)塊鏈里枚冗,地址就是我們的身份標(biāo)識(shí)缓溅。以太坊的地址示例:?0x807a59ca6e531225f86dc5f5abfd42f779290325。??每個(gè)地址都有對(duì)應(yīng)的私鑰赁温,私鑰就像是你的銀行網(wǎng)站密碼坛怪。你需要 地址+私鑰 才能和以太坊區(qū)塊鏈進(jìn)行交互。關(guān)于地址和私鑰有三點(diǎn)要記住的:
1. 地址是公開(kāi)的股囊,可以讓所有人知道袜匿。
2. 私鑰不能隨意分享給其他人,最好只有你自己知道稚疹。
3. 地址和私鑰都不保存在數(shù)據(jù)庫(kù)里面居灯,要自己保管好。? ?
2.4 ????以太坊賬戶(hù)
有了地址和私鑰就形成了以太坊的賬戶(hù)内狗。賬戶(hù)可以保存余額(以太幣)以及發(fā)送交易怪嫌,以太坊有兩種賬戶(hù)類(lèi)型。
1. 外部擁有賬戶(hù)(EOA: Externally owned accounts): 地址+私鑰的組合形成一個(gè)外部擁有賬戶(hù)其屏。
? ? 1.1????你可以用這個(gè)賬戶(hù)來(lái)接收來(lái)自其他賬戶(hù)的以太幣喇勋,也可以給其他賬戶(hù)發(fā)送以太幣。
? ? 1.2????可以給智能合約發(fā)送交易偎行。
2. 合約賬戶(hù)(Contract accounts): 這類(lèi)賬戶(hù)是沒(méi)有私鑰的川背。當(dāng)你把智能合約發(fā)布到以太坊區(qū)塊鏈上時(shí),就會(huì)生成這類(lèi)賬戶(hù)蛤袒。
? ? 2.1? ? 合約賬戶(hù)像EOA一樣也可以發(fā)送或者接收以太幣熄云。
? ? 2.2? ? 合約賬戶(hù)里面有智能合約的代碼。
? ? 2.3? ? 交易必須是通過(guò)EOA或者其他合約賬戶(hù)觸發(fā)的妙真。
2.5????以太坊錢(qián)包
錢(qián)包用來(lái)存放和管理以太坊賬戶(hù)缴允,還有對(duì)交易進(jìn)行數(shù)字簽名,追蹤余額等功能珍德。
2.6? ? 以太坊(Gas, Gas Price, Gas Limit)
發(fā)布智能合約到以太坊區(qū)塊鏈以及執(zhí)行交易等操作都是有代價(jià)的练般,要給予礦工一定數(shù)量的以太幣以讓他們?nèi)?zhí)行相應(yīng)的功能操作。那么執(zhí)行什么操作需要對(duì)應(yīng)什么價(jià)格呢锈候?以太坊的黃皮書(shū)有寫(xiě)明標(biāo)準(zhǔn)薄料,比如執(zhí)行兩個(gè)數(shù)相加需要3 units of work,兩個(gè)數(shù)相乘則需要 5 units of work, 這里的unit of work 單位就是 Gas(氣).??以太坊黃皮書(shū)
我們現(xiàn)在知道每筆交易需要多少Gas泵琳,但我們?nèi)匀徊恢牢覀円虻V工支付多少以太幣摄职,這是由Gas價(jià)格決定的誊役,比較有意思的是,你可以設(shè)置任何想要的Gas價(jià)格谷市。例如蛔垢,你可以說(shuō)我的交易是"我愿意為每個(gè)Gas支付3Gwei"。如果交易需要100000Gas迫悠,并且將Gas價(jià)格設(shè)置為3Gwei鹏漆,那最終的交易支付便是 3000000GWei。并且你設(shè)定的Gas價(jià)格越高及皂,交易就開(kāi)始得越快甫男。因?yàn)榇蠖鄶?shù)礦工按照Gas價(jià)格從高到低的順序?qū)灰走M(jìn)行分類(lèi),并選擇Gas價(jià)格較高的交易納入?yún)^(qū)塊验烧。如果將價(jià)格設(shè)置得較低,交易雖然總會(huì)被寫(xiě)進(jìn)在區(qū)塊中又跛,但需要等待的時(shí)間就比較久碍拆。
要確切知道交易需要多少 Gas 是很困難的。作為開(kāi)發(fā)人員慨蓝,不能盲目執(zhí)行交易感混,并意識(shí)到你的交易可能會(huì)花費(fèi)數(shù)百美元的以太幣。為了避免這種情況礼烈,可以指定一個(gè)Gas Limit弧满,指明你愿意支付以執(zhí)行交易的最大Gas數(shù)量。
2.7 Byte Code
智能合約代碼一般是用 Solidity 語(yǔ)言編寫(xiě)的此熬,接著代碼會(huì)被 Solidity Compiler 編譯成 EVM(Ethereum Virtural Machine 以太坊虛擬機(jī)) bytecode庭呜。實(shí)際上真正被發(fā)布到區(qū)塊鏈上面的就是這些被編譯后的 bytecode. 因?yàn)镋VM只能讀懂也只能執(zhí)行這些 bytecode。
這樣設(shè)計(jì)的優(yōu)點(diǎn)是開(kāi)發(fā)者可以選擇自己想要的編程語(yǔ)言去開(kāi)發(fā)智能合約犀忱。目前還有另外一種編程語(yǔ)言 Vyper (類(lèi)似Python語(yǔ)言) 也可以編譯成 EVM bytecode募谎。假如你是一個(gè)語(yǔ)言設(shè)計(jì)者,你甚至可以根據(jù)黃皮書(shū)的標(biāo)準(zhǔn)實(shí)現(xiàn)自己的編程語(yǔ)言去開(kāi)發(fā)智能合約阴汇。
2.8 EVM(Ethereum Virtual Machine 以太坊虛擬機(jī))
EVM是一個(gè)具備圖靈完整数冬,256bit的,并且允許任何人執(zhí)行任意 EVM bytecode 的虛擬機(jī)搀庶。EVM同時(shí)也是以太坊協(xié)議的一部分拐纱。
Part 3? ? 以太坊工具與技術(shù)
3.1? ? Geth
到目前為止,我們講解了以太坊基本的理論概念哥倔。 現(xiàn)在來(lái)看看以太坊有哪些工具秸架,庫(kù)和應(yīng)用。
Geth是以太坊基金會(huì)提供的官方客戶(hù)端軟件未斑,用Go語(yǔ)言編寫(xiě)咕宿。 當(dāng)您啟動(dòng)geth時(shí)币绩,它會(huì)連接到網(wǎng)絡(luò)中的其他以太坊客戶(hù)端(節(jié)點(diǎn))并下載區(qū)塊鏈副本。 它會(huì)不斷和其他節(jié)點(diǎn)通信府阀,以保持區(qū)塊鏈的最新副本缆镣。 它還可以挖掘區(qū)塊并將交易添加到區(qū)塊鏈中,驗(yàn)證區(qū)塊中的交易并執(zhí)行交易试浙。?
Geth附帶一個(gè)JavaScript客戶(hù)端(geth控制臺(tái))董瞻,可用于連接到區(qū)塊鏈。
3.2 ????Web3.JS / Truffle
Web3.JS?是一個(gè)很流行的JavaScript庫(kù)田巴,用于與以太坊區(qū)塊鏈進(jìn)行交互钠糊。 你可以在任何前端框架中使用它來(lái)開(kāi)發(fā)Dapp。后面我會(huì)寫(xiě)一個(gè)開(kāi)發(fā)Dapp的教程壹哺,里面會(huì)涉及到如何使用Web3.JS抄伍。
Truffle就像Web應(yīng)用程序開(kāi)發(fā)的框架,比如Ruby on Rails管宵,Python的Django等一樣截珍,Truffle是用于開(kāi)發(fā)Dapp的最流行的框架之一。 他們將區(qū)塊鏈上編譯和部署合同的復(fù)雜性抽象出來(lái)箩朴。 你可以在這里查看?Truffle?的更多細(xì)節(jié)岗喉。?
3.3 ????Ganache
使用比如geth等客戶(hù)端進(jìn)行開(kāi)發(fā)可能效率不高,因?yàn)閳?zhí)行每個(gè)交易需要15秒炸庞。 為了解決這個(gè)問(wèn)題钱床,開(kāi)發(fā)人員通常使用ganache進(jìn)行開(kāi)發(fā)。 你可以安裝 ganache-cli 命令行版本或GUI版本埠居。 Ganache 另一個(gè)好處是一開(kāi)始就有10個(gè)測(cè)試帳戶(hù)并且都預(yù)先加載了100個(gè)以太幣查牌。點(diǎn)擊這里查看Ganache
3.4? ? ?Metamask
我們?cè)谇耙徊糠种v過(guò)錢(qián)包,Metamask是以太坊社區(qū)中的流行錢(qián)包之一拐格,你可以在Chrome里面以插件的形式安裝他們僧免。點(diǎn)擊這里查看MetaMask
3.5? ? Etherscan
由Etherscan公司提供的一項(xiàng)免費(fèi)服務(wù),提供方便的前端界面用來(lái)探索以太坊區(qū)塊鏈捏浊《茫可以在這個(gè)網(wǎng)站上查看所有地址,交易金踪,區(qū)塊詳細(xì)信息等浊洞。?
Mainnet是以太坊的主網(wǎng)絡(luò),其他3個(gè)是以太坊的測(cè)試網(wǎng)絡(luò)胡岔。
Mainnet:https://etherscan.io/
Ropsten:https://ropsten.etherscan.io/
Rinkeby:https://rinkeby.etherscan.io/
Kovan:https://kovan.etherscan.io/
3.6? ? Remix
一個(gè)瀏覽器IDE法希,可用來(lái)編寫(xiě)智能合約。 不僅可以把它用作編輯器靶瘸,還可以用于編譯和將智能合約部署到各種網(wǎng)絡(luò)苫亦,并直接從IDE與它們進(jìn)行交互毛肋。 它具有許多功能來(lái)選擇各種編譯器版本,調(diào)試智能合約等等屋剑。 可以在這里訪問(wèn)IDE
下一篇文章會(huì)寫(xiě)一個(gè)基于以太坊的投票Dapp開(kāi)發(fā)教程润匙,敬請(qǐng)關(guān)注。