🖐🏻 免责声明
本教程仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,请各读者自觉遵守相关法律法规。
# 官网
https://geth.ethereum.org/docs/getting-started
假设我们事先准备目录结构如下:
📂ethereum ┣ 📂consensus ┣ 📂execution
# 安装
# -Geth
Windows系统下安装Geth最简便的方式是从下载 (opens new window)页面获取一个预编译好的二进制文件。该页面提供了安装程序以及包含Geth源代码的zip文件。安装向导为用户提供了安装仅Geth或同时安装Geth及开发者工具的选择。安装程序会自动将geth添加到系统的PATH环境中。zip文件包含了可以直接在命令提示符中运行的.exe命令文件。完整的命令行选项列表可在此处查看,或通过在终端中运行geth --help来获取。
更新已有的Geth安装版本,只需先停止节点,然后按照上述步骤下载并安装最新版本。当再次启动节点时,Geth将自动使用前一版本的所有数据,并同步节点离线期间错过的所有区块。
# 共识客户端(consensus-clients)Prysm (opens new window)
找一个目录,执行以下命令
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.bat --output prysm.bat reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
# 生成JWT Secret(不确定是否需要,下一步也会生成jwt文件)
JWT(JSON Web Token)是一种开放标准(RFC 7519),设计用于在网络应用间安全地传输信息,特别是那些涉及到用户身份验证和授权的场景。JWT提供了一种紧凑、自包含且经过数字签名的方式来编码并传递信息,这些信息以JSON对象的形式存在,并且可以在各方之间进行透明的传递。
JWT令牌主要由三部分组成:
JWT头(Header):
- 包含有关该JWT的元数据,如使用的加密算法(
alg)和令牌类型(typ,通常为JWT)。- 通常用JSON表示,然后使用Base64 URL编码转换为字符串,以便在HTTP请求中进行安全传输。
有效载荷(Payload):
- 存储实际要传递给接收方的数据,可以包括但不限于:
- 用户标识(如用户ID)
- 访问权限和角色信息
- 过期时间(
exp)- 发行时间(
iat)- 不同的应用场景可能还包括其他自定义声明(claims)。
- 同样以JSON形式表示,然后进行Base64 URL编码。
签名(Signature):
- 通过对前两部分(即头和有效载荷的编码值)使用指定的加密算法(如HMAC SHA256或RSA)进行签名来生成。
- 签名过程确保了JWT的内容不可被篡改,同时验证了发送者的真实性。
- 如果使用的是非对称加密(如RSA),服务端持有私钥进行签名,而公钥可以公开给客户端用于验证签名。
完整的JWT令牌是一个长字符串,由上述三个部分通过
.字符连接而成,形如header.payload.signature。接收方收到JWT后,可以通过验证签名来确认令牌的完整性和来源可信度,然后解码并解析有效载荷中的信息,以此来进行用户身份验证、授权决策或其他必要的业务逻辑处理。JWT令牌的主要优点包括:
- 轻量级:由于其紧凑的设计,JWT相比传统的cookie-based session机制更节省带宽。
- 自包含:所有必要的用户信息和授权数据都封装在令牌内,使得服务器无需查询数据库即可完成验证。
- 跨域支持:由于JWT不依赖于cookie的同源策略,适用于跨域环境和无状态RESTful API架构。
- 可配置过期时间:通过在有效载荷中设置过期时间,可以控制令牌的有效期限,提高安全性。
- 易于使用:JSON格式易于解析,且有多种语言的成熟库支持JWT的生成、验证及解析。
在现代Web应用尤其是前后端分离、微服务架构中,JWT令牌常用于实现无状态、分布式的身份验证和授权,取代或补充传统的session管理机制。
# 方案1
使用OpenSSL等实用程序通过命令openssl rand -hex 32 | tr -d "\n" > "jwt.hex",windows下推荐用git.bash去执行
# 方案2
prysm.bat beacon-chain generate-auth-secret
Prysm将输出jwt.hex文件路径。
将jwt.hex文件移动到ethereum目录中:
📂ethereum ┣ 📂consensus ┣ 📂execution ┣ 📄jwt.hex
# 使用步骤
# 1.启动Prysm
在此步骤中,您将使用Prysm运行信标节点。
有两种主要的方法来同步信标节点:从起源,并从一个检查点。从检查点同步更安全,速度也快得多。从检查点同步时,最简单的方法是连接到检查点同步端点。检查点同步端点 (opens new window)的非详尽列表可用。
在下面的示例中,我们将使用beaconstate.info (opens new window)提供的检查点同步端点。你想用哪个就用哪个。
导航到consensus目录,运行以下命令,通过将<PATH_TO_JWT_FILE>替换为上一步生成的JWT文件的路径,启动连接到本地执行节点的beacon节点:
prysm.bat beacon-chain --execution-endpoint=http://localhost:8551 --mainnet --jwt-secret=<PATH_TO_JWT_FILE> --checkpoint-sync-url=https://beaconstate.info --genesis-beacon-api-url=https://beaconstate.info
从检查点同步通常需要几分钟。有关此功能的详细信息,请参阅从检查点同步 (opens new window)。
如果你想从起源同步,你需要删除 --checkpoint-sync-url 和 --genesis-beacon-api-url 上一个命令的标志。从起源同步通常需要几天,但它可能需要更长的时间取决于您的网络和硬件规格。
如果您计划运行验证器,强烈建议使用--suggested-fee-recipient=<WALLET ADDRESS>选项。当你的验证者提出一个区块时,它将允许你赚取区块优先级费用,有时也称为“小费”。
恭喜你-你现在正在运行一个完整的以太坊节点。要检查节点的状态,请访问检查节点和验证器状态 (opens new window)。
# 2.生成账户(已有可忽略)
clef newaccount --keystore geth-tutorial/keystore
Clef中生成新帐户的特定函数是newaccount,它接受一个参数--keystore,告诉它在哪里存储新生成的密钥。在本例中,keystore位置是一个将自动创建的新目录:geth-tutorial/keystore。Clef将在终端返回以下结果:

这是很重要的信息geth-tutorial/keystore目录将很快包含一个密钥,可用于访问新帐户中持有的任何资金。如果它被破坏,资金可能会被盗。如果丢失了,就没有办法找回资金。本教程将只使用没有真实的世界价值的虚拟资金,但是当这些步骤在以太坊主网上重复时,关键是要保持密钥库的安全和备份。
在终端中输入ok,然后按回车键,Clef会提示输入密码。Clef需要至少10个字符长的密码,最佳做法是使用数字、字符和特殊字符的组合。输入适当的密码并按回车键,将向终端返回以下结果:
-----------------------
DEBUG[02-10|13:46:46.436] FS scan times list="92.081µs" set="12.629µs" diff="2.129µs"
INFO [02-10|13:46:46.592] Your new key was generated address=0xCe8dBA5e4157c2B284d8853afEEea259344C1653
WARN [02-10|13:46:46.595] Please backup your key file! path=keystore:///.../geth-tutorial/keystore/UTC--2022-02-07T17-19-56.517538000Z--ca57f3b40b42fcce3c37b8d18adbca5260ca72ec
WARN [02-10|13:46:46.595] Please remember your password!
Generated account 0xCe8dBA5e4157c2B284d8853afEEea259344C1653
# 3.开始谱号
前面的命令使用Clef的newaccount函数向密钥库添加新的密钥对。Clef使用保存在密钥库中的私钥来签署事务。为了做到这一点,Clef需要在Geth同时运行时启动并保持运行,这样两个程序就可以相互通信。
要启动Clef,请运行Clef可执行文件,并将密钥库文件位置、配置目录位置和链ID作为参数传递。在上一步中,配置目录会在geth-tutorial目录中自动创建。chain ID (opens new window)是一个整数,它定义了要连接到哪个以太坊网络。以太坊主网的链ID为1。在本教程中,使用了Sepolia测试网的链ID 11155111。将此链ID参数设置为11155111非常重要- Clef使用链ID来签名消息,因此它必须正确。以下命令在Sepolia上启动Clef:
clef --keystore geth-tutorial/keystore --configdir geth-tutorial/clef --chainid 11155111
运行上述命令后,Clef请求用户键入“ok”以继续。在输入“ok”并按回车键时,Clef会向终端返回以下内容:
INFO [02-10|13:55:30.812] Using CLI as UI-channel
INFO [02-10|13:55:30.946] Loaded 4byte database embeds=146,841 locals=0 local=./4byte-custom.json
WARN [02-10|13:55:30.947] Failed to open master, rules disabled err="failed stat on geth-tutorial/clef/masterseed.json: stat geth-tutorial/clef/masterseed.json: no such file or directory"
INFO [02-10|13:55:30.947] Starting signer chainid=5 keystore=geth-tutorial/keystore light-kdf=false advanced=false
DEBUG[02-10|13:55:30.948] FS scan times list="133.35µs" set="5.692µs" diff="3.262µs"
DEBUG[02-10|13:55:30.970] Ledger support enabled
DEBUG[02-10|13:55:30.973] Trezor support enabled via HID
DEBUG[02-10|13:55:30.976] Trezor support enabled via WebUSB
INFO [02-10|13:55:30.978] Audit logs configured file=audit.log
DEBUG[02-10|13:55:30.981] IPCs registered namespaces=account
INFO [02-10|13:55:30.984] IPC endpoint opened url=geth-tutorial/clef/clef.ipc
------- Signer info -------
* intapi_version : 7.0.1
* extapi_version : 6.1.0
* extapi_http : n/a
* extapi_ipc : geth-tutorial/clef/clef.ipc
此结果表明Clef正在运行。在本教程中,此终端应保持运行状态。如果教程被停止并在以后重新启动,Clef也必须通过运行上一个命令重新启动。
# 4.启动Geth
Geth是将计算机连接到以太坊网络的以太坊客户端。在本教程中,网络是Sepolia,一个以太坊测试网。测试网用于在没有现实价值风险的环境中测试以太坊客户端软件和智能合约。要启动Geth,请运行Geth可执行文件传递参数,该参数定义了数据目录(Geth应该保存区块链数据),签名者(将Geth指向Clef),网络ID和同步模式。对于本教程,建议使用快照同步(有关原因,请参阅此处 (opens new window))。传递给Geth的最后一个参数是--http标志。这将启用http-rpc服务器,该服务器允许外部程序通过向Geth发送http请求与Geth交互。默认情况下,http服务器只在本地使用端口8545:localhost:8545公开。还需要使用--authrpc为共识客户端授权一些流量,并使用--jwt-secret在已知位置设置JWT secret令牌。
下面的命令应该在一个新的终端中运行,与运行Clef的终端分开:
geth --sepolia --datadir geth-tutorial --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --authrpc.jwtsecret geth-tutorial/jwtsecret --http --http.api eth,net --signer=geth-tutorial/clef/clef.ipc --http
运行上面的命令启动Geth。Geth不会正确同步区块链,除非有一个共识客户端可以向Geth传递一个有效的头部以进行同步。在单独的终端中,启动共识客户端。一旦共识客户端同步,Geth也将开始同步。
终端应该快速填充类似于下面的状态更新。要检查日志的含义,请参阅日志页面 (opens new window)。
INFO [02-10|13:59:06.649] Starting Geth on sepolia testnet...
INFO [02-10|13:59:06.652] Maximum peer count ETH=50 LES=0 total=50
INFO [02-10|13:59:06.655] Using external signer url=geth-tutorial/clef/clef.ipc
INFO [02-10|13:59:06.660] Set global gas cap cap=50,000,000
INFO [02-10|13:59:06.661] Allocated cache and file handles database=/.../geth-tutorial/geth/chaindata cache=64.00MiB handles=5120
INFO [02-10|13:59:06.855] Persisted trie from memory database nodes=361 size=51.17KiB time="643.54µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [02-10|13:59:06.855] Initialised chain configuration config="{ChainID: 11155111 Homestead: 0 DAO: nil DAOSupport: true EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: 0 Petersburg: 0 Istanbul: 1561651, Muir Glacier: nil, Berlin: 4460644, London: 5062605, Arrow Glacier: nil, MergeFork: nil, Engine: clique}"
INFO [02-10|13:59:06.862] Added trusted checkpoint block=5,799,935 hash=2de018..c32427
INFO [02-10|13:59:06.863] Loaded most recent local header number=6,340,934 hash=483cf5..858315 td=9,321,576 age=2d9h29m
INFO [02-10|13:59:06.867] Configured checkpoint oracle address=0x18CA0E045F0D772a851BC7e48357Bcaab0a0795D signers=5 threshold=2
INFO [02-10|13:59:06.867] Gasprice oracle is ignoring threshold set threshold=2
WARN [02-10|13:59:06.869] Unclean shutdown detected booted=2022-02-08T04:25:08+0100 age=2d9h33m
INFO [02-10|13:59:06.870] Starting peer-to-peer node instance=Geth/v1.10.15-stable/darwin-amd64/go1.17.5
INFO [02-10|13:59:06.995] New local node record seq=1,644,272,735,880 id=d4ffcd252d322a89 ip=127.0.0.1 udp=30303 tcp=30303
INFO [02-10|13:59:06.996] Started P2P networking self=enode://4b80ebd341b5308f7a6b61d91aa0ea31bd5fc9e0a6a5483e59fd4ea84e0646b13ecd289e31e00821ccedece0bf4b9189c474371af7393093138f546ac23ef93e@127.0.0.1:30303
INFO [02-10|13:59:06.997] IPC endpoint opened url=/.../geth-tutorial/geth.ipc
INFO [02-10|13:59:06.998] HTTP server started endpoint=127.0.0.1:8545 prefix= cors= vhosts=localhost
默认情况下,Geth使用snap-sync,从相对较新的块(而不是genesis块)顺序下载块。它将数据保存在文件/go-ethereum/geth-tutorial/geth/chaindata/中。一旦头部序列被验证,Geth在开始“状态修复”阶段之前下载块体和状态数据,以更新新到达数据的状态。打印到终端的日志可以证实这一点。终端中应该有一个快速增长的日志序列,语法如下:
INFO [04-29][15:54:09.238] Looking for peers peercount=2 tried=0 static=0
INFO [04-29][15:54:19.393] Imported new block headers count=2 elapsed=1.127ms number=996288 hash=09f1e3..718c47 age=13h9m5s
INFO [04-29][15:54:19:656] Imported new block receipts count=698 elapsed=4.464ms number=994566 hash=56dc44..007c93 age=13h9m9s
此消息将定期显示,直到状态修复完成:
INFO [10-20|20:20:09.510] State heal in progress accounts=313,309@17.95MiB slots=363,525@28.77MiB codes=7222@50.73MiB nodes=49,616,912@12.67GiB pending=29805
当状态修复完成时,节点处于同步状态,可以使用。
向http服务器发送一个空的Curl请求提供了一种快速的方法来确认这也已经启动,没有任何问题。在第三个终端中,可以运行以下命令:
curl http://localhost:8545
如果没有错误消息报告给终端,则一切正常。Geth必须运行并同步,以便用户与以太坊网络进行交互。如果运行Geth的终端关闭,则必须在新终端中重新启动Geth。Geth可以很容易地启动和停止,但它必须运行才能与以太坊进行任何交互。要关闭Geth,只需在Geth终端中按CTRL+C即可。要再次启动它,请运行前面的命令geth --datadir其他命令>。

