2024-07-05 22:20:13 -04:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
cmtcfg "github.com/cometbft/cometbft/config"
|
|
|
|
dbm "github.com/cosmos/cosmos-db"
|
Feature/update dockerfile (#6)
* chore: remove unused new.Dockerfile
* feat: add DID model definitions
* fix: Fix EncodePublicKey method in KeyInfo struct
* feat: Update `EncodePublicKey` to be the inverse of `DecodePublicKey`
* refactor: update AssetInfo protobuf definition
* fix: update default assets with correct asset types
* fix: Initialize IPFS client and check for mounted directories
* feat: Improve IPFS client initialization and mount checking
* feat: Add local filesystem check for IPFS and IPNS
* fix: Use Unixfs().Get() instead of Cat() for IPFS and IPNS content retrieval
* feat: Update GetCID and GetIPNS functions to read data from IPFS node
* fix: Ensure IPFS client is initialized before pinning CID
* feat: Add AddFile and AddFolder methods
* feat: add IPFS file system abstraction
* feat: Implement IPFS file, location, and filesystem abstractions
* refactor: remove unused functions and types
* refactor: remove unused FileSystem interface
* feat: add initial wasm entrypoint
* feat: add basic vault command operations
* docs: add vault module features
* test: remove test for MsgUpdateParams
* refactor: Replace PrimaryKey with Property struct in zkprop.go
* feat: Update the `CreateWitness` and `CreateAccumulator` and `VerifyWitness` and `UpdateAccumulator` to Use the new `Accumulator` and `Witness` types. Then Clean up the code in the file and refactor the marshalling methods
* <no value>
* feat: add KeyCurve and KeyType to KeyInfo in genesis
* feat: add WASM build step to devbox.json
* feat: Add zkgate.go file
* feat: Uncomment and modify zkgate code to work with Property struct
* feat: Merge zkgate.go and zkprop.go logic
* feat: implement API endpoints for profile management
* refactor: remove unused template file
* feat(orm): remove unused ORM models
* feat: add persistent SQLite database support in WASM
* fix: Update module names in protobuf files
* feat: Add method to initialize SQLite database
* fix: update go-sqlite3 dependency to version 1.14.23
* feat: introduce database layer
* feat: Implement database layer for Vault node
* feature/update-dockerfile
* feat: Add keyshares table
* fix: Reorder the SQL statements in the tables.go file
* feat: Update the `createCredentialsTable` method to match the proper Credential struct
* feat: Update createProfilesTable and add createPropertiesTable
* feat: Add constant SQL queries to queries.go and use prepared statements in db.go
* feat: Add createKeysharesTable to internal/db/db.go
* feat: Update `createPermissionsTable` to match Permissions struct
* feat: Add database enum types
* feat: Add DIDNamespace and PermissionScope enums
* feat: Add DBConfig and DBOption types
* feat: Update the db implementation to use the provided go library
* fix: update db implementation to use go-sqlite3 v0.18.2
* fix: Refactor database connection and statement handling
* feat: Simplify db.go implementation
* feat: Convert constant SQL queries to functions in queries.go and update db.go to use prepared statements
* feat: Add models.go file with database table structs
* fix: Remove unused statement map and prepare statements
diff --git a/internal/db/db.go b/internal/db/db.go
index 201d09b..d4d4d4e 100644
--- a/internal/db/db.go
+++ b/internal/db/db.go
@@ -32,11 +32,6 @@ func Open(config *DBConfig) (*DB, error) {
Conn: conn,
}
- if err := createTables(db); err != nil {
- conn.Close()
- return nil, fmt.Errorf("failed to create tables: %w", err)
- }
-
return db, nil
}
@@ -61,114 +56,3 @@ func createTables(db *DB) error {
return nil
}
-// AddAccount adds a new account to the database
-func (db *DB) AddAccount(name, address string) error {
- return db.Exec(insertAccountQuery(name, address))
-}
-
-// AddAsset adds a new asset to the database
-func (db *DB) AddAsset(name, symbol string, decimals int, chainID int64) error {
- return db.Exec(insertAssetQuery(name, symbol, decimals, chainID))
-}
-
-// AddChain adds a new chain to the database
-func (db *DB) AddChain(name, networkID string) error {
- return db.Exec(insertChainQuery(name, networkID))
-}
-
-// AddCredential adds a new credential to the database
-func (db *DB) AddCredential(
- handle, controller, attestationType, origin string,
- credentialID, publicKey []byte,
- transport string,
- signCount uint32,
- userPresent, userVerified, backupEligible, backupState, cloneWarning bool,
-) error {
- return db.Exec(insertCredentialQuery(
- handle,
- controller,
- attestationType,
- origin,
- credentialID,
- publicKey,
- transport,
- signCount,
- userPresent,
- userVerified,
- backupEligible,
- backupState,
- cloneWarning,
- ))
-}
-
-// AddProfile adds a new profile to the database
-func (db *DB) AddProfile(
- id, subject, controller, originURI, publicMetadata, privateMetadata string,
-) error {
- return db.statements["insertProfile"].Exec(
- id, subject, controller, originURI, publicMetadata, privateMetadata,
- )
-}
-
-// AddProperty adds a new property to the database
-func (db *DB) AddProperty(
- profileID, key, accumulator, propertyKey string,
-) error {
- return db.statements["insertProperty"].Exec(
- profileID, key, accumulator, propertyKey,
- )
-}
-
-// AddPermission adds a new permission to the database
-func (db *DB) AddPermission(
- serviceID string,
- grants []DIDNamespace,
- scopes []PermissionScope,
-) error {
- grantsJSON, err := json.Marshal(grants)
- if err != nil {
- return fmt.Errorf("failed to marshal grants: %w", err)
- }
-
- scopesJSON, err := json.Marshal(scopes)
- if err != nil {
- return fmt.Errorf("failed to marshal scopes: %w", err)
- }
-
- return db.statements["insertPermission"].Exec(
- serviceID, string(grantsJSON), string(scopesJSON),
- )
-}
-
-// GetPermission retrieves the permission for the given service ID
-func (db *DB) GetPermission(serviceID string) ([]DIDNamespace, []PermissionScope, error) {
- row := db.statements["getPermission"].QueryRow(serviceID)
-
- var grantsJSON, scopesJSON string
- if err := row.Scan(&grantsJSON, &scopesJSON); err != nil {
- return nil, nil, fmt.Errorf("failed to get permission: %w", err)
- }
-
- var grants []DIDNamespace
- if err := json.Unmarshal([]byte(grantsJSON), &grants); err != nil {
- return nil, nil, fmt.Errorf("failed to unmarshal grants: %w", err)
- }
-
- var scopes []PermissionScope
- if err := json.Unmarshal([]byte(scopesJSON), &scopes); err != nil {
- return nil, nil, fmt.Errorf("failed to unmarshal scopes: %w", err)
- }
-
- return grants, scopes, nil
-}
-
-// Close closes the database connection and finalizes all prepared statements
-func (db *DB) Close() error {
- for _, stmt := range db.statements {
- stmt.Finalize()
- }
- return db.Conn.Close()
-}
diff --git a/internal/db/queries.go b/internal/db/queries.go
index 807d701..e69de29 100644
--- a/internal/db/queries.go
+++ b/internal/db/queries.go
@@ -1,79 +0,0 @@
-package db
-
-import "fmt"
-
-// Account queries
-func insertAccountQuery(name, address string) string {
- return fmt.Sprintf(`INSERT INTO accounts (name, address) VALUES (%s, %s)`, name, address)
-}
-
-// Asset queries
-func insertAssetQuery(name, symbol string, decimals int, chainID int64) string {
- return fmt.Sprintf(
- `INSERT INTO assets (name, symbol, decimals, chain_id) VALUES (%s, %s, %d, %d)`,
- name,
- symbol,
- decimals,
- chainID,
- )
-}
-
-// Chain queries
-func insertChainQuery(name string, networkID string) string {
- return fmt.Sprintf(`INSERT INTO chains (name, network_id) VALUES (%s, %d)`, name, networkID)
-}
-
-// Credential queries
-func insertCredentialQuery(
- handle, controller, attestationType, origin string,
- credentialID, publicKey []byte,
- transport string,
- signCount uint32,
- userPresent, userVerified, backupEligible, backupState, cloneWarning bool,
-) string {
- return fmt.Sprintf(`INSERT INTO credentials (
- handle, controller, attestation_type, origin,
- credential_id, public_key, transport, sign_count,
- user_present, user_verified, backup_eligible,
- backup_state, clone_warning
- ) VALUES (%s, %s, %s, %s, %s, %s, %s, %d, %t, %t, %t, %t, %t)`,
- handle, controller, attestationType, origin,
- credentialID, publicKey, transport, signCount,
- userPresent, userVerified, backupEligible,
- backupState, cloneWarning)
-}
-
-// Profile queries
-func insertProfileQuery(
- id, subject, controller, originURI, publicMetadata, privateMetadata string,
-) string {
- return fmt.Sprintf(`INSERT INTO profiles (
- id, subject, controller, origin_uri,
- public_metadata, private_metadata
- ) VALUES (%s, %s, %s, %s, %s, %s)`,
- id, subject, controller, originURI,
- publicMetadata, privateMetadata)
-}
-
-// Property queries
-func insertPropertyQuery(profileID, key, accumulator, propertyKey string) string {
- return fmt.Sprintf(`INSERT INTO properties (
- profile_id, key, accumulator, property_key
- ) VALUES (%s, %s, %s, %s)`,
- profileID, key, accumulator, propertyKey)
-}
-
-// Permission queries
-func insertPermissionQuery(serviceID, grants, scopes string) string {
- return fmt.Sprintf(
- `INSERT INTO permissions (service_id, grants, scopes) VALUES (%s, %s, %s)`,
- serviceID,
- grants,
- scopes,
- )
-}
-
-// GetPermission query
-func getPermissionQuery(serviceID string) string {
- return fmt.Sprintf(`SELECT grants, scopes FROM permissions WHERE service_id = %s`, serviceID)
-}
* fix: update Makefile to use sonrd instead of wasmd
* feat: Add targets for templ and vault in Makefile and use only make in devbox.json
* feat: add SQLite database support
* bump: version 0.6.0 → 0.7.0
* refactor: upgrade actions to latest versions
2024-09-05 01:24:57 -04:00
|
|
|
"github.com/onsonr/sonr/app"
|
2024-07-05 22:20:13 -04:00
|
|
|
"github.com/spf13/cast"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
|
|
|
"cosmossdk.io/log"
|
|
|
|
confixcmd "cosmossdk.io/tools/confix/cmd"
|
|
|
|
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/debug"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/keys"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/pruning"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/rpc"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/snapshot"
|
|
|
|
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/server"
|
|
|
|
serverconfig "github.com/cosmos/cosmos-sdk/server/config"
|
|
|
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/types/module"
|
|
|
|
authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
|
|
|
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/x/crisis"
|
|
|
|
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
|
|
|
|
)
|
|
|
|
|
2024-12-05 20:36:58 -05:00
|
|
|
// TODO: Load this from PKL
|
2024-07-05 22:20:13 -04:00
|
|
|
// initCometBFTConfig helps to override default CometBFT Config values.
|
|
|
|
// return cmtcfg.DefaultConfig if no custom configuration is required for the application.
|
|
|
|
func initCometBFTConfig() *cmtcfg.Config {
|
|
|
|
cfg := cmtcfg.DefaultConfig()
|
|
|
|
|
|
|
|
// these values put a higher strain on node memory
|
|
|
|
// cfg.P2P.MaxNumInboundPeers = 100
|
|
|
|
// cfg.P2P.MaxNumOutboundPeers = 40
|
|
|
|
|
|
|
|
return cfg
|
|
|
|
}
|
|
|
|
|
2024-12-05 20:36:58 -05:00
|
|
|
// TODO: Load this from PKL
|
2024-07-05 22:20:13 -04:00
|
|
|
// initAppConfig helps to override default appConfig template and configs.
|
|
|
|
// return "", nil if no custom configuration is required for the application.
|
|
|
|
func initAppConfig() (string, interface{}) {
|
|
|
|
// The following code snippet is just for reference.
|
|
|
|
|
2024-12-05 20:36:58 -05:00
|
|
|
type SonrAppConfig struct {
|
2024-07-05 22:20:13 -04:00
|
|
|
serverconfig.Config
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optionally allow the chain developer to overwrite the SDK's default
|
|
|
|
// server config.
|
|
|
|
srvCfg := serverconfig.DefaultConfig()
|
|
|
|
// The SDK's default minimum gas price is set to "" (empty value) inside
|
|
|
|
// app.toml. If left empty by validators, the node will halt on startup.
|
|
|
|
// However, the chain developer can set a default app.toml value for their
|
|
|
|
// validators here.
|
|
|
|
//
|
|
|
|
// In summary:
|
|
|
|
// - if you leave srvCfg.MinGasPrices = "", all validators MUST tweak their
|
|
|
|
// own app.toml config,
|
|
|
|
// - if you set srvCfg.MinGasPrices non-empty, validators CAN tweak their
|
|
|
|
// own app.toml to override, or use this default value.
|
|
|
|
//
|
|
|
|
// In simapp, we set the min gas prices to 0.
|
|
|
|
srvCfg.MinGasPrices = "0stake"
|
|
|
|
// srvCfg.BaseConfig.IAVLDisableFastNode = true // disable fastnode by default
|
|
|
|
|
2024-12-05 20:36:58 -05:00
|
|
|
customAppConfig := SonrAppConfig{
|
2024-07-05 22:20:13 -04:00
|
|
|
Config: *srvCfg,
|
|
|
|
}
|
|
|
|
|
|
|
|
customAppTemplate := serverconfig.DefaultConfigTemplate
|
|
|
|
|
|
|
|
return customAppTemplate, customAppConfig
|
|
|
|
}
|
|
|
|
|
|
|
|
func initRootCmd(
|
|
|
|
rootCmd *cobra.Command,
|
|
|
|
txConfig client.TxConfig,
|
|
|
|
_ codectypes.InterfaceRegistry,
|
|
|
|
|
|
|
|
basicManager module.BasicManager,
|
|
|
|
) {
|
|
|
|
cfg := sdk.GetConfig()
|
|
|
|
cfg.Seal()
|
|
|
|
|
|
|
|
rootCmd.AddCommand(
|
|
|
|
genutilcli.InitCmd(basicManager, app.DefaultNodeHome),
|
|
|
|
NewTestnetCmd(basicManager, banktypes.GenesisBalancesIterator{}),
|
|
|
|
debug.Cmd(),
|
|
|
|
confixcmd.ConfigCommand(),
|
|
|
|
pruning.Cmd(newApp, app.DefaultNodeHome),
|
|
|
|
snapshot.Cmd(newApp),
|
|
|
|
)
|
|
|
|
|
|
|
|
server.AddCommands(rootCmd, app.DefaultNodeHome, newApp, appExport, addModuleInitFlags)
|
|
|
|
|
|
|
|
// add keybase, auxiliary RPC, query, genesis, and tx child commands
|
|
|
|
rootCmd.AddCommand(
|
|
|
|
server.StatusCommand(),
|
|
|
|
genesisCommand(txConfig, basicManager),
|
|
|
|
queryCommand(),
|
|
|
|
txCommand(),
|
|
|
|
keys.Commands(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func addModuleInitFlags(startCmd *cobra.Command) {
|
|
|
|
crisis.AddModuleInitFlags(startCmd)
|
|
|
|
}
|
|
|
|
|
|
|
|
// genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter
|
|
|
|
func genesisCommand(txConfig client.TxConfig, basicManager module.BasicManager, cmds ...*cobra.Command) *cobra.Command {
|
|
|
|
cmd := genutilcli.Commands(txConfig, basicManager, app.DefaultNodeHome)
|
|
|
|
|
|
|
|
for _, subCmd := range cmds {
|
|
|
|
cmd.AddCommand(subCmd)
|
|
|
|
}
|
|
|
|
return cmd
|
|
|
|
}
|
|
|
|
|
|
|
|
func queryCommand() *cobra.Command {
|
|
|
|
cmd := &cobra.Command{
|
|
|
|
Use: "query",
|
|
|
|
Aliases: []string{"q"},
|
|
|
|
Short: "Querying subcommands",
|
|
|
|
DisableFlagParsing: false,
|
|
|
|
SuggestionsMinimumDistance: 2,
|
|
|
|
RunE: client.ValidateCmd,
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd.AddCommand(
|
|
|
|
rpc.QueryEventForTxCmd(),
|
|
|
|
server.QueryBlockCmd(),
|
|
|
|
authcmd.QueryTxsByEventsCmd(),
|
|
|
|
server.QueryBlocksCmd(),
|
|
|
|
authcmd.QueryTxCmd(),
|
|
|
|
server.QueryBlockResultsCmd(),
|
|
|
|
)
|
|
|
|
|
|
|
|
return cmd
|
|
|
|
}
|
|
|
|
|
|
|
|
func txCommand() *cobra.Command {
|
|
|
|
cmd := &cobra.Command{
|
|
|
|
Use: "tx",
|
|
|
|
Short: "Transactions subcommands",
|
|
|
|
DisableFlagParsing: false,
|
|
|
|
SuggestionsMinimumDistance: 2,
|
|
|
|
RunE: client.ValidateCmd,
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd.AddCommand(
|
|
|
|
authcmd.GetSignCommand(),
|
|
|
|
authcmd.GetSignBatchCommand(),
|
|
|
|
authcmd.GetMultiSignCommand(),
|
|
|
|
authcmd.GetMultiSignBatchCmd(),
|
|
|
|
authcmd.GetValidateSignaturesCommand(),
|
|
|
|
authcmd.GetBroadcastCommand(),
|
|
|
|
authcmd.GetEncodeCommand(),
|
|
|
|
authcmd.GetDecodeCommand(),
|
|
|
|
authcmd.GetSimulateCmd(),
|
|
|
|
)
|
|
|
|
|
|
|
|
return cmd
|
|
|
|
}
|
|
|
|
|
|
|
|
// newApp creates the application
|
|
|
|
func newApp(
|
|
|
|
logger log.Logger,
|
|
|
|
db dbm.DB,
|
|
|
|
traceStore io.Writer,
|
|
|
|
appOpts servertypes.AppOptions,
|
|
|
|
) servertypes.Application {
|
|
|
|
baseappOptions := server.DefaultBaseappOptions(appOpts)
|
|
|
|
|
|
|
|
if cast.ToBool(appOpts.Get("telemetry.enabled")) {
|
|
|
|
}
|
|
|
|
|
|
|
|
return app.NewChainApp(
|
|
|
|
logger, db, traceStore, true,
|
|
|
|
appOpts,
|
|
|
|
baseappOptions...,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func appExport(
|
|
|
|
logger log.Logger,
|
|
|
|
db dbm.DB,
|
|
|
|
traceStore io.Writer,
|
|
|
|
height int64,
|
|
|
|
forZeroHeight bool,
|
|
|
|
jailAllowedAddrs []string,
|
|
|
|
appOpts servertypes.AppOptions,
|
|
|
|
modulesToExport []string,
|
|
|
|
) (servertypes.ExportedApp, error) {
|
|
|
|
var chainApp *app.SonrApp
|
|
|
|
// this check is necessary as we use the flag in x/upgrade.
|
|
|
|
// we can exit more gracefully by checking the flag here.
|
|
|
|
homePath, ok := appOpts.Get(flags.FlagHome).(string)
|
|
|
|
if !ok || homePath == "" {
|
|
|
|
return servertypes.ExportedApp{}, errors.New("application home is not set")
|
|
|
|
}
|
|
|
|
|
|
|
|
viperAppOpts, ok := appOpts.(*viper.Viper)
|
|
|
|
if !ok {
|
|
|
|
return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper")
|
|
|
|
}
|
|
|
|
|
|
|
|
// overwrite the FlagInvCheckPeriod
|
|
|
|
viperAppOpts.Set(server.FlagInvCheckPeriod, 1)
|
|
|
|
appOpts = viperAppOpts
|
|
|
|
|
|
|
|
chainApp = app.NewChainApp(
|
|
|
|
logger,
|
|
|
|
db,
|
|
|
|
traceStore,
|
|
|
|
height == -1,
|
|
|
|
appOpts,
|
|
|
|
nil,
|
|
|
|
)
|
|
|
|
|
|
|
|
if height != -1 {
|
|
|
|
if err := chainApp.LoadHeight(height); err != nil {
|
|
|
|
return servertypes.ExportedApp{}, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return chainApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport)
|
|
|
|
}
|
|
|
|
|
|
|
|
var tempDir = func() string {
|
|
|
|
dir, err := os.MkdirTemp("", "sonr")
|
|
|
|
if err != nil {
|
|
|
|
panic("failed to create temp dir: " + err.Error())
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(dir)
|
|
|
|
|
|
|
|
return dir
|
|
|
|
}
|