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?
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:
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.
VRFParamsare broadcast just like BlockParts. Also, this value is managed in the internal state in the same way as commit.Things to think about