0.2.7 |
|
---|---|
0.2.6 |
|
0.2.2 |
|
0.1.7 |
|
0.1.1 |
|
#44 in #aptos
270KB
6K SLoC
Aptos Indexer
跟踪区块链的交易并将它们推入PostgreSQL数据库
使用REST接口/客户端跟踪节点,并为每个注册的 TransactionProcessor
维护状态。启动时,默认情况下将重试每个注册处理器的之前出错的版本。
在开发自己的时,确保每个 TransactionProcessor
是幂等的,并且在相同的输入被调用时不会导致错误,即使某些或所有处理之前已经完成。
示例调用
cargo run -- --pg-uri "postgresql://127.0.0.1/postgres" --node-url "https://fullnode.devnet.aptoslabs.com" --emit-every 25 --batch-size 100
尝试使用 --help
运行索引器以获取更多详细信息
要求
本地开发
安装指南(适用于苹果硅芯片)
brew install libpq
(这是一个PostgreSQL C API库)。另外,在安装后执行所有导出命令brewinstall postgres
pg_ctl -D /opt/homebrew/var/postgres start
或brew services start postgresql
/opt/homebrew/bin/createuser-s postgres
- 确保您能够执行:
psql postgres
cargoinstall diesel_cli --无默认功能 --功能PostgreSQL
运行diesel迁移--数据库-url postgresql://localhost/postgres
- 启动索引器
cargo run -- --pg-uri "postgresql://127.0.0.1/postgres" --node-url "http://0.0.0.0:8080" --emit-every 25 --batch-size 100
# or
cargo run -- --pg-uri "postgresql://127.0.0.1/postgres" --node-url "https://fullnode.devnet.aptoslabs.com" --emit-every 25 --batch-size 100
可选PgAdmin4
- 上面的完整安装指南
brew安装 --caskpgadmin4
- 打开PgAdmin4
- 创建主密码
- 右键单击服务器 >
注册
>服务器
- 在注册对话框中输入信息
General:
Name: Indexer
Connection:
Hostname / Address: 127.0.0.1
Port: 5432
Maintenance Database: postgres
Username: postgres
- 保存
注意:
- Diesel使用
DATABASE_URL
环境变量连接到数据库。- 可以通过cargo安装diesel CLI,例如:
cargo install diesel_cli --no-default-features --features postgres
。diesel migration run
设置数据库并运行所有可用的迁移。- Aptos测试使用
INDEXER_DATABASE_URL
环境变量。必须设置该变量才能运行相关测试。- Postgres可以通过brew安装和运行。
使用Diesel添加新表/更新表
diesel migration generate <your_migration_name>
会生成一个包含up.sql + down.sql
的新文件夹,用于您的迁移diesel migration run
以应用缺失的迁移。这将根据需要重新生成schema.rs
。diesel migration redo
以回滚并应用最后一个迁移diesel database reset
删除现有数据库并重新运行所有迁移- 更多信息请参阅Diesel文档
一般流程
Tailer
是所有其他组件的中心胶水,它负责以下内容
- 维护处理器状态。`Tailer`会记录每个`TransactionProcessor`的输出结果,为每个事务版本(例如:事务)。如果`TransactionProcessor`对事务返回一个`Result::Err`,则`Tailer`将在数据库中将该版本标记为失败(包括字符串化的错误文本)并继续。
- 为每个`TransactionProcessor`重试失败的版本。默认情况下,当`Tailer`启动时,它将重新获取所有失败的`TransactionProcessor`的版本,并尝试重新处理它们。`TransactionProcessor::process_version`返回的`Result::Ok`/`Result::Err`将替换给定`TransactionProcessor`/版本组合在数据库中的状态。
- 将从
Fetcher
中获取的新交易分配到每个注册到它的TransactionProcessor
。每个TransactionProcessor
都会为其每个版本创建自己的副本,并在自己的tokio::Task
中运行。这些操作以批量的方式进行,批量大小的设置可以通过--batch-size
进行指定。对于其他可调整的参数,请尝试使用cargo run -- --help
。
Fetcher
负责以两种方式从节点获取交易:
- 一次一个(当
在重试之前出错的交易时使用)。 - 批量,使用内部缓冲区。虽然
每次只从 Fetcher
获取一个交易,但内部Fetcher
将从/transactions
端点获取交易,每次可能返回数百个交易。这比进行数百个单独的HTTP调用要高效得多。在未来,当有流式节点API时,这将是最优的交易来源。
所有这些功能都是“开箱即用”的。TransactionProcessor
是编写自己的索引器的人可以从中获得所有这些功能的地方。该特性只有一个需要实现的主要方法:process_transaction
。你可以在TransactionProcessor
中做任何事情 - 比如像DefaultProcessor
那样将数据写入Postgres表,向其他服务发出RESTful HTTP调用,将交易提交到链上:任何你想做的事。只有一个注意事项:交易处理保证至少一次。可能存在一个特定的TransactionProcessor
会接收到相同的交易多次:因此你的实现必须是幂等的。
要实现自己的TransactionProcessor
,请查看此处提供的文档和源代码:./src/indexer/transaction_processor.rs
。
其他
- 如果你遇到
= note: ld: library not found for -lpq
clang: error: linker command failed with exit code 1 (use -v to see invocation)
首先确保你已经通过homebrew
安装了postgres
和libpq
,有关更多详细信息,请参阅上面的安装指南。这是关于libpq
库的抱怨,这是一个postgres C API库,diesel需要运行,更多关于这个问题在这里 2. Postgresql Mac M1 安装指南 3. 停止postgresql:brew services stop postgresql
4. 由于homebrew在/opt/homebrew/bin/postgres
中安装包,对于Apple Silicon用户,你的pg_hba.conf
应该在/opt/homebrew/var/postgres/
5. 同样,你的postmaster.pid
应该可以通过cat /opt/homebrew/var/postgres/postmaster.pid
检索。有时你可能需要删除它,如果你无法启动你的服务器,那么运行以下命令:
waiting for server to start....2022-05-17 12:49:42.735 PDT [4936] FATAL: lock file "postmaster.pid" already exists
2022-05-17 12:49:42.735 PDT [4936] HINT: Is another postmaster (PID 4885) running in data directory "/opt/homebrew/var/postgres"?
stopped waiting
pg_ctl: could not start server
然后运行brew services restart postgresql
6. 为启动测试网创建别名(将此放入~/.zshrc
)
alias testnet="cd ~/Desktop/aptos-core; CARGO_NET_GIT_FETCH_WITH_CLI=true cargo run -p aptos-node -- --test"
然后运行source ~/.zshrc
,然后在终端中运行testnet
以启动测试网
依赖项
~94MB
~2M SLoC