package types import ( "fmt" "golang.org/x/crypto/ripemd160" abci "github.com/tendermint/abci/types" wire "github.com/tendermint/go-wire" "github.com/tendermint/go-wire/data" "github.com/tendermint/tmlibs/merkle" ) //----------------------------------------------------------------------------- // ABCIResult is the deterministic component of a ResponseDeliverTx. type ABCIResult struct { Code uint32 `json:"code"` Data data.Bytes `json:"data"` } // Hash returns the canonical json hash of the ABCIResult func (a ABCIResult) Hash() []byte { // stupid canonical json output, easy to check in any language bs := fmt.Sprintf(`{"code":%d,"data":"%s"}`, a.Code, a.Data) var hasher = ripemd160.New() hasher.Write([]byte(bs)) return hasher.Sum(nil) } // ABCIResults wraps the deliver tx results to return a proof type ABCIResults []ABCIResult // NewResults creates ABCIResults from ResponseDeliverTx func NewResults(del []*abci.ResponseDeliverTx) ABCIResults { res := make(ABCIResults, len(del)) for i, d := range del { res[i] = NewResultFromResponse(d) } return res } func NewResultFromResponse(response *abci.ResponseDeliverTx) ABCIResult { return ABCIResult{ Code: response.Code, Data: response.Data, } } // Bytes serializes the ABCIResponse using go-wire func (a ABCIResults) Bytes() []byte { return wire.BinaryBytes(a) } // Hash returns a merkle hash of all results func (a ABCIResults) Hash() []byte { return merkle.SimpleHashFromHashables(a.toHashables()) } // ProveResult returns a merkle proof of one result from the set func (a ABCIResults) ProveResult(i int) merkle.SimpleProof { _, proofs := merkle.SimpleProofsFromHashables(a.toHashables()) return *proofs[i] } func (a ABCIResults) toHashables() []merkle.Hashable { l := len(a) hashables := make([]merkle.Hashable, l) for i := 0; i < l; i++ { hashables[i] = a[i] } return hashables }