| 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:///postgres" --node-url "https://fullnode.devnet.aptoslabs.com" --emit-every 25 --batch-size 100
尝试使用 --help 运行索引器以获取更多详细信息
要求
本地开发
安装指南(适用于苹果硅芯片)
brew install libpq(这是一个PostgreSQL C API库)。另外,在安装后执行所有导出命令brewinstall postgrespg_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:///postgres" --node-url "http://0.0.0.0:8080" --emit-every 25 --batch-size 100
# or
cargo run -- --pg-uri "postgresql:///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