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.MarshalBinaryLengthPrefixed(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
|
|
}
|