Skip to content

Commit

Permalink
avoid unnecessary get code call when address doesn't have code hash (0…
Browse files Browse the repository at this point in the history
  • Loading branch information
tclemos authored Jan 30, 2024
1 parent b938572 commit 3f537af
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
3 changes: 3 additions & 0 deletions merkletree/tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ func (tree *StateTree) GetCode(ctx context.Context, address common.Address, root
}

k := new(big.Int).SetBytes(scCodeHash)
if k.Cmp(big.NewInt(0)) == 0 {
return []byte{}, nil
}

// this code gets actual smart contract code from sc code storage
scCode, err := tree.getProgram(ctx, scalarToh4(k))
Expand Down
86 changes: 86 additions & 0 deletions merkletree/tree_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package merkletree

import (
"context"
"fmt"
"testing"

"github.com/0xPolygonHermez/zkevm-node/hex"
"github.com/0xPolygonHermez/zkevm-node/test/contracts/bin/EmitLog2"
"github.com/0xPolygonHermez/zkevm-node/test/testutils"
"github.com/ethereum/go-ethereum/common"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
)

func TestGetCode(t *testing.T) {
ctx := context.Background()
zkProverURI := testutils.GetEnv("ZKPROVER_URI", "localhost")

cfg := Config{URI: fmt.Sprintf("%s:50061", zkProverURI)}
c, _, _ := NewMTDBServiceClient(ctx, cfg)
sTree := NewStateTree(c)

type testCase struct {
name string
addr common.Address
root []byte
expectedResult []byte
expectedError error
setup func(*testing.T, *testCase, *StateTree)
}

testCases := []testCase{
{
name: "get existent code successfully",
addr: common.HexToAddress("0x1"),
root: common.HexToHash("0x0").Bytes(),
expectedResult: hex.DecodeBig(EmitLog2.EmitLog2Bin).Bytes(),
expectedError: nil,
setup: func(t *testing.T, tc *testCase, sTree *StateTree) {
txID := uuid.NewString()

err := sTree.StartBlock(ctx, common.Hash(tc.root), txID)
require.NoError(t, err)

newRoot, _, err := sTree.SetCode(ctx, tc.addr, tc.expectedResult, tc.root, txID)
require.NoError(t, err)
tc.root = newRoot

err = sTree.FinishBlock(ctx, common.Hash(tc.root), txID)
require.NoError(t, err)

err = sTree.Flush(ctx, common.Hash(newRoot), txID)
require.NoError(t, err)
},
},
{
name: "get non-existent code successfully",
addr: common.HexToAddress("0x2"),
root: common.HexToHash("0x0").Bytes(),
expectedResult: []byte{},
expectedError: nil,
setup: func(t *testing.T, tc *testCase, sTree *StateTree) {
},
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
tc := tc
tc.setup(t, &tc, sTree)

result, err := sTree.GetCode(ctx, tc.addr, tc.root)
require.NoError(t, err)

if tc.expectedResult != nil || result != nil {
require.Equal(t, len(tc.expectedResult), len(result))
require.ElementsMatch(t, tc.expectedResult, result)
}

if tc.expectedError != nil || err != nil {
require.Equal(t, tc.expectedError, err)
}
})
}
}

0 comments on commit 3f537af

Please sign in to comment.