0.2.7 2022年8月16日
0.2.6 2022年8月14日
0.2.2 2022年7月22日
0.1.7 2022年7月10日
0.1.1 2022年6月6日

#44 in #aptos

Apache-2.0

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 运行索引器以获取更多详细信息

要求

本地开发

安装指南(适用于苹果硅芯片)

  1. brew install libpq (这是一个PostgreSQL C API库)。另外,在安装后执行所有导出命令
  2. brewinstall postgres
  3. pg_ctl -D /opt/homebrew/var/postgres startbrew services start postgresql
  4. /opt/homebrew/bin/createuser-s postgres
  5. 确保您能够执行: psql postgres
  6. cargoinstall diesel_cli --无默认功能 --功能PostgreSQL
  7. 运行diesel迁移--数据库-url postgresql://localhost/postgres
  8. 启动索引器
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

  1. 上面的完整安装指南
  2. brew安装 --caskpgadmin4
  3. 打开PgAdmin4
  4. 创建主密码
  5. 右键单击服务器 > 注册 > 服务器
  6. 在注册对话框中输入信息
General:
Name: Indexer

Connection:
Hostname / Address: 127.0.0.1
Port: 5432
Maintenance Database: postgres
Username: postgres
  1. 保存

注意:

  • 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是所有其他组件的中心胶水,它负责以下内容

  1. 维护处理器状态。`Tailer`会记录每个`TransactionProcessor`的输出结果,为每个事务版本(例如:事务)。如果`TransactionProcessor`对事务返回一个`Result::Err`,则`Tailer`将在数据库中将该版本标记为失败(包括字符串化的错误文本)并继续。
  2. 为每个`TransactionProcessor`重试失败的版本。默认情况下,当`Tailer`启动时,它将重新获取所有失败的`TransactionProcessor`的版本,并尝试重新处理它们。`TransactionProcessor::process_version`返回的`Result::Ok`/`Result::Err`将替换给定`TransactionProcessor`/版本组合在数据库中的状态。
  3. 将从Fetcher中获取的新交易分配到每个注册到它的TransactionProcessor。每个TransactionProcessor都会为其每个版本创建自己的副本,并在自己的tokio::Task中运行。这些操作以批量的方式进行,批量大小的设置可以通过--batch-size进行指定。对于其他可调整的参数,请尝试使用cargo run -- --help

Fetcher负责以两种方式从节点获取交易:

  1. 一次一个(当在重试之前出错的交易时使用)。
  2. 批量,使用内部缓冲区。虽然每次只从Fetcher获取一个交易,但内部Fetcher将从/transactions端点获取交易,每次可能返回数百个交易。这比进行数百个单独的HTTP调用要高效得多。在未来,当有流式节点API时,这将是最优的交易来源。

所有这些功能都是“开箱即用”的。TransactionProcessor是编写自己的索引器的人可以从中获得所有这些功能的地方。该特性只有一个需要实现的主要方法:process_transaction。你可以在TransactionProcessor中做任何事情 - 比如像DefaultProcessor那样将数据写入Postgres表,向其他服务发出RESTful HTTP调用,将交易提交到链上:任何你想做的事。只有一个注意事项:交易处理保证至少一次。可能存在一个特定的TransactionProcessor会接收到相同的交易多次:因此你的实现必须是幂等的。

要实现自己的TransactionProcessor,请查看此处提供的文档和源代码:./src/indexer/transaction_processor.rs

其他

  1. 如果你遇到
  = note: ld: library not found for -lpq
          clang: error: linker command failed with exit code 1 (use -v to see invocation)

首先确保你已经通过homebrew安装了postgreslibpq,有关更多详细信息,请参阅上面的安装指南。这是关于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