2 个稳定版本
1.10.31 | 2022 年 7 月 30 日 |
---|---|
1.10.5 | 2022 年 4 月 9 日 |
#9 in #bigtable
89KB
2K SLoC
solana-geyser-plugin-bigtable
solana-geyser-plugin-bigtable
包实现了使用 Geyser 插件框架 将账户、区块、交易数据存储到 Bigtable 数据库的插件。
配置文件格式
插件使用输入配置文件进行配置。一个示例配置文件如下所示
{
"libpath": "/solana/target/release/libsolana_geyser_plugin_bigtable.so",
"credential_path": "/home/solana/geyser-big-table-creds.json",
"instance": "geyser-bigtable",
"threads": 80,
"batch_size": 20,
"panic_on_db_errors": true,
"accounts_selector" : {
"accounts" : ["*"]
},
}
credential_path
指定 Bigtable 凭证 JSON 文件的路径。请参阅 https://cloud.google.com/docs/authentication/getting-started 了解创建服务账户密钥。它必须符合 https://github.com/durch/rust-goauth 规定的格式。例如
{
"type": "service_account",
"project_id": "dummy",
"private_key_id": "dummy",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDNk6cKkWP/4NMu\nWb3s24YHfM639IXzPtTev06PUVVQnyHmT1bZgQ/XB6BvIRaReqAqnQd61PAGtX3e\n8XocTw+u/ZfiPJOf+jrXMkRBpiBh9mbyEIqBy8BC20OmsUc+O/YYh/qRccvRfPI7\n3XMabQ8eFWhI6z/t35oRpvEVFJnSIgyV4JR/L/cjtoKnxaFwjBzEnxPiwtdy4olU\nKO/1maklXexvlO7onC7CNmPAjuEZKzdMLzFszikCDnoKJC8k6+2GZh0/JDMAcAF4\nwxlKNQ89MpHVRXZ566uKZg0MqZqkq5RXPn6u7yvNHwZ0oahHT+8ixPPrAEjuPEKM\nUPzVRz71AgMBAAECggEAfdbVWLW5Befkvam3hea2+5xdmeN3n3elrJhkiXxbAhf3\nE1kbq9bCEHmdrokNnI34vz0SWBFCwIiWfUNJ4UxQKGkZcSZto270V8hwWdNMXUsM\npz6S2nMTxJkdp0s7dhAUS93o9uE2x4x5Z0XecJ2ztFGcXY6Lupu2XvnW93V9109h\nkY3uICLdbovJq7wS/fO/AL97QStfEVRWW2agIXGvoQG5jOwfPh86GZZRYP9b8VNw\ntkAUJe4qpzNbWs9AItXOzL+50/wsFkD/iWMGWFuU8DY5ZwsL434N+uzFlaD13wtZ\n63D+tNAxCSRBfZGQbd7WxJVFfZe/2vgjykKWsdyNAQKBgQDnEBgSI836HGSRk0Ub\nDwiEtdfh2TosV+z6xtyU7j/NwjugTOJEGj1VO/TMlZCEfpkYPLZt3ek2LdNL66n8\nDyxwzTT5Q3D/D0n5yE3mmxy13Qyya6qBYvqqyeWNwyotGM7hNNOix1v9lEMtH5Rd\nUT0gkThvJhtrV663bcAWCALmtQKBgQDjw2rYlMUp2TUIa2/E7904WOnSEG85d+nc\norhzthX8EWmPgw1Bbfo6NzH4HhebTw03j3NjZdW2a8TG/uEmZFWhK4eDvkx+rxAa\n6EwamS6cmQ4+vdep2Ac4QCSaTZj02YjHb06Be3gptvpFaFrotH2jnpXxggdiv8ul\n6x+ooCffQQKBgQCR3ykzGoOI6K/c75prELyR+7MEk/0TzZaAY1cSdq61GXBHLQKT\nd/VMgAN1vN51pu7DzGBnT/dRCvEgNvEjffjSZdqRmrAVdfN/y6LSeQ5RCfJgGXSV\nJoWVmMxhCNrxiX3h01Xgp/c9SYJ3VD54AzeR/dwg32/j/oEAsDraLciXGQKBgQDF\nMNc8k/DvfmJv27R06Ma6liA6AoiJVMxgfXD8nVUDW3/tBCVh1HmkFU1p54PArvxe\nchAQqoYQ3dUMBHeh6ZRJaYp2ATfxJlfnM99P1/eHFOxEXdBt996oUMBf53bZ5cyJ\n/lAVwnQSiZy8otCyUDHGivJ+mXkTgcIq8BoEwERFAQKBgQDmImBaFqoMSVihqHIf\nDa4WZqwM7ODqOx0JnBKrKO8UOc51J5e1vpwP/qRpNhUipoILvIWJzu4efZY7GN5C\nImF9sN3PP6Sy044fkVPyw4SYEisxbvp9tfw8Xmpj/pbmugkB2ut6lz5frmEBoJSN\n3osZlZTgx+pM3sO6ITV6U4ID2Q==\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "dummy",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/457015483506-compute%40developer.gserviceaccount.com"
}
instance
指定 Bigtable 实例名称。
为了提高对数据库的吞吐量,插件支持使用多个线程进行连接池,每个线程都保持与 PostgreSQL 数据库的连接。线程的数量由 threads
字段控制。较高的线程数通常提供更好的性能。
为了进一步提高启动时保存大量账户的性能,插件使用批量插入。批处理大小由 batch_size
参数控制。这可以减少数据库往返次数。
可以使用 panic_on_db_errors
在数据库错误发生时使验证器崩溃,以确保数据一致性。
账户选择
可以使用 accounts_selector
来过滤应持久化的账户。
例如,可以如下所示仅持久化具有特定 Base58 编码公钥的账户
"accounts_selector" : {
"accounts" : ["pubkey-1", "pubkey-2", ..., "pubkey-n"],
}
或使用以下方式选择具有特定程序所有者的账户
"accounts_selector" : {
"owners" : ["pubkey-owner-1", "pubkey-owner-2", ..., "pubkey-owner-m"],
}
要选择所有账户,请使用通配符字符 (*)
"accounts_selector" : {
"accounts" : ["*"],
}
BigTable 设置
开发环境
在开发/测试期间可以使用 Cloud BigTable 模拟器。有关一般设置信息,请参阅 https://cloud.google.com/bigtable/docs/emulator。
过程
- 请确保安装 GCP CLI,请参阅 https://cloud.google.com/sdk/docs/install-sdk。
- 安装 Bigtable CLI CBT https://cloud.google.com/bigtable/docs/cbt-overview。
- 在后台运行
gcloud beta emulators bigtable start
- 运行
$(gcloud beta emulators bigtable env-init)
建立环境变量BIGTABLE_EMULATOR_HOST
- 运行
./scripts/init-bigtable.sh
来配置模拟器 - 开发/测试
生产环境
导出一个标准的 GOOGLE_APPLICATION_CREDENTIALS
环境变量到您的服务账户凭据。项目应该包含一个在配置文件中配置的 BigTable 实例,必须通过运行 ./init-bigtable.sh
脚本来初始化。
根据所需的操作模式,将使用提供的凭据请求 OAuth 范围 https://www.googleapis.com/auth/bigtable.data
或 https://www.googleapis.com/auth/bigtable.data.readonly
。
对象模型
支持账户和槽位元数据,计划支持事务数据、块元数据和账户二级索引。
存储-proto 包含对象的 gRPC 模型。例如,对于账户
message account {
bytes pubkey = 1;
bytes owner = 2;
uint64 lamports = 3;
uint64 slot = 4;
bool executable = 5;
uint64 rent_epoch = 6;
bytes data = 7;
uint64 write_version = 8;
UnixTimestamp updated_on = 9;
}
以下是在 Postgres 数据库中的表
表 | 描述 |
---|---|
account | 账户数据 |
slot | 槽位元数据 |
模型数据被编码成二进制格式,然后使用 compress_best
src/compression.rs 进行压缩。
依赖关系
~53–71MB
~1.5M SLoC