10 个版本 (4 个破坏性版本)
0.19.0 | 2021 年 4 月 7 日 |
---|---|
0.18.1 | 2021 年 2 月 11 日 |
0.18.0 | 2021 年 1 月 29 日 |
0.17.0 | 2020 年 12 月 17 日 |
0.15.0 | 2020 年 7 月 20 日 |
#28 in #bft
2MB
32K SLoC
查看 仓库根目录 以获取构建状态、许可证、Rust 版本等信息
光节点
Tendermint light-node 将 Tendermint 的 light-client 库封装成一个命令行界面工具。它可以作为一个独立的光客户端守护程序使用,并暴露一个 JSON-RPC 端点,您可以从该端点查询光节点的当前状态。
入门
前提条件
本简短教程假设您熟悉如何在您的机器上运行 Tendermint 全节点。要了解如何做到这一点,您可以查阅 tendermint 文档中的 快速入门 部分。
本教程还假设您已安装 git
和最新的稳定 Rust 工具链(见 https://rustup.rs/)。此外,jq
工具将使您处理 JSON 输出更加容易。
克隆仓库
要从源运行轻节点,您必须首先克隆此仓库
$ git clone https://github.com/informalsystems/tendermint-rs.git
然后导航到轻节点构建目录
$ cd tendermint-rs/light-node
配置
您可以通过配置文件配置轻节点的所有方面。一个示例配置可以在light_node.toml.example下找到。
如果您在您的计算机上运行Tendermint全节点,您可以简单地复制并使用它来开始
$ cp light_node.toml.example light_node.toml
请查看配置文件并根据您的需求进行编辑。提供的示例配置文件包含大量说明性注释,希望这些注释能为您提供足够的指导以配置您的轻节点。
主观初始化
假设您正在运行一个在回环接口上公开RPC端点的Tendermint全节点,您可以按照以下步骤主观初始化轻节点:
首先,您必须获取一个您想要信任的标头哈希和高度(主观)。为了我们的目的,您可以通过查询您正在运行的Tendermint全节点来获取一个。这里我们获取了高度2的标头哈希。
$ curl -X GET "https://127.0.0.1:26657/block?height=2" -H "accept: application/json" | jq .result.block_id.hash 1515:15:26
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2155 0 2155 0 0 161k 0 --:--:-- --:--:-- --:--:-- 161k
"76F85BEF1133114482FC8F78C5E78D2B1C1875DD8422A0394B175DD694A7FBA1"
现在您可以使用这个标头哈希通过以下方式主观初始化您的轻节点:
$ cargo run -- initialize 2 76F85BEF1133114482FC8F78C5E78D2B1C1875DD8422A0394B175DD694A7FBA1
请注意,第一次调用cargo run
可能需要一段时间,因为这个命令还将编译轻节点及其所有依赖项。
运行轻节点守护进程
现在您可以通过简单地运行以下命令来启动您的轻节点:
$ cargo run -- start
如果一切正常,输出将类似于
cargo run -- start 17:56:31
Finished dev [unoptimized + debuginfo] target(s) in 0.42s
Running `/redacted/tendermint-rs/target/debug/light_node start`
[info] synced to block 20041
[info] synced to block 20042
[info] synced to block 20044
[info] synced to block 20046
[info] synced to block 20048
[info] synced to block 20049
[info] synced to block 20051
[info] synced to block 20053
[info] synced to block 20054
[...]
您可以通过按Ctrl+c来停止轻节点。
帮助
您会注意到一些配置参数可以通过命令行参数进行覆盖。
要获取完整概述、命令行参数和可用子命令,请运行
$ cargo run -- help
或在特定子命令下,例如
$ cargo run -- help start
JSON-RPC端点
当您有一个正在运行的轻节点时,您可以通过以下方式查询其当前状态:
$ curl localhost:8888 -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc": "2.0", "method": "state", "id": 1}' | jq
或者您可以通过/status
端点查询一个简短的摘要
$ curl localhost:8888 -X POST -H 'Content-Type: application/json'\ 15:58:52
-d '{"jsonrpc": "2.0", "method": "status", "id": 1}' | jq
点击这里查看状态端点的预期输出示例
$ curl localhost:8888 -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc": "2.0", "method": "status", "id": 1}' | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 364 100 317 100 47 1843 273 --:--:-- --:--:-- --:--:-- 2104
{
"jsonrpc": "2.0",
"result": {
"block_hash": "ED745723430944215F65ED78AD7DF9ED0AA8A2A3B465BF421E0BAF66AA55AA08",
"connected_nodes": [
"BADFADAD0BEFEEDC0C0ADEADBEEFC0FFEEFACADE",
"CEFEEDBADFADAD0C0CEEFACADE0ADEADBEEFC0FF"
],
"height": 3850,
"valset_hash": "74F2AC2B6622504D08DD2509E28CE731985CFE4D133C9DB0CB85763EDCA95AA3"
},
"id": 1
}
点击这里查看状态端点的预期输出示例
命令
$ curl localhost:8888 -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc": "2.0", "method": "state", "id": 1}' | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1902 100 1856 100 46 164k 4181 --:--:-- --:--:-- --:--:-- 168k
示例输出
{
"jsonrpc": "2.0",
"result": {
"next_validator_set": {
"validators": [
{
"address": "AD358F20C8CE80889E0F0248FDDC454595D632AE",
"proposer_priority": "0",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "uo9rbgR5J0kuED0C529bTa6mcHZ4uXDjJRdg1k8proY="
},
"voting_power": "10"
}
]
},
"provider": "BADFADAD0BEFEEDC0C0ADEADBEEFC0FFEEFACADE",
"signed_header": {
"commit": {
"block_id": {
"hash": "76F85BEF1133114482FC8F78C5E78D2B1C1875DD8422A0394B175DD694A7FBA1",
"parts": {
"hash": "568F279E3F59FBE3CABEACE7A3C028C15CA6A902F9D77DDEBA3BFCB9514E2881",
"total": "1"
}
},
"height": "2",
"round": "0",
"signatures": [
{
"block_id_flag": 2,
"signature": "sN3e6bzKLeIFNRptQ4SytBDLZJA53e92D6FWTll5Lq8Wdg4fVzxya6qx3SHFU82ukuj8jKmBMkwTTJsb8xThCQ==",
"timestamp": "2020-07-10T12:39:06.977628900Z",
"validator_address": "AD358F20C8CE80889E0F0248FDDC454595D632AE"
}
]
},
"header": {
"app_hash": "0000000000000000",
"chain_id": "dockerchain",
"consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
"data_hash": null,
"evidence_hash": null,
"height": "2",
"last_block_id": {
"hash": "F008EACA817CF6A3918CF7A6FD44F1F2464BB24D25A7EDB45A03E8783E9AB438",
"parts": {
"hash": "BF5130E879A02AC4BB83E392732ED4A37BE2F01304A615467EE7960858774E57",
"total": "1"
}
},
"last_commit_hash": "474496740A2EAA967EED02B239DA302BAF696AE36AEA78F7FEFCE4A77CCA5B33",
"last_results_hash": null,
"next_validators_hash": "74F2AC2B6622504D08DD2509E28CE731985CFE4D133C9DB0CB85763EDCA95AA3",
"proposer_address": "AD358F20C8CE80889E0F0248FDDC454595D632AE",
"time": "2020-07-10T12:39:05.977628900Z",
"validators_hash": "74F2AC2B6622504D08DD2509E28CE731985CFE4D133C9DB0CB85763EDCA95AA3",
"version": {
"app": "1",
"block": "10"
}
}
},
"validator_set": {
"validators": [
{
"address": "AD358F20C8CE80889E0F0248FDDC454595D632AE",
"proposer_priority": "0",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "uo9rbgR5J0kuED0C529bTa6mcHZ4uXDjJRdg1k8proY="
},
"voting_power": "10"
}
]
}
},
"id": 1
}
依赖项
~29–43MB
~808K SLoC