From cb2fc6621e3e5f1fc3d391c14b159d75bdb0200a Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Mon, 3 Nov 2025 09:45:13 +0200 Subject: [PATCH] sqldb: add new gossip v2 columns to graph tables Add a new migration that updates the graph tables (nodes, channels and policies) in preparation for the new columns required for V2 announcements. This migration has to be added to the set of "live" migrations instead of "dev only" since it edits the columns of existing tables and so changes the existing sql models. We are going to prep the SQLStore code to handle the V2 types in the coming commits, so we need this migration to be in place. In this commit we also remove the TestSchemaMigrationIdempotency test since this test fails with the new "ALTER TABLE" migrations which dont have "IF NOT EXISTS" options like tables and indexes do. Migrations should be idempotent anyways due to the migration tracker file and/or the sqlc migration tracker. --- sqldb/migrations.go | 5 + sqldb/migrations_test.go | 126 ------------------ sqldb/sqlc/graph.sql.go | 107 +++++++++++---- .../sqlc/migrations/000009_graph_v2.down.sql | 17 +++ sqldb/sqlc/migrations/000009_graph_v2.up.sql | 23 ++++ sqldb/sqlc/models.go | 20 ++- 6 files changed, 140 insertions(+), 158 deletions(-) create mode 100644 sqldb/sqlc/migrations/000009_graph_v2.down.sql create mode 100644 sqldb/sqlc/migrations/000009_graph_v2.up.sql diff --git a/sqldb/migrations.go b/sqldb/migrations.go index 38535d8b9..28d45f37f 100644 --- a/sqldb/migrations.go +++ b/sqldb/migrations.go @@ -92,6 +92,11 @@ var ( // schema. This is optional and can be disabled by the // user if necessary. }, + { + Name: "000009_graph_v2_columns", + Version: 11, + SchemaVersion: 9, + }, }, migrationAdditions...) // ErrMigrationMismatch is returned when a migrated record does not diff --git a/sqldb/migrations_test.go b/sqldb/migrations_test.go index 063f810b0..536ba8971 100644 --- a/sqldb/migrations_test.go +++ b/sqldb/migrations_test.go @@ -452,132 +452,6 @@ func TestCustomMigration(t *testing.T) { } } -// TestSchemaMigrationIdempotency tests that the our schema migrations are -// idempotent. This means that we can apply the migrations multiple times and -// the schema version will always be the same. -func TestSchemaMigrationIdempotency(t *testing.T) { - dropMigrationTrackerEntries := func(t *testing.T, db *BaseDB) { - _, err := db.Exec("DELETE FROM migration_tracker;") - require.NoError(t, err) - } - - lastMigration := migrationConfig[len(migrationConfig)-1] - - t.Run("SQLite", func(t *testing.T) { - // First instantiate the database and run the migrations - // including the custom migrations. - t.Logf("Creating new SQLite DB for testing migrations") - - dbFileName := filepath.Join(t.TempDir(), "tmp.db") - var ( - db *SqliteStore - err error - ) - - // Run the migration 3 times to test that the migrations - // are idempotent. - for i := 0; i < 3; i++ { - db, err = NewSqliteStore(&SqliteConfig{ - SkipMigrations: false, - }, dbFileName) - require.NoError(t, err) - - dbToCleanup := db.DB - t.Cleanup(func() { - require.NoError( - t, dbToCleanup.Close(), - ) - }) - - ctxb := t.Context() - require.NoError( - t, db.ApplyAllMigrations(ctxb, GetMigrations()), - ) - - version, dirty, err := db.GetSchemaVersion() - require.NoError(t, err) - - // Now reset the schema version to 0 and make sure that - // we can apply the migrations again. - require.Equal(t, lastMigration.SchemaVersion, version) - require.False(t, dirty) - - require.NoError( - t, db.SetSchemaVersion( - database.NilVersion, false, - ), - ) - dropMigrationTrackerEntries(t, db.BaseDB) - - // Make sure that we reset the schema version. - version, dirty, err = db.GetSchemaVersion() - require.NoError(t, err) - require.Equal(t, -1, version) - require.False(t, dirty) - } - }) - - t.Run("Postgres", func(t *testing.T) { - // First create a temporary Postgres database to run - // the migrations on. - fixture := NewTestPgFixture( - t, DefaultPostgresFixtureLifetime, - ) - t.Cleanup(func() { - fixture.TearDown(t) - }) - - dbName := randomDBName(t) - - // Next instantiate the database and run the migrations - // including the custom migrations. - t.Logf("Creating new Postgres DB '%s' for testing "+ - "migrations", dbName) - - _, err := fixture.db.ExecContext( - t.Context(), "CREATE DATABASE "+dbName, - ) - require.NoError(t, err) - - cfg := fixture.GetConfig(dbName) - var db *PostgresStore - - // Run the migration 3 times to test that the migrations - // are idempotent. - for i := 0; i < 3; i++ { - cfg.SkipMigrations = false - db, err = NewPostgresStore(cfg) - require.NoError(t, err) - - ctxb := t.Context() - require.NoError( - t, db.ApplyAllMigrations(ctxb, GetMigrations()), - ) - - version, dirty, err := db.GetSchemaVersion() - require.NoError(t, err) - - // Now reset the schema version to 0 and make sure that - // we can apply the migrations again. - require.Equal(t, lastMigration.SchemaVersion, version) - require.False(t, dirty) - - require.NoError( - t, db.SetSchemaVersion( - database.NilVersion, false, - ), - ) - dropMigrationTrackerEntries(t, db.BaseDB) - - // Make sure that we reset the schema version. - version, dirty, err = db.GetSchemaVersion() - require.NoError(t, err) - require.Equal(t, -1, version) - require.False(t, dirty) - } - }) -} - // TestMigrationBug19RC1 tests a bug that was present in the migration code // at the v0.19.0-rc1 release. // The bug was fixed in: https://github.com/lightningnetwork/lnd/pull/9647 diff --git a/sqldb/sqlc/graph.sql.go b/sqldb/sqlc/graph.sql.go index 0ce7780d5..8b10e4967 100644 --- a/sqldb/sqlc/graph.sql.go +++ b/sqldb/sqlc/graph.sql.go @@ -290,7 +290,7 @@ func (q *Queries) DeleteZombieChannel(ctx context.Context, arg DeleteZombieChann const getChannelAndNodesBySCID = `-- name: GetChannelAndNodesBySCID :one SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pub_key, n2.pub_key AS node2_pub_key FROM graph_channels c @@ -319,6 +319,9 @@ type GetChannelAndNodesBySCIDRow struct { Node2Signature []byte Bitcoin1Signature []byte Bitcoin2Signature []byte + Signature []byte + FundingPkScript []byte + MerkleRootHash []byte Node1PubKey []byte Node2PubKey []byte } @@ -340,6 +343,9 @@ func (q *Queries) GetChannelAndNodesBySCID(ctx context.Context, arg GetChannelAn &i.Node2Signature, &i.Bitcoin1Signature, &i.Bitcoin2Signature, + &i.Signature, + &i.FundingPkScript, + &i.MerkleRootHash, &i.Node1PubKey, &i.Node2PubKey, ) @@ -348,7 +354,7 @@ func (q *Queries) GetChannelAndNodesBySCID(ctx context.Context, arg GetChannelAn const getChannelByOutpointWithPolicies = `-- name: GetChannelByOutpointWithPolicies :one SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pubkey, n2.pub_key AS node2_pubkey, @@ -454,6 +460,9 @@ func (q *Queries) GetChannelByOutpointWithPolicies(ctx context.Context, arg GetC &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1Pubkey, &i.Node2Pubkey, &i.Policy1ID, @@ -491,7 +500,7 @@ func (q *Queries) GetChannelByOutpointWithPolicies(ctx context.Context, arg GetC } const getChannelBySCID = `-- name: GetChannelBySCID :one -SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature FROM graph_channels +SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature, signature, funding_pk_script, merkle_root_hash FROM graph_channels WHERE scid = $1 AND version = $2 ` @@ -517,15 +526,18 @@ func (q *Queries) GetChannelBySCID(ctx context.Context, arg GetChannelBySCIDPara &i.Node2Signature, &i.Bitcoin1Signature, &i.Bitcoin2Signature, + &i.Signature, + &i.FundingPkScript, + &i.MerkleRootHash, ) return i, err } const getChannelBySCIDWithPolicies = `-- name: GetChannelBySCIDWithPolicies :one SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, - n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, - n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, + n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, n1.block_height, + n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, n2.block_height, -- Policy 1 cp1.id AS policy1_id, @@ -630,6 +642,9 @@ func (q *Queries) GetChannelBySCIDWithPolicies(ctx context.Context, arg GetChann &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.GraphNode.ID, &i.GraphNode.Version, &i.GraphNode.PubKey, @@ -637,6 +652,7 @@ func (q *Queries) GetChannelBySCIDWithPolicies(ctx context.Context, arg GetChann &i.GraphNode.LastUpdate, &i.GraphNode.Color, &i.GraphNode.Signature, + &i.GraphNode.BlockHeight, &i.GraphNode_2.ID, &i.GraphNode_2.Version, &i.GraphNode_2.PubKey, @@ -644,6 +660,7 @@ func (q *Queries) GetChannelBySCIDWithPolicies(ctx context.Context, arg GetChann &i.GraphNode_2.LastUpdate, &i.GraphNode_2.Color, &i.GraphNode_2.Signature, + &i.GraphNode_2.BlockHeight, &i.Policy1ID, &i.Policy1NodeID, &i.Policy1Version, @@ -764,7 +781,7 @@ func (q *Queries) GetChannelFeaturesBatch(ctx context.Context, chanIds []int64) } const getChannelPolicyByChannelAndNode = `-- name: GetChannelPolicyByChannelAndNode :one -SELECT id, version, channel_id, node_id, timelock, fee_ppm, base_fee_msat, min_htlc_msat, max_htlc_msat, last_update, disabled, inbound_base_fee_msat, inbound_fee_rate_milli_msat, message_flags, channel_flags, signature +SELECT id, version, channel_id, node_id, timelock, fee_ppm, base_fee_msat, min_htlc_msat, max_htlc_msat, last_update, disabled, inbound_base_fee_msat, inbound_fee_rate_milli_msat, message_flags, channel_flags, signature, block_height, disable_flags FROM graph_channel_policies WHERE channel_id = $1 AND node_id = $2 @@ -797,6 +814,8 @@ func (q *Queries) GetChannelPolicyByChannelAndNode(ctx context.Context, arg GetC &i.MessageFlags, &i.ChannelFlags, &i.Signature, + &i.BlockHeight, + &i.DisableFlags, ) return i, err } @@ -852,7 +871,7 @@ func (q *Queries) GetChannelPolicyExtraTypesBatch(ctx context.Context, policyIds const getChannelsByIDs = `-- name: GetChannelsByIDs :many SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, -- Minimal node data. n1.id AS node1_id, @@ -975,6 +994,9 @@ func (q *Queries) GetChannelsByIDs(ctx context.Context, ids []int64) ([]GetChann &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1ID, &i.Node1PubKey, &i.Node2ID, @@ -1025,7 +1047,7 @@ func (q *Queries) GetChannelsByIDs(ctx context.Context, ids []int64) ([]GetChann const getChannelsByOutpoints = `-- name: GetChannelsByOutpoints :many SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pubkey, n2.pub_key AS node2_pubkey FROM graph_channels c @@ -1074,6 +1096,9 @@ func (q *Queries) GetChannelsByOutpoints(ctx context.Context, outpoints []string &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1Pubkey, &i.Node2Pubkey, ); err != nil { @@ -1092,9 +1117,9 @@ func (q *Queries) GetChannelsByOutpoints(ctx context.Context, outpoints []string const getChannelsByPolicyLastUpdateRange = `-- name: GetChannelsByPolicyLastUpdateRange :many SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, - n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, - n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, + n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, n1.block_height, + n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, n2.block_height, -- Policy 1 (node_id_1) cp1.id AS policy1_id, @@ -1244,6 +1269,9 @@ func (q *Queries) GetChannelsByPolicyLastUpdateRange(ctx context.Context, arg Ge &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.GraphNode.ID, &i.GraphNode.Version, &i.GraphNode.PubKey, @@ -1251,6 +1279,7 @@ func (q *Queries) GetChannelsByPolicyLastUpdateRange(ctx context.Context, arg Ge &i.GraphNode.LastUpdate, &i.GraphNode.Color, &i.GraphNode.Signature, + &i.GraphNode.BlockHeight, &i.GraphNode_2.ID, &i.GraphNode_2.Version, &i.GraphNode_2.PubKey, @@ -1258,6 +1287,7 @@ func (q *Queries) GetChannelsByPolicyLastUpdateRange(ctx context.Context, arg Ge &i.GraphNode_2.LastUpdate, &i.GraphNode_2.Color, &i.GraphNode_2.Signature, + &i.GraphNode_2.BlockHeight, &i.Policy1ID, &i.Policy1NodeID, &i.Policy1Version, @@ -1303,7 +1333,7 @@ func (q *Queries) GetChannelsByPolicyLastUpdateRange(ctx context.Context, arg Ge } const getChannelsBySCIDRange = `-- name: GetChannelsBySCIDRange :many -SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, +SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pub_key, n2.pub_key AS node2_pub_key FROM graph_channels c @@ -1347,6 +1377,9 @@ func (q *Queries) GetChannelsBySCIDRange(ctx context.Context, arg GetChannelsByS &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1PubKey, &i.Node2PubKey, ); err != nil { @@ -1365,9 +1398,9 @@ func (q *Queries) GetChannelsBySCIDRange(ctx context.Context, arg GetChannelsByS const getChannelsBySCIDWithPolicies = `-- name: GetChannelsBySCIDWithPolicies :many SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, - n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, - n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, + n1.id, n1.version, n1.pub_key, n1.alias, n1.last_update, n1.color, n1.signature, n1.block_height, + n2.id, n2.version, n2.pub_key, n2.alias, n2.last_update, n2.color, n2.signature, n2.block_height, -- Policy 1 cp1.id AS policy1_id, @@ -1490,6 +1523,9 @@ func (q *Queries) GetChannelsBySCIDWithPolicies(ctx context.Context, arg GetChan &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.GraphNode.ID, &i.GraphNode.Version, &i.GraphNode.PubKey, @@ -1497,6 +1533,7 @@ func (q *Queries) GetChannelsBySCIDWithPolicies(ctx context.Context, arg GetChan &i.GraphNode.LastUpdate, &i.GraphNode.Color, &i.GraphNode.Signature, + &i.GraphNode.BlockHeight, &i.GraphNode_2.ID, &i.GraphNode_2.Version, &i.GraphNode_2.PubKey, @@ -1504,6 +1541,7 @@ func (q *Queries) GetChannelsBySCIDWithPolicies(ctx context.Context, arg GetChan &i.GraphNode_2.LastUpdate, &i.GraphNode_2.Color, &i.GraphNode_2.Signature, + &i.GraphNode_2.BlockHeight, &i.Policy1ID, &i.Policy1NodeID, &i.Policy1Version, @@ -1549,7 +1587,7 @@ func (q *Queries) GetChannelsBySCIDWithPolicies(ctx context.Context, arg GetChan } const getChannelsBySCIDs = `-- name: GetChannelsBySCIDs :many -SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature FROM graph_channels +SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature, signature, funding_pk_script, merkle_root_hash FROM graph_channels WHERE version = $1 AND scid IN (/*SLICE:scids*/?) ` @@ -1593,6 +1631,9 @@ func (q *Queries) GetChannelsBySCIDs(ctx context.Context, arg GetChannelsBySCIDs &i.Node2Signature, &i.Bitcoin1Signature, &i.Bitcoin2Signature, + &i.Signature, + &i.FundingPkScript, + &i.MerkleRootHash, ); err != nil { return nil, err } @@ -1756,7 +1797,7 @@ func (q *Queries) GetNodeAddressesBatch(ctx context.Context, ids []int64) ([]Gra } const getNodeByPubKey = `-- name: GetNodeByPubKey :one -SELECT id, version, pub_key, alias, last_update, color, signature +SELECT id, version, pub_key, alias, last_update, color, signature, block_height FROM graph_nodes WHERE pub_key = $1 AND version = $2 @@ -1778,6 +1819,7 @@ func (q *Queries) GetNodeByPubKey(ctx context.Context, arg GetNodeByPubKeyParams &i.LastUpdate, &i.Color, &i.Signature, + &i.BlockHeight, ) return i, err } @@ -1947,7 +1989,7 @@ func (q *Queries) GetNodeIDByPubKey(ctx context.Context, arg GetNodeIDByPubKeyPa } const getNodesByIDs = `-- name: GetNodesByIDs :many -SELECT id, version, pub_key, alias, last_update, color, signature +SELECT id, version, pub_key, alias, last_update, color, signature, block_height FROM graph_nodes WHERE id IN (/*SLICE:ids*/?) ` @@ -1979,6 +2021,7 @@ func (q *Queries) GetNodesByIDs(ctx context.Context, ids []int64) ([]GraphNode, &i.LastUpdate, &i.Color, &i.Signature, + &i.BlockHeight, ); err != nil { return nil, err } @@ -1994,7 +2037,7 @@ func (q *Queries) GetNodesByIDs(ctx context.Context, ids []int64) ([]GraphNode, } const getNodesByLastUpdateRange = `-- name: GetNodesByLastUpdateRange :many -SELECT id, version, pub_key, alias, last_update, color, signature +SELECT id, version, pub_key, alias, last_update, color, signature, block_height FROM graph_nodes WHERE last_update >= $1 AND last_update <= $2 @@ -2061,6 +2104,7 @@ func (q *Queries) GetNodesByLastUpdateRange(ctx context.Context, arg GetNodesByL &i.LastUpdate, &i.Color, &i.Signature, + &i.BlockHeight, ); err != nil { return nil, err } @@ -2143,7 +2187,7 @@ func (q *Queries) GetPruneTip(ctx context.Context) (GraphPruneLog, error) { } const getPublicV1ChannelsBySCID = `-- name: GetPublicV1ChannelsBySCID :many -SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature +SELECT id, version, scid, node_id_1, node_id_2, outpoint, capacity, bitcoin_key_1, bitcoin_key_2, node_1_signature, node_2_signature, bitcoin_1_signature, bitcoin_2_signature, signature, funding_pk_script, merkle_root_hash FROM graph_channels WHERE node_1_signature IS NOT NULL AND scid >= $1 @@ -2178,6 +2222,9 @@ func (q *Queries) GetPublicV1ChannelsBySCID(ctx context.Context, arg GetPublicV1 &i.Node2Signature, &i.Bitcoin1Signature, &i.Bitcoin2Signature, + &i.Signature, + &i.FundingPkScript, + &i.MerkleRootHash, ); err != nil { return nil, err } @@ -2704,7 +2751,7 @@ func (q *Queries) IsZombieChannel(ctx context.Context, arg IsZombieChannelParams } const listChannelsByNodeID = `-- name: ListChannelsByNodeID :many -SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, +SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pubkey, n2.pub_key AS node2_pubkey, @@ -2820,6 +2867,9 @@ func (q *Queries) ListChannelsByNodeID(ctx context.Context, arg ListChannelsByNo &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1Pubkey, &i.Node2Pubkey, &i.Policy1ID, @@ -2867,7 +2917,7 @@ func (q *Queries) ListChannelsByNodeID(ctx context.Context, arg ListChannelsByNo } const listChannelsForNodeIDs = `-- name: ListChannelsForNodeIDs :many -SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, +SELECT c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, n1.pub_key AS node1_pubkey, n2.pub_key AS node2_pubkey, @@ -3004,6 +3054,9 @@ func (q *Queries) ListChannelsForNodeIDs(ctx context.Context, arg ListChannelsFo &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1Pubkey, &i.Node2Pubkey, &i.Policy1ID, @@ -3230,7 +3283,7 @@ func (q *Queries) ListChannelsWithPoliciesForCachePaginated(ctx context.Context, const listChannelsWithPoliciesPaginated = `-- name: ListChannelsWithPoliciesPaginated :many SELECT - c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, + c.id, c.version, c.scid, c.node_id_1, c.node_id_2, c.outpoint, c.capacity, c.bitcoin_key_1, c.bitcoin_key_2, c.node_1_signature, c.node_2_signature, c.bitcoin_1_signature, c.bitcoin_2_signature, c.signature, c.funding_pk_script, c.merkle_root_hash, -- Join node pubkeys n1.pub_key AS node1_pubkey, @@ -3347,6 +3400,9 @@ func (q *Queries) ListChannelsWithPoliciesPaginated(ctx context.Context, arg Lis &i.GraphChannel.Node2Signature, &i.GraphChannel.Bitcoin1Signature, &i.GraphChannel.Bitcoin2Signature, + &i.GraphChannel.Signature, + &i.GraphChannel.FundingPkScript, + &i.GraphChannel.MerkleRootHash, &i.Node1Pubkey, &i.Node2Pubkey, &i.Policy1ID, @@ -3436,7 +3492,7 @@ func (q *Queries) ListNodeIDsAndPubKeys(ctx context.Context, arg ListNodeIDsAndP } const listNodesPaginated = `-- name: ListNodesPaginated :many -SELECT id, version, pub_key, alias, last_update, color, signature +SELECT id, version, pub_key, alias, last_update, color, signature, block_height FROM graph_nodes WHERE version = $1 AND id > $2 ORDER BY id @@ -3466,6 +3522,7 @@ func (q *Queries) ListNodesPaginated(ctx context.Context, arg ListNodesPaginated &i.LastUpdate, &i.Color, &i.Signature, + &i.BlockHeight, ); err != nil { return nil, err } diff --git a/sqldb/sqlc/migrations/000009_graph_v2.down.sql b/sqldb/sqlc/migrations/000009_graph_v2.down.sql new file mode 100644 index 000000000..b566e4016 --- /dev/null +++ b/sqldb/sqlc/migrations/000009_graph_v2.down.sql @@ -0,0 +1,17 @@ +-- Remove the block_height column from graph_nodes +ALTER TABLE graph_nodes DROP COLUMN block_height; + +-- Remove the signature column from graph_channels +ALTER TABLE graph_channels DROP COLUMN signature; + +-- Remove the funding_pk_script column from graph_channels +ALTER TABLE graph_channels DROP COLUMN funding_pk_script; + +-- Remove the merkle_root_hash column from graph_channels +ALTER TABLE graph_channels DROP COLUMN merkle_root_hash; + +-- Remove the block_height column from graph_channel_policies +ALTER TABLE graph_channel_policies DROP COLUMN block_height; + +-- Remove the disable_flags column from graph_channel_policies +ALTER TABLE graph_channel_policies DROP COLUMN disable_flags; \ No newline at end of file diff --git a/sqldb/sqlc/migrations/000009_graph_v2.up.sql b/sqldb/sqlc/migrations/000009_graph_v2.up.sql new file mode 100644 index 000000000..19a3e99f9 --- /dev/null +++ b/sqldb/sqlc/migrations/000009_graph_v2.up.sql @@ -0,0 +1,23 @@ +-- The block height timestamp of this node's latest received node announcement. +-- It may be zero if we have not received a node announcement yet. +ALTER TABLE graph_nodes ADD COLUMN block_height BIGINT; + +-- The signature of the channel announcement. If this is null, then the channel +-- belongs to the source node and the channel has not been announced yet. +ALTER TABLE graph_channels ADD COLUMN signature BLOB; + +-- For v2 channels onwards, we cant necessarily derive the funding pk script +-- from the other fields in the announcement, so we store it here so that +-- we have easy access to it when we want to subscribe to channel closures. +ALTER TABLE graph_channels ADD COLUMN funding_pk_script BLOB; + +-- The optional merkel root hash advertised in the V2 channel announcement. +ALTER TABLE graph_channels ADD COLUMN merkle_root_hash BLOB; + +-- The block height timestamp of this channel's latest received channel-update +-- message (for v2 channel update messages). +ALTER TABLE graph_channel_policies ADD COLUMN block_height BIGINT; + +-- A bitfield describing the disabled flags for a v2 channel update. +ALTER TABLE graph_channel_policies ADD COLUMN disable_flags SMALLINT + CHECK (disable_flags >= 0 AND disable_flags <= 255); \ No newline at end of file diff --git a/sqldb/sqlc/models.go b/sqldb/sqlc/models.go index 24df0d680..359720096 100644 --- a/sqldb/sqlc/models.go +++ b/sqldb/sqlc/models.go @@ -42,6 +42,9 @@ type GraphChannel struct { Node2Signature []byte Bitcoin1Signature []byte Bitcoin2Signature []byte + Signature []byte + FundingPkScript []byte + MerkleRootHash []byte } type GraphChannelExtraType struct { @@ -72,6 +75,8 @@ type GraphChannelPolicy struct { MessageFlags sql.NullInt16 ChannelFlags sql.NullInt16 Signature []byte + BlockHeight sql.NullInt64 + DisableFlags sql.NullInt16 } type GraphChannelPolicyExtraType struct { @@ -85,13 +90,14 @@ type GraphClosedScid struct { } type GraphNode struct { - ID int64 - Version int16 - PubKey []byte - Alias sql.NullString - LastUpdate sql.NullInt64 - Color sql.NullString - Signature []byte + ID int64 + Version int16 + PubKey []byte + Alias sql.NullString + LastUpdate sql.NullInt64 + Color sql.NullString + Signature []byte + BlockHeight sql.NullInt64 } type GraphNodeAddress struct {