Geth介紹及如何執行以太坊節點
在本文中,我們將看看以太坊節點是什麼,並探索最受歡迎的節點之一,稱為Geth。
為了與區塊鏈進行通訊,我們必須使用區塊鏈客戶端。客戶端是能夠與其他客戶建立p2p通訊通道,簽署和廣播交易,挖掘,部署和與智慧合約互動等的軟體。客戶端通常被稱為節點。
以太坊節點必須遵循的功能的正式定義在以太坊黃皮書中定義。黃皮書定義了網路上節點所需的函式,挖掘演算法,私鑰/公鑰ECDSA引數。它定義了使節點與以太坊客戶端完全相容的全部功能。
基於以太坊黃皮書,任何人都能夠以他們認為合適的語言建立自己的以太坊節點實現。
這裡可以看到完整的客戶端列表。
迄今為止最受歡迎的客戶是Geth和Parity。實現的不同之處主要在於選擇的程式語言:Geth使用Golang,而Parity使用Rust。
由於Geth是目前最受歡迎的客戶端實現,我們現在將重點關注它。
節點型別
當你加入以太坊網路時,你可以選擇執行各種型別的節點。目前的選項是:
- light節點
- full節點
- Archive節點
Archive節點是full節點的特例,因此我們不會詳細介紹它。我發現的節點型別的最佳摘要之一是在Stack Exchange上:
通常,我們可以將節點軟體劃分為兩種型別:完整節點和輕(重量)節點。完整節點驗證廣播到網路上的塊。也就是說,它們確保塊中包含的交易(以及塊本身)遵循以太坊規範中定義的規則。它們維護網路的當前狀態(根據以太坊規範定義)。
不遵循規則的交易和塊不用於確定以太坊網路的當前狀態。例如,如果A嘗試向B傳送100以太,但A有0個ethers,並且一個塊包含此交易,則完整節點將意識到這不遵循以太坊的規則並拒絕該塊為無效。特別是,智慧合約的執行是交易的一個例子。每當在交易中使用智慧合約(例如,傳送ERC-20代幣)時,所有完整節點都必須執行所有指令以確保它們到達區塊鏈的正確的,商定的下一狀態。
到達同一個狀態有多種方式。例如,如果A有101個以太,並且在一次交易中將其中的一百個給了B以支付1個以太的gas,那麼最終結果將是如果A每次向B傳送100個1以太的交易,每次交易支付0.01以太(無視誰收到交易費用)。要知道B現在是否允許傳送100以太,就足以知道B的當前餘額是多少。保留整個交易歷史記錄的完整節點稱為完整歸檔節點。這些必須存在於網路上才能保持健康。
節點也可以選擇丟棄舊資料;如果B想要向C傳送100以太,那麼如何獲得以太並不重要,只要B的賬號包含100以太。相反,輕節點不會驗證每個塊或交易,也可能沒有當前區塊鏈狀態的副本。他們依靠完整的節點為他們提供缺失的細節(或者只是缺少特定的功能)。輕型節點的優勢在於它們可以更快地啟動和執行,可以在更多計算/記憶體受限的裝置上執行,並且不會佔用幾乎同樣多的儲存空間。在缺點方面,其他節點存在信任因素(它根據客戶端和概率方法/啟發式方法而有所不同,可用於降低風險)。一些完整的客戶端包括具有更快同步的功能(例如,Parity的warp sync)。
安裝Geth
可以在此處找到Geth在各種平臺(Windows,macOS,Linux)上的安裝說明。該列表非常全面,並且保持最新,所以我不會在文章中介紹它。
執行Geth
為了啟動Geth節點,你唯一需要做的就是轉到終端視窗並執行geth。當你這樣做時,你應該得到類似於這樣的輸出:
~ geth
INFO [06-03|11:03:13] Maximum peer count ETH=25 LES=0 total=25
INFO [06-03|11:03:13] Starting peer-to-peer node instance=Geth/v1.8.10-stable/darwin-amd64/go1.10.2
INFO [06-03|11:03:13] Allocated cache and file handles database=/Users/mjvr/Library/Ethereum/geth/chaindata cache=768 handles=128
INFO [06-03|11:03:13] Writing default main-net genesis block
INFO [06-03|11:03:14] Persisted trie from memory database nodes=12356 size=2.34mB time=48.31016ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [06-03|11:03:14] Initialised chain configuration config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Constantinople: <nil> Engine: ethash}"
INFO [06-03|11:03:14] Disk storage enabled for ethash caches dir=/Users/mjvr/Library/Ethereum/geth/ethash count=3
INFO [06-03|11:03:14] Disk storage enabled for ethash DAGs dir=/Users/mjvr/.ethash count=2
INFO [06-03|11:03:14] Initialising Ethereum protocol versions="[63 62]" network=1
INFO [06-03|11:03:14] Loaded most recent local header number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [06-03|11:03:14] Loaded most recent local full block number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [06-03|11:03:14] Loaded most recent local fast block number=0 hash=d4e567…cb8fa3 td=17179869184
INFO [06-03|11:03:14] Regenerated local transaction journal transactions=0 accounts=0
INFO [06-03|11:03:14] Starting P2P networking
INFO [06-03|11:03:16] UDP listener up self=enode://a4cb08519bc2bceecb8ad421871c624d5212888653bbaee309fda960f3c87ca7aa9855ee14684d521836ae88ad1986b8ca944348e976760d2bd1247ed3ca7628@[::]:30303
INFO [06-03|11:03:16] RLPx listener up self=enode://a4cb08519bc2bceecb8ad421871c624d5212888653bbaee309fda960f3c87ca7aa9855ee14684d521836ae88ad1986b8ca944348e976760d2bd1247ed3ca7628@[::]:30303
INFO [06-03|11:03:16] IPC endpoint opened url=/Users/mjvr/Library/Ethereum/geth.ipc
在此之後,你應該看到定期出現新行,Geth說“匯入新狀態”或“匯入新區塊頭”或“匯入新收據”。狀態,塊頭和交易是 Ethereum’s tree tries的一部分:必須下載它們才能使你的節點與以太坊區塊鏈同步。
這個過程可能需要很長時間,因此你可以選擇執行這樣的輕型節點。
geth --light
Geth現在需要做的只是拉動最新的塊頭並依賴其他完整節點來通過使用merkle證明來驗證交易。
訪問Geth控制檯
現在你已經建立了一個節點,你可以通過在終端中開啟一個新選項卡並執行以下命令來訪問它:
geth attach
這將把Geth控制檯(一個用於與區塊鏈通訊的Javascript環境)連線到你的執行節點。這可以在完全客戶端模式和輕模式下完成。
開啟控制檯後,鍵入以下內容:
web3.eth.blockNumber
你應該輸出一個數字(例如5631487),表示以太坊網路的當前塊號。
建立一個新帳戶
要使用區塊鏈,你需要擁有一個帳戶。使用Geth,你可以通過在終端中執行以下命令來實現:
geth account new
完成後,它會詢問你輸入密碼,以保護你的帳戶。確保使用安全密碼並安全儲存。
執行geth account new
時Geth所做的是更新Geth資料目錄中的檔案(Geth儲存所有必要資料的目錄,包括塊和塊頭資訊)。目錄在每個平臺的位置:
- macOS:
~/Library/Ethereum
- Linux:
~/.ethereum
- Windows:
%APPDATA%\Ethereum
從其他客戶端訪問Geth
當你啟動Geth時,客戶端會自動在埠8545
啟動RPC伺服器。你可以通過使用web3js
或web3j
等庫連線到localhost:8545
或使用curl
或wget
手動呼叫它來訪問此埠上的RPC伺服器及其方法。
要了解如何與正在執行的Geth例項(在啟動你自己的區塊鏈時是私有的,或在上面的說明中公開)的外部工具的連線,請參閱此文章。
結論
在這篇簡短的介紹中,我們介紹了Geth,以太坊節點的型別及其目的。你現在可以執行自己的Geth節點,並使用第三方工具對其進行增強。在以後的文章中,我們將介紹執行專用網路(你自己的乙太網區域鏈與Geth)以及更多內容。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是原文Geth介紹及如何執行以太坊節點