Skip to content
Draft
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
430 changes: 430 additions & 0 deletions AuditSpec.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ import (
upgrades "github.com/LumeraProtocol/lumera/app/upgrades"
appParams "github.com/LumeraProtocol/lumera/app/upgrades/params"
actionmodulekeeper "github.com/LumeraProtocol/lumera/x/action/v1/keeper"
auditmodulekeeper "github.com/LumeraProtocol/lumera/x/audit/v1/keeper"
claimmodulekeeper "github.com/LumeraProtocol/lumera/x/claim/keeper"
lumeraidmodulekeeper "github.com/LumeraProtocol/lumera/x/lumeraid/keeper"
sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types"
Expand Down Expand Up @@ -150,6 +151,7 @@ type App struct {
LumeraidKeeper lumeraidmodulekeeper.Keeper
ClaimKeeper claimmodulekeeper.Keeper
SupernodeKeeper sntypes.SupernodeKeeper
AuditKeeper auditmodulekeeper.Keeper
ActionKeeper actionmodulekeeper.Keeper
// this line is used by starport scaffolding # stargate/app/keeperDeclaration

Expand Down Expand Up @@ -252,6 +254,7 @@ func New(
&app.LumeraidKeeper,
&app.ClaimKeeper,
&app.SupernodeKeeper,
&app.AuditKeeper,
&app.ActionKeeper,
// this line is used by starport scaffolding # stargate/app/keeperDefinition
); err != nil {
Expand Down
9 changes: 9 additions & 0 deletions app/app_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ import (
upgradetypes "cosmossdk.io/x/upgrade/types"
actionmodulev1 "github.com/LumeraProtocol/lumera/x/action/v1/module"
actionmoduletypes "github.com/LumeraProtocol/lumera/x/action/v1/types"
auditmodulev1 "github.com/LumeraProtocol/lumera/x/audit/v1/module"
auditmoduletypes "github.com/LumeraProtocol/lumera/x/audit/v1/types"
claimmodulev1 "github.com/LumeraProtocol/lumera/x/claim/module"
claimmoduletypes "github.com/LumeraProtocol/lumera/x/claim/types"
lumeraidmodulev1 "github.com/LumeraProtocol/lumera/x/lumeraid/module"
Expand Down Expand Up @@ -121,6 +123,7 @@ var (
wasmtypes.ModuleName,
claimmoduletypes.ModuleName,
supernodemoduletypes.ModuleName,
auditmoduletypes.ModuleName,
actionmoduletypes.ModuleName,
// this line is used by starport scaffolding # stargate/app/initGenesis
}
Expand Down Expand Up @@ -149,6 +152,7 @@ var (
wasmtypes.ModuleName,
claimmoduletypes.ModuleName,
supernodemoduletypes.ModuleName,
auditmoduletypes.ModuleName,
actionmoduletypes.ModuleName,
// this line is used by starport scaffolding # stargate/app/beginBlockers
}
Expand All @@ -171,6 +175,7 @@ var (
wasmtypes.ModuleName,
claimmoduletypes.ModuleName,
supernodemoduletypes.ModuleName,
auditmoduletypes.ModuleName,
actionmoduletypes.ModuleName,
// this line is used by starport scaffolding # stargate/app/endBlockers
}
Expand Down Expand Up @@ -338,6 +343,10 @@ var (
Name: supernodemoduletypes.ModuleName,
Config: appconfig.WrapAny(&supernodemodulev1.Module{}),
},
{
Name: auditmoduletypes.ModuleName,
Config: appconfig.WrapAny(&auditmodulev1.Module{}),
},
{
Name: actionmoduletypes.ModuleName,
Config: appconfig.WrapAny(&actionmodulev1.Module{}),
Expand Down
2 changes: 1 addition & 1 deletion config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ genesis:
max_processing_time: 1h0m0s
expiration_duration: 24h0m0s
claim:
total_claimable_amount: '18749999991853'
total_claimable_amount: '18749999981413'
params:
claim_end_time: '1767225600' # Jan 1 2026, 00:00:00
crisis:
Expand Down
2 changes: 1 addition & 1 deletion docs/static/openapi.yml

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions proto/lumera/audit/module/v1/module.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
syntax = "proto3";
package lumera.audit.module.v1;

option go_package = "x/audit/v1/module;audit";

import "cosmos/app/v1alpha1/module.proto";

// Module is the config object for the module.
message Module {
option (cosmos.app.v1alpha1.module) = {
go_import: "github.com/LumeraProtocol/lumera/x/audit/v1"
};

// authority defines the custom module authority. If not set, defaults to the governance module.
string authority = 1;
}
83 changes: 83 additions & 0 deletions proto/lumera/audit/v1/audit.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
syntax = "proto3";
package lumera.audit.v1;

option go_package = "x/audit/v1/types";

import "amino/amino.proto";
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";

enum PortState {
PORT_STATE_UNKNOWN = 0;
PORT_STATE_OPEN = 1;
PORT_STATE_CLOSED = 2;
}

message AuditSelfReport {
double cpu_usage_percent = 1;
double mem_usage_percent = 2;
double disk_usage_percent = 3;

// inbound_port_states[i] refers to required_open_ports[i] for the window.
repeated PortState inbound_port_states = 4;

uint32 failed_actions_count = 5;
}

message AuditPeerObservation {
string target_supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];

// port_states[i] refers to required_open_ports[i] for the window.
repeated PortState port_states = 2;
}

message AuditReport {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
uint64 window_id = 2;
int64 report_height = 3;

AuditSelfReport self_report = 4 [(gogoproto.nullable) = false];
repeated AuditPeerObservation peer_observations = 5;
}

// Per-window, per-supernode reachability/compliance status history.
message AuditWindowStatus {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
uint64 window_id = 2;

bool compliant = 3;
repeated string reasons = 4;

// required_ports_state[i] refers to required_open_ports[i] for the window.
repeated PortState required_ports_state = 5;
}

message PortEvidenceAggregate {
uint32 count = 1;
PortState first_state = 2;
bool conflict = 3;
}

// Evidence aggregated per (window_id, target_supernode_account).
message TargetEvidenceAggregate {
uint64 window_id = 1;
string target_supernode_account = 2 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];

// required_ports[i] refers to required_open_ports[i] for the window.
repeated PortEvidenceAggregate required_ports = 3 [(gogoproto.nullable) = false];
}

message WindowSnapshot {
uint64 window_id = 1;
int64 window_start_height = 2;

bytes seed_bytes = 3;

repeated string senders = 4 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
repeated string receivers = 5 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];

uint32 k_window = 6;

// Snapshot of Params.required_open_ports at window start.
repeated uint32 required_open_ports = 7;
}
17 changes: 17 additions & 0 deletions proto/lumera/audit/v1/genesis.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
syntax = "proto3";
package lumera.audit.v1;

option go_package = "x/audit/v1/types";

import "amino/amino.proto";
import "gogoproto/gogo.proto";

import "lumera/audit/v1/params.proto";

// GenesisState defines the audit module's genesis state.
message GenesisState {
Params params = 1 [
(gogoproto.nullable) = false,
(amino.dont_omitempty) = true
];
}
21 changes: 21 additions & 0 deletions proto/lumera/audit/v1/params.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
syntax = "proto3";
package lumera.audit.v1;

option go_package = "x/audit/v1/types";

import "amino/amino.proto";
import "gogoproto/gogo.proto";

// Params defines the parameters for the audit module.
message Params {
option (gogoproto.equal) = true;

uint64 reporting_window_blocks = 1;
uint64 missing_report_grace_blocks = 2;

uint32 peer_quorum_reports = 3;
uint32 min_probe_targets_per_window = 4;
uint32 max_probe_targets_per_window = 5;

repeated uint32 required_open_ports = 6;
}
111 changes: 111 additions & 0 deletions proto/lumera/audit/v1/query.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
syntax = "proto3";
package lumera.audit.v1;

option go_package = "x/audit/v1/types";

import "amino/amino.proto";
import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "cosmos_proto/cosmos.proto";
import "cosmos/base/query/v1beta1/pagination.proto";

import "lumera/audit/v1/params.proto";
import "lumera/audit/v1/audit.proto";

// Query defines the gRPC querier service.
service Query {
// Parameters queries the parameters of the module.
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/params";
}

// CurrentWindow returns the current derived window boundaries at the current chain height.
rpc CurrentWindow(QueryCurrentWindowRequest) returns (QueryCurrentWindowResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/current_window";
}

rpc AuditWindowStatus(QueryAuditWindowStatusRequest) returns (QueryAuditWindowStatusResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/audit_window_status/{supernode_account}/{window_id}";
}

rpc AuditWindowStatusLatest(QueryAuditWindowStatusLatestRequest) returns (QueryAuditWindowStatusLatestResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/audit_window_status_latest/{supernode_account}";
}

rpc AuditReport(QueryAuditReportRequest) returns (QueryAuditReportResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/audit_report/{window_id}/{supernode_account}";
}

rpc AuditReportsByReporter(QueryAuditReportsByReporterRequest) returns (QueryAuditReportsByReporterResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/audit_reports_by_reporter/{supernode_account}";
}

// AssignedTargets returns the exact ordered target list that MsgSubmitAuditReport.peer_observations must match.
rpc AssignedTargets(QueryAssignedTargetsRequest) returns (QueryAssignedTargetsResponse) {
option (google.api.http).get = "/LumeraProtocol/lumera/audit/v1/assigned_targets/{supernode_account}/{window_id}";
}
}

message QueryParamsRequest {}

message QueryParamsResponse {
Params params = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

message QueryCurrentWindowRequest {}

message QueryCurrentWindowResponse {
uint64 window_id = 1;
int64 window_start_height = 2;
int64 window_end_height = 3;
int64 grace_end_height = 4;
}

message QueryAuditWindowStatusRequest {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
uint64 window_id = 2;
}

message QueryAuditWindowStatusResponse {
AuditWindowStatus status = 1 [(gogoproto.nullable) = false];
}

message QueryAuditWindowStatusLatestRequest {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
}

message QueryAuditWindowStatusLatestResponse {
AuditWindowStatus status = 1 [(gogoproto.nullable) = false];
}

message QueryAuditReportRequest {
uint64 window_id = 1;
string supernode_account = 2 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
}

message QueryAuditReportResponse {
AuditReport report = 1 [(gogoproto.nullable) = false];
}

message QueryAuditReportsByReporterRequest {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

message QueryAuditReportsByReporterResponse {
repeated AuditReport reports = 1 [(gogoproto.nullable) = false];
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

message QueryAssignedTargetsRequest {
string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
uint64 window_id = 2;
}

message QueryAssignedTargetsResponse {
uint64 window_id = 1;
int64 window_start_height = 2;
uint32 k_window = 3;
repeated uint32 required_open_ports = 4;
repeated string target_supernode_accounts = 5 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
}
45 changes: 45 additions & 0 deletions proto/lumera/audit/v1/tx.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
syntax = "proto3";
package lumera.audit.v1;

option go_package = "x/audit/v1/types";

import "amino/amino.proto";
import "gogoproto/gogo.proto";
import "cosmos/msg/v1/msg.proto";
import "cosmos_proto/cosmos.proto";

import "lumera/audit/v1/audit.proto";
import "lumera/audit/v1/params.proto";

// Msg defines the Msg service.
service Msg {
option (cosmos.msg.v1.service) = true;

// UpdateParams defines a (governance) operation for updating the module
// parameters. The authority defaults to the x/gov module account.
rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse);

rpc SubmitAuditReport(MsgSubmitAuditReport) returns (MsgSubmitAuditReportResponse);
}

message MsgUpdateParams {
option (cosmos.msg.v1.signer) = "authority";
option (amino.name) = "lumera/x/audit/v1/MsgUpdateParams";

string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
Params params = 2 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

message MsgUpdateParamsResponse {}

message MsgSubmitAuditReport {
option (cosmos.msg.v1.signer) = "supernode_account";

string supernode_account = 1 [(cosmos_proto.scalar) = "cosmos.AccAddressString"];
uint64 window_id = 2;

AuditSelfReport self_report = 3 [(gogoproto.nullable) = false];
repeated AuditPeerObservation peer_observations = 4;
}

message MsgSubmitAuditReportResponse {}
Loading