Ethereum 基础
Posted chinusyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ethereum 基础相关的知识,希望对你有一定的参考价值。
以太坊(Ethereum
)是社区运行的技术,为加密货币以太币(ETH)和数千个去中心化应用程序提供动力。
ethereum.org是您进入以太坊世界的门户。这项技术是新的、不断发展的——有个向导会有帮助。如果你想深入研究,我们建议你这样做。
以太坊是一种数字货币、全球支付和应用程序的技术。这个社区已经建立了一个蓬勃发展的数字经济,为创作者提供了大胆的在线赚钱新方法,等等。它向所有人开放,无论你在世界上的任何地方——你所需要的只是互联网。
以太坊是一种用于构建应用程序和组织、持有资产、交易和通信的技术,不受中央权威机构的控制。没有必要交出你所有的个人信息来使用以太坊-你可以控制你自己的数据和被共享的内容。以太坊有自己的加密货币Ether
,用于支付以太坊网络上的某些活动。
什么是加密货币(cryptocurrency
)?
Crypto
(cryptocurrency的缩写)是一种由密码学驱动的新形式的数字货币。
这一切都始于2008年的比特币。你可以用它向全球任何地方的任何人汇款。加密与正常的银行转账或Paypal或支付宝等其他金融服务的不同之处在于,第一次没有中间人。
等等,什么是中间人?
中间人是像银行或政府一样的中央机构,它干预发送方和接收方之间的交易。他们有权监视、审查或恢复交易,还可以与第三方分享他们收集到的关于你的敏感数据。他们还经常规定你可以获得哪些金融服务。
加密货币的情况有所不同。交易直接连接发送方和接收方(Transactions directly connect sender and recipient
),而无需处理任何中央机构。没有人能拿到你的资金,也没有人能告诉你可以使用什么服务(nobody can tell you what services you can use
)。这是可能的,因为加密货币运行的区块链技术。
what is a blockchain?
区块链是一个交易数据库,在网络中的许多计算机之间更新和共享。每当一组新的交易被添加时,它被称为“区块”——因此得名区块链。大多数区块链都是公开的,你只能添加数据,不能删除。如果有人想改变任何信息或欺骗系统,他们需要在网络上的大多数计算机上这样做。这是很多!这使得以太坊等已建立的区块链高度安全。
why is it called crytocurrency?
区块链使用加密技术来确保您的资金安全。多年来,银行业一直使用类似的技术来确保货币交易的安全性。所以你可以说加密货币具有银行级别的安全性。
以太坊和比特币有什么区别?
以太坊于2015年推出,基于比特币的创新,但有一些很大的不同。
两者都可以让你在没有支付提供商或银行的情况下使用数字货币。但是以太坊是可编程的(Ethereum is programmable
),所以你也可以在它的网络上构建和部署去中心化的应用程序。
以太坊是可编程的,这意味着您可以构建使用区块链存储数据或控制应用程序可以做什么的应用程序。这就产生了一个通用的区块链,它可以被编程来做任何事情。由于以太坊可以做的事情没有限制,它允许在以太坊网络上发生伟大的创新。
比特币只是一个支付网络,而以太坊更像是一个金融服务、游戏、社交网络和其他应用程序的市场,它们尊重你的隐私,不能审查你。
What can Ethereum do?
为每个人提供银行服务
不是每个人都能获得金融服务。但要访问以太坊及其借贷和储蓄产品,你只需要一个互联网连接。
更私有的互联网
你不需要提供所有的个人信息来使用以太坊应用程序。以太坊正在建立一个基于价值而不是监控的经济。
点对点网络
以太坊允许你直接与他人转移资金或达成协议。你不需要通过中介公司。
Censorship-resistant
没有政府或公司可以控制以太坊。这种去中心化使得任何人都几乎不可能阻止你在以太坊上接收付款或使用服务。
商业担保
客户有一个安全的、内置的保证,只有你提供了他们同意的东西,资金才会转手。同样地,开发人员可以确定规则不会在他们身上改变。
所有产品都是可组合的
由于所有应用程序都构建在具有共享全局状态的相同区块链上,因此它们可以相互构建(就像乐高积木一样)。这使得更好的产品和体验能够一直被创造出来。
以太币,以太坊的加密货币
以太坊有一种称为以太币(ether , ETH
)的原生加密货币。它是纯数字的,你可以立即发送给世界上任何地方的任何人。ETH的供应不受任何政府或公司的控制——它是去中心化的,完全透明的。新币(New coins,也通常称为代币,tokens)只发行给保护网络的利益相关者。
以太坊网络上的每个动作都需要一定的计算能力。这笔费用以以太币的形式支付。这意味着你至少需要少量的ETH来使用网络。
我可以用ETH币做什么?
事实证明:很多事情!以太坊技术最突出的用途之一是去中心化金融(decentralized financ,DeFi),它向任何有互联网连接的人开放整个银行服务领域。你可以使用以太币作为抵押来贷款或提供流动性以赚取资金的利息。
谁在运营以太坊?
以太坊不受任何一个实体控制。它仅通过社区的分散参与和合作而存在。以太坊利用志愿者运行的节点(具有以太坊区块链数据副本的计算机)来取代主要互联网提供商和服务拥有的个人服务器和云系统。
这些分布式节点由世界各地的个人和企业运行,为以太坊网络基础设施提供弹性。因此,它更不容易受到黑客攻击或关闭的影响。自2015年推出以来,以太坊从未遭遇过停机。以太坊网络有数千个独立节点运行。这使得以太坊成为最去中心化的加密货币之一,仅次于比特币。
一、启动你自己的以太坊节点
运行自己的节点为您提供了各种好处,开辟了新的可能性,并有助于支持生态系统。本页将指导您旋转自己的节点,并参与验证以太坊交易。
请注意,在合并之后,需要两个客户端来运行一个以太坊节点;执行层(execution layer
, EL)客户端和共识层(consensus layer
, CL)客户端。本页面将展示如何安装、配置和连接这两个客户端以运行以太坊节点。
1.1 先决条件
你应该了解什么是以太坊节点,以及为什么你可能想要运行客户端。这在节点和客户端中有介绍。
如果你对运行节点的主题不熟悉,或者正在寻找不那么技术性的路径,我们建议首先查看我们关于运行以太坊节点的用户友好介绍。
1.2 选择方法
运行节点的第一步是选择方法。根据需求和各种可能性,您必须选择客户端实现(执行客户端和共识客户端)、环境(硬件、系统)以及客户端设置的参数。
本页将指导您完成这些决定,并帮助您找到运行以太坊实例的最合适的方式。
要从客户端实现中进行选择,请查看所有可用的主网就绪执行客户端、共识客户端,并了解客户端的多样性。
考虑客户的需求,决定是在自己的硬件上运行软件还是在云中运行软件。
在准备好环境后,使用初学者友好的界面或使用具有高级选项的终端手动安装所选的客户端。
当节点正在运行并同步时,您就可以使用它了,但是一定要注意它的维护。
1.3 要求
数据库的大小和初始同步的速度取决于所选择的客户端、其配置和同步策略。
您选择的同步模式和客户端将影响空间需求,但我们已经估计了以下每个客户端所需的磁盘空间。
Client | Disk size (snap sync) | Disk size (full archive) |
---|---|---|
Geth | 500GB+ | 12TB+ |
Nethermind | 500GB+ | 12TB+ |
Besu | 800GB+ | 12TB+ |
Erigon | N/A | 2.5TB+ |
注:Erigon不提供快照同步,但完全修剪是可能的(~500GB)
对于共识客户端,空间需求也取决于客户端实现和启用的功能(例如验证器slasher),但通常需要另外200GB的信标数据。有了大量的验证器,带宽负载也会增加。您可以在此分析中找到关于共识客户需求的详细信息。
1.4 即插即用的解决方案
使用自己的硬件运行节点最简单的选择是使用即插即用盒子。来自供应商的预配置机器提供了最直接的体验:订购、连接、运行。一切都是预配置的,并自动运行,有一个直观的指南和仪表板,用于监控和控制软件。
1.5 以太坊在单板计算机上
运行以太坊节点的一种简单而廉价的方法是使用单板计算机,即使是使用像树莓派这样的ARM架构。ARM上的以太坊为树莓派和其他ARM板提供了易于运行的多个执行映像和共识客户端。
像这样的小型、廉价且高效的设备非常适合在家里运行节点,但要记住它们的性能有限。
1.6 运行(SPINNING UP)节点
实际的客户端设置既可以通过自动启动器完成,也可以手动完成,直接设置客户端软件。
对于不太高级的用户,推荐的方法是使用启动器,该软件指导您完成安装并自动化客户端设置过程。但是,如果您有一些使用终端的经验,手动设置的步骤应该很简单。
1.7 指导安装
多个用户友好的项目旨在改善设置客户端的体验。这些启动器提供自动客户端安装和配置,有些甚至提供图形界面来指导客户端安装和监控。
下面是几个项目,可以帮助你安装和控制客户端只需点击几下:
- DappNode DappNode不仅仅是由供应商提供的机器提供的。该软件、实际的节点启动器和控制中心具有许多功能,可以在任意硬件上使用。
- eth-docker 自动安装使用Docker专注于简单和安全的赌注,需要基本的终端和Docker知识,推荐给一些更高级的用户。
- Stereum 用于通过SSH连接在远程服务器上安装客户机的启动器,该启动器具有GUI设置指南、控制中心和许多其他特性。
- NiceNode 在计算机上运行节点,直接进行用户体验。只需选择客户端并点击几下即可启动。仍在开发中。
1.8 手动客户端设置
另一种选择是手动下载、验证和配置客户端软件。即使一些客户端提供图形界面,手动安装仍然需要使用终端的基本技能,但可以提供更多的功能。
如前所述,设置自己的以太坊节点将需要运行一对共识和执行客户端。有些客户端可能包含其他类型的轻客户端,无需任何其他软件即可进行同步。然而,完全的无信任验证需要两种实现。
1.8.1 获取客户端软件
您只需下载适合您的操作系统和体系结构的可执行应用程序或安装包。始终验证下载包的签名和校验和。一些客户端还提供存储库或Docker映像,以便于安装和更新。所有的客户端都是开源的,所以您也可以从源代码构建它们。这是一种更高级的方法,但在某些情况下可能是必需的。
在上面客户端列表中链接的文档中提供了安装每个客户端的说明。
下面是客户端的发布页面,在那里你可以找到他们预先构建的二进制文件或安装说明:
- Besu
- Erigon (Doesn’t provide a pre-built binary, has to be compiled)
- Geth
- Nethermind
同样值得注意的是,客户端多样性是执行层的一个问题。建议读者考虑运行少数执行客户端。
客户端多样性对于运行验证器的共识节点至关重要。如果大多数验证器都在运行单个客户端实现,那么网络安全就会面临风险。因此,建议考虑选择少数族裔客户。
软件验证
开发人员用他们的PGP密钥签署发布的二进制文件,这样您就可以用密码验证您正在运行他们创建的软件。您只需要获得开发人员使用的公钥,这些公钥可以在客户端发布页面或文档中找到。在下载客户端版本及其签名之后,您可以使用PGP实现,例如GnuPG来轻松地验证它们。查看在linux或Windows/MacOS上使用gpg的各种开源软件的教程。
另一种形式的验证是确保您下载的软件的哈希(唯一的加密指纹)与开发人员提供的相匹配。这甚至比使用PGP更容易,而且一些客户端只提供这个选项。只需在下载的软件上运行哈希函数,并将其与发布页面上的软件进行比较。例如:
sha256sum teku-22.6.1.tar.gz
9b2f8c1f8d4dab0404ce70ea314ff4b3c77e9d27aff9d1e4c1933a5439767dde
1.8.2 启动执行客户端
路由器和防火墙接受监听端口上的连接。默认情况下,以太坊客户端使用侦听器(TCP)端口和发现(UDP)端口,默认情况下都在30303上。
首先在测试网上运行您的客户端,以帮助确保一切正常工作。
您需要在开始时声明任何非默认的客户端设置。您可以使用标志或配置文件来声明您的首选配置。每个客户端的特性和配置语法都不同。查看你客户的文件了解细节。
执行客户端和共识客户端通过Engine API中指定的经过身份验证的端点进行通信。为了连接到共识客户机,执行客户机必须在已知路径上生成jwtsecret。出于安全性和稳定性考虑,客户机应该在同一台机器上运行,并且两个客户机必须知道此路径,因为它用于验证它们之间的本地RPC连接。执行客户端还必须为经过身份验证的api定义监听端口。
这个令牌是由客户端软件自动生成的,但在某些情况下,您可能需要自己完成。您可以使用OpenSSL生成它:
openssl rand -hex 32 > jwtsecret
1.8.3 运行执行客户端 (execution client
)
本节将指导您启动执行客户端。它只是作为一个基本配置的例子,它将启动客户端这些设置:
- 指定要连接的网络,在我们的示例中为主网
- 您可以选择一个测试网来对您的设置进行初步测试
- 定义数据目录,包括区块链在内的所有数据将存储在其中
- 确保替换路径与一个真正的,例如指向您的外部驱动器
- 启用与客户端通信的接口
- 包括JSON RPC和引擎API(Engine API),用于与共识客户端通信
- 为认证API定义 jwtsecret 的路径
- 确保将示例路径替换为客户端可以访问的真实路径,例如/tmp/jwtsecret
请记住,这只是一个基本的例子,所有其他设置将设置为默认值。注意每个客户端的文档,了解默认值、设置和特性。有关更多功能,例如运行验证器、监视等,请参考特定客户端的文档。
注意示例中的反斜杠\\
仅用于格式化目的;配置标志可以在一行中定义。
Running Geth
这个例子在主网上启动Geth,在/data/ethereum
上存储区块链数据,启用JSON RPC并定义允许哪些名称空间。它还支持连接共识客户机的身份验证,这需要jwtsecret的路径,还需要定义允许哪些连接的选项,在我们的示例中,只允许从localhost连接。
geth --mainnet \\
--datadir "/data/ethereum" \\
--http --authrpc.addr localhost \\
--authrpc.vhosts="localhost" \\
--authrpc.port 8551
--authrpc.jwtsecret=/path/to/jwtsecret
Check docs for all configuration options and learn more about running Geth with a consensus client.
1.8.4 启动共识客户机 (consensus client
)
必须使用正确的端口配置启动共识客户机,以建立到执行客户机的本地RPC连接。必须使用公开的执行客户端端口作为配置参数来运行共识客户端。
共识客户机还需要执行客户机的jwt-secret路径,以便对它们之间的RPC连接进行身份验证。与上面的执行示例类似,每个共识客户机都有一个配置标志,该标志以jwt令牌文件路径作为参数。这必须与提供给执行客户端的jwtsecret路径一致。
如果你计划运行一个验证器(validator
),请确保添加一个配置标志,指定费用接收者的以太坊地址。这就是为你的验证器积累以太奖励的地方。每个共识客户端都有一个选项,例如--suggested-fee-recipient=0xabcd1
,它以以太坊地址作为参数。
在测试网上启动Beacon Node时,通过使用公共端点进行Checkpoint同步,可以节省大量同步时间。
1.8.5 运行一个共识客户端
Running Prysm
Prysm附带脚本,允许轻松自动安装。详细信息可以在Prysm文档中找到。
./prysm.sh beacon-chain \\
--mainnet
--datadir /data/ethereum \\
--execution-endpoint=http://localhost:8551 \\
--jwt-secret=/path/to/jwtsecret
Eth Beacon Node API
Geth (go-ethereum
)
Geth (Go - Ethereum)是以太坊协议的官方Go实现——一个进入去中心化网络的网关。
Geth
从一开始就一直是以太坊的核心部分。Geth
是最初的以太坊实现之一,使其成为最久经考验的(battle-hardened)客户端。
Geth
是一个以太坊执行客户端,这意味着它处理交易、智能合约的部署和执行,并包含一个被称为以太坊虚拟机(Ethereum Virtual Machine,EVM)的嵌入式计算机。
与共识客户端一起运行Geth
将计算机变成以太坊节点。
为Geth做贡献
我们欢迎来自互联网上任何人的贡献,并感谢即使是最小的修复!如果你想贡献Geth源代码,请fork GitHub存储库,修复,提交并发送一个拉请求(Pull request),让维护者检查并合并到主代码库中。
所有拉取请求(Pull request)都将根据代码审查指南进行审查。
我们鼓励早期的拉取请求方法,这意味着即使没有完成修复/特性,也会尽早创建拉取请求。这将让核心开发者和其他志愿者知道你发现了一个问题。这些早期pr应该表明“进展中”状态。
许可证
go-ethereum库(即cmd目录之外的所有代码)是在GNU Lesser General Public License v3.0下许可的,也包括在COPYING.LESSER
文件。
go-ethereum二进制文件(即cmd目录中的所有代码)是根据GNU通用公共许可证v3.0授权的,也包括在COPYING
文件中。
安装
Windows
安装Geth最简单的方法是从下载页面下载预编译的二进制文件。该页面提供了一个安装程序以及一个包含Geth源代码的zip文件。安装向导为用户提供了安装Geth或Geth和开发人员工具的选项。安装程序会自动将geth
添加到系统的PATH
中。zip
文件包含可以从命令提示符运行的命令.exe
文件。命令行选项的完整列表可以在这里或通过运行geth --help
在终端中查看。
更新现有的Geth安装可以通过停止节点,按照上面的说明下载并安装最新版本来实现。当节点再次启动时,Geth将自动使用前一个版本的所有数据,并同步节点离线时遗漏的块。
# windows goerli 网络
geth --goerli --datadir "E:\\ethereum\\execution" --http --authrpc.addr localhost --authrpc.vhosts="localhost" --authrpc.port 8551 --authrpc.jwtsecret=E:\\ethereum\\jwtsecret
INFO [01-05|09:05:22.269] Starting Geth on Görli testnet...
INFO [01-05|09:05:22.293] Maximum peer count ETH=50 LES=0 total=50
INFO [01-05|09:05:22.329] Set global gas cap cap=50,000,000
INFO [01-05|09:05:22.332] Allocated trie memory caches clean=154.00MiB dirty=256.00MiB
INFO [01-05|09:05:22.332] Allocated cache and file handles database=E:\\ethereum\\execution\\geth\\chaindata cache=512.00MiB handles=8192
INFO [01-05|09:05:22.772] Opened ancient database database=E:\\ethereum\\execution\\geth\\chaindata\\ancient/chain readonly=false
INFO [01-05|09:05:22.785] Writing custom genesis block
INFO [01-05|09:05:22.794] Persisted trie from memory database nodes=361 size=51.17KiB time="542.1µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [01-05|09:05:22.800]
INFO [01-05|09:05:22.800] ---------------------------------------------------------------------------------------------------------------------------------------------------------
INFO [01-05|09:05:22.806] Chain ID: 5 (goerli)
INFO [01-05|09:05:22.807] Consensus: Beacon (proof-of-stake), merged from Clique (proof-of-authority)
INFO [01-05|09:05:22.808]
INFO [01-05|09:05:22.809] Pre-Merge hard forks:
INFO [01-05|09:05:22.810] - Homestead: 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md)
INFO [01-05|09:05:22.812] - Tangerine Whistle (EIP 150): 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md)
INFO [01-05|09:05:22.815] - Spurious Dragon/1 (EIP 155): 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)
INFO [01-05|09:05:22.817] - Spurious Dragon/2 (EIP 158): 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)
INFO [01-05|09:05:22.820] - Byzantium: 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md)
INFO [01-05|09:05:22.827] - Constantinople: 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md)
INFO [01-05|09:05:22.830] - Petersburg: 0 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md)
INFO [01-05|09:05:22.834] - Istanbul: 1561651 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md)
INFO [01-05|09:05:22.837] - Berlin: 4460644 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md)
INFO [01-05|09:05:22.842] - London: 5062605 (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md)
INFO [01-05|09:05:22.845]
INFO [01-05|09:05:22.846] Merge configured:
INFO [01-05|09:05:22.847] - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md
INFO [01-05|09:05:22.849] - Network known to be merged: true
INFO [01-05|09:05:22.850] - Total terminal difficulty: 10790000
INFO [01-05|09:05:22.853] - Merge netsplit block: <nil>
INFO [01-05|09:05:22.854] ---------------------------------------------------------------------------------------------------------------------------------------------------------
INFO [01-05|09:05:22.858]
INFO [01-05|09:05:22.861] Initialising Ethereum protocol network=5 dbversion=<nil>
INFO [01-05|09:05:22.863] Loaded most recent local header number=0 hash=bf7e33..b88c1a td=1 age=3y11mo3w
INFO [01-05|09:05:22.865] Loaded most recent local full block number=0 hash=bf7e33..b88c1a td=1 age=3y11mo3w
INFO [01-05|09:05:22.868] Loaded most recent local fast block number=0 hash=bf7e33..b88c1a td=1 age=3y11mo3w
WARN [01-05|09:05:22.868] Failed to load snapshot, regenerating err="missing or corrupted snapshot"
INFO [01-05|09:05:22.873] Rebuilding state snapshot
INFO [01-05|09:05:22.873] Regenerated local transaction journal transactions=0 accounts=0
INFO [01-05|09:05:22.873] Chain post-merge, sync via beacon client
INFO [01-05|09:05:22.873] Gasprice oracle is ignoring threshold set threshold=2
INFO [01-05|09:05:22.873] Stored checkpoint snapshot to disk number=0 hash=bf7e33..b88c1a
INFO [01-05|09:05:22.873] Resuming state snapshot generation root=5d6cde..8b3008 accounts=0 slots=0 storage=0.00B dangling=0 elapsed=0s
WARN [01-05|09:05:22.873] Error reading unclean shutdown markers error="leveldb: not found"
WARN [01-05|09:05:22.897] Engine API enabled protocol=eth
INFO [01-05|09:05:22.900] Starting peer-to-peer node instance=Geth/v1.10.26-stable-e5eb32ac/windows-amd64/go1.18.5
INFO [01-05|09:05:22.901] Generated state snapshot accounts=260 slots=0 storage=9.69KiB dangling=0 elapsed=27.283ms
INFO [01-05|09:05:23.003] New local node record seq=1,672,880,723,000 id=c2ce2adc4c301bee ip=127.0.0.1 udp=30303 tcp=30303
INFO [01-05|09:05:23.009] Started P2P networking self=enode://6742aa1026a8f9f66289363a9966794438ad7338a1f853c960803d3e61b7b69e2804f1084bc59a2e22d29bac20832327768819da3d47c68e332f7f8dd13c24c3@127.0.0.1:30303
INFO [01-05|09:05:23.010] IPC endpoint opened url=\\\\.\\pipe\\geth.ipc
INFO [01-05|09:05:23.017] Loaded JWT secret file path=E:\\ethereum\\jwtsecret crc32=0x5586b942
INFO [01-05|09:05:23.020] HTTP server started endpoint=127.0.0.1:8545 auth=false prefix= cors= vhosts=localhost
INFO [01-05|09:05:23.028] WebSocket enabled url=ws://127.0.0.1:8551
INFO [01-05|09:05:23.031] HTTP server started endpoint=127.0.0.1:8551 auth=true prefix= cors=localhost vhosts=localhost
INFO [01-05|09:05:33.167] Looking for peers peercount=0 tried=12 static=0
INFO [01-05|09:05:43.352] Looking for peers peercount=0 tried=28 static=0
INFO [01-05|09:05:53.366] Looking for peers peercount=0 tried=20 static=0
WARN [01-05|09:05:57.916] Post-merge network, but no beacon client seen. Please launch one to follow the chain!
INFO [01-05|09:06:03.668] Looking for peers peercount=0 tried=11 static=0
连接到共识客户端
Geth是一个执行客户端。从历史上看,一个执行客户端就足以运行一个完整的以太坊节点。然而,自从以太坊从工作量证明(PoW)交换到基于共识的权益证明(PoS)以来,Geth
就需要与另一个被称为“共识客户端”的软件耦合。
有五个可用的共识客户机,它们都以相同的方式连接到Geth。本页将概述Geth如何与共识客户端一起设置,以形成一个完整的以太坊节点。
Configuring Geth
Geth可根据“安装Geth”页面的说明下载并安装。为了连接到共识客户机,Geth必须为客户机间RPC连接公开一个端口。
RPC连接必须使用jwtsecret
文件进行身份验证。默认情况下,它被创建并保存到<datadir>/geth/jwtsecret
,但也可以创建并保存到自定义位置,或者可以通过将文件路径传递给--authrpc.jwtsecret
来自行生成并提供给geth。Geth
和共识客户机都需要jwtsecret
文件。
然后必须将授权应用到特定的地址/端口(address/port)。这是通过向--authrpc.addr
传递地址来实现的。地址和端口号到--authrpc.port
。为--authrpc.vhosts
提供localhost
或通配符*
也是安全的。以便Geth接受来自虚拟主机的传入请求,因为它只应用于使用jwtsecret
进行身份验证的端口。
一个完整的命令来启动Geth,以便它可以连接到一个共识客户端,如下所示:
geth --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret /tmp/jwtsecret
共识客户端
目前有五个共识客户端可以与Geth一起运行。这些都是:
Lighthouse: written in Rust
Nimbus: written in Nim
Prysm: written in Go
Teku: written in Java
Lodestar: written in Typescript
建议在选择共识客户端时考虑客户端的多样性。上面列表中链接的文档中提供了安装每个客户机的说明。
必须使用正确的端口配置启动共识客户机,以建立到本地Geth实例的RPC连接。在上面的示例中,localhost:8551
被授权用于此目的。共识客户端都有一个类似于--http-webprovider
的命令,该命令将公开的Geth端口作为参数。
为了验证它们之间的RPC连接,共识客户机还需要Geth的jwt-secret
的路径。每个共识客户机都有一个类似于--jwt-secret
的命令,该命令以文件路径作为参数。这必须与Geth提供的路径--authrpc.jwtsecret
一致。
共识客户端都公开了一个Beacon API,可以用来检查Beacon客户端的状态,或者通过使用Curl等工具发送请求来下载区块和共识数据。关于这方面的更多信息可以在每个共识客户机的文档中找到。
验证器 (Validator)
验证器负责保护以太坊区块链。验证者已经将至少32个ETH押注到存款合同中,并运行验证器软件。每个共识客户端都有自己的验证器软件,在各自的文档中有详细描述。处理押注和验证器密钥生成的最简单方法是使用以太坊基金会押注启动板。Launchpad指导用户完成生成验证器密钥并将验证器连接到共识客户机的过程。
同步
Geth不能同步,直到连接的共识客户端同步。这是因为Geth需要一个目标头来同步。同步共识客户端的最快方法是使用检查点同步(checkpoint sync)。为此,可以在启动时向共识客户端提供检查点或检查点提供程序的url。这些检查点有几个来源。这些检查点有几个来源。理想的场景是从可信的节点操作者(带外组织)获得一个,并根据第三方节点或区块资源管理器或检查点提供程序进行验证。一些客户端还允许通过HTTP API访问现有的Beacon节点进行检查点同步。还有几个公共检查点同步端点。
使用Geth
Geth是用户向以太坊发送交易的门户。Geth javascript控制台可用于此目的,大多数JSON-RPC API将通过web3js
或HTTP请求(命令作为json有效负载)保持可用。这些选项在Javascript控制台页面有更详细的解释。Javascript控制台可以在单独的终端上使用以下命令启动(假设Geth的IPC文件保存在datadir
中):
geth attach datadir/geth.ipc
Prysm
快速入门
Prysm是以太坊权益证明共识规范的实现。在这个快速入门中,您将使用Prysm运行一个以太坊节点,并可选地运行一个验证器。这将允许您使用您管理的硬件下注32个ETH。
这是一个初学者友好的指南。我们希望您熟悉命令行,但除此之外,本指南对您的技术技能或先验知识没有任何假设。
在高层次上,我们将走过以下流程:
- 使用执行层客户端配置执行节点。
- 使用共识层客户端Prysm配置信标节点(
beacon node
)。 - 使用Prysm配置验证器和权益ETH(可选)。
步骤1:先决条件和最佳实践
Node type | Benefits | Requirements |
---|---|---|
Execution + beacon | 1.有助于以太坊生态系统的安全性。2. 让您直接访问以太坊网络,而无需信任第三方服务。3. 允许您在合并后运行验证器。 | Software: Execution client, beacon node client (instructions for clients below), curl ; OS: 64-bit Linux, Mac OS X 10.14+, Windows 10+ 64-bit CPU: 4+ cores @ 2.8+ GHz; Memory: 16GB+ RAM; Storage: SSD with at least 2TB free space; Network: 8 MBit/sec broadband |
Validator | 让您下注ETH,提议 + 验证区块,赚取下注奖励 + 交易费用提示。 | Everything above, plus… Software: Validator client, browser-based crypto wallet (instructions below); Hardware: (Recommended) A new machine that has never been connected to the internet that you can use to securely generate your mnemonic phrase (生成助记短语) and keypair; 32 ETH (Mainnet) ;32 testnet ETH (Testnets) |
最佳实践
- 如果您摆注 ETH 作为验证器,请先在测试网上尝试本指南,然后再在主网上尝试。
- 保持简单。本指南假设所有客户端软件都运行在一台机器上。
- 查看您正在使用的网络的最新建议:Goerli-Prater, Mainnet。
- 回顾我们发布的所有安全最佳实践。
- 加入社区-加入我们的邮件列表,Prysm Discord服务器,r/ethstaker和EthStaker Discord server 以获得更新和支持。
步骤2:安装 Prysm
在SSD上创建一个名为ethereum
的文件夹,然后在其中创建两个子文件夹:consensus
和execution
:
导航到您的共识目录并运行以下命令:
mkdir prysm && cd prysm
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.bat --output prysm.bat
reg add HKCU\\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
这将下载Prysm
客户端并更新注册表以启用详细日志记录。
Generate JWT Secret
信标节点和执行节点之间的HTTP连接需要使用JWT令牌进行身份验证。有几种方法可以生成这个JWT令牌:
- 使用像这个在线生成器。将此值复制并粘贴到
jwt.hex
中。 - 使用类似OpenSSL的工具通过命令创建令牌:
openssl rand -hex 32 | tr -d "\\n" > "jwt.hex"
。 - 使用执行客户端生成
jwt.hex
文件。 - 使用Prysm生成
jwt.hex
文件
## Optional. This command is necessary only if you've previously configured USE_PRYSM_VERSION
SET USE_PRYSM_VERSION=v3.1.2
## Required.
prysm.bat beacon-chain generate-auth-secret
Prysm将输出jwt.hex
文件路径
确保用于创建和访问JWT令牌的脚本、
CentOS 7 部署以太坊私有链 go1.13.2 + go-ethereum1.9.12
###1.安装基础工具yum update -y && yum install git bzip2 gcc-c++ ntp epel-release nodejs -y
###2.安装cmake
wget https://cmake.org/files/v3.15/cmake-3.15.2.tar.gz tar zxvf cmake-3.15.2.tar.gz mv cmake-3.15.2 /usr/local/ cd /usr/local/cmake-3.15.2 ./bootstrap gmake gmake install
###3.配置环境变量
echo "export PATH=/usr/local/cmake-3.15.2/bin:$PATH" >> /etc/profile source /etc/profile cmake -version [root@192 ~]# cmake -version cmake version 3.15.2 CMake suite maintained and supported by Kitware (kitware.com/cmake).
###4.安装go语言
wget https://storage.googleapis.com/golang/go1.13.2.linux-amd64.tar.gz tar -C /usr/local -zxzf go1.13.2.linux-amd64.tar.gz echo "export GOROOT=/usr/local/go" >> /etc/profile echo "export PATH=/usr/local/go/bin:$PATH" >> /etc/profile source /etc/profile [root@192 ~]# go version go version go1.13.2 linux/amd64
###5.克隆并编译go-ethereum项目
cd /usr/local git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum/ make all echo "export PATH=$PATH:/usr/local/go-ethereum/build/bin" >> /etc/profile source /etc/profile [root@192 ~]# geth version Geth Version: 1.9.12-unstable Git Commit: 556888c4a971d4fd02be15f09cba7a65c5c0d930 Git Commit Date: 20200303 Architecture: amd64 Protocol Versions: [65 64 63] Go Version: go1.13.2 Operating System: linux GOPATH= GOROOT=/usr/local/go
###6.开启网络时间同步
systemctl enable ntpd systemctl start ntpd
###7.创建geth工作目录
mkdir -pv /test/chain vim /test/genesis.json [root@192 ~]# cat /test/genesis.json { "config": { "chainId": 666, "homesteadBlock": 0, "eip150Block": 0, "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, "ethash": {} }, "nonce": "0x0", "timestamp": "0x5ddf8f3e", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x47b760", "difficulty": "0x00002", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "0x1e82968C4624880FD1E8e818421841E6DB8D1Fa4" : {"balance" : "30000000000000000000"} }, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }
###8.启动geth命令
[root@localhost test]# geth --port ‘30303‘ --datadir "./chain" --nodiscover console 2>>eth_output.log Welcome to the Geth JavaScript console! instance: Geth/v1.9.12-unstable-556888c4-20200303/linux-amd64/go1.13.2 coinbase: 0x60b50043de183a439c96891416c003c46623f528 at block: 109 (Mon Mar 09 2020 16:18:37 GMT+0800 (CST)) datadir: /test/chain modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 >
###9.账户的添加和查看(在启动私有链后的Geth javascript console中操作)
> web3.eth.accounts []
创建帐户的方式有两种,第一种创建帐户时直接初始化密码
> web3.personal.newAccount("123456") "0x60b50043de183a439c96891416c003c46623f528"
其中返回的0x60b50043de183a439c96891416c003c46623f528是帐户,123456是帐户的密码
第二种方法是先创建账户,然后输入密码> web3.personal.newAccount() Passphrase: Repeat passphrase: "0xdb66c9c37efabab160f5453d27676e7930153eec"
这时我们再查看帐户,能够看到刚才创建的两个帐户已经存在了> web3.eth.accounts ["0x60b50043de183a439c96891416c003c46623f528", "0xdb66c9c37efabab160f5453d27676e7930153eec"]
###10.开始和停止
执行以下命令:> miner.start(1)
执行以后,通过刚才查看日志的方法tail -f eth_output.log,能够看到类似下面的日志,说明程序已经在进行.INFO [03-09|16:18:31.770]
以上是关于Ethereum 基础的主要内容,如果未能解决你的问题,请参考以下文章
区块链Ethereum使用keccak256生成公私钥以及消息签名
[Ethereum] 以太坊区块链搭建与使用-私有链配置与启动