Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem: no efficient batch query for encryption keys #1415

Merged
merged 1 commit into from
Apr 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
* (versiondb) [#1379](https://github.com/crypto-org-chain/cronos/pull/1379) Flush versiondb when graceful shutdown, make rocksdb upgrade smooth.
* (store) [#1378](https://github.com/crypto-org-chain/cronos/pull/1378) Upgrade rocksdb to `v8.11.3`.
* (versiondb) [#1387](https://github.com/crypto-org-chain/cronos/pull/1387) Add dedicated config section for versiondb, prepare for sdk 0.50 integration.
* [#1413](https://github.com/crypto-org-chain/cronos/pull/1413) Add custom keyring implementation for e2ee module.
* (e2ee)[#1413](https://github.com/crypto-org-chain/cronos/pull/1413) Add custom keyring implementation for e2ee module.
* (e2ee)[#1415](https://github.com/crypto-org-chain/cronos/pull/1415) Add batch keys query for e2ee module.
yihuang marked this conversation as resolved.
Show resolved Hide resolved

### Bug Fixes

Expand Down
69 changes: 67 additions & 2 deletions client/docs/swagger-ui/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -896,7 +896,6 @@ paths:
properties:
key:
type: string
format: byte
description: KeyResponse is the response type for the Query/Key RPC method.
default:
description: An unexpected error response.
Expand Down Expand Up @@ -927,6 +926,57 @@ paths:
type: string
tags:
- Query
/e2ee/v1/keys:
post:
summary: Keys queries the encryption keys for a batch of addresses
operationId: Keys
responses:
'200':
description: A successful response.
schema:
type: object
properties:
keys:
type: array
items:
type: string
description: KeysResponse is the response type for the Query/Key RPC method.
default:
description: An unexpected error response.
schema:
type: object
properties:
error:
type: string
code:
type: integer
format: int32
message:
type: string
details:
type: array
items:
type: object
properties:
type_url:
type: string
value:
type: string
format: byte
parameters:
- name: body
in: body
required: true
schema:
type: object
properties:
addresses:
type: array
items:
type: string
description: KeysRequest is the request type for the Query/Key RPC method.
tags:
- Query
/ethermint/evm/v1/account/{address}:
get:
summary: Account queries an Ethereum account.
Expand Down Expand Up @@ -45554,8 +45604,23 @@ definitions:
properties:
key:
type: string
format: byte
description: KeyResponse is the response type for the Query/Key RPC method.
e2ee.KeysRequest:
type: object
properties:
addresses:
type: array
items:
type: string
description: KeysRequest is the request type for the Query/Key RPC method.
e2ee.KeysResponse:
type: object
properties:
keys:
type: array
items:
type: string
description: KeysResponse is the response type for the Query/Key RPC method.
ethermint.evm.v1.ChainConfig:
type: object
properties:
Expand Down
12 changes: 12 additions & 0 deletions integration_tests/cosmoscli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1854,6 +1854,18 @@ def query_e2ee_key(self, address):
)
)["key"]

def query_e2ee_keys(self, *addresses):
return json.loads(
self.raw(
"q",
"e2ee",
"keys",
*addresses,
home=self.data_dir,
output="json",
)
)["keys"]

def register_e2ee_key(self, key, **kwargs):
kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE)
kwargs.setdefault("gas", DEFAULT_GAS)
Expand Down
7 changes: 6 additions & 1 deletion integration_tests/test_e2ee.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ def test_encrypt_decrypt(cronos):
assert cli.query_e2ee_key(cli.address("validator")) == pubkey0
pubkey1 = cli.keygen(keyring_name="key1")
cli.register_e2ee_key(pubkey1, _from="community")
assert cli.query_e2ee_key(cli.address("community")) == pubkey1

# query in batch
assert cli.query_e2ee_keys(cli.address("validator"), cli.address("community")) == [
pubkey0,
pubkey1,
]

# prepare data file to encrypt
content = "Hello World!"
Expand Down
18 changes: 18 additions & 0 deletions proto/e2ee/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ service Query {
rpc Key(KeyRequest) returns (KeyResponse) {
option (google.api.http).get = "/e2ee/v1/key/{address}";
}
// Keys queries the encryption keys for a batch of addresses
rpc Keys(KeysRequest) returns (KeysResponse) {
option (google.api.http) = {
post: "/e2ee/v1/keys"
body: "*"
};
}
}

// KeyRequest is the request type for the Query/Key RPC method.
Expand All @@ -22,3 +29,14 @@ message KeyRequest {
message KeyResponse {
string key = 1;
}


// KeysRequest is the request type for the Query/Key RPC method.
message KeysRequest {
repeated string addresses = 1;
}

// KeysResponse is the response type for the Query/Key RPC method.
message KeysResponse {
repeated string keys = 1;
}
6 changes: 6 additions & 0 deletions x/e2ee/autocli.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions {
Short: "Query an encryption key by address",
PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "address"}},
},
{
RpcMethod: "Keys",
Use: "keys [addresses] ...",
Short: "Query a batch of encryption key by addresses",
PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "addresses", Varargs: true}},
},
},
},
Tx: &autocliv1.ServiceCommandDescriptor{
Expand Down
17 changes: 9 additions & 8 deletions x/e2ee/client/cli/encrypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,16 @@

// query encryption key from chain state
client := types.NewQueryClient(clientCtx)
rsp, err := client.Keys(clientCtx.CmdContext, &types.KeysRequest{
Addresses: recs,
})
if err != nil {
return err

Check warning on line 47 in x/e2ee/client/cli/encrypt.go

View check run for this annotation

Codecov / codecov/patch

x/e2ee/client/cli/encrypt.go#L47

Added line #L47 was not covered by tests
}

recipients := make([]age.Recipient, len(recs))
for i, rec := range recs {
rsp, err := client.Key(clientCtx.CmdContext, &types.KeyRequest{
Address: rec,
})
if err != nil {
return err
}
recipient, err := age.ParseX25519Recipient(rsp.Key)
for i, key := range rsp.Keys {
recipient, err := age.ParseX25519Recipient(key)
if err != nil {
return err
}
Expand Down
15 changes: 15 additions & 0 deletions x/e2ee/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,18 @@
value := sdkCtx.KVStore(k.storeKey).Get(types.KeyPrefix(bz))
return &types.KeyResponse{Key: string(value)}, nil
}

func (k Keeper) Keys(ctx context.Context, requests *types.KeysRequest) (*types.KeysResponse, error) {
store := sdk.UnwrapSDKContext(ctx).KVStore(k.storeKey)
var rsp types.KeysResponse
for _, address := range requests.Addresses {
bz, err := k.addressCodec.StringToBytes(address)
if err != nil {
return nil, err

Check warning on line 95 in x/e2ee/keeper/keeper.go

View check run for this annotation

Codecov / codecov/patch

x/e2ee/keeper/keeper.go#L89-L95

Added lines #L89 - L95 were not covered by tests
}
value := store.Get(types.KeyPrefix(bz))
rsp.Keys = append(rsp.Keys, string(value))

Check warning on line 98 in x/e2ee/keeper/keeper.go

View check run for this annotation

Codecov / codecov/patch

x/e2ee/keeper/keeper.go#L97-L98

Added lines #L97 - L98 were not covered by tests
}

return &rsp, nil

Check warning on line 101 in x/e2ee/keeper/keeper.go

View check run for this annotation

Codecov / codecov/patch

x/e2ee/keeper/keeper.go#L101

Added line #L101 was not covered by tests
}
Loading
Loading