Writing vote extensions to state is possible using the SDK's PreBlocker - which allows you to modify the state before the block is executed
and committed. Since the vote extensions not directly accessible from the PreBlocker, we inject the vote extensions in PrepareProposal and verify them in ProcessProposal before a block is accepted by the network.
The PreBlockHandler assumes that the vote extensions are already verified by validators in the network and are ready to be aggregated. A bad vote extension included in a proposal implies that the
network has accepted a bad proposal.
To use the preblock handler, you need to initialize the preblock handler in your app.go file. By default, we encourage users to use the aggregation function defined in abci/preblock/math to aggregate the votes. This will aggregate all prices and calculate a stake-weighted median for each supported asset.
The PreBlockHandler currently only supports assets that are initialized in the oracle keeper. However, allowing any type of asset can be supported with a small modification to WritePrices (TBD whether we will support this).