Skip to content

Commit 95f7341

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

File tree

15 files changed

+282
-56
lines changed

15 files changed

+282
-56
lines changed

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: 49 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,72 @@ 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+
71+
cert, err := x509.ParseCertificate(block.Bytes)
72+
if err != nil {
73+
panic(err.Error())
74+
}
75+
76+
if cert.SerialNumber.String() != id.Serial.String() {
77+
panic("certificate id does not match")
78+
}
79+
80+
res = append(res, types.GenesisCertificate{
81+
Owner: id.Owner.String(),
82+
Certificate: certificate.Certificate,
83+
})
84+
85+
return false
86+
})
87+
88+
return &types.GenesisState{
89+
Certificates: res,
90+
}
4691
}
4792

4893
// 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

x/cert/keeper/keeper.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type Keeper interface {
1515
CreateCertificate(sdk.Context, sdk.Address, []byte, []byte) error
1616
RevokeCertificate(sdk.Context, types.CertID) error
1717
GetCertificateByID(ctx sdk.Context, id types.CertID) (types.CertificateResponse, bool)
18-
WithCertificates(ctx sdk.Context, fn func(certificate types.CertificateResponse) bool)
18+
WithCertificates(ctx sdk.Context, fn func(id types.CertID, certificate types.CertificateResponse) bool)
1919
WithCertificatesState(ctx sdk.Context, state types.Certificate_State, fn func(certificate types.CertificateResponse) bool)
2020
WithOwner(ctx sdk.Context, id sdk.Address, fn func(types.CertificateResponse) bool)
2121
WithOwnerState(ctx sdk.Context, id sdk.Address, state types.Certificate_State, fn func(types.CertificateResponse) bool)
@@ -56,7 +56,7 @@ func (k keeper) CreateCertificate(ctx sdk.Context, owner sdk.Address, crt []byte
5656
return err
5757
}
5858

59-
key := certificateKey(types.CertID{
59+
key := CertificateKey(types.CertID{
6060
Owner: owner,
6161
Serial: *cert.SerialNumber,
6262
})
@@ -78,7 +78,7 @@ func (k keeper) CreateCertificate(ctx sdk.Context, owner sdk.Address, crt []byte
7878

7979
func (k keeper) RevokeCertificate(ctx sdk.Context, id types.CertID) error {
8080
store := ctx.KVStore(k.skey)
81-
key := certificateKey(id)
81+
key := CertificateKey(id)
8282

8383
buf := store.Get(key)
8484
if buf == nil {
@@ -103,7 +103,7 @@ func (k keeper) RevokeCertificate(ctx sdk.Context, id types.CertID) error {
103103
func (k keeper) GetCertificateByID(ctx sdk.Context, id types.CertID) (types.CertificateResponse, bool) {
104104
store := ctx.KVStore(k.skey)
105105

106-
buf := store.Get(certificateKey(id))
106+
buf := store.Get(CertificateKey(id))
107107
if buf == nil {
108108
return types.CertificateResponse{}, false
109109
}
@@ -118,7 +118,7 @@ func (k keeper) GetCertificateByID(ctx sdk.Context, id types.CertID) (types.Cert
118118
}
119119

120120
// WithCertificates iterates all certificates
121-
func (k keeper) WithCertificates(ctx sdk.Context, fn func(certificate types.CertificateResponse) bool) {
121+
func (k keeper) WithCertificates(ctx sdk.Context, fn func(id types.CertID, certificate types.CertificateResponse) bool) {
122122
store := ctx.KVStore(k.skey)
123123
iter := store.Iterator(nil, nil)
124124

@@ -127,8 +127,13 @@ func (k keeper) WithCertificates(ctx sdk.Context, fn func(certificate types.Cert
127127
}()
128128

129129
for ; iter.Valid(); iter.Next() {
130+
id, err := ParseCertID(types.PrefixCertificateID(), iter.Key())
131+
if err != nil {
132+
panic(err.Error())
133+
}
134+
130135
item := k.mustUnmarshal(iter.Key(), iter.Value())
131-
if stop := fn(item); stop {
136+
if stop := fn(id, item); stop {
132137
break
133138
}
134139
}
@@ -156,7 +161,7 @@ func (k keeper) WithCertificatesState(ctx sdk.Context, state types.Certificate_S
156161
// WithOwner iterates all certificates by owner
157162
func (k keeper) WithOwner(ctx sdk.Context, id sdk.Address, fn func(types.CertificateResponse) bool) {
158163
store := ctx.KVStore(k.skey)
159-
iter := sdk.KVStorePrefixIterator(store, certificatePrefix(id))
164+
iter := sdk.KVStorePrefixIterator(store, CertificatePrefix(id))
160165
defer func() {
161166
_ = iter.Close()
162167
}()
@@ -172,7 +177,7 @@ func (k keeper) WithOwner(ctx sdk.Context, id sdk.Address, fn func(types.Certifi
172177
// WithOwnerState iterates all certificates by owner in certain state
173178
func (k keeper) WithOwnerState(ctx sdk.Context, id sdk.Address, state types.Certificate_State, fn func(types.CertificateResponse) bool) {
174179
store := ctx.KVStore(k.skey)
175-
iter := sdk.KVStorePrefixIterator(store, certificatePrefix(id))
180+
iter := sdk.KVStorePrefixIterator(store, CertificatePrefix(id))
176181
defer func() {
177182
_ = iter.Close()
178183
}()
@@ -188,7 +193,7 @@ func (k keeper) WithOwnerState(ctx sdk.Context, id sdk.Address, state types.Cert
188193
}
189194

190195
func (k keeper) mustUnmarshal(key, val []byte) types.CertificateResponse {
191-
serial := certificateSerialFromKey(key)
196+
serial := CertificateSerialFromKey(key)
192197
item := types.CertificateResponse{
193198
Serial: serial.String(),
194199
}
@@ -198,7 +203,7 @@ func (k keeper) mustUnmarshal(key, val []byte) types.CertificateResponse {
198203
}
199204

200205
func (k keeper) unmarshalIterator(key, val []byte) (types.CertificateResponse, error) {
201-
serial := certificateSerialFromKey(key)
206+
serial := CertificateSerialFromKey(key)
202207
item := types.CertificateResponse{
203208
Serial: serial.String(),
204209
}

0 commit comments

Comments
 (0)