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

feat(sequencers): whitelisted relayers #572

Merged
merged 22 commits into from
Oct 29, 2024

Conversation

keruch
Copy link
Contributor

@keruch keruch commented Oct 10, 2024

Description

ADR link https://www.notion.so/dymension/ADR-Whitelisted-Relayer-Fee-Exemption-in-Rollapp-104a4a51f86a80e8ad94c916c87deb17
Closes dymensionxyz/dymension#1226


Closes #XXX

All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow-up issues.

PR review checkboxes:

I have...

  • Added a relevant changelog entry to the Unreleased section in CHANGELOG.md
  • Targeted PR against the correct branch
  • included the correct type prefix in the PR title
  • Linked to the GitHub issue with discussion and accepted design
  • Targets only one GitHub issue
  • Wrote unit and integration tests
  • Wrote relevant migration scripts if necessary
  • All CI checks have passed
  • Added relevant godoc comments
  • Add an issue in the e2e-tests repo if necessary

SDK Checklist

  • Import/Export Genesis
  • Registered Invariants
  • Registered Events
  • Updated openapi.yaml
  • No usage of go map
  • No usage of time.Now()
  • Used fixed point arithmetic and not float arithmetic
  • Avoid panicking in Begin/End block as much as possible
  • No unexpected math Overflow
  • Used sendCoin and not SendCoins
  • Out-of-block compute is bounded
  • No serialized ID at the end of store keys
  • UInt to byte conversion should use BigEndian

Full security checklist here


For Reviewer:

  • Confirmed the correct type prefix in the PR title
  • Reviewers assigned
  • Confirmed all author checklist items have been addressed

After reviewer approval:

  • In case the PR targets the main branch, PR should not be squash merge in order to keep meaningful git history.
  • In case the PR targets a release branch, PR must be rebased.

@keruch keruch self-assigned this Oct 10, 2024
@keruch keruch requested a review from a team as a code owner October 10, 2024 15:39
@keruch keruch marked this pull request as draft October 10, 2024 15:39
@keruch keruch force-pushed the kirill/1226-whitelisted-relayers branch from a74f418 to f40c59f Compare October 10, 2024 18:00
@keruch keruch marked this pull request as ready for review October 10, 2024 18:21
zale144
zale144 previously approved these changes Oct 11, 2024
Copy link
Contributor

@zale144 zale144 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good. left a couple of questions

proto/sequencers/sequencers.proto Show resolved Hide resolved
x/sequencers/keeper/msg_server.go Show resolved Hide resolved
Base automatically changed from kirill/1248-sequencer-reward-addr to main October 13, 2024 06:56
@mtsitrin mtsitrin dismissed zale144’s stale review October 13, 2024 06:56

The base branch was changed.

@keruch keruch marked this pull request as draft October 15, 2024 17:13
@keruch
Copy link
Contributor Author

keruch commented Oct 15, 2024

the task is suspended until the RollApp-Hub ADR is ready.

@keruch keruch marked this pull request as ready for review October 16, 2024 15:45
@keruch
Copy link
Contributor Author

keruch commented Oct 18, 2024

the PR is ready for review once again!

proto/sequencers/tx.proto Show resolved Hide resolved

// Consensus Messages
rpc UpsertSequencer(ConsensusMsgUpsertSequencer) returns (ConsensusMsgUpsertSequencerResponse);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how this TX prevented from being sent manually on the L2?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as discussed, it can be sent by only by the owner of the address (i.e sequencer can update it's own reward and relayer address which is fine)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not talking about the update msgs, but the UpsertSequencer which creates new sequencer.
It's supposed to be treated solely as Consesnsus msg

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

anyway, if it can be run by L2 users, we need to validate the pubkey (as we had in create_sequencer before).
I prefer to handle it as trusted consensus msg

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as discussed gonna block it from running by the L2.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i added a hack what allows the message to be executed only as part of RequestBeginBlocker.

basically, we say that the only signer is x/seqeucners module addr, thus in practice no one can sign this message. however, while processing consensus msgs, we trigger the execution through MsgServiceRouter and bypass the ante handler that verifies signatures, thus this msg can be executed as consensus msg.

// GetSigners returns signers of the msg. The only signer is x/sequencers which allows this msg
// to be executed only as part of consensus msgs.
func (m *ConsensusMsgUpsertSequencer) GetSigners() []sdk.AccAddress {
	authority := authtypes.NewModuleAddress(ModuleName)
	return []sdk.AccAddress{authority}
}

Copy link
Contributor

@omritoptix omritoptix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the export genesis is explicitly setting the reward address though we have this already as a field on the sequencer (old code). not sure why?

// ExportGenesis returns the sequencers module's exported genesis.
func (k *Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
	genesis := types.DefaultGenesis()
	genesis.Params = k.GetParams(ctx)

	sequencersAsValidators := k.GetAllSequencers(ctx)
	genesis.Sequencers = make([]types.Sequencer, len(sequencersAsValidators))
	for i, v := range sequencersAsValidators {
		genesis.Sequencers[i].Validator = &v
		rewardAddr, ok := k.GetRewardAddr(ctx, v.GetOperator())
		if ok {
			genesis.Sequencers[i].RewardAddr = rewardAddr.String()
		}
	}

	return genesis
}

Also seems like we're not setting the RelayerAddress collection upon genesis import?

@keruch
Copy link
Contributor Author

keruch commented Oct 29, 2024

the export genesis is explicitly setting the reward address though we have this already as a field on the sequencer (old code). not sure why?

@omritoptix we don't store Sequencer type anywhere, it's used only for genesis. instead, we store 3 keys in the state: staking.Validator, whitelisted relayers, reward addr. i did this due to backward compatibility (previously we were storing only staking.Validator).

@keruch keruch force-pushed the kirill/1226-whitelisted-relayers branch from 751b67e to 772c2e2 Compare October 29, 2024 11:36
@omritoptix omritoptix merged commit 5450517 into main Oct 29, 2024
7 checks passed
@omritoptix omritoptix deleted the kirill/1226-whitelisted-relayers branch October 29, 2024 16:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Sequencer zero-fee relayer address registration
4 participants