2017-12-22 08:59:52 -08:00
|
|
|
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"
|
|
|
|
)
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
2017-12-25 10:47:16 -08:00
|
|
|
// ABCIResult is the deterministic component of a ResponseDeliverTx.
|
2017-12-22 08:59:52 -08:00
|
|
|
type ABCIResult struct {
|
|
|
|
Code uint32 `json:"code"`
|
|
|
|
Data data.Bytes `json:"data"`
|
|
|
|
}
|
|
|
|
|
2017-12-25 10:47:16 -08:00
|
|
|
// Hash returns the canonical json hash of the ABCIResult
|
2017-12-22 08:59:52 -08:00
|
|
|
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 {
|
2017-12-25 10:47:16 -08:00
|
|
|
res[i] = NewResultFromResponse(d)
|
2017-12-22 08:59:52 -08:00
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
2017-12-25 10:47:16 -08:00
|
|
|
func NewResultFromResponse(response *abci.ResponseDeliverTx) ABCIResult {
|
|
|
|
return ABCIResult{
|
|
|
|
Code: response.Code,
|
|
|
|
Data: response.Data,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-22 08:59:52 -08:00
|
|
|
// 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
|
|
|
|
}
|