github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/abci/types/types_test.go (about)

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