mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-07 05:46:32 +00:00
This change set implements the most recent version of `FinalizeBlock`. # What does this change actually contain? * This change set is rather large but fear not! The majority of the files touched and changes are renaming `ResponseDeliverTx` to `ExecTxResult`. This should be a pretty inoffensive change since they're effectively the same type but with a different name. * The `execBlockOnProxyApp` was totally removed since it served as just a wrapper around the logic that is now mostly encapsulated within `FinalizeBlock` * The `updateState` helper function has been made a public method on `State`. It was being exposed as a shim through the testing infrastructure, so this seemed innocuous. * Tests already existed to ensure that the application received the `ByzantineValidators` and the `ValidatorUpdates`, but one was fixed up to ensure that `LastCommitInfo` was being sent across. * Tests were removed from the `psql` indexer that seemed to search for an event in the indexer that was not being created. # Questions for reviewers * We store this [ABCIResponses](5721a13ab1/proto/tendermint/state/types.pb.go (L37)) type in the data base as the block results. This type has changed since v0.35 to contain the `FinalizeBlock` response. I'm wondering if we need to do any shimming to keep the old data retrieveable? * Similarly, this change is exposed via the RPC through [ResultBlockResults](5721a13ab1/rpc/coretypes/responses.go (L69)) changing. Should we somehow shim or notify for this change? closes: #7658
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package types
|
|
|
|
import (
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
"github.com/tendermint/tendermint/crypto/merkle"
|
|
)
|
|
|
|
// ABCIResults wraps the deliver tx results to return a proof.
|
|
type ABCIResults []*abci.ExecTxResult
|
|
|
|
// NewResults strips non-deterministic fields from ResponseDeliverTx responses
|
|
// and returns ABCIResults.
|
|
func NewResults(responses []*abci.ExecTxResult) ABCIResults {
|
|
res := make(ABCIResults, len(responses))
|
|
for i, d := range responses {
|
|
res[i] = deterministicExecTxResult(d)
|
|
}
|
|
return res
|
|
}
|
|
|
|
// Hash returns a merkle hash of all results.
|
|
func (a ABCIResults) Hash() []byte {
|
|
return merkle.HashFromByteSlices(a.toByteSlices())
|
|
}
|
|
|
|
// ProveResult returns a merkle proof of one result from the set
|
|
func (a ABCIResults) ProveResult(i int) merkle.Proof {
|
|
_, proofs := merkle.ProofsFromByteSlices(a.toByteSlices())
|
|
return *proofs[i]
|
|
}
|
|
|
|
func (a ABCIResults) toByteSlices() [][]byte {
|
|
l := len(a)
|
|
bzs := make([][]byte, l)
|
|
for i := 0; i < l; i++ {
|
|
bz, err := a[i].Marshal()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
bzs[i] = bz
|
|
}
|
|
return bzs
|
|
}
|
|
|
|
// deterministicExecTxResult strips non-deterministic fields from
|
|
// ResponseDeliverTx and returns another ResponseDeliverTx.
|
|
func deterministicExecTxResult(response *abci.ExecTxResult) *abci.ExecTxResult {
|
|
return &abci.ExecTxResult{
|
|
Code: response.Code,
|
|
Data: response.Data,
|
|
GasWanted: response.GasWanted,
|
|
GasUsed: response.GasUsed,
|
|
}
|
|
}
|