Celestia Node RPC CLI 教程
在本教程中,我们将介绍如何使用 Celestia Node RPC API 通过命名空间提交和检索数据(blob)到数据可用性层。
🔔
要查看 Celestia 轻节点的视频教程,请点击这里。
⚠️
Gateway API 已被弃用,并将在未来移除。如果您仍希望使用它们,可以在这里找到更多细节。
目录
本教程分为以下几个部分:
简介
Blobs
通过向核心网络发送 MsgPayForBlobs
交易来提交Data
到 Celestia 的 DA 层。详细了解 MsgPayForBlobs
交易请点击此处。
命名空间
Celestia 将区块数据分割成多个命名空间,每个应用程序对应一个命名空间。这使得应用程序只需下载自己的数据,而无需下载其他应用程序的数据。详细了解命名空间 Merkle 树(NMTs)请点击此处。
硬件要求
以下是运行轻节点所推荐的最低硬件要求:
- 内存: 2 GB
- CPU: 单核
- 硬盘: 25 GB SSD 存储
- 带宽: 56 Kbps 上下行
安装依赖项
首先,请确保更新和升级操作系统:
以下是执行许多任务(如下载文件、编译和监控节点)所必需的基本软件包:
安装 Golang
celestia-app
和 celestia-node
是用 Golang
编写的,因此我们必须安装 Golang
才能编译和运行它们。
现在我们需要将 /usr/local/go/bin
目录添加到 $PATH
环境变量中:
要检查 Go 是否正确安装,请运行以下命令:
go version
如果已安装输出应该是:
Celestia 节点
安装 Celestia 节点
通过运行celestia version
命令检查版本,验证二进制文件是否正常工作:
$ celestia version
Semantic version: v0.10.4
Commit: 03ff94a7d779caf1225f3dccb53a68e8f1646dc6
Build Date: Thu Dec 15 10:19:22 PM UTC 2022
System version: amd64/linux
Golang version: go1.20.2
实例化 Celestia 轻节点
现在,让我们实例化一个 Celestia 轻节点:
注意:RPC 接入点在所有
celestia-node
类型(如轻节点、桥接节点和完整节点)中都是可用的。
连接到公共的接入点
🔔
--core.ip
的 gRPC 端口默认为 9090,因此如果您在命令行中不指定它,它将默认使用该端口。您可以在 IP 地址后添加端口,或者使用--core.grpc.port
标志来指定其他端口。
有关所需开放哪些端口的信息,请参阅“ports”部分。
例如,您的命令连同一个 RPC 接入点可能如下所示:
密钥及钱包
你可以通过运行以下命令为你的节点创建自己的密钥:
./cel-key add <key_name> --keyring-backend test --node.type light --p2p.network <network>
你可以通过运行以下命令使用上面创建的密钥启动你的轻节点:
TIP
请参考 "ports" 部分以了解在您的机器上需要打开哪些端口。
一旦启动了轻节点,将会自动生成一个钱包密钥。您需要用 Mocha Testnet 或 Arabica Devnet 代币为该地址充值,以支付PayForBlob
交易的费用。
你可以通过在celestia-node
目录中运行以下命令来找到该地址:
./cel-key list --node.type light --keyring-backend test --p2p.network <network>
如果你想用测试网代币充值你的钱包,请前往 Celestia Discord的#mocha-faucet
或#arabica-faucet
频道。
你可以在 Discord 中使用以下命令向你的钱包地址请求代币:
$request <Wallet-Address>
<Wallet-Address>
是在创建钱包时生成的类似 celestia1******
的钱包地址。
一旦您的钱包获得了资金,您可以继续进行下一步操作。
RPC 命令行教程
🔔
“命令行”和“终端”这两个词语经常混用,但其表达的是同一个意思,即用来与操作系统交互的 OSX/Linux 下的终端窗口或 Windows 环境下的命令行应用(或其他类似的应用)。
这部分教程将教你如何与 Celestia 节点的RPC(远程过程调用)API 进行交互。
首先,请先安装和运行 celestia-node,然后打开另一个终端窗口以开始查询 API。
Celestia 节点的命令行界面(CLI)有一个名为rpc
的子命令,它允许你通过终端与节点的 RPC API 进行交互。
rpc
子命令的格式如下:
celestia rpc [module] [method] [...args]
安装
认证令牌 🔒
为了使用rpc
子命令与 API 进行交互,你需要设置认证令牌。
--auth TOKEN
参数用于设置认证令牌,否则它将从环境变量CELESTIA_NODE_AUTH_TOKEN
中读取。如果找不到令牌,认证将不会被设置。如果没有设置认证,请求将失败。
要设置你的认证令牌,你可以使用以下命令。确保将<node-type>
替换为节点的类型,将<network>
替换为你运行节点的网络:
export CELESTIA_NODE_AUTH_TOKEN=$(celestia <node-type> auth admin --p2p.network <network>)
以下是在 Arabica 上设置你的轻节点认证令牌的示例:
export CELESTIA_NODE_AUTH_TOKEN=$(celestia light auth admin --p2p.network arabica)
接入点
--host URL
参数用于设置接入点地址,默认情况下是通过 HTTP 访问的localhost:26658
。
自动补全
如果你想为 Celestia Node CLI 的 rpc
子命令开启自动补全功能,你可以使用以下命令,并按照 CLI 中的说明进行操作。
# pick your sh type from the array
celestia completion [bash | fish | powersh | zsh]
如果你想查看你的 sh 的帮助菜单,可以运行以下命令:
# pick your sh type from the array
celestia completion [bash | fish | powersh | zsh] --help
提交数据
在这个示例中,我们将使用我们的轻节点提交一个PayForBlob
交易。
需要考虑的一些事项:
- PFB 是一个
PayForBlob
消息。 - 接入点还需要提供
namespace_id
和data
值。 - Namespace ID 应为 10 字节,以
0x
为前缀。 - Data 应为原始消息的十六进制编码字节。
我们使用以下数据来完成这个示例:
namespace_id: 0x42690c204d39600fddd3
data:0xf1f20ca8007e910a3bf8b2e61da0f26bca07ef78717a6ea54165f5
你也可以使用我们创建的Golang Playground 来生成你自己的 namespace_id
和 data
。
下面是 PayForBlob
交易的示例格式:
celestia rpc blob SubmitPayForBlob [namespace in hex] [data in hex]
我们运行以下命令以十六进制格式向网络提交一个Blob
:
celestia rpc blob Submit 0x42690c204d39600fddd3 0xf1f20ca8007e910a3bf8b2e61da0f26bca07ef78717a6ea54165f5
输出
{
"jsonrpc": "2.0",
"result": 32236,
"id": 1
}
我们还可以使用文本字符串作为 data
,它将被转换为 Base64 格式。以下是格式的示例:
celestia rpc blob Submit [namespace in hex] "'[data]'"
以下是以纯文本数据 "gm" 提交 PayForBlob
交易的示例:
celestia rpc blob Submit 0x42690c204d39600fddd3 '"gm"'
上面的输出返回了一个 height
为 32236
,我们将在下一个命令中使用这个height
。
注意:要了解更多关于状态响应代码的信息,请查阅 cosmos代码解释
。
SubmitPayForBlob
参数
通过 rpc
子命令,你可以使用 SubmitPayForBlob
方法将一个 blob
提交到网络中。
SubmitPayForBlob
的参数会进行特殊解析,以提高用户体验。
有几种方式可以提交SubmitPayForBlob
:
- Namespace ID 可以被编码为十六进制或 Base64 格式。
- Blob 可以是十六进制(
0x...
)、Base64 格式("..."
)或普通字符串(将被编码为 Base64)('"Hello There!"'
)。
检索数据
在成功提交你的 PFB 交易后,节点将返回包含 PFB 交易的区块高度。你可以使用该区块高度和你提交 PFB 交易时使用的 Namespace ID,来获取返回给你的消息份额(数据)。在这个例子中,我们得到的区块高度是 32236,我们将在下面的命令中使用它。在 Celestia 规范中,可以阅读更多关于份额(shares)的信息。
以下是 GetAll
命令的使用格式:
celestia rpc blob GetAll [block height] [namespace in hex]
以下是在 arabica-9
节点上检索上述数据的示例命令:
celestia rpc blob GetAll 32236 0x42690c204d39600fddd3
输出如下
{
"jsonrpc": "2.0",
"result": [
{
"namespace": "AAAAAAAAAAAAAAAAAAAAAAAAAAwgTTlgD93TAAA=",
"data": "8fIMqAB+kQo7+LLmHaDya8oH73hxem6lQWX1",
"share_version": 0,
"commitment": "y0WFz9YPTAtkdv781IfcMO144qkdnAnjKnL9oJxkQ44="
}
],
"id": 1
}
这里的输出是经过 base64 编码过的。
要查看通过 cURL 发送的 JSON 请求,在发送请求时,使用 -—print-request
参数即可:
celestia rpc blob GetAll 32236 0x42690c204d39600fddd3 --print-request
输出如下
{
"Request": {
"id": 1,
"jsonrpc": "2.0",
"method": "blob.GetAll",
"params": [32236, ["AAAAAAAAAAAAAAAAAAAAAAAAAAwgTTlgD93TAAA="]]
},
"Response": {
"jsonrpc": "2.0",
"result": [
{
"namespace": "AAAAAAAAAAAAAAAAAAAAAAAAAAwgTTlgD93TAAA=",
"data": "8fIMqAB+kQo7+LLmHaDya8oH73hxem6lQWX1",
"share_version": 0,
"commitment": "y0WFz9YPTAtkdv781IfcMO144qkdnAnjKnL9oJxkQ44="
}
],
"id": 1
}
}
类似的,你可以通过运行以下命令来使用 cURL 获取响应:
curl -X POST -H "Authorization: Bearer ${CELESTIA_NODE_AUTH_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{
"id": 1,
"jsonrpc": "2.0",
"method": "blob.GetAll",
"params": [
32236,
[
"AAAAAAAAAAAAAAAAAAAAAAAAAAwgTTlgD93TAAA="
]
]
}' \
http://localhost:26658
输出
{“jsonrpc”:“2.0",“result”:[{“namespace”:“AAAAAAAAAAAAAAAAAAAAAAAAAAwgTTlgD93TAAA=“,”data”:“8fIMqAB+kQo7+LLmHaDya8oH73hxem6lQWX1”,“share_version”:0,“commitment”:“y0WFz9YPTAtkdv781IfcMO144qkdnAnjKnL9oJxkQ44=“}],“id”:1}
示例
检查余额
查询我们的节点以获取其默认账户的余额(默认账户与我们之前生成的CELESTIA_NODE_AUTH_TOKEN
密钥相关联):
celestia rpc state Balance
输出应与以下类似
{
"jsonrpc": "2.0",
"result": {
"denom": "utia",
"amount": "79934811"
},
"id": 1
}
检查其他账户的余额
以下是BalanceForAddress
命令的示例格式:
celestia rpc state BalanceForAddress [address]
下面是通过节点检查其他地址余额的示例:
celestia rpc state BalanceForAddress celestia10rtd9lhel2cuh6c659l25yncl6atcyt37umard
输出如下
{
"jsonrpc": "2.0",
"result": {
"denom": "utia",
"amount": "100000000"
},
"id": 1
}
获取你的节点 ID
以下是用于获取你的节点 peerId 信息的 RPC 调用:
celestia rpc p2p Info
节点 ID 在响应中的 ID
值中:
{
"jsonrpc": "2.0",
"result": {
"ID": "12D3KooWQHg8eo2DMjkw9WrNrhDq5Z7tPs32uMJkpj8njbGNF8kj",
"Addrs": [
"/ip4/10.0.0.171/tcp/2121",
"/ip6/::1/tcp/2121",
"/ip4/10.0.0.171/udp/2121/quic-v1",
"/ip6/::1/udp/2121/quic-v1",
"/ip4/71.200.65.106/tcp/54588",
"/ip4/71.200.65.106/udp/54588/quic-v1"
]
},
"id": 1
}
获取你的账户地址
以下是用于获取你的节点账户地址的 RPC 调用:
celestia rpc state AccountAddress
输出如下
{
"jsonrpc": "2.0",
"result": "celestia182wascu47m2fsu6davhktsaledd4pukahs2dgs",
"id": 1
}
获取指定高度的区块头
以下是 GetByHeight
命令的示例格式:
celestia rpc header GetByHeight [height]
现在,让我们获取区块头信息。
这里我们将获取区块 1
的头信息:
输出如下
{
"jsonrpc": "2.0",
"result": {
"header": {
"version": {
"block": "11",
"app": "1"
},
"chain_id": "arabica-9",
"height": "1",
"time": "2023-05-30T15:06:21.9265Z",
"last_block_id": {
"hash": "",
"parts": {
"total": 0,
"hash": ""
}
},
"last_commit_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"data_hash": "3D96B7D238E7E0456F6AF8E7CDF0A67BD6CF9C2089ECB559C659DCAA1F880353",
"validators_hash": "C4F7F08A8F3024A28D6486B4BA434B12391A29DFA8C04C74589A013A9A0BE427",
"next_validators_hash": "C4F7F08A8F3024A28D6486B4BA434B12391A29DFA8C04C74589A013A9A0BE427",
"consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
"app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"proposer_address": "7CD439E5F1A00E8594AA243CC9C4BFE1A6E7C397"
},
"validator_set": {
"validators": [
{
"address": "7CD439E5F1A00E8594AA243CC9C4BFE1A6E7C397",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "oubutxNSyuD0XZNmMQSraHazmE2PjFsZVZ8RNHFX3WA="
},
"voting_power": "500000000",
"proposer_priority": "0"
}
],
"proposer": {
"address": "7CD439E5F1A00E8594AA243CC9C4BFE1A6E7C397",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "oubutxNSyuD0XZNmMQSraHazmE2PjFsZVZ8RNHFX3WA="
},
"voting_power": "500000000",
"proposer_priority": "0"
}
},
"commit": {
"height": 1,
"round": 0,
"block_id": {
"hash": "E5D620B5BE7873222DCD83464C285FD0F215C209393E7481F9A5979280AD6CA2",
"parts": {
"total": 1,
"hash": "5BDD329766F3803594FA840D5B4860A82115AFA70CB307F28F7E84D3FE883A55"
}
},
"signatures": [
{
"block_id_flag": 2,
"validator_address": "7CD439E5F1A00E8594AA243CC9C4BFE1A6E7C397",
"timestamp": "2023-05-30T17:44:48.957739642Z",
"signature": "vgp6mcStXsCN5OmmqtPJCReoSu47bRcysDphTbXjqq4FuR876dwMD0fu/8lyrrpLBSt3vMAA0bTQ0GggXh6VAw=="
}
]
},
"dah": {
"row_roots": [
"//////////////////////////////////////7//////////////////////////////////////huZWOTTDmD36N1F75A9BshxNlRasCnNpQiWqIhdVHcU",
"/////////////////////////////////////////////////////////////////////////////5iieeroHBMfF+sER3JpvROIeEJZjbY+TRE0ntADQLL3"
],
"column_roots": [
"//////////////////////////////////////7//////////////////////////////////////huZWOTTDmD36N1F75A9BshxNlRasCnNpQiWqIhdVHcU",
"/////////////////////////////////////////////////////////////////////////////5iieeroHBMfF+sER3JpvROIeEJZjbY+TRE0ntADQLL3"
]
}
},
"id": 1
}
更多示例
查询节点信息
celestia rpc node Info
获取数据可用性采样相关的统计
celestia rpc das SamplingStats
转账到其他账户
根据你的需求转移指定数量的代币,并设置接收方地址、燃料费用和燃料限制。格式如下:
celestia rpc state Transfer $TO_ADDRESS [amount in utia] [gas fee in utia] [gas fee in utia]
这是一个样例,用来发送 0.1 TIA
到celestia1c425ckmve2489atttx022qpc02gxspa29wmh0d
,gasFee
为 0.008TIA
,gasLimit
为 0.08TIA
export $ADDRESS='celestia1c425ckmve2489atttx022qpc02gxspa29wmh0d'
celestia rpc state Transfer $ADDRESS 100000 8000 80000
可以通过jq
获取交易哈希
celestia rpc state Transfer $ADDRESS 100000 8000 80000 | jq .result.txhash
其他资源
发布一个 SVG 作为 PFB
如果你想创建自己的 SVG 图像,将其上传到 Celestia,并检索它,你可以查看 Base64 SVG 教程。
Golang 教程
如果你有兴趣使用 Go 语言与节点的 API 进行交互(client.go
),你可以使用 da-rpc-client-tutorial
。
疑难解答
💡
如果你碰到了类似的错误
"rpc error: code = NotFound desc = account celestia1krkle0n547u0znz3unnln8paft2dq4z3rznv86 not found"
有可能你正在尝试从某个账户提交 PayForBlob
交易,但该账户尚未获得测试网代币。请确保测试网水龙头(testnet faucet)已向你的账户提供了代币,然后再次尝试提交交易