@blinklabs/dingo 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dingo/blob/000001.sst +0 -0
- package/.dingo/blob/000001.vlog +0 -0
- package/.dingo/blob/DISCARD +0 -0
- package/.dingo/blob/KEYREGISTRY +2 -0
- package/.dingo/blob/MANIFEST +0 -0
- package/.dingo/metadata.sqlite +0 -0
- package/.github/workflows/golangci-lint.yml +1 -1
- package/.github/workflows/publish.yml +1 -7
- package/README.md +2 -1
- package/{dist/dingo_darwin_amd64_v1/dingo → dingo} +0 -0
- package/dingo.yaml.example +53 -0
- package/package.json +5 -5
- package/Dockerfile +0 -25
- package/Makefile +0 -53
- package/blockfetch.go +0 -144
- package/chain/chain.go +0 -504
- package/chain/chain_test.go +0 -468
- package/chain/errors.go +0 -80
- package/chain/event.go +0 -33
- package/chain/iter.go +0 -64
- package/chainsync/chainsync.go +0 -97
- package/chainsync.go +0 -223
- package/cmd/dingo/load.go +0 -52
- package/cmd/dingo/main.go +0 -118
- package/cmd/dingo/serve.go +0 -49
- package/config/cardano/node.go +0 -192
- package/config/cardano/node_test.go +0 -85
- package/config/cardano/preview/README.md +0 -4
- package/config/cardano/preview/alonzo-genesis.json +0 -196
- package/config/cardano/preview/byron-genesis.json +0 -117
- package/config/cardano/preview/config.json +0 -114
- package/config/cardano/preview/conway-genesis.json +0 -297
- package/config/cardano/preview/shelley-genesis.json +0 -68
- package/config.go +0 -245
- package/connmanager/connection_manager.go +0 -105
- package/connmanager/connection_manager_test.go +0 -185
- package/connmanager/event.go +0 -37
- package/connmanager/listener.go +0 -140
- package/connmanager/outbound.go +0 -93
- package/connmanager/socket.go +0 -55
- package/connmanager/unix.go +0 -78
- package/custom-p2p-topology.json +0 -24
- package/custom-p2p-topology.json.backup +0 -24
- package/custom-p2p-topology.json.mainnet +0 -37
- package/database/account.go +0 -138
- package/database/block.go +0 -362
- package/database/certs.go +0 -53
- package/database/commit_timestamp.go +0 -77
- package/database/database.go +0 -118
- package/database/database_test.go +0 -62
- package/database/drep.go +0 -27
- package/database/epoch.go +0 -121
- package/database/immutable/chunk.go +0 -182
- package/database/immutable/immutable.go +0 -350
- package/database/immutable/immutable_test.go +0 -59
- package/database/immutable/primary.go +0 -106
- package/database/immutable/secondary.go +0 -103
- package/database/immutable/testdata/08893.chunk +0 -0
- package/database/immutable/testdata/08893.primary +0 -0
- package/database/immutable/testdata/08893.secondary +0 -0
- package/database/immutable/testdata/08894.chunk +0 -0
- package/database/immutable/testdata/08894.primary +0 -0
- package/database/immutable/testdata/08894.secondary +0 -0
- package/database/immutable/testdata/README.md +0 -4
- package/database/plugin/blob/badger/commit_timestamp.go +0 -50
- package/database/plugin/blob/badger/database.go +0 -152
- package/database/plugin/blob/badger/logger.go +0 -63
- package/database/plugin/blob/badger/metrics.go +0 -98
- package/database/plugin/blob/blob.go +0 -19
- package/database/plugin/blob/store.go +0 -40
- package/database/plugin/log.go +0 -27
- package/database/plugin/metadata/metadata.go +0 -19
- package/database/plugin/metadata/sqlite/account.go +0 -224
- package/database/plugin/metadata/sqlite/certs.go +0 -58
- package/database/plugin/metadata/sqlite/commit_timestamp.go +0 -68
- package/database/plugin/metadata/sqlite/database.go +0 -218
- package/database/plugin/metadata/sqlite/epoch.go +0 -120
- package/database/plugin/metadata/sqlite/models/account.go +0 -81
- package/database/plugin/metadata/sqlite/models/auth_committee_hot.go +0 -26
- package/database/plugin/metadata/sqlite/models/deregistration_drep.go +0 -26
- package/database/plugin/metadata/sqlite/models/drep.go +0 -27
- package/database/plugin/metadata/sqlite/models/epoch.go +0 -31
- package/database/plugin/metadata/sqlite/models/models.go +0 -45
- package/database/plugin/metadata/sqlite/models/pool.go +0 -97
- package/database/plugin/metadata/sqlite/models/pparam_update.go +0 -27
- package/database/plugin/metadata/sqlite/models/pparams.go +0 -27
- package/database/plugin/metadata/sqlite/models/registration_drep.go +0 -28
- package/database/plugin/metadata/sqlite/models/resign_committee_cold.go +0 -27
- package/database/plugin/metadata/sqlite/models/stake_registration_delegation.go +0 -27
- package/database/plugin/metadata/sqlite/models/stake_vote_delegation.go +0 -27
- package/database/plugin/metadata/sqlite/models/stake_vote_registration_delegation.go +0 -27
- package/database/plugin/metadata/sqlite/models/tip.go +0 -26
- package/database/plugin/metadata/sqlite/models/update_drep.go +0 -27
- package/database/plugin/metadata/sqlite/models/utxo.go +0 -30
- package/database/plugin/metadata/sqlite/models/vote_delegation.go +0 -26
- package/database/plugin/metadata/sqlite/models/vote_registration_delegation.go +0 -26
- package/database/plugin/metadata/sqlite/pool.go +0 -240
- package/database/plugin/metadata/sqlite/pparams.go +0 -110
- package/database/plugin/metadata/sqlite/tip.go +0 -83
- package/database/plugin/metadata/sqlite/utxo.go +0 -292
- package/database/plugin/metadata/store.go +0 -168
- package/database/plugin/option.go +0 -190
- package/database/plugin/plugin.go +0 -20
- package/database/plugin/register.go +0 -118
- package/database/pparams.go +0 -145
- package/database/tip.go +0 -45
- package/database/txn.go +0 -147
- package/database/types/types.go +0 -74
- package/database/types/types_test.go +0 -83
- package/database/utxo.go +0 -263
- package/dist/artifacts.json +0 -1
- package/dist/checksums.txt +0 -22
- package/dist/config.yaml +0 -253
- package/dist/dingo-0.5.0-SNAPSHOT-d9431e4.tar.gz +0 -0
- package/dist/dingo-0.5.0-SNAPSHOT-d9431e4.tar.gz.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_darwin_arm64.tar.gz +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_darwin_arm64.tar.gz.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_darwin_x86_64.tar.gz +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_darwin_x86_64.tar.gz.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.apk +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.apk.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.deb +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.deb.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.rpm +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_amd64.rpm.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.apk +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.apk.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.deb +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.deb.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.rpm +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.rpm.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.tar.gz +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_arm64.tar.gz.sbom.json +0 -1
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_x86_64.tar.gz +0 -0
- package/dist/dingo_0.5.0-SNAPSHOT-d9431e4_linux_x86_64.tar.gz.sbom.json +0 -1
- package/dist/dingo_darwin_arm64_v8.0/dingo +0 -0
- package/dist/dingo_linux_amd64_v1/dingo +0 -0
- package/dist/dingo_linux_arm64_v8.0/dingo +0 -0
- package/dist/homebrew/dingo.rb +0 -51
- package/dist/metadata.json +0 -1
- package/event/event.go +0 -141
- package/event/event_test.go +0 -115
- package/event/metrics.go +0 -44
- package/go.mod +0 -98
- package/go.sum +0 -358
- package/internal/config/config.go +0 -145
- package/internal/config/config_test.go +0 -118
- package/internal/node/load.go +0 -149
- package/internal/node/node.go +0 -176
- package/internal/version/version.go +0 -33
- package/ledger/certs.go +0 -113
- package/ledger/chainsync.go +0 -578
- package/ledger/eras/allegra.go +0 -154
- package/ledger/eras/alonzo.go +0 -156
- package/ledger/eras/babbage.go +0 -154
- package/ledger/eras/byron.go +0 -42
- package/ledger/eras/conway.go +0 -158
- package/ledger/eras/eras.go +0 -44
- package/ledger/eras/mary.go +0 -154
- package/ledger/eras/shelley.go +0 -164
- package/ledger/error.go +0 -19
- package/ledger/event.go +0 -50
- package/ledger/metrics.go +0 -53
- package/ledger/queries.go +0 -260
- package/ledger/slot.go +0 -127
- package/ledger/slot_test.go +0 -147
- package/ledger/state.go +0 -726
- package/ledger/view.go +0 -73
- package/localstatequery.go +0 -50
- package/localtxmonitor.go +0 -44
- package/localtxsubmission.go +0 -52
- package/mempool/consumer.go +0 -98
- package/mempool/mempool.go +0 -322
- package/node.go +0 -320
- package/peergov/event.go +0 -27
- package/peergov/peer.go +0 -67
- package/peergov/peergov.go +0 -290
- package/peersharing.go +0 -70
- package/preview-local-topology.json +0 -23
- package/topology/topology.go +0 -69
- package/topology/topology_test.go +0 -179
- package/tracing.go +0 -65
- package/txsubmission.go +0 -233
- package/utxorpc/query.go +0 -311
- package/utxorpc/submit.go +0 -395
- package/utxorpc/sync.go +0 -276
- package/utxorpc/utxorpc.go +0 -166
- package/utxorpc/watch.go +0 -310
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package sqlite
|
|
16
|
-
|
|
17
|
-
import (
|
|
18
|
-
"github.com/blinklabs-io/dingo/database/plugin/metadata/sqlite/models"
|
|
19
|
-
lcommon "github.com/blinklabs-io/gouroboros/ledger/common"
|
|
20
|
-
"gorm.io/gorm"
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
// GetStakeRegistrations returns stake registration certificates
|
|
24
|
-
func (d *MetadataStoreSqlite) GetStakeRegistrations(
|
|
25
|
-
stakingKey []byte,
|
|
26
|
-
txn *gorm.DB,
|
|
27
|
-
) ([]lcommon.StakeRegistrationCertificate, error) {
|
|
28
|
-
ret := []lcommon.StakeRegistrationCertificate{}
|
|
29
|
-
certs := []models.StakeRegistration{}
|
|
30
|
-
if txn != nil {
|
|
31
|
-
result := txn.Where("staking_key = ?", stakingKey).
|
|
32
|
-
Order("id DESC").
|
|
33
|
-
Find(&certs)
|
|
34
|
-
if result.Error != nil {
|
|
35
|
-
return ret, result.Error
|
|
36
|
-
}
|
|
37
|
-
} else {
|
|
38
|
-
result := d.DB().Where("staking_key = ?", stakingKey).
|
|
39
|
-
Order("id DESC").
|
|
40
|
-
Find(&certs)
|
|
41
|
-
if result.Error != nil {
|
|
42
|
-
return ret, result.Error
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
var tmpCert lcommon.StakeRegistrationCertificate
|
|
46
|
-
for _, cert := range certs {
|
|
47
|
-
tmpCert = lcommon.StakeRegistrationCertificate{
|
|
48
|
-
CertType: lcommon.CertificateTypeStakeRegistration,
|
|
49
|
-
StakeRegistration: lcommon.Credential{
|
|
50
|
-
// TODO: determine correct type
|
|
51
|
-
// CredType: lcommon.CredentialTypeAddrKeyHash,
|
|
52
|
-
Credential: lcommon.CredentialHash(cert.StakingKey),
|
|
53
|
-
},
|
|
54
|
-
}
|
|
55
|
-
ret = append(ret, tmpCert)
|
|
56
|
-
}
|
|
57
|
-
return ret, nil
|
|
58
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package sqlite
|
|
16
|
-
|
|
17
|
-
import (
|
|
18
|
-
"errors"
|
|
19
|
-
|
|
20
|
-
"gorm.io/gorm"
|
|
21
|
-
"gorm.io/gorm/clause"
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
const (
|
|
25
|
-
commitTimestampRowId = 1
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
// CommitTimestamp represents the sqlite table used to track the current commit timestamp
|
|
29
|
-
type CommitTimestamp struct {
|
|
30
|
-
ID uint `gorm:"primarykey"`
|
|
31
|
-
Timestamp int64
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
func (CommitTimestamp) TableName() string {
|
|
35
|
-
return "commit_timestamp"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
func (d *MetadataStoreSqlite) GetCommitTimestamp() (int64, error) {
|
|
39
|
-
// Get value from sqlite
|
|
40
|
-
var tmpCommitTimestamp CommitTimestamp
|
|
41
|
-
result := d.DB().First(&tmpCommitTimestamp)
|
|
42
|
-
if result.Error != nil {
|
|
43
|
-
// It's not an error if there's no records found
|
|
44
|
-
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
|
45
|
-
return 0, nil
|
|
46
|
-
}
|
|
47
|
-
return 0, result.Error
|
|
48
|
-
}
|
|
49
|
-
return tmpCommitTimestamp.Timestamp, nil
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
func (d *MetadataStoreSqlite) SetCommitTimestamp(
|
|
53
|
-
txn *gorm.DB,
|
|
54
|
-
timestamp int64,
|
|
55
|
-
) error {
|
|
56
|
-
tmpCommitTimestamp := CommitTimestamp{
|
|
57
|
-
ID: commitTimestampRowId,
|
|
58
|
-
Timestamp: timestamp,
|
|
59
|
-
}
|
|
60
|
-
result := txn.Clauses(clause.OnConflict{
|
|
61
|
-
Columns: []clause.Column{{Name: "id"}},
|
|
62
|
-
DoUpdates: clause.AssignmentColumns([]string{"timestamp"}),
|
|
63
|
-
}).Create(&tmpCommitTimestamp)
|
|
64
|
-
if result.Error != nil {
|
|
65
|
-
return result.Error
|
|
66
|
-
}
|
|
67
|
-
return nil
|
|
68
|
-
}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package sqlite
|
|
16
|
-
|
|
17
|
-
import (
|
|
18
|
-
"errors"
|
|
19
|
-
"fmt"
|
|
20
|
-
"io"
|
|
21
|
-
"io/fs"
|
|
22
|
-
"log/slog"
|
|
23
|
-
"os"
|
|
24
|
-
"path/filepath"
|
|
25
|
-
"time"
|
|
26
|
-
|
|
27
|
-
"github.com/blinklabs-io/dingo/database/plugin"
|
|
28
|
-
"github.com/blinklabs-io/dingo/database/plugin/metadata/sqlite/models"
|
|
29
|
-
"github.com/glebarez/sqlite"
|
|
30
|
-
"gorm.io/gorm"
|
|
31
|
-
gormlogger "gorm.io/gorm/logger"
|
|
32
|
-
"gorm.io/plugin/opentelemetry/tracing"
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
// Register plugin
|
|
36
|
-
func init() {
|
|
37
|
-
plugin.Register(
|
|
38
|
-
plugin.PluginEntry{
|
|
39
|
-
Type: plugin.PluginTypeMetadata,
|
|
40
|
-
Name: "sqlite",
|
|
41
|
-
},
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// MetadataStoreSqlite stores all data in sqlite. Data may not be persisted
|
|
46
|
-
type MetadataStoreSqlite struct {
|
|
47
|
-
dataDir string
|
|
48
|
-
db *gorm.DB
|
|
49
|
-
logger *slog.Logger
|
|
50
|
-
timerVacuum *time.Timer
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// New creates a new database
|
|
54
|
-
func New(
|
|
55
|
-
dataDir string,
|
|
56
|
-
logger *slog.Logger,
|
|
57
|
-
) (*MetadataStoreSqlite, error) {
|
|
58
|
-
var metadataDb *gorm.DB
|
|
59
|
-
var err error
|
|
60
|
-
if dataDir == "" {
|
|
61
|
-
// No dataDir, use in-memory config
|
|
62
|
-
metadataDb, err = gorm.Open(
|
|
63
|
-
sqlite.Open("file::memory:?cache=shared"),
|
|
64
|
-
&gorm.Config{
|
|
65
|
-
Logger: gormlogger.Discard,
|
|
66
|
-
SkipDefaultTransaction: true,
|
|
67
|
-
},
|
|
68
|
-
)
|
|
69
|
-
if err != nil {
|
|
70
|
-
return nil, err
|
|
71
|
-
}
|
|
72
|
-
} else {
|
|
73
|
-
// Make sure that we can read data dir, and create if it doesn't exist
|
|
74
|
-
if _, err := os.Stat(dataDir); err != nil {
|
|
75
|
-
if !errors.Is(err, fs.ErrNotExist) {
|
|
76
|
-
return nil, fmt.Errorf("failed to read data dir: %w", err)
|
|
77
|
-
}
|
|
78
|
-
// Create data directory
|
|
79
|
-
if err := os.MkdirAll(dataDir, fs.ModePerm); err != nil {
|
|
80
|
-
return nil, fmt.Errorf("failed to create data dir: %w", err)
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Open sqlite DB
|
|
84
|
-
metadataDbPath := filepath.Join(
|
|
85
|
-
dataDir,
|
|
86
|
-
"metadata.sqlite",
|
|
87
|
-
)
|
|
88
|
-
// WAL journal mode, disable sync on write, increase cache size to 50MB (from 2MB)
|
|
89
|
-
metadataConnOpts := "_pragma=journal_mode(WAL)&_pragma=sync(OFF)&_pragma=cache_size(-50000)"
|
|
90
|
-
metadataDb, err = gorm.Open(
|
|
91
|
-
sqlite.Open(
|
|
92
|
-
fmt.Sprintf("file:%s?%s", metadataDbPath, metadataConnOpts),
|
|
93
|
-
),
|
|
94
|
-
&gorm.Config{
|
|
95
|
-
Logger: gormlogger.Discard,
|
|
96
|
-
SkipDefaultTransaction: true,
|
|
97
|
-
},
|
|
98
|
-
)
|
|
99
|
-
if err != nil {
|
|
100
|
-
return nil, err
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
db := &MetadataStoreSqlite{
|
|
104
|
-
db: metadataDb,
|
|
105
|
-
dataDir: dataDir,
|
|
106
|
-
logger: logger,
|
|
107
|
-
}
|
|
108
|
-
if err := db.init(); err != nil {
|
|
109
|
-
// MetadataStoreSqlite is available for recovery, so return it with error
|
|
110
|
-
return db, err
|
|
111
|
-
}
|
|
112
|
-
// Create table schemas
|
|
113
|
-
db.logger.Debug(fmt.Sprintf("creating table: %#v", &CommitTimestamp{}))
|
|
114
|
-
if err := db.db.AutoMigrate(&CommitTimestamp{}); err != nil {
|
|
115
|
-
return db, err
|
|
116
|
-
}
|
|
117
|
-
for _, model := range models.MigrateModels {
|
|
118
|
-
db.logger.Debug(fmt.Sprintf("creating table: %#v", model))
|
|
119
|
-
if err := db.db.AutoMigrate(model); err != nil {
|
|
120
|
-
return db, err
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return db, nil
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
func (d *MetadataStoreSqlite) init() error {
|
|
127
|
-
if d.logger == nil {
|
|
128
|
-
// Create logger to throw away logs
|
|
129
|
-
// We do this so we don't have to add guards around every log operation
|
|
130
|
-
d.logger = slog.New(slog.NewJSONHandler(io.Discard, nil))
|
|
131
|
-
}
|
|
132
|
-
// Configure tracing for GORM
|
|
133
|
-
if err := d.db.Use(tracing.NewPlugin(tracing.WithoutMetrics())); err != nil {
|
|
134
|
-
return err
|
|
135
|
-
}
|
|
136
|
-
// Schedule daily database vacuum to free unused space
|
|
137
|
-
d.scheduleDailyVacuum()
|
|
138
|
-
return nil
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
func (d *MetadataStoreSqlite) runVacuum() error {
|
|
142
|
-
if d.dataDir == "" {
|
|
143
|
-
return nil
|
|
144
|
-
}
|
|
145
|
-
if result := d.DB().Raw("VACUUM"); result.Error != nil {
|
|
146
|
-
return result.Error
|
|
147
|
-
}
|
|
148
|
-
return nil
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
func (d *MetadataStoreSqlite) scheduleDailyVacuum() {
|
|
152
|
-
if d.timerVacuum != nil {
|
|
153
|
-
d.timerVacuum.Stop()
|
|
154
|
-
}
|
|
155
|
-
daily := time.Duration(24) * time.Hour
|
|
156
|
-
f := func() {
|
|
157
|
-
d.logger.Debug(
|
|
158
|
-
"running vacuum on sqlite metadata database",
|
|
159
|
-
)
|
|
160
|
-
// schedule next run
|
|
161
|
-
defer d.scheduleDailyVacuum()
|
|
162
|
-
if err := d.runVacuum(); err != nil {
|
|
163
|
-
d.logger.Error(
|
|
164
|
-
"failed to free unused space in metadata store",
|
|
165
|
-
"component", "database",
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
d.timerVacuum = time.AfterFunc(daily, f)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// AutoMigrate wraps the gorm AutoMigrate
|
|
173
|
-
func (d *MetadataStoreSqlite) AutoMigrate(dst ...interface{}) error {
|
|
174
|
-
return d.DB().AutoMigrate(dst...)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Close gets the database handle from our MetadataStore and closes it
|
|
178
|
-
func (d *MetadataStoreSqlite) Close() error {
|
|
179
|
-
// get DB handle from gorm.DB
|
|
180
|
-
db, err := d.DB().DB()
|
|
181
|
-
if err != nil {
|
|
182
|
-
return err
|
|
183
|
-
}
|
|
184
|
-
return db.Close()
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Create creates a record
|
|
188
|
-
func (d *MetadataStoreSqlite) Create(value interface{}) *gorm.DB {
|
|
189
|
-
return d.DB().Create(value)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// DB returns the database handle
|
|
193
|
-
func (d *MetadataStoreSqlite) DB() *gorm.DB {
|
|
194
|
-
return d.db
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// First returns the first DB entry
|
|
198
|
-
func (d *MetadataStoreSqlite) First(args interface{}) *gorm.DB {
|
|
199
|
-
return d.DB().First(args)
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Order orders a DB query
|
|
203
|
-
func (d *MetadataStoreSqlite) Order(args interface{}) *gorm.DB {
|
|
204
|
-
return d.DB().Order(args)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Transaction creates a gorm transaction
|
|
208
|
-
func (d *MetadataStoreSqlite) Transaction() *gorm.DB {
|
|
209
|
-
return d.DB().Begin()
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Where constrains a DB query
|
|
213
|
-
func (d *MetadataStoreSqlite) Where(
|
|
214
|
-
query interface{},
|
|
215
|
-
args ...interface{},
|
|
216
|
-
) *gorm.DB {
|
|
217
|
-
return d.DB().Where(query, args...)
|
|
218
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package sqlite
|
|
16
|
-
|
|
17
|
-
import (
|
|
18
|
-
"errors"
|
|
19
|
-
"strconv"
|
|
20
|
-
|
|
21
|
-
"github.com/blinklabs-io/dingo/database/plugin/metadata/sqlite/models"
|
|
22
|
-
"gorm.io/gorm"
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
// GetEpochLatest returns the latest epoch
|
|
26
|
-
func (d *MetadataStoreSqlite) GetEpochLatest(
|
|
27
|
-
txn *gorm.DB,
|
|
28
|
-
) (models.Epoch, error) {
|
|
29
|
-
ret := models.Epoch{}
|
|
30
|
-
if txn != nil {
|
|
31
|
-
result := txn.Order("epoch_id DESC").First(&ret)
|
|
32
|
-
if result.Error != nil {
|
|
33
|
-
if !errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
|
34
|
-
return ret, result.Error
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
} else {
|
|
38
|
-
result := d.DB().Order("epoch_id DESC").First(&ret)
|
|
39
|
-
if result.Error != nil {
|
|
40
|
-
if !errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
|
41
|
-
return ret, result.Error
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return ret, nil
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// GetEpochsByEra returns the list of epochs by era
|
|
49
|
-
func (d *MetadataStoreSqlite) GetEpochsByEra(
|
|
50
|
-
eraId uint,
|
|
51
|
-
txn *gorm.DB,
|
|
52
|
-
) ([]models.Epoch, error) {
|
|
53
|
-
ret := []models.Epoch{}
|
|
54
|
-
if txn != nil {
|
|
55
|
-
result := txn.Where("era_id = ?", eraId).Order("epoch_id").Find(&ret)
|
|
56
|
-
if result.Error != nil {
|
|
57
|
-
return ret, result.Error
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
result := d.DB().Where("era_id = ?", eraId).Order("epoch_id").Find(&ret)
|
|
61
|
-
if result.Error != nil {
|
|
62
|
-
return ret, result.Error
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return ret, nil
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// GetEpochs returns the list of epochs
|
|
69
|
-
func (d *MetadataStoreSqlite) GetEpochs(
|
|
70
|
-
txn *gorm.DB,
|
|
71
|
-
) ([]models.Epoch, error) {
|
|
72
|
-
ret := []models.Epoch{}
|
|
73
|
-
if txn != nil {
|
|
74
|
-
result := txn.Order("epoch_id").Find(&ret)
|
|
75
|
-
if result.Error != nil {
|
|
76
|
-
return ret, result.Error
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
result := d.DB().Order("epoch_id").Find(&ret)
|
|
80
|
-
if result.Error != nil {
|
|
81
|
-
return ret, result.Error
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return ret, nil
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// SetEpoch saves an epoch
|
|
88
|
-
func (d *MetadataStoreSqlite) SetEpoch(
|
|
89
|
-
slot, epoch uint64,
|
|
90
|
-
nonce []byte,
|
|
91
|
-
era, slotLength, lengthInSlots uint,
|
|
92
|
-
txn *gorm.DB,
|
|
93
|
-
) error {
|
|
94
|
-
tmpItem := models.Epoch{
|
|
95
|
-
EpochId: epoch,
|
|
96
|
-
StartSlot: slot,
|
|
97
|
-
Nonce: nonce,
|
|
98
|
-
EraId: era,
|
|
99
|
-
SlotLength: slotLength,
|
|
100
|
-
LengthInSlots: lengthInSlots,
|
|
101
|
-
}
|
|
102
|
-
if txn != nil {
|
|
103
|
-
if result := txn.Create(&tmpItem); result.Error != nil {
|
|
104
|
-
return result.Error
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
if result := d.DB().Create(&tmpItem); result.Error != nil {
|
|
108
|
-
return result.Error
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Run a vacuum, on error only log
|
|
112
|
-
if err := d.runVacuum(); err != nil {
|
|
113
|
-
d.logger.Error(
|
|
114
|
-
"failed to free space in metdata store",
|
|
115
|
-
"epoch", strconv.FormatUint(epoch, 10),
|
|
116
|
-
"error", err,
|
|
117
|
-
)
|
|
118
|
-
}
|
|
119
|
-
return nil
|
|
120
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package models
|
|
16
|
-
|
|
17
|
-
type Account struct {
|
|
18
|
-
ID uint `gorm:"primarykey"`
|
|
19
|
-
StakingKey []byte `gorm:"index,unique"`
|
|
20
|
-
Pool []byte `gorm:"index"`
|
|
21
|
-
Drep []byte `gorm:"index"`
|
|
22
|
-
AddedSlot uint64
|
|
23
|
-
Active bool `gorm:"default:true"`
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
func (a *Account) TableName() string {
|
|
27
|
-
return "account"
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
type Deregistration struct {
|
|
31
|
-
ID uint `gorm:"primarykey"`
|
|
32
|
-
StakingKey []byte `gorm:"index"`
|
|
33
|
-
AddedSlot uint64
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
func (Deregistration) TableName() string {
|
|
37
|
-
return "deregistration"
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
type Registration struct {
|
|
41
|
-
ID uint `gorm:"primarykey"`
|
|
42
|
-
StakingKey []byte `gorm:"index"`
|
|
43
|
-
AddedSlot uint64
|
|
44
|
-
DepositAmount uint64
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
func (Registration) TableName() string {
|
|
48
|
-
return "registration"
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
type StakeDelegation struct {
|
|
52
|
-
ID uint `gorm:"primarykey"`
|
|
53
|
-
StakingKey []byte `gorm:"index"`
|
|
54
|
-
PoolKeyHash []byte `gorm:"index"`
|
|
55
|
-
AddedSlot uint64
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
func (StakeDelegation) TableName() string {
|
|
59
|
-
return "stake_delegation"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
type StakeDeregistration struct {
|
|
63
|
-
ID uint `gorm:"primarykey"`
|
|
64
|
-
StakingKey []byte `gorm:"index"`
|
|
65
|
-
AddedSlot uint64
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
func (StakeDeregistration) TableName() string {
|
|
69
|
-
return "stake_deregistration"
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
type StakeRegistration struct {
|
|
73
|
-
ID uint `gorm:"primarykey"`
|
|
74
|
-
StakingKey []byte `gorm:"index"`
|
|
75
|
-
AddedSlot uint64
|
|
76
|
-
DepositAmount uint64
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
func (StakeRegistration) TableName() string {
|
|
80
|
-
return "stake_registration"
|
|
81
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package models
|
|
16
|
-
|
|
17
|
-
type AuthCommitteeHot struct {
|
|
18
|
-
ID uint `gorm:"primarykey"`
|
|
19
|
-
ColdCredential []byte `gorm:"index"`
|
|
20
|
-
HostCredential []byte `gorm:"index"`
|
|
21
|
-
AddedSlot uint64
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
func (AuthCommitteeHot) TableName() string {
|
|
25
|
-
return "auth_committee_hot"
|
|
26
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package models
|
|
16
|
-
|
|
17
|
-
type DeregistrationDrep struct {
|
|
18
|
-
ID uint `gorm:"primarykey"`
|
|
19
|
-
DrepCredential []byte `gorm:"index"`
|
|
20
|
-
AddedSlot uint64
|
|
21
|
-
DepositAmount uint64
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
func (DeregistrationDrep) TableName() string {
|
|
25
|
-
return "deregistration_drep"
|
|
26
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package models
|
|
16
|
-
|
|
17
|
-
type Drep struct {
|
|
18
|
-
ID uint `gorm:"primarykey"`
|
|
19
|
-
Credential []byte `gorm:"index"`
|
|
20
|
-
AnchorUrl string
|
|
21
|
-
AnchorHash []byte
|
|
22
|
-
AddedSlot uint64
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
func (d *Drep) TableName() string {
|
|
26
|
-
return "drep"
|
|
27
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// Copyright 2025 Blink Labs Software
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
package models
|
|
16
|
-
|
|
17
|
-
type Epoch struct {
|
|
18
|
-
ID uint `gorm:"primarykey"`
|
|
19
|
-
// NOTE: we would normally use this as the primary key, but GORM doesn't
|
|
20
|
-
// like a primary key value of 0
|
|
21
|
-
EpochId uint64 `gorm:"uniqueIndex"`
|
|
22
|
-
StartSlot uint64
|
|
23
|
-
Nonce []byte
|
|
24
|
-
EraId uint
|
|
25
|
-
SlotLength uint
|
|
26
|
-
LengthInSlots uint
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
func (Epoch) TableName() string {
|
|
30
|
-
return "epoch"
|
|
31
|
-
}
|