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 介绍及如何运行以太坊节点
网友评论