Skip to content

Malicious proposers may choose VRF proof #553

@ulbqb

Description

@ulbqb

Problem

The current ostracon allows proposers to re-propose previously proposed blocks. A vrf proof exists in the block header to determine the next height proposer. Therefore, a malicious proposer may select and re-propose a block containing his/her preferred vrf proof from past round proposed blocks.

This is still a concern. It is not yet known that this attack is possible. However, I think that concerns can be eliminated by changing the specification so that the highest round proposer creates a VRF proof.

Proposal

I would suggest the following fixes:

message Block {
  Header                      header          = 1 [(gogoproto.nullable) = false];
  Data                        data            = 2 [(gogoproto.nullable) = false];
  ostracon.types.EvidenceList evidence        = 3 [(gogoproto.nullable) = false];
  Commit                      last_commit     = 4;
  VRFParams                   last_vrf_params = 5; // new field!!
}

// new message!!
message VRFParams {
  bytes proof = 1;
}

// Header defines the structure of an Ostracon block header.
message Header {
  ...
  // *** Ostracon Extended Fields ***
  // Note that MaxHeaderSize must be modified when adding/removing fields.

  // vrf info
  // int32 round = 1000; // remove this field!!
  // bytes proof = 1001; // remove this field!!
}

Since the latest proposer creates a VRF proof, it cannot be stored in the current block. Therefore, it is stored in the next block in the same way as last_commit. VRFParams are broadcast just like BlockParts. Also, this value is managed in the internal state in the same way as commit.

Things to think about

  • What problems does this attack pose?
  • Is this attack possible?
  • Assuming this attack is possible, is it realistic?
  • Can the highest round proposer rule prevent this attack?

Metadata

Metadata

Assignees

Labels

C: discussionClassification: Discuss somethingStaleFor github bot

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions