mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-01 01:32:13 +00:00
* crypto/merkle: Remove byter in favor of plain byte slices This PR is fully backwards compatible in terms of function output! (The Go API differs though) The only test case changes was to refactor it to be table driven. * Update godocs per review comments
79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
package types
|
|
|
|
import (
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
"github.com/tendermint/tendermint/crypto/merkle"
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
cmn "github.com/tendermint/tendermint/libs/common"
|
|
)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// ABCIResult is the deterministic component of a ResponseDeliverTx.
|
|
// TODO: add Tags
|
|
type ABCIResult struct {
|
|
Code uint32 `json:"code"`
|
|
Data cmn.HexBytes `json:"data"`
|
|
}
|
|
|
|
// Hash returns the canonical hash of the ABCIResult
|
|
func (a ABCIResult) Hash() []byte {
|
|
bz := tmhash.Sum(cdcEncode(a))
|
|
return bz
|
|
}
|
|
|
|
func (a ABCIResult) Bytes() []byte {
|
|
return cdcEncode(a)
|
|
}
|
|
|
|
// ABCIResults wraps the deliver tx results to return a proof
|
|
type ABCIResults []ABCIResult
|
|
|
|
// NewResults creates ABCIResults from the list of ResponseDeliverTx.
|
|
func NewResults(responses []*abci.ResponseDeliverTx) ABCIResults {
|
|
res := make(ABCIResults, len(responses))
|
|
for i, d := range responses {
|
|
res[i] = NewResultFromResponse(d)
|
|
}
|
|
return res
|
|
}
|
|
|
|
// NewResultFromResponse creates ABCIResult from ResponseDeliverTx.
|
|
func NewResultFromResponse(response *abci.ResponseDeliverTx) ABCIResult {
|
|
return ABCIResult{
|
|
Code: response.Code,
|
|
Data: response.Data,
|
|
}
|
|
}
|
|
|
|
// Bytes serializes the ABCIResponse using wire
|
|
func (a ABCIResults) Bytes() []byte {
|
|
bz, err := cdc.MarshalBinary(a)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return bz
|
|
}
|
|
|
|
// Hash returns a merkle hash of all results
|
|
func (a ABCIResults) Hash() []byte {
|
|
// NOTE: we copy the impl of the merkle tree for txs -
|
|
// we should be consistent and either do it for both or not.
|
|
return merkle.SimpleHashFromByteSlices(a.toByteSlices())
|
|
}
|
|
|
|
// ProveResult returns a merkle proof of one result from the set
|
|
func (a ABCIResults) ProveResult(i int) merkle.SimpleProof {
|
|
_, proofs := merkle.SimpleProofsFromByteSlices(a.toByteSlices())
|
|
return *proofs[i]
|
|
}
|
|
|
|
func (a ABCIResults) toByteSlices() [][]byte {
|
|
l := len(a)
|
|
bzs := make([][]byte, l)
|
|
for i := 0; i < l; i++ {
|
|
bzs[i] = a[i].Bytes()
|
|
}
|
|
return bzs
|
|
}
|