Skip to content

Commit 42debb1

Browse files
committed
fix: implement import genesis for akash stores
Signed-off-by: Artur Troian <[email protected]>
1 parent cc518ff commit 42debb1

File tree

17 files changed

+355
-122
lines changed

17 files changed

+355
-122
lines changed

go.mod

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
module github.com/akash-network/node
22

3-
go 1.21
3+
go 1.22.0
4+
5+
toolchain go1.23.6
46

57
require (
6-
github.com/akash-network/akash-api v0.0.67
8+
github.com/akash-network/akash-api v0.0.73
79
github.com/blang/semver/v4 v4.0.0
810
github.com/boz/go-lifecycle v0.1.1
911
github.com/cosmos/cosmos-sdk v0.45.16
@@ -119,11 +121,12 @@ require (
119121
github.com/fatih/color v1.14.1 // indirect
120122
github.com/felixge/httpsnoop v1.0.4 // indirect
121123
github.com/fsnotify/fsnotify v1.7.0 // indirect
124+
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
122125
github.com/getsentry/sentry-go v0.17.0 // indirect
123126
github.com/go-kit/kit v0.12.0 // indirect
124127
github.com/go-kit/log v0.2.1 // indirect
125128
github.com/go-logfmt/logfmt v0.5.1 // indirect
126-
github.com/go-logr/logr v1.4.1 // indirect
129+
github.com/go-logr/logr v1.4.2 // indirect
127130
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
128131
github.com/gogo/gateway v1.1.0 // indirect
129132
github.com/golang/protobuf v1.5.4 // indirect
@@ -170,7 +173,7 @@ require (
170173
github.com/prometheus/procfs v0.10.1 // indirect
171174
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
172175
github.com/rivo/uniseg v0.2.0 // indirect
173-
github.com/rogpeppe/go-internal v1.10.0 // indirect
176+
github.com/rogpeppe/go-internal v1.12.0 // indirect
174177
github.com/rs/cors v1.8.2 // indirect
175178
github.com/russross/blackfriday/v2 v2.1.0 // indirect
176179
github.com/sagikazarmark/locafero v0.4.0 // indirect
@@ -184,29 +187,30 @@ require (
184187
github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect
185188
github.com/tendermint/go-amino v0.16.0 // indirect
186189
github.com/tidwall/btree v1.5.0 // indirect
190+
github.com/x448/float16 v0.8.4 // indirect
187191
github.com/zondax/hid v0.9.1 // indirect
188192
github.com/zondax/ledger-go v0.14.1 // indirect
189193
go.etcd.io/bbolt v1.3.6 // indirect
190194
go.uber.org/atomic v1.10.0 // indirect
191195
go.uber.org/multierr v1.9.0 // indirect
192-
golang.org/x/crypto v0.22.0 // indirect
196+
golang.org/x/crypto v0.24.0 // indirect
193197
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
194-
golang.org/x/net v0.24.0 // indirect
195-
golang.org/x/sys v0.19.0 // indirect
196-
golang.org/x/term v0.19.0 // indirect
197-
golang.org/x/text v0.14.0 // indirect
198+
golang.org/x/net v0.26.0 // indirect
199+
golang.org/x/sys v0.21.0 // indirect
200+
golang.org/x/term v0.21.0 // indirect
201+
golang.org/x/text v0.16.0 // indirect
198202
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
199203
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect
200204
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
201-
google.golang.org/protobuf v1.33.0 // indirect
205+
google.golang.org/protobuf v1.34.2 // indirect
202206
gopkg.in/inf.v0 v0.9.1 // indirect
203207
gopkg.in/ini.v1 v1.67.0 // indirect
204208
gopkg.in/yaml.v2 v2.4.0 // indirect
205-
k8s.io/api v0.26.1 // indirect
206-
k8s.io/apimachinery v0.26.1 // indirect
207-
k8s.io/klog/v2 v2.80.1 // indirect
208-
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect
209+
k8s.io/api v0.31.5 // indirect
210+
k8s.io/apimachinery v0.31.5 // indirect
211+
k8s.io/klog/v2 v2.130.1 // indirect
212+
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
209213
nhooyr.io/websocket v1.8.6 // indirect
210-
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
211-
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
214+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
215+
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
212216
)

go.sum

Lines changed: 43 additions & 38 deletions
Large diffs are not rendered by default.

x/audit/genesis.go

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package audit
22

33
import (
44
"encoding/json"
5+
"sort"
56

67
"github.com/cosmos/cosmos-sdk/codec"
78
sdk "github.com/cosmos/cosmos-sdk/types"
9+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
810
abci "github.com/tendermint/tendermint/abci/types"
911

1012
"github.com/akash-network/node/x/audit/keeper"
@@ -14,17 +16,76 @@ import (
1416

1517
// ValidateGenesis does validation check of the Genesis and returns error incase of failure
1618
func ValidateGenesis(data *types.GenesisState) error {
19+
for _, record := range data.Attributes {
20+
if _, err := sdk.AccAddressFromBech32(record.Owner); err != nil {
21+
return sdkerrors.ErrInvalidAddress.Wrap("audited attributes: invalid owner address")
22+
}
23+
24+
if _, err := sdk.AccAddressFromBech32(record.Auditor); err != nil {
25+
return sdkerrors.ErrInvalidAddress.Wrap("audited attributes: invalid auditor address")
26+
}
27+
28+
if err := record.Attributes.Validate(); err != nil {
29+
return sdkerrors.Wrap(err, "audited attributes: invalid attributes")
30+
}
31+
}
32+
1733
return nil
1834
}
1935

2036
// InitGenesis initiate genesis state and return updated validator details
21-
func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, data *types.GenesisState) []abci.ValidatorUpdate {
37+
func InitGenesis(ctx sdk.Context, kpr keeper.Keeper, data *types.GenesisState) []abci.ValidatorUpdate {
38+
store := ctx.KVStore(kpr.StoreKey())
39+
cdc := kpr.Codec()
40+
41+
for _, record := range data.Attributes {
42+
owner, err := sdk.AccAddressFromBech32(record.Owner)
43+
if err != nil {
44+
panic(sdkerrors.ErrInvalidAddress.Wrap("audited attributes: invalid owner address").Error())
45+
}
46+
47+
auditor, err := sdk.AccAddressFromBech32(record.Auditor)
48+
if err != nil {
49+
panic(sdkerrors.ErrInvalidAddress.Wrap("audited attributes: invalid auditor address"))
50+
}
51+
52+
key := keeper.ProviderKey(types.ProviderID{
53+
Owner: owner,
54+
Auditor: auditor,
55+
})
56+
57+
prov := types.Provider{
58+
Owner: record.Owner,
59+
Auditor: record.Auditor,
60+
Attributes: record.Attributes,
61+
}
62+
63+
sort.SliceStable(prov.Attributes, func(i, j int) bool {
64+
return prov.Attributes[i].Key < prov.Attributes[j].Key
65+
})
66+
67+
store.Set(key, cdc.MustMarshal(&prov))
68+
}
69+
2270
return []abci.ValidatorUpdate{}
2371
}
2472

2573
// ExportGenesis returns genesis state as raw bytes for the provider module
2674
func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState {
27-
return &types.GenesisState{}
75+
var records []types.AuditedAttributes
76+
77+
k.WithProviders(ctx, func(provider types.Provider) bool {
78+
records = append(records, types.AuditedAttributes{
79+
Owner: provider.Owner,
80+
Auditor: provider.Auditor,
81+
Attributes: provider.Attributes.Dup(),
82+
})
83+
return false
84+
})
85+
86+
return &types.GenesisState{
87+
Attributes: records,
88+
}
2889
}
2990

3091
// DefaultGenesisState returns default genesis state as raw bytes for the provider

x/audit/keeper/keeper.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (k Keeper) StoreKey() sdk.StoreKey {
4848
func (k Keeper) GetProviderByAuditor(ctx sdk.Context, id types.ProviderID) (types.Provider, bool) {
4949
store := ctx.KVStore(k.skey)
5050

51-
buf := store.Get(providerKey(id))
51+
buf := store.Get(ProviderKey(id))
5252
if buf == nil {
5353
return types.Provider{}, false
5454
}
@@ -65,7 +65,7 @@ func (k Keeper) GetProviderAttributes(ctx sdk.Context, id sdk.Address) (types.Pr
6565

6666
var attr types.Providers
6767

68-
iter := sdk.KVStorePrefixIterator(store, providerPrefix(id))
68+
iter := sdk.KVStorePrefixIterator(store, ProviderPrefix(id))
6969
defer func() {
7070
_ = iter.Close()
7171
}()
@@ -88,7 +88,7 @@ func (k Keeper) GetProviderAttributes(ctx sdk.Context, id sdk.Address) (types.Pr
8888
// if key exists, existing values for matching pairs will be replaced
8989
func (k Keeper) CreateOrUpdateProviderAttributes(ctx sdk.Context, id types.ProviderID, attr akashtypes.Attributes) error {
9090
store := ctx.KVStore(k.skey)
91-
key := providerKey(id)
91+
key := ProviderKey(id)
9292

9393
prov := types.Provider{
9494
Owner: id.Owner.String(),
@@ -138,7 +138,7 @@ func (k Keeper) CreateOrUpdateProviderAttributes(ctx sdk.Context, id types.Provi
138138

139139
func (k Keeper) DeleteProviderAttributes(ctx sdk.Context, id types.ProviderID, keys []string) error {
140140
store := ctx.KVStore(k.skey)
141-
key := providerKey(id)
141+
key := ProviderKey(id)
142142

143143
buf := store.Get(key)
144144
if buf == nil {
@@ -220,10 +220,10 @@ func (k Keeper) WithProviders(ctx sdk.Context, fn func(types.Provider) bool) {
220220
}
221221
}
222222

223-
// WithProviders iterates all signed provider's attributes
223+
// WithProvider iterates all signed provider's attributes
224224
func (k Keeper) WithProvider(ctx sdk.Context, id sdk.Address, fn func(types.Provider) bool) {
225225
store := ctx.KVStore(k.skey)
226-
iter := sdk.KVStorePrefixIterator(store, providerPrefix(id))
226+
iter := sdk.KVStorePrefixIterator(store, ProviderPrefix(id))
227227
defer func() {
228228
_ = iter.Close()
229229
}()

x/audit/keeper/key.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
types "github.com/akash-network/akash-api/go/node/audit/v1beta3"
1111
)
1212

13-
func providerKey(id types.ProviderID) []byte {
13+
func ProviderKey(id types.ProviderID) []byte {
1414
buf := bytes.NewBuffer(types.PrefixProviderID())
1515
if _, err := buf.Write(address.MustLengthPrefix(id.Owner.Bytes())); err != nil {
1616
panic(err)
@@ -23,7 +23,7 @@ func providerKey(id types.ProviderID) []byte {
2323
return buf.Bytes()
2424
}
2525

26-
func providerPrefix(id sdk.Address) []byte {
26+
func ProviderPrefix(id sdk.Address) []byte {
2727
buf := bytes.NewBuffer(types.PrefixProviderID())
2828
if _, err := buf.Write(address.MustLengthPrefix(id.Bytes())); err != nil {
2929
panic(err)

x/cert/genesis.go

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cert
22

33
import (
4+
"crypto/x509"
45
"encoding/json"
6+
"encoding/pem"
57
"fmt"
68

79
"github.com/cosmos/cosmos-sdk/codec"
@@ -20,29 +22,71 @@ func ValidateGenesis(data *types.GenesisState) error {
2022
return err
2123
}
2224
}
25+
2326
return nil
2427
}
2528

2629
// InitGenesis initiate genesis state and return updated validator details
27-
func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, data *types.GenesisState) []abci.ValidatorUpdate {
30+
func InitGenesis(ctx sdk.Context, kpr keeper.Keeper, data *types.GenesisState) []abci.ValidatorUpdate {
31+
store := ctx.KVStore(kpr.StoreKey())
32+
cdc := kpr.Codec()
33+
2834
for _, record := range data.Certificates {
2935
owner, err := sdk.AccAddressFromBech32(record.Owner)
3036
if err != nil {
3137
panic(fmt.Sprintf("error init certificate from genesis: %s", err))
3238
}
3339

34-
err = keeper.CreateCertificate(ctx, owner, record.Certificate.Cert, record.Certificate.Pubkey)
40+
cert, err := types.ParseAndValidateCertificate(owner, record.Certificate.Cert, record.Certificate.Pubkey)
3541
if err != nil {
36-
panic(fmt.Sprintf("error init certificate from genesis: %s", err))
42+
panic(err.Error())
43+
}
44+
45+
key := keeper.CertificateKey(types.CertID{
46+
Owner: owner,
47+
Serial: *cert.SerialNumber,
48+
})
49+
50+
if store.Has(key) {
51+
panic(types.ErrCertificateExists.Error())
3752
}
53+
54+
store.Set(key, cdc.MustMarshal(&record.Certificate))
3855
}
3956

4057
return []abci.ValidatorUpdate{}
4158
}
4259

4360
// ExportGenesis returns genesis state as raw bytes for the provider module
4461
func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState {
45-
return &types.GenesisState{}
62+
var res types.GenesisCertificates
63+
64+
k.WithCertificates(ctx, func(id types.CertID, certificate types.CertificateResponse) bool {
65+
block, rest := pem.Decode(certificate.Certificate.Cert)
66+
if len(rest) > 0 {
67+
panic("unable to decode certificate")
68+
}
69+
70+
cert, err := x509.ParseCertificate(block.Bytes)
71+
if err != nil {
72+
panic(err.Error())
73+
}
74+
75+
if cert.SerialNumber.String() != id.Serial.String() {
76+
panic("certificate id does not match")
77+
}
78+
79+
res = append(res, types.GenesisCertificate{
80+
Owner: id.Owner.String(),
81+
Certificate: certificate.Certificate,
82+
})
83+
84+
return false
85+
})
86+
87+
return &types.GenesisState{
88+
Certificates: res,
89+
}
4690
}
4791

4892
// DefaultGenesisState returns default genesis state as raw bytes for the provider

x/cert/keeper/grpc_query.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ func (q querier) Certificates(c context.Context, req *types.QueryCertificatesReq
6464
certificates = append(certificates, item)
6565
}
6666
} else {
67-
ownerStore := prefix.NewStore(store, certificatePrefix(owner))
67+
ownerStore := prefix.NewStore(store, CertificatePrefix(owner))
6868
pageRes, err = sdkquery.FilteredPaginate(ownerStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) {
6969
// prefixed store returns key without prefix
70-
key = append(certificatePrefix(owner), key...)
70+
key = append(CertificatePrefix(owner), key...)
7171
item, err := q.unmarshalIterator(key, value)
7272
if err != nil {
7373
return true, err

0 commit comments

Comments
 (0)