package types_test import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto/merkle" ) func TestHashAndProveResults(t *testing.T) { trs := []*abci.ExecTxResult{ // Note, these tests rely on the first two entries being in this order. {Code: 0, Data: nil}, {Code: 0, Data: []byte{}}, {Code: 0, Data: []byte("one")}, {Code: 14, Data: nil}, {Code: 14, Data: []byte("foo")}, {Code: 14, Data: []byte("bar")}, } // Nil and []byte{} should produce the same bytes bz0, err := trs[0].Marshal() require.NoError(t, err) bz1, err := trs[1].Marshal() require.NoError(t, err) require.Equal(t, bz0, bz1) // Make sure that we can get a root hash from results and verify proofs. rs, err := abci.MarshalTxResults(trs) require.NoError(t, err) root := merkle.HashFromByteSlices(rs) assert.NotEmpty(t, root) _, proofs := merkle.ProofsFromByteSlices(rs) for i, tr := range trs { bz, err := tr.Marshal() require.NoError(t, err) valid := proofs[i].Verify(root, bz) assert.NoError(t, valid, "%d", i) } } func TestHashDeterministicFieldsOnly(t *testing.T) { tr1 := abci.ExecTxResult{ Code: 1, Data: []byte("transaction"), Log: "nondeterministic data: abc", Info: "nondeterministic data: abc", GasWanted: 1000, GasUsed: 1000, Events: []abci.Event{}, Codespace: "nondeterministic.data.abc", } tr2 := abci.ExecTxResult{ Code: 1, Data: []byte("transaction"), Log: "nondeterministic data: def", Info: "nondeterministic data: def", GasWanted: 1000, GasUsed: 1000, Events: []abci.Event{}, Codespace: "nondeterministic.data.def", } r1, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr1}) require.NoError(t, err) r2, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr2}) require.NoError(t, err) require.Equal(t, merkle.HashFromByteSlices(r1), merkle.HashFromByteSlices(r2)) }