以太坊客戶端是一個(gè)軟件應(yīng)用程序,它實(shí)現(xiàn)以太坊規(guī)范并通過(guò)對(duì)等網(wǎng)絡(luò)與其他以太坊客戶端進(jìn)行通信。如果不同的以太坊客戶端符合參考規(guī)范和標(biāo)準(zhǔn)化通信協(xié)議,則可以進(jìn)行互操作。雖然這些不同的客戶端由不同的團(tuán)隊(duì)和不同的編程語(yǔ)言實(shí)現(xiàn),但他們都“speak”相同的協(xié)議并遵循相同的規(guī)則。
以太坊是一個(gè)開源項(xiàng)目,源代碼在開源(LGPL v3.0)許可下可用,可以免費(fèi)下載和用于任何目的。開源意味著不僅僅是免費(fèi)使用。這也意味著以太坊是由一個(gè)開源的志愿者社區(qū)開發(fā)的,任何人都可以修改。
以太坊由稱為“黃皮書”的正式規(guī)范定義。這與例如比特幣形成對(duì)比,比特幣沒(méi)有以任何正式方式定義。比特幣的“規(guī)范”是比特幣核心的參考實(shí)現(xiàn),以太坊的規(guī)范記錄在一篇結(jié)合了英語(yǔ)和數(shù)學(xué)(正式)規(guī)范的論文中。除了各種以太坊改進(jìn)提案之外,此正式規(guī)范還定義了以太坊客戶端的標(biāo)準(zhǔn)行為。隨著對(duì)以太坊的重大改變,黃皮書會(huì)定期更新。
作為以太坊明確的正式規(guī)范的結(jié)果,以太網(wǎng)客戶端有許多獨(dú)立開發(fā)但可互操作的軟件實(shí)現(xiàn)。以太網(wǎng)在網(wǎng)絡(luò)上運(yùn)行的實(shí)現(xiàn)比任何其他區(qū)塊鏈更多樣化。
以太坊網(wǎng)絡(luò)
存在各種基于以太坊的網(wǎng)絡(luò),這些網(wǎng)絡(luò)很大程度上符合以太坊“黃皮書”中定義的形式規(guī)范,但它們之間可能相互也可能不相互操作。
在這些基于以太坊的網(wǎng)絡(luò)中有:以太坊,以太坊經(jīng)典,Ella,Expanse,Ubiq,Musicoin等等。雖然大多數(shù)在協(xié)議級(jí)別兼容,但這些網(wǎng)絡(luò)通常具有要求以太坊客戶端軟件維護(hù)人員進(jìn)行微小更改以支持每個(gè)網(wǎng)絡(luò)的功能或?qū)傩?。因此,并非所有版本的以太坊客戶端軟件都在基于以太坊的區(qū)塊鏈上運(yùn)行。
目前,以六種不同語(yǔ)言編寫的以太坊協(xié)議有六種主要實(shí)現(xiàn):Go (Geth), Rust (parity), C++ (cpp-ethereum), Python (pyethereum), Scala (mantis) and Java (harmony)。
在本節(jié)中,我們將介紹兩個(gè)最常見(jiàn)的客戶,Geth和Parity。我們將學(xué)習(xí)使用每個(gè)客戶端設(shè)置一個(gè)節(jié)點(diǎn),并探索它們的一些命令行和應(yīng)用程序編程接口(API)。
我應(yīng)該運(yùn)行全節(jié)點(diǎn)嗎?
區(qū)塊鏈的健康,彈性和審查抵抗力取決于具有許多獨(dú)立操作和地理上分散的全節(jié)點(diǎn)。每個(gè)全節(jié)點(diǎn)都可以幫助其他新節(jié)點(diǎn)獲取區(qū)塊數(shù)據(jù)以引導(dǎo)其操作,并為操作員提供所有交易和合約的權(quán)威和獨(dú)立的驗(yàn)證。
但是,運(yùn)行全節(jié)點(diǎn)將導(dǎo)致硬件資源和帶寬的顯著成本。全節(jié)點(diǎn)必須下載超過(guò)80GB的數(shù)據(jù)(截至2018年4月;取決于客戶端)并將其存儲(chǔ)在本地硬盤上。隨著新交易和區(qū)塊的增加,這種數(shù)據(jù)負(fù)擔(dān)每天都在迅速增加。
以太坊開發(fā)不需要在實(shí)時(shí)網(wǎng)絡(luò)(主網(wǎng))上運(yùn)行的全節(jié)點(diǎn)。您可以使用testnet節(jié)點(diǎn)(存儲(chǔ)較小的公共測(cè)試區(qū)塊鏈的副本),本地私有區(qū)塊鏈或使用服務(wù)提供的基于云的以太坊客戶端執(zhí)行幾乎所有操作。
您還可以選擇運(yùn)行輕量級(jí)客戶端,該客戶端不存儲(chǔ)區(qū)塊鏈的本地副本或驗(yàn)證區(qū)塊和交易。這些客戶端提供錢包的功能,可以創(chuàng)建和廣播交易。
輕量級(jí)客戶端可用于連接到現(xiàn)有網(wǎng)絡(luò),例如您自己的全節(jié)點(diǎn)、公共區(qū)塊鏈、公共或許可(PoA)測(cè)試網(wǎng)或私有本地區(qū)塊鏈。實(shí)際上,您可能會(huì)使用輕量級(jí)客戶端(如MetaMask,Emerald Wallet,MyEtherWallet或MyCrypto)作為在所有不同節(jié)點(diǎn)選項(xiàng)之間切換的便捷方式。
術(shù)語(yǔ)“輕量級(jí)客戶端”和“錢包”可互換使用,但存在一些差異。通常,輕量級(jí)客戶端除了提供錢包的交易功能外,還提供API(例如web3js API)。
不要將以太坊輕量級(jí)錢包的概念與比特幣中的簡(jiǎn)易支付驗(yàn)證(SPV)客戶端的概念混淆。SPV客戶端驗(yàn)證塊頭并使用merkle證明來(lái)驗(yàn)證區(qū)塊鏈中的交易。通常,以太坊輕量級(jí)客戶端不驗(yàn)證區(qū)塊頭或交易。他們完全信任由第三方運(yùn)營(yíng)的完整客戶端,以授予他們對(duì)區(qū)塊鏈的RPC訪問(wèn)權(quán)限。
全節(jié)點(diǎn)的優(yōu)點(diǎn)和缺點(diǎn)
選擇運(yùn)行全節(jié)點(diǎn)有助于各種基于以太坊的網(wǎng)絡(luò),但也會(huì)為您帶來(lái)一些輕微到中等的成本。讓我們看看一些優(yōu)點(diǎn)和缺點(diǎn)。
優(yōu)點(diǎn)
- 支持基于以太坊的網(wǎng)絡(luò)的靈活性和審查區(qū)塊。
- 權(quán)威地驗(yàn)證所有交易。
- 可以與公共區(qū)塊鏈上的任何合約互動(dòng)(無(wú)需中間人)。
- 如有必要,可以離線查詢(只讀)區(qū)塊鏈狀態(tài)(帳戶,合約等)。
- 可以在不讓第三方知道您正在閱讀的信息的情況下查詢區(qū)塊鏈。
- 可以直接將您自己的合約部署到公共區(qū)塊鏈中(無(wú)需中介)。
缺點(diǎn)
- 需要大量且不斷增長(zhǎng)的硬件和帶寬資源。
- 第一次初始下載需要幾個(gè)小時(shí)或幾天才能完全同步。
- 必須維護(hù),升級(jí)并保持在線以保持同步。
公共Testnet的優(yōu)點(diǎn)和缺點(diǎn)
無(wú)論您是否選擇運(yùn)行全節(jié)點(diǎn),您可能都希望運(yùn)行公共testnet節(jié)點(diǎn)。讓我們看看使用公共testnet的一些優(yōu)點(diǎn)和缺點(diǎn)。
優(yōu)點(diǎn)
- 一個(gè)testnet節(jié)點(diǎn)需要同步和存儲(chǔ)更少的數(shù)據(jù),大約10GB,具體取決于網(wǎng)絡(luò)(截至2018年4月)。
- 一個(gè)testnet節(jié)點(diǎn)可以在幾個(gè)小時(shí)內(nèi)完全同步。
- 部署合約或進(jìn)行交易需要測(cè)試以太,它沒(méi)有價(jià)值,可以從幾個(gè)“水龍頭”免費(fèi)獲得。
- Testnets是具有許多其他用戶和合約的公共區(qū)塊鏈,運(yùn)行“l(fā)ive”。
缺點(diǎn)
- 你不能在testnet上使用“真正的”錢,它在測(cè)試以太坊網(wǎng)絡(luò)上運(yùn)行。
- 因此,您無(wú)法測(cè)試真實(shí)對(duì)手的安全性,因?yàn)闆](méi)有任何利害關(guān)系。
- 公共區(qū)塊鏈的某些方面無(wú)法在testnet上進(jìn)行實(shí)際測(cè)試。例如,交易費(fèi)用雖然是發(fā)送交易所必需的,但由于gas是免費(fèi)的,因此不在testnet上考慮。并且測(cè)試網(wǎng)絡(luò)不會(huì)像公共網(wǎng)絡(luò)那樣經(jīng)歷網(wǎng)絡(luò)擁塞。
本地實(shí)例(TestRPC)的優(yōu)點(diǎn)和缺點(diǎn)
對(duì)于許多測(cè)試目的,最好的選擇是使用testrpc節(jié)點(diǎn)啟動(dòng)單實(shí)例專用區(qū)塊鏈。TestRPC創(chuàng)建一個(gè)僅限本地的私有區(qū)塊鏈,您可以與其進(jìn)行交互,而無(wú)需任何其他參與者。它具有公共testnet的許多優(yōu)點(diǎn)和缺點(diǎn),但也有一些差異。
優(yōu)點(diǎn)
- 磁盤上沒(méi)有同步,而且?guī)缀鯖](méi)有數(shù)據(jù)。你自己挖掘第一塊。
- 無(wú)需獲取測(cè)試以太,您可以“獎(jiǎng)勵(lì)”自己可用于測(cè)試的挖掘獎(jiǎng)勵(lì)。
- 沒(méi)有其他用戶,只有你。
- 沒(méi)有其他合約,只有您在啟動(dòng)它之后部署的合同。
缺點(diǎn)
- 沒(méi)有其他用戶意味著它的行為與公共區(qū)塊鏈的行為不同。交易空間或交易順序沒(méi)有競(jìng)爭(zhēng)。
- 除了你之外沒(méi)有礦工意味著挖掘更容易預(yù)測(cè),因此你無(wú)法測(cè)試公共區(qū)塊鏈上發(fā)生的某些情況。
- 沒(méi)有其他合約意味著您必須部署要測(cè)試的所有內(nèi)容,包括依賴項(xiàng)和合約庫(kù)。
- 您無(wú)法重新創(chuàng)建一些公共合約及其地址來(lái)測(cè)試某些方案(例如DAO合同)。
運(yùn)行以太坊客戶端
如果您有時(shí)間和資源,則應(yīng)嘗試運(yùn)行全節(jié)點(diǎn),即使只是為了了解有關(guān)該過(guò)程的更多信息。在接下來(lái)的幾節(jié)中,我們將下載、編譯和運(yùn)行以太坊客戶端Go-Ethereum(Geth)和Parity。這需要熟悉在操作系統(tǒng)上使用命令行界面。無(wú)論您選擇將它們作為全節(jié)點(diǎn),作為testnet節(jié)點(diǎn)還是作為本地私有區(qū)塊鏈的客戶端運(yùn)行,都值得安裝這些客戶端。
全節(jié)點(diǎn)的硬件要求
在開始之前,您應(yīng)確保擁有一臺(tái)具有足夠資源的計(jì)算機(jī)來(lái)運(yùn)行以太坊全節(jié)點(diǎn)。您將需要至少80GB的磁盤空間來(lái)存儲(chǔ)以太坊區(qū)塊鏈的完整副本。如果您還想在以太坊測(cè)試網(wǎng)上運(yùn)行完全節(jié)點(diǎn),則至少需要額外的15GB。下載80GB的區(qū)塊鏈數(shù)據(jù)可能需要很長(zhǎng)時(shí)間,因此建議您使用快速的Internet連接。
同步以太坊區(qū)塊鏈?zhǔn)欠浅]斎胼敵觯↖ / O)密集型。最好有固態(tài)硬盤(SSD)。如果您有機(jī)械硬盤驅(qū)動(dòng)器(HDD),則需要至少8GB的RAM才能用作緩存。否則,您可能會(huì)發(fā)現(xiàn)系統(tǒng)太慢而無(wú)法跟上并完全同步。
最低要求
- 具有至少雙核的CPU。
- 固態(tài)硬盤(SSD),可用空間至少為80GB。
- 最小4GB RAM,如果你有HHD而不是SSD,至少8GB。
- 8 MBit/sec下載Internet服務(wù)。
這些是同步基于以太坊的區(qū)塊鏈的完整(但已修剪)副本的最低要求。
在撰寫本文時(shí)(2018年4月),Parity代碼庫(kù)在資源方面往往更少,如果您使用有限的硬件運(yùn)行,您可能會(huì)看到使用Parity的最佳效果。
如果您想在合理的時(shí)間內(nèi)同步并存儲(chǔ)我們?cè)诒緯杏懻摰乃虚_發(fā)工具、庫(kù)、客戶端和區(qū)塊鏈,您將需要一臺(tái)功能更強(qiáng)大的計(jì)算機(jī)。
推薦規(guī)格
- 具有至少四核的快速CPU。
- 16GB+ RAM。
- 具有至少500GB可用空間的快速SSD。
- 25+ MBit/sec下載Internet服務(wù)。
很難預(yù)測(cè)區(qū)塊鏈的大小會(huì)增加多快以及何時(shí)需要更多磁盤空間,因此建議在開始同步之前檢查區(qū)塊鏈的最新大小。
以太坊:https://bitinfocharts.com/ethereum/
以太坊經(jīng)典:https://bitinfocharts.com/ethereum%20classic/
搭建和運(yùn)行客戶端的軟件要求(節(jié)點(diǎn))
本節(jié)介紹Geth和Parity客戶端軟件。假設(shè)您使用的是類Unix的命令行環(huán)境。這些示例顯示了在運(yùn)行Bash shell(命令行執(zhí)行環(huán)境)的Ubuntu Linux操作系統(tǒng)上輸入的輸出和命令。
通常,每個(gè)區(qū)塊鏈都有自己的Geth版本,而Parity則支持多個(gè)基于以太坊的區(qū)塊鏈(以太坊,以太坊經(jīng)典,Ellaism,Expanse,Musicoin)。
| Tip | 在本章的許多示例中,我們將使用操作系統(tǒng)的命令行界面(也稱為“shell”),通過(guò)“終端”應(yīng)用程序訪問(wèn)。shell會(huì)顯示提示; 鍵入命令,shell響應(yīng)一些文本和下一個(gè)命令的新提示。您的系統(tǒng)上的提示可能看起來(lái)不同,但在以下示例中,它由$符號(hào)表示。在示例中,當(dāng)您在$符號(hào)后面看到文本時(shí),請(qǐng)不要鍵入$符號(hào),而是緊跟其后鍵入命令,然后按Enter執(zhí)行命令。在示例中,每個(gè)命令下面的行是操作系統(tǒng)對(duì)該命令的響應(yīng)。當(dāng)你看到下一個(gè)$前綴時(shí),你會(huì)知道它是一個(gè)新命令,你應(yīng)該重復(fù)這個(gè)過(guò)程。 |
|---|
在我們開始之前,我們可能需要滿足一些先決條件。如果您從未在當(dāng)前使用的計(jì)算機(jī)上進(jìn)行任何軟件開發(fā),則可能需要安裝一些基本工具。對(duì)于下面的示例,您需要安裝源代碼管理系統(tǒng)git;golang,Go編程語(yǔ)言和標(biāo)準(zhǔn)庫(kù); 和Rust,一種系統(tǒng)編程語(yǔ)言。
可以按照以下說(shuō)明安裝Git:https://git-scm.com/
可以按照以下說(shuō)明安裝Go:https://golang.org/
| Note | Geth的要求各不相同,但如果你堅(jiān)持使用Go 1.10或更高版本,你應(yīng)該能夠編譯你想要的任何版本的Geth。當(dāng)然,您應(yīng)該始終參考您選擇的Geth對(duì)應(yīng)的文檔。安裝在操作系統(tǒng)上或可從系統(tǒng)的軟件包管理器獲得的golang版本可能遠(yuǎn)遠(yuǎn)大于1.10。如果是這樣,請(qǐng)將其刪除并從golang.org安裝最新版本。 |
|---|
可以按照以下說(shuō)明安裝Rust:https://www.rustup.rs/
| Note | Parity需要Rust1.24版本或更高版本。 |
|---|
Parity還需要一些軟件庫(kù),例如OpenSSL和libudev。要在Linux(Debian)兼容系統(tǒng)上安裝它們:
sudo apt-get install openssl libssl-dev libudev-dev
對(duì)于其他操作系統(tǒng),請(qǐng)使用操作系統(tǒng)的軟件包管理器或按照Wiki說(shuō)明(https://github.com/paritytech/parity/wiki/Setup)安裝所需的庫(kù)。
現(xiàn)在你已經(jīng)安裝了git,golang,rust和必要的庫(kù),讓我們開始工作吧!
Parity
Parity是全節(jié)點(diǎn)以太坊客戶端和DApp瀏覽器的實(shí)現(xiàn)。Parity是Rust“從頭開始”編寫的,這是一種系統(tǒng)編程語(yǔ)言,旨在構(gòu)建模塊化,安全且可擴(kuò)展的以太坊客戶端。Parity由英國(guó)公司Parity Tech開發(fā),并根據(jù)GPLv3開源許可證發(fā)布。
| Note | 披露:本書的作者之一Gavin Wood是Parity Tech的創(chuàng)始人,并撰寫了大部分Parity客戶端。Parity代表已安裝的以太坊客戶群約28%。 |
|---|
要安裝Parity,您可以使用Rust包管理器cargo或從GitHub下載源代碼。包管理器還是下載源代碼,兩個(gè)選項(xiàng)之間沒(méi)有太大區(qū)別。在下一節(jié)中,我們將向您展示如何自己下載和編譯Parity。
安裝Parity
Parity Wiki提供了在不同環(huán)境和容器中構(gòu)建Parity的說(shuō)明:
https://github.com/paritytech/parity/wiki/Setup
我們將從源代碼構(gòu)建Parity。這假設(shè)您已經(jīng)使用rustup安裝了Rust。
首先,讓我們從GitHub獲取源代碼:
$ git clone https://github.com/paritytech/parity
現(xiàn)在,讓我們切換到parity目錄并使用cargo來(lái)構(gòu)建可執(zhí)行文件:
$ cd parity
$ cargo build
如果一切順利,你應(yīng)該看到類似的東西:
$ cargo build
Updating git repository `https://github.com/paritytech/js-precompiled.git`
Downloading log v0.3.7
Downloading isatty v0.1.1
Downloading regex v0.2.1
[...]
Compiling parity-ipfs-api v1.7.0
Compiling parity-rpc v1.7.0
Compiling parity-rpc-client v1.4.0
Compiling rpc-cli v1.4.0 (file:///home/aantonop/Dev/parity/rpc_cli)
Finished dev [unoptimized + debuginfo] target(s) in 479.12 secs
$
讓我們通過(guò)調(diào)用--version選項(xiàng)嘗試運(yùn)行parity以查看它是否已安裝:
(譯者注:mac下會(huì)出現(xiàn)“parity: command not found”錯(cuò)誤,請(qǐng)參考Fixing Parity Error on a Mac)
$ parity --version
Parity
version Parity/v1.7.0-unstable-02edc95-20170623/x86_64-linux-gnu/rustc1.18.0
Copyright 2015, 2016, 2017 Parity Technologies (UK) Ltd
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
By Wood/Paronyan/Kotewicz/Drwi?ga/Volf
Habermeier/Czaban/Greeff/Gotchac/Redmann
$
很好!現(xiàn)在已經(jīng)安裝了Parity,我們可以同步區(qū)塊鏈并開始使用一些基本的命令行選項(xiàng)。
Go-Ethereum(Geth)
Geth是Go語(yǔ)言實(shí)現(xiàn),它被積極開發(fā)并被認(rèn)為是以太坊客戶端的“官方”實(shí)現(xiàn)。通常,每個(gè)基于以太坊的區(qū)塊鏈都有自己的Geth實(shí)現(xiàn)。如果您正在運(yùn)行Geth,那么您需要確保使用以下某個(gè)倉(cāng)庫(kù)鏈接獲取區(qū)塊鏈的正確版本。
倉(cāng)庫(kù)鏈接
- Ethereum: https://github.com/ethereum/go-ethereum (或 https://geth.ethereum.org/)
- Ethereum Classic: https://github.com/ethereumproject/go-ethereum
- Ellaism: https://github.com/ellaism/go-ellaism
- Expanse: https://github.com/expanse-org/go-expanse
- Musicoin: https://github.com/Musicoin/go-musicoin
- Ubiq: https://github.com/ubiq/go-ubiq
| Note | 您也可以跳過(guò)這些說(shuō)明,并為您選擇的平臺(tái)安裝預(yù)編譯的二進(jìn)制文件。預(yù)編譯版本更容易安裝,可以在上面的倉(cāng)庫(kù)的“release”部分找到。但是,您可以通過(guò)自行下載和編譯軟件來(lái)了解更多信息。 |
|---|
克隆倉(cāng)庫(kù)
我們的第一步是克隆git倉(cāng)庫(kù),以獲取源代碼的副本。
要?jiǎng)?chuàng)建此倉(cāng)庫(kù)的本地克隆,請(qǐng)?jiān)谥髂夸浿谢蛟谟糜陂_發(fā)的任何目錄下使用git命令,如下所示:
git clone <Repository Link>
將倉(cāng)庫(kù)克隆到本地系統(tǒng)時(shí),您應(yīng)該看到進(jìn)度日志:
Cloning into 'go-ethereum'...
remote: Counting objects: 62587, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 62587 (delta 10), reused 13 (delta 4), pack-reused 62557
Receiving objects: 100% (62587/62587), 84.51 MiB | 1.40 MiB/s, done.
Resolving deltas: 100% (41554/41554), done.
Checking connectivity... done.
很好!現(xiàn)在我們有了Geth的本地副本,我們可以為我們的平臺(tái)編譯可執(zhí)行文件。
從源代碼構(gòu)建Geth
要構(gòu)建Geth,請(qǐng)切換到下載源代碼的目錄并使用make命令:
$ cd go-ethereum
$ make geth
如果一切順利,您將看到Go編譯器構(gòu)建每個(gè)組件,直到它生成geth可執(zhí)行文件:
build/env.sh go run build/ci.go install ./cmd/geth
>>> /usr/local/go/bin/go install -ldflags -X main.gitCommit=58a1e13e6dd7f52a1d5e67bee47d23fd6cfdee5c -v ./cmd/geth
github.com/ethereum/go-ethereum/common/hexutil
github.com/ethereum/go-ethereum/common/math
github.com/ethereum/go-ethereum/crypto/sha3
github.com/ethereum/go-ethereum/rlp
github.com/ethereum/go-ethereum/crypto/secp256k1
github.com/ethereum/go-ethereum/common
[...]
github.com/ethereum/go-ethereum/cmd/utils
github.com/ethereum/go-ethereum/cmd/geth
Done building.
Run "build/bin/geth" to launch geth.
$
讓我們運(yùn)行g(shù)eth以確保它在停止并更改它的配置之前有效:
$ ./build/bin/geth version
Geth
Version: 1.6.6-unstable
Git Commit: 58a1e13e6dd7f52a1d5e67bee47d23fd6cfdee5c
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.8.3
Operating System: linux
GOPATH=/usr/local/src/gocode/
GOROOT=/usr/local/go
您的geth version命令可能會(huì)顯示略有不同的信息,但您應(yīng)該看到與上面的版本日志非常相似的版本日志。
最后,我們可能希望將geth命令復(fù)制到操作系統(tǒng)的應(yīng)用程序目錄(或命令行執(zhí)行路徑上的目錄)。在Linux上,我們使用以下命令:
$ sudo cp ./build/bin/geth /usr/local/bin
不要開始運(yùn)行g(shù)eth,因?yàn)樗鼘㈤_始以“緩慢的方式”同步區(qū)塊鏈,這將花費(fèi)太長(zhǎng)時(shí)間(數(shù)周)?;谝蕴坏膮^(qū)塊鏈的第一次同步解釋了以太坊區(qū)塊鏈的初始同步帶來(lái)的困難。
基于以太坊的區(qū)塊鏈的第一次同步
通常,在同步以太坊區(qū)塊鏈時(shí),您的客戶端將下載并驗(yàn)證自創(chuàng)世塊以來(lái)的每個(gè)區(qū)塊和每個(gè)交易。
雖然可以通過(guò)這種方式完全同步區(qū)塊鏈,但同步將花費(fèi)很長(zhǎng)時(shí)間并且具有高計(jì)算資源要求(更多RAM和更快的存儲(chǔ))。
許多基于以太坊的區(qū)塊鏈?zhǔn)?016年底遭遇拒絕服務(wù)(DoS)攻擊的受害者。受此攻擊影響的區(qū)塊鏈在進(jìn)行完全同步時(shí)往往會(huì)緩慢同步。
例如,在以太坊上,新客戶將快速進(jìn)展,直至達(dá)到2,283,397區(qū)塊。該區(qū)塊于2016年9月18日開采,標(biāo)志著DoS攻擊的開始。從該塊到塊2,700,031(2016年11月26日),交易驗(yàn)證變得非常緩慢,內(nèi)存密集,I/O密集。這導(dǎo)致每區(qū)塊的驗(yàn)證時(shí)間超過(guò)1分鐘。以太坊使用硬分叉實(shí)施了一系列升級(jí),以解決在拒絕服務(wù)中利用的潛在漏洞。這些升級(jí)還通過(guò)刪除垃圾郵件交易創(chuàng)建的大約2000萬(wàn)個(gè)空帳戶來(lái)清理區(qū)塊鏈。
如果您正在同步完整驗(yàn)證,您的客戶端將會(huì)變慢并可能需要幾天或更長(zhǎng)時(shí)間來(lái)驗(yàn)證受此DoS攻擊影響的任何區(qū)塊。
大多數(shù)以太坊客戶端都包含執(zhí)行“快速”同步的選項(xiàng),該同步會(huì)跳過(guò)交易的完整驗(yàn)證,直到它同步到區(qū)塊鏈的提示,然后恢復(fù)完整驗(yàn)證。
對(duì)于Geth,啟用快速同步的選項(xiàng)通常稱為--fast。您可能需要參考所選以太坊鏈的具體說(shuō)明。
對(duì)于Parity,對(duì)于較舊版本(<1.6),選項(xiàng)為--warp,并且在較新版本(> = 1.6)上默認(rèn)啟用(無(wú)需設(shè)置配置選項(xiàng))。
| Note | Geth和Parity只能在從空區(qū)塊數(shù)據(jù)庫(kù)開始時(shí)進(jìn)行快速同步。如果您已經(jīng)開始同步而沒(méi)有“快速”模式,則Geth和Parity無(wú)法切換。刪除區(qū)塊鏈數(shù)據(jù)目錄并從頭開始“快速”同步比繼續(xù)同步完全驗(yàn)證更快。刪除區(qū)塊鏈數(shù)據(jù)時(shí),請(qǐng)注意不要?jiǎng)h除任何錢包! |
|---|
JSON-RPC接口
以太坊客戶端提供應(yīng)用程序編程接口(API)和一組遠(yuǎn)程調(diào)用(RPC)命令,這些命令被編碼為JavaScript對(duì)象表示法(JSON)。您將看到這稱為JSON-RPC API。本質(zhì)上,JSON-RPC API是一個(gè)接口,允許我們編寫使用以太坊客戶端作為網(wǎng)關(guān)進(jìn)入以太坊網(wǎng)絡(luò)和區(qū)塊鏈的程序。
通常,RPC接口在端口8545上作為HTTP服務(wù)提供。出于安全原因,默認(rèn)情況下,它僅限于接受來(lái)自localhost(您自己的計(jì)算機(jī)的IP地址為127.0.0.1)的連接。
要訪問(wèn)JSON-RPC API,您可以使用以您選擇的編程語(yǔ)言編寫的專用庫(kù),該庫(kù)提供與每個(gè)可用RPC命令相對(duì)應(yīng)的“stub”函數(shù)調(diào)用?;蛘?,您可以手動(dòng)構(gòu)建HTTP請(qǐng)求并發(fā)送/接收J(rèn)SON編碼的請(qǐng)求。您甚至可以使用通用命令行HTTP客戶端(如curl)來(lái)調(diào)用RPC接口。讓我們?cè)囋嚕ù_保您已配置Geth并先運(yùn)行):
或者,您可以手動(dòng)構(gòu)建HTTP請(qǐng)求并發(fā)送/接收J(rèn)SON編碼的請(qǐng)求。您甚至可以使用通用命令行HTTP客戶端(如curl)來(lái)調(diào)用RPC接口。讓我們?cè)囋嚕ù_保您已配置Geth并先運(yùn)行):
使用curl通過(guò)JSON-RPC調(diào)用web3_clientVersion函數(shù)
$ curl -X POST -H "Content-Type: application/json" --data \
'{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' \
http://localhost:8545
{"jsonrpc":"2.0","id":1,
"result":"Geth/v1.8.0-unstable-02aeb3d7/linux-amd64/go1.8.3"}
在此示例中,我們使用curl建立HTTP連接以尋址http://localhost:8545。我們已經(jīng)在運(yùn)行g(shù)eth,它在端口8545上提供JSON-RPC API作為HTTP服務(wù)。我們指示curl使用HTTP POST命令并將內(nèi)容標(biāo)識(shí)為Content-Type:application/json。最后,我們傳遞一個(gè)JSON編碼的請(qǐng)求作為HTTP請(qǐng)求的數(shù)據(jù)組件。我們的大多數(shù)命令行只是設(shè)置curl以正確建立HTTP連接。有趣的部分是我們發(fā)出的實(shí)際JSON-RPC命令:
{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":4192}
JSON-RPC請(qǐng)求根據(jù)JSON-RPC 2.0規(guī)范進(jìn)行格式化,您可以在此處看到:http://www.jsonrpc.org/specification
每個(gè)請(qǐng)求包含4個(gè)元素:
- jsonrpc:JSON-RPC協(xié)議的版本。這必須是“2.0”。
- method:要調(diào)用的方法的名稱。
- params:一個(gè)結(jié)構(gòu)化值,用于保存在調(diào)用方法期間要使用的參數(shù)值。該成員可以省略。
- id:客戶端建立的標(biāo)識(shí)符,必須包含字符串、數(shù)字或NULL值。如果包含,服務(wù)器必須在Response對(duì)象中回復(fù)相同的值。該成員用于關(guān)聯(lián)兩個(gè)對(duì)象之間的上下文。
| Tip | id參數(shù)主要用于在單個(gè)JSON-RPC調(diào)用中發(fā)出多個(gè)請(qǐng)求時(shí),這種做法稱為批處理。批處理用于避免每個(gè)請(qǐng)求的新HTTP和TCP連接的開銷。例如,在以太坊上下文中,如果我們想要在一個(gè)HTTP連接中檢索數(shù)千個(gè)交易,我們將使用批處理。批處理時(shí),為每個(gè)請(qǐng)求設(shè)置不同的id,然后將其與來(lái)自JSON-RPC服務(wù)器的每個(gè)響應(yīng)中的id匹配。實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是維護(hù)計(jì)數(shù)器并增加每個(gè)請(qǐng)求的值。 |
|---|
我們收到的回復(fù)是:
{"jsonrpc":"2.0","id":4192,
"result":"Geth/v1.8.0-unstable-02aeb3d7/linux-amd64/go1.8.3"}
這告訴我們Geth客戶端版本1.8.0正在提供JSON-RPC API。
讓我們嘗試更有趣的事情。在下一個(gè)示例中,我們向JSON-RPC API詢問(wèn)wei中當(dāng)前的gas價(jià)格:
$ curl -X POST -H "Content-Type: application/json" --data \
'{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":4213}' \
http://localhost:8545
{"jsonrpc":"2.0","id":4213,"result":"0x430e23400"}
響應(yīng),0x430e23400告訴我們,目前的gas價(jià)格是1.8 Gwei(千兆wei或億wei)。
https://github.com/ethereum/wiki/wiki/JSON-RPC
parity的Geth兼容模式
Parity有一個(gè)特殊的“Geth兼容模式”,它提供了一個(gè)與geth提供的相同的JSON-RPC API。要在Geth兼容模式下運(yùn)行Parity,請(qǐng)使用--geth開關(guān):
$ parity --geth
輕量級(jí)以太坊客戶端
輕量級(jí)客戶端提供完整客戶端的功能子集。它們不存儲(chǔ)完整的以太坊區(qū)塊鏈,因此它們?cè)O(shè)置起來(lái)更快,并且需要更少的數(shù)據(jù)存儲(chǔ)。
輕量級(jí)客戶端提供以下一項(xiàng)或多項(xiàng)功能:
- 管理錢包中的私鑰和以太坊地址。
- 創(chuàng)建、簽名和廣播交易。
- 使用數(shù)據(jù)有效負(fù)載與智能合約進(jìn)行交互。
- 瀏覽DApps并與之交互。
- 提供外部服務(wù)的鏈接,例如區(qū)塊瀏覽器。
- 轉(zhuǎn)換以太單位并從外部來(lái)源檢索匯率。
- 將web3實(shí)例作為JavaScript對(duì)象注入Web瀏覽器。
- 使用由另一個(gè)客戶端提供/注入瀏覽器的web3實(shí)例。
- 訪問(wèn)本地或遠(yuǎn)程以太坊節(jié)點(diǎn)上的RPC服務(wù)。
一些輕量級(jí)客戶端,例如移動(dòng)(智能手機(jī))錢包,僅提供基本錢包功能。其他輕量級(jí)客戶端是完全開發(fā)的DApp瀏覽器。輕量級(jí)客戶端通常提供全節(jié)點(diǎn)以太坊客戶端的一些功能,而無(wú)需同步以太坊區(qū)塊鏈的本地副本。
讓我們來(lái)看看一些最流行的輕量級(jí)客戶端及其提供的功能。
移動(dòng)(智能手機(jī))錢包
所有移動(dòng)錢包都是輕量級(jí)客戶端,因?yàn)橹悄苁謾C(jī)沒(méi)有足夠的資源來(lái)運(yùn)行完整的以太坊客戶端。
流行的移動(dòng)錢包包括Jaxx,Status和Trust Wallet。我們將這些列為流行移動(dòng)錢包的示例(這不是對(duì)這些錢包的安全性或功能的認(rèn)可或指示)。
Jaxx
基于BIP39助記符種子的多幣種手機(jī)錢包,支持比特幣,Litecoin,以太坊,以太坊經(jīng)典,ZCash,各種ERC20 token和許多其他貨幣。Jaxx可用于Android,iOS,作為瀏覽器插件錢包,以及適用于各種操作系統(tǒng)的桌面錢包。在https://jaxx.io上找到它
Status
移動(dòng)錢包和DApp瀏覽器,支持各種token和流行的DApp。適用于iOS和Android智能手機(jī)。在https://status.im上找到它
Trust Wallet
移動(dòng)的以太坊,以太坊經(jīng)典錢包,支持ERC20和ERC223 token。Trust Wallet適用于iOS和Android智能手機(jī)。在https://trustwalletapp.com/找到它
Cipher Browser
全功能的支持以太坊的移動(dòng)DApp瀏覽器和錢包。允許與以太坊應(yīng)用和token集成。在https://www.cipherbrowser.com上找到它
瀏覽器錢包
各種錢包和DApp瀏覽器可用作Chrome和Firefox等Web瀏覽器的插件或擴(kuò)展:在瀏覽器中運(yùn)行的輕量級(jí)客戶端。
一些比較流行的是MetaMask,Jaxx和MyEtherWallet/MyCrypto。
MetaMask
MetaMask是在[介紹]中引入的,是一個(gè)多功能的基于瀏覽器的錢包、RPC客戶端和基本合約瀏覽器。它適用于Chrome,F(xiàn)irefox,Opera和Brave Browser。在以下位置找到MetaMask:
乍一看,MetaMask是一個(gè)基于瀏覽器的錢包。但是,與其他瀏覽器錢包不同,MetaMask將一個(gè)web3實(shí)例注入瀏覽器,充當(dāng)連接各種以太坊區(qū)塊鏈的RPC客戶端(例如,mainnet,Ropsten testnet,Kovan testnet,本地RPC節(jié)點(diǎn)等)。注入web3實(shí)例并充當(dāng)外部RPC服務(wù)的網(wǎng)關(guān)的能力使MetaMask成為開發(fā)人員和用戶都非常強(qiáng)大的工具。例如,它可以與MyEtherWallet或MyCrypto結(jié)合使用,充當(dāng)這些工具的web3提供程序和RPC網(wǎng)關(guān)。
Jaxx
Jaxx是智能手機(jī)中的移動(dòng)錢包,也可作為Chrome和Firefox擴(kuò)展程序使用。找到它:
MyEtherWallet(MEW)
MyEtherWallet是一個(gè)基于瀏覽器的JavaScript輕量級(jí)客戶端,提供:
- 一個(gè)用JavaScript運(yùn)行的軟件錢包。
- 通往Trezor和Ledger等流行硬件錢包的橋梁。
- 一個(gè)web3接口,可以連接到另一個(gè)客戶端注入的web3實(shí)例(例如MetaMask)。
- 可以連接到以太坊完整客戶端的RPC客戶端。
- 給定合約地址和應(yīng)用程序二進(jìn)制接口(ABI)的基本接口,可與智能合約交互。
MyEtherWallet對(duì)于測(cè)試和硬件錢包的接口非常有用。它不應(yīng)該用作主要的軟件錢包,因?yàn)樗ㄟ^(guò)瀏覽器環(huán)境暴露于威脅,并且不是安全的密鑰存儲(chǔ)系統(tǒng)。
訪問(wèn)MyEtherWallet和其他基于瀏覽器的JavaScript錢包時(shí)必須非常小心,因?yàn)樗鼈兘?jīng)常成為網(wǎng)絡(luò)釣魚的目標(biāo)。始終使用書簽而不是搜索引擎或鏈接來(lái)訪問(wèn)正確的Web URL。MyEtherWallet可在以下位置找到:
MyCrypto
就在本書第一版出版之前,MyEtherWallet項(xiàng)目分為兩個(gè)競(jìng)爭(zhēng)實(shí)現(xiàn),由兩個(gè)獨(dú)立的開發(fā)團(tuán)隊(duì)指導(dǎo):在開源開發(fā)中調(diào)用的“fork”。這兩個(gè)項(xiàng)目稱為MyEtherWallet(原始品牌)和MyCrypto。在拆分時(shí),MyCrypto提供了與MyEtherWallet相同的功能。由于兩個(gè)開發(fā)團(tuán)隊(duì)采用不同的目標(biāo)和優(yōu)先事項(xiàng),這兩個(gè)項(xiàng)目很可能會(huì)出現(xiàn)分歧。
與MyEtherWallet一樣,在瀏覽器中訪問(wèn)MyCrypto時(shí)必須非常小心。始終使用書簽,或者非常仔細(xì)地鍵入U(xiǎn)RL(然后將其加入書簽以備將來(lái)使用)。
MyCrypto可在以下位置找到:
Mist
Mist是由以太坊基金會(huì)建造的首個(gè)支持以太坊的瀏覽器。它還包含一個(gè)基于瀏覽器的錢包,這是ERC20令牌標(biāo)準(zhǔn)的首次實(shí)現(xiàn)(Fabian Vogelsteller,ERC20的作者也是Mist的主要開發(fā)者)。Mist也是第一個(gè)引入camelCase校驗(yàn)和的錢包(EIP-155,參見(jiàn)[eip-155])。Mist運(yùn)行全節(jié)點(diǎn),并提供完整的DApp瀏覽器,支持基于Swarm的存儲(chǔ)和ENS地址。找到它:
https://github.com/ethereum/mist