#account #bigtable #plugin #thread #service-account #solana #instance

solana-geyser-plugin-bigtable

用于 Bigtable 数据库的 Solana AccountsDb 插件

2 个稳定版本

1.10.31 2022 年 7 月 30 日
1.10.5 2022 年 4 月 9 日

#9 in #bigtable

Apache-2.0

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

过程

  1. 请确保安装 GCP CLI,请参阅 https://cloud.google.com/sdk/docs/install-sdk
  2. 安装 Bigtable CLI CBT https://cloud.google.com/bigtable/docs/cbt-overview
  3. 在后台运行 gcloud beta emulators bigtable start
  4. 运行 $(gcloud beta emulators bigtable env-init) 建立环境变量 BIGTABLE_EMULATOR_HOST
  5. 运行 ./scripts/init-bigtable.sh 来配置模拟器
  6. 开发/测试

生产环境

导出一个标准的 GOOGLE_APPLICATION_CREDENTIALS 环境变量到您的服务账户凭据。项目应该包含一个在配置文件中配置的 BigTable 实例,必须通过运行 ./init-bigtable.sh 脚本来初始化。

根据所需的操作模式,将使用提供的凭据请求 OAuth 范围 https://www.googleapis.com/auth/bigtable.datahttps://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