You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.0 KiB

  1. package types_test
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. abci "github.com/tendermint/tendermint/abci/types"
  7. "github.com/tendermint/tendermint/crypto/merkle"
  8. )
  9. func TestHashAndProveResults(t *testing.T) {
  10. trs := []*abci.ExecTxResult{
  11. // Note, these tests rely on the first two entries being in this order.
  12. {Code: 0, Data: nil},
  13. {Code: 0, Data: []byte{}},
  14. {Code: 0, Data: []byte("one")},
  15. {Code: 14, Data: nil},
  16. {Code: 14, Data: []byte("foo")},
  17. {Code: 14, Data: []byte("bar")},
  18. }
  19. // Nil and []byte{} should produce the same bytes
  20. bz0, err := trs[0].Marshal()
  21. require.NoError(t, err)
  22. bz1, err := trs[1].Marshal()
  23. require.NoError(t, err)
  24. require.Equal(t, bz0, bz1)
  25. // Make sure that we can get a root hash from results and verify proofs.
  26. rs, err := abci.MarshalTxResults(trs)
  27. require.NoError(t, err)
  28. root := merkle.HashFromByteSlices(rs)
  29. assert.NotEmpty(t, root)
  30. _, proofs := merkle.ProofsFromByteSlices(rs)
  31. for i, tr := range trs {
  32. bz, err := tr.Marshal()
  33. require.NoError(t, err)
  34. valid := proofs[i].Verify(root, bz)
  35. assert.NoError(t, valid, "%d", i)
  36. }
  37. }
  38. func TestHashDeterministicFieldsOnly(t *testing.T) {
  39. tr1 := abci.ExecTxResult{
  40. Code: 1,
  41. Data: []byte("transaction"),
  42. Log: "nondeterministic data: abc",
  43. Info: "nondeterministic data: abc",
  44. GasWanted: 1000,
  45. GasUsed: 1000,
  46. Events: []abci.Event{},
  47. Codespace: "nondeterministic.data.abc",
  48. }
  49. tr2 := abci.ExecTxResult{
  50. Code: 1,
  51. Data: []byte("transaction"),
  52. Log: "nondeterministic data: def",
  53. Info: "nondeterministic data: def",
  54. GasWanted: 1000,
  55. GasUsed: 1000,
  56. Events: []abci.Event{},
  57. Codespace: "nondeterministic.data.def",
  58. }
  59. r1, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr1})
  60. require.NoError(t, err)
  61. r2, err := abci.MarshalTxResults([]*abci.ExecTxResult{&tr2})
  62. require.NoError(t, err)
  63. require.Equal(t, merkle.HashFromByteSlices(r1), merkle.HashFromByteSlices(r2))
  64. }