Skip to content

Commit

Permalink
fix: use different database file names for signet and testnet4 to avo…
Browse files Browse the repository at this point in the history
…id wrong height (#3224)

* use different database file names for signet and testnet4

* stop fallback to old btc config if it is Signet or Testnet4

* sync with the fix made to develop

* use chain name as bitcoin database suffix for regnet, signet and testnet4
  • Loading branch information
ws4charlie authored Dec 2, 2024
1 parent a87243a commit e2c34d3
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 6 deletions.
10 changes: 9 additions & 1 deletion zetaclient/config/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"sync"

"github.com/showa-93/go-mask"

"github.com/zeta-chain/node/pkg/chains"
)

// KeyringBackend is the type of keyring backend to use for the hotkey
Expand Down Expand Up @@ -139,7 +141,13 @@ func (c Config) GetBTCConfig(chainID int64) (BTCConfig, bool) {
// this will allow new 'zetaclientd' binary to work with old config file
btcCfg, found := c.BTCChainConfigs[chainID]
if !found || btcCfg.Empty() {
btcCfg = c.BitcoinConfig
// fallback to old 'BitcoinConfig' ONLY for mainnet and testnet.
// we don't want observers who hasn't setup their Signet/Testnet4 endpoints to use old config
// because old config is either testnet3 or mainnet which is the incorrect endpoint to use.
if chainID == chains.BitcoinMainnet.ChainId ||
chainID == chains.BitcoinTestnet.ChainId {
btcCfg = c.BitcoinConfig
}
}

return btcCfg, !btcCfg.Empty()
Expand Down
18 changes: 18 additions & 0 deletions zetaclient/config/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,24 @@ func Test_GetBTCConfig(t *testing.T) {
},
want: false,
},
{
name: "should not fallback to old config if Signet config is not set in the new config",
chainID: chains.BitcoinSignetTestnet.ChainId,
oldCfg: config.BTCConfig{
RPCHost: "localhost",
},
btcCfg: nil, // new config is not set
want: false,
},
{
name: "should not fallback to old config if Testnet4 config is not set in the new config",
chainID: chains.BitcoinTestnet4.ChainId,
oldCfg: config.BTCConfig{
RPCHost: "localhost",
},
btcCfg: nil, // new config is not set
want: false,
},
}

for _, tt := range tests {
Expand Down
40 changes: 40 additions & 0 deletions zetaclient/orchestrator/bootstap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,46 @@ func TestCreateChainObserverMap(t *testing.T) {
})
}

func TestBtcDatabaseFileName(t *testing.T) {
tests := []struct {
name string
chain chains.Chain
expected string
}{
{
name: "should use legacy file name for bitcoin mainnet",
chain: chains.BitcoinMainnet,
expected: "btc_chain_client",
},
{
name: "should use legacy file name for bitcoin testnet3",
chain: chains.BitcoinTestnet,
expected: "btc_chain_client",
},
{
name: "should use new file name for bitcoin regtest",
chain: chains.BitcoinRegtest,
expected: "btc_chain_client_btc_regtest",
},
{
name: "should use new file name for bitcoin signet",
chain: chains.BitcoinSignetTestnet,
expected: "btc_chain_client_btc_signet_testnet",
},
{
name: "should use new file name for bitcoin testnet4",
chain: chains.BitcoinTestnet4,
expected: "btc_chain_client_btc_testnet4",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert.Equal(t, tt.expected, btcDatabaseFileName(tt.chain))
})
}
}

func chainParams(supportedChains []chains.Chain) ([]chains.Chain, map[int64]*observertypes.ChainParams) {
params := make(map[int64]*observertypes.ChainParams)

Expand Down
22 changes: 17 additions & 5 deletions zetaclient/orchestrator/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package orchestrator

import (
"context"
"fmt"

ethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
Expand All @@ -11,6 +12,7 @@ import (
"github.com/pkg/errors"
"github.com/tonkeeper/tongo/ton"

"github.com/zeta-chain/node/pkg/chains"
toncontracts "github.com/zeta-chain/node/pkg/contracts/ton"
"github.com/zeta-chain/node/zetaclient/chains/base"
btcobserver "github.com/zeta-chain/node/zetaclient/chains/bitcoin/observer"
Expand All @@ -32,10 +34,6 @@ import (
"github.com/zeta-chain/node/zetaclient/metrics"
)

// btcDatabaseFilename is the Bitcoin database file name now used in mainnet,
// so we keep using it here for backward compatibility
const btcDatabaseFilename = "btc_chain_client"

// CreateSignerMap creates a map of interfaces.ChainSigner (by chainID) for all chains in the config.
// Note that signer construction failure for a chain does not prevent the creation of signers for other chains.
func CreateSignerMap(
Expand Down Expand Up @@ -363,7 +361,7 @@ func syncObserverMap(
continue
}

database, err := db.NewFromSqlite(dbpath, btcDatabaseFilename, true)
database, err := db.NewFromSqlite(dbpath, btcDatabaseFileName(*rawChain), true)
if err != nil {
logger.Std.Error().Err(err).Msgf("unable to open database for BTC chain %d", chainID)
continue
Expand Down Expand Up @@ -481,6 +479,20 @@ func syncObserverMap(
return added, removed, nil
}

func btcDatabaseFileName(chain chains.Chain) string {
// legacyBTCDatabaseFilename is the Bitcoin database file name now used in mainnet and testnet3
// so we keep using it here for backward compatibility
const legacyBTCDatabaseFilename = "btc_chain_client"

// For additional bitcoin networks, we use the chain name as the database file name
switch chain.ChainId {
case chains.BitcoinMainnet.ChainId, chains.BitcoinTestnet.ChainId:
return legacyBTCDatabaseFilename
default:
return fmt.Sprintf("%s_%s", legacyBTCDatabaseFilename, chain.Name)
}
}

func makeTONClient(
ctx context.Context,
cfg config.TONConfig,
Expand Down

0 comments on commit e2c34d3

Please sign in to comment.