github.com/jpmorganchase/quorum@v21.1.0+incompatible/internal/ethapi/api_test.go (about)

     1  package ethapi
     2  
     3  import (
     4  	"context"
     5  	"math/big"
     6  	"os"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/ethereum/go-ethereum/accounts"
    11  	"github.com/ethereum/go-ethereum/common"
    12  	"github.com/ethereum/go-ethereum/common/hexutil"
    13  	"github.com/ethereum/go-ethereum/core"
    14  	"github.com/ethereum/go-ethereum/core/bloombits"
    15  	"github.com/ethereum/go-ethereum/core/rawdb"
    16  	"github.com/ethereum/go-ethereum/core/state"
    17  	"github.com/ethereum/go-ethereum/core/types"
    18  	"github.com/ethereum/go-ethereum/core/vm"
    19  	"github.com/ethereum/go-ethereum/crypto"
    20  	"github.com/ethereum/go-ethereum/eth/downloader"
    21  	"github.com/ethereum/go-ethereum/ethdb"
    22  	"github.com/ethereum/go-ethereum/event"
    23  	"github.com/ethereum/go-ethereum/log"
    24  	"github.com/ethereum/go-ethereum/multitenancy"
    25  	"github.com/ethereum/go-ethereum/params"
    26  	"github.com/ethereum/go-ethereum/private"
    27  	"github.com/ethereum/go-ethereum/private/engine"
    28  	"github.com/ethereum/go-ethereum/private/engine/notinuse"
    29  	"github.com/ethereum/go-ethereum/rpc"
    30  	"github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto"
    31  	"github.com/stretchr/testify/assert"
    32  )
    33  
    34  var (
    35  	arbitraryCtx         = context.Background()
    36  	arbitraryPrivateFrom = "arbitrary private from"
    37  	privateTxArgs        = &PrivateTxArgs{
    38  		PrivateFrom: arbitraryPrivateFrom,
    39  		PrivateFor:  []string{"arbitrary party 1", "arbitrary party 2"},
    40  	}
    41  	arbitraryFrom = common.BytesToAddress([]byte("arbitrary address"))
    42  
    43  	arbitrarySimpleStorageContractEncryptedPayloadHash = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash"))
    44  
    45  	simpleStorageContractCreationTx = types.NewContractCreation(
    46  		0,
    47  		big.NewInt(0),
    48  		hexutil.MustDecodeUint64("0x47b760"),
    49  		big.NewInt(0),
    50  		hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"))
    51  
    52  	rawSimpleStorageContractCreationTx = types.NewContractCreation(
    53  		0,
    54  		big.NewInt(0),
    55  		hexutil.MustDecodeUint64("0x47b760"),
    56  		big.NewInt(0),
    57  		arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
    58  
    59  	arbitrarySimpleStorageContractAddress                common.Address
    60  	arbitraryStandardPrivateSimpleStorageContractAddress common.Address
    61  
    62  	simpleStorageContractMessageCallTx                   *types.Transaction
    63  	standardPrivateSimpleStorageContractMessageCallTx    *types.Transaction
    64  	rawStandardPrivateSimpleStorageContractMessageCallTx *types.Transaction
    65  
    66  	arbitraryCurrentBlockNumber = big.NewInt(1)
    67  
    68  	publicStateDB  *state.StateDB
    69  	privateStateDB *state.StateDB
    70  )
    71  
    72  func TestMain(m *testing.M) {
    73  	setup()
    74  	retCode := m.Run()
    75  	teardown()
    76  	os.Exit(retCode)
    77  }
    78  
    79  func setup() {
    80  	log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true)))
    81  	var err error
    82  
    83  	memdb := rawdb.NewMemoryDatabase()
    84  	db := state.NewDatabase(memdb)
    85  
    86  	publicStateDB, err = state.New(common.Hash{}, db)
    87  	if err != nil {
    88  		panic(err)
    89  	}
    90  	privateStateDB, err = state.New(common.Hash{}, db)
    91  	if err != nil {
    92  		panic(err)
    93  	}
    94  
    95  	private.P = &StubPrivateTransactionManager{}
    96  
    97  	key, _ := crypto.GenerateKey()
    98  	from := crypto.PubkeyToAddress(key.PublicKey)
    99  
   100  	arbitrarySimpleStorageContractAddress = crypto.CreateAddress(from, 0)
   101  
   102  	simpleStorageContractMessageCallTx = types.NewTransaction(
   103  		0,
   104  		arbitrarySimpleStorageContractAddress,
   105  		big.NewInt(0),
   106  		hexutil.MustDecodeUint64("0x47b760"),
   107  		big.NewInt(0),
   108  		hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000d"))
   109  
   110  	arbitraryStandardPrivateSimpleStorageContractAddress = crypto.CreateAddress(from, 1)
   111  
   112  	standardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
   113  		0,
   114  		arbitraryStandardPrivateSimpleStorageContractAddress,
   115  		big.NewInt(0),
   116  		hexutil.MustDecodeUint64("0x47b760"),
   117  		big.NewInt(0),
   118  		hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"))
   119  
   120  	rawStandardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
   121  		0,
   122  		arbitraryStandardPrivateSimpleStorageContractAddress,
   123  		big.NewInt(0),
   124  		hexutil.MustDecodeUint64("0x47b760"),
   125  		big.NewInt(0),
   126  		arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
   127  
   128  }
   129  
   130  func teardown() {
   131  	log.Root().SetHandler(log.DiscardHandler())
   132  }
   133  
   134  func TestSimulateExecution_whenStandardPrivateCreation(t *testing.T) {
   135  	assert := assert.New(t)
   136  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   137  
   138  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   139  
   140  	assert.NoError(err, "simulate execution")
   141  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   142  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   143  }
   144  
   145  func TestSimulateExecution_whenPartyProtectionCreation(t *testing.T) {
   146  	assert := assert.New(t)
   147  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   148  
   149  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   150  
   151  	assert.NoError(err, "simulation execution")
   152  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   153  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   154  }
   155  
   156  func TestSimulateExecution_whenCreationWithStateValidation(t *testing.T) {
   157  	assert := assert.New(t)
   158  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   159  
   160  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   161  
   162  	assert.NoError(err, "simulate execution")
   163  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   164  	assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
   165  }
   166  
   167  func TestSimulateExecution_whenStandardPrivateMessageCall(t *testing.T) {
   168  	assert := assert.New(t)
   169  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   170  
   171  	privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
   172  	privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   173  	privateStateDB.Commit(true)
   174  
   175  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   176  
   177  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   178  
   179  	assert.NoError(err, "simulate execution")
   180  	assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
   181  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   182  }
   183  
   184  func TestSimulateExecution_StandardPrivateMessageCallSucceedsWheContractNotAvailableLocally(t *testing.T) {
   185  	assert := assert.New(t)
   186  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   187  
   188  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   189  
   190  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   191  
   192  	assert.NoError(err, "simulate execution")
   193  	assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
   194  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   195  }
   196  
   197  func TestSimulateExecution_whenPartyProtectionMessageCall(t *testing.T) {
   198  	assert := assert.New(t)
   199  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   200  
   201  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   202  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   203  		PrivacyFlag:    privateTxArgs.PrivacyFlag,
   204  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   205  	})
   206  
   207  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   208  	privateStateDB.Commit(true)
   209  
   210  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   211  
   212  	expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   213  
   214  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   215  
   216  	assert.NoError(err, "simulate execution")
   217  	assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   218  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   219  	assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
   220  }
   221  
   222  func TestSimulateExecution_whenPartyProtectionMessageCallAndPrivacyEnhancementsDisabled(t *testing.T) {
   223  	assert := assert.New(t)
   224  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   225  
   226  	params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
   227  	defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
   228  
   229  	stbBackend := &StubBackend{}
   230  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, stbBackend, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   231  
   232  	// the simulation returns early without executing the transaction
   233  	assert.False(stbBackend.getEVMCalled, "simulation is ended early - before getEVM is called")
   234  	assert.NoError(err, "simulate execution")
   235  	assert.Empty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   236  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   237  }
   238  
   239  func TestSimulateExecution_whenStateValidationMessageCall(t *testing.T) {
   240  	assert := assert.New(t)
   241  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   242  
   243  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   244  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   245  		PrivacyFlag:    privateTxArgs.PrivacyFlag,
   246  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   247  	})
   248  
   249  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   250  	privateStateDB.Commit(true)
   251  
   252  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   253  
   254  	expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   255  
   256  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   257  
   258  	assert.NoError(err, "simulate execution")
   259  	assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   260  	assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
   261  	assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
   262  }
   263  
   264  //mix and match flags
   265  func TestSimulateExecution_PrivacyFlagPartyProtectionCallingStandardPrivateContract_Error(t *testing.T) {
   266  	assert := assert.New(t)
   267  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   268  
   269  	privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
   270  	privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   271  	privateStateDB.Commit(true)
   272  
   273  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   274  
   275  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   276  
   277  	assert.Error(err, "simulate execution")
   278  }
   279  
   280  func TestSimulateExecution_StandardPrivateFlagCallingPartyProtectionContract_Error(t *testing.T) {
   281  	assert := assert.New(t)
   282  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   283  
   284  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   285  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   286  		PrivacyFlag:    engine.PrivacyFlagPartyProtection,
   287  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   288  	})
   289  
   290  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   291  	privateStateDB.Commit(true)
   292  
   293  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   294  
   295  	assert.Error(err, "simulate execution")
   296  }
   297  
   298  func TestSimulateExecution_StandardPrivateFlagCallingStateValidationContract_Error(t *testing.T) {
   299  	assert := assert.New(t)
   300  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   301  
   302  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   303  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   304  		PrivacyFlag:    engine.PrivacyFlagStateValidation,
   305  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   306  	})
   307  
   308  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   309  	privateStateDB.Commit(true)
   310  
   311  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   312  
   313  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   314  
   315  	assert.Error(err, "simulate execution")
   316  }
   317  
   318  func TestSimulateExecution_PartyProtectionFlagCallingStateValidationContract_Error(t *testing.T) {
   319  	assert := assert.New(t)
   320  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   321  
   322  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   323  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   324  		PrivacyFlag:    engine.PrivacyFlagStateValidation,
   325  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   326  	})
   327  
   328  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   329  	privateStateDB.Commit(true)
   330  
   331  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   332  
   333  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   334  
   335  	assert.Error(err, "simulate execution")
   336  }
   337  
   338  func TestSimulateExecution_StateValidationFlagCallingPartyProtectionContract_Error(t *testing.T) {
   339  	assert := assert.New(t)
   340  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   341  
   342  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   343  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   344  		PrivacyFlag:    engine.PrivacyFlagPartyProtection,
   345  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   346  	})
   347  
   348  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   349  	privateStateDB.Commit(true)
   350  
   351  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   352  
   353  	//expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   354  
   355  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   356  
   357  	assert.Error(err, "simulate execution")
   358  }
   359  
   360  func TestHandlePrivateTransaction_whenInvalidFlag(t *testing.T) {
   361  	assert := assert.New(t)
   362  	privateTxArgs.PrivacyFlag = 4
   363  
   364  	_, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   365  
   366  	assert.Error(err, "invalid privacyFlag")
   367  }
   368  
   369  func TestHandlePrivateTransaction_withPartyProtectionTxAndPrivacyEnhancementsIsDisabled(t *testing.T) {
   370  	assert := assert.New(t)
   371  	privateTxArgs.PrivacyFlag = 1
   372  	params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
   373  	defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
   374  
   375  	_, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   376  
   377  	assert.Error(err, "PrivacyEnhancements are disabled. Can only accept transactions with PrivacyFlag=0(StandardPrivate).")
   378  }
   379  
   380  func TestHandlePrivateTransaction_whenStandardPrivateCreation(t *testing.T) {
   381  	assert := assert.New(t)
   382  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   383  
   384  	isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   385  
   386  	if err != nil {
   387  		t.Fatalf("%s", err)
   388  	}
   389  
   390  	assert.True(isPrivate, "must be a private transaction")
   391  }
   392  
   393  func TestHandlePrivateTransaction_whenStandardPrivateCallingContractThatIsNotAvailableLocally(t *testing.T) {
   394  	assert := assert.New(t)
   395  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   396  
   397  	isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   398  
   399  	assert.NoError(err, "no error expected")
   400  
   401  	assert.True(isPrivate, "must be a private transaction")
   402  }
   403  
   404  func TestHandlePrivateTransaction_whenPartyProtectionCallingContractThatIsNotAvailableLocally(t *testing.T) {
   405  	assert := assert.New(t)
   406  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   407  
   408  	isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   409  
   410  	assert.Error(err, "handle invalid message call")
   411  
   412  	assert.True(isPrivate, "must be a private transaction")
   413  }
   414  
   415  func TestHandlePrivateTransaction_whenPartyProtectionCallingStandardPrivate(t *testing.T) {
   416  	assert := assert.New(t)
   417  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   418  
   419  	isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   420  
   421  	assert.Error(err, "handle invalid message call")
   422  
   423  	assert.True(isPrivate, "must be a private transaction")
   424  }
   425  
   426  func TestHandlePrivateTransaction_whenRawStandardPrivateCreation(t *testing.T) {
   427  	assert := assert.New(t)
   428  	private.P = &StubPrivateTransactionManager{creation: true}
   429  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   430  
   431  	isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawSimpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction)
   432  
   433  	assert.NoError(err, "raw standard private creation succeeded")
   434  	assert.True(isPrivate, "must be a private transaction")
   435  }
   436  
   437  func TestHandlePrivateTransaction_whenRawStandardPrivateMessageCall(t *testing.T) {
   438  	assert := assert.New(t)
   439  	private.P = &StubPrivateTransactionManager{creation: false}
   440  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   441  
   442  	_, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawStandardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, RawTransaction)
   443  
   444  	assert.NoError(err, "raw standard private msg call succeeded")
   445  
   446  }
   447  
   448  // Copy and set private
   449  func copyTransaction(tx *types.Transaction) *types.Transaction {
   450  	var privateTx *types.Transaction
   451  	if tx.To() == nil {
   452  		privateTx = types.NewContractCreation(tx.Nonce(),
   453  			tx.Value(),
   454  			tx.Gas(),
   455  			tx.GasPrice(),
   456  			tx.Data())
   457  	} else {
   458  		privateTx = types.NewTransaction(tx.Nonce(),
   459  			*tx.To(),
   460  			tx.Value(),
   461  			tx.Gas(),
   462  			tx.GasPrice(),
   463  			tx.Data())
   464  	}
   465  	privateTx.SetPrivate()
   466  	return privateTx
   467  }
   468  
   469  type StubBackend struct {
   470  	getEVMCalled                    bool
   471  	mockAccountExtraDataStateGetter *vm.MockAccountExtraDataStateGetter
   472  }
   473  
   474  func (sb *StubBackend) SupportsMultitenancy(rpcCtx context.Context) (*proto.PreAuthenticatedAuthenticationToken, bool) {
   475  	panic("implement me")
   476  }
   477  
   478  func (sb *StubBackend) AccountExtraDataStateGetterByNumber(context.Context, rpc.BlockNumber) (vm.AccountExtraDataStateGetter, error) {
   479  	return sb.mockAccountExtraDataStateGetter, nil
   480  }
   481  
   482  func (sb *StubBackend) IsAuthorized(ctx context.Context, authToken *proto.PreAuthenticatedAuthenticationToken, attributes ...*multitenancy.ContractSecurityAttribute) (bool, error) {
   483  	panic("implement me")
   484  }
   485  
   486  func (sb *StubBackend) GetEVM(ctx context.Context, msg core.Message, state vm.MinimalApiState, header *types.Header) (*vm.EVM, func() error, error) {
   487  	sb.getEVMCalled = true
   488  	vmCtx := core.NewEVMContext(msg, &types.Header{
   489  		Coinbase:   arbitraryFrom,
   490  		Number:     arbitraryCurrentBlockNumber,
   491  		Time:       0,
   492  		Difficulty: big.NewInt(0),
   493  		GasLimit:   0,
   494  	}, nil, &arbitraryFrom)
   495  	return vm.NewEVM(vmCtx, publicStateDB, privateStateDB, params.QuorumTestChainConfig, vm.Config{}), nil, nil
   496  }
   497  
   498  func (sb *StubBackend) CurrentBlock() *types.Block {
   499  	return types.NewBlock(&types.Header{
   500  		Number: arbitraryCurrentBlockNumber,
   501  	}, nil, nil, nil)
   502  }
   503  
   504  func (sb *StubBackend) Downloader() *downloader.Downloader {
   505  	panic("implement me")
   506  }
   507  
   508  func (sb *StubBackend) ProtocolVersion() int {
   509  	panic("implement me")
   510  }
   511  
   512  func (sb *StubBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {
   513  	panic("implement me")
   514  }
   515  
   516  func (sb *StubBackend) ChainDb() ethdb.Database {
   517  	panic("implement me")
   518  }
   519  
   520  func (sb *StubBackend) EventMux() *event.TypeMux {
   521  	panic("implement me")
   522  }
   523  
   524  func (sb *StubBackend) AccountManager() *accounts.Manager {
   525  	panic("implement me")
   526  }
   527  
   528  func (sb *StubBackend) ExtRPCEnabled() bool {
   529  	panic("implement me")
   530  }
   531  
   532  func (sb *StubBackend) CallTimeOut() time.Duration {
   533  	panic("implement me")
   534  }
   535  
   536  func (sb *StubBackend) RPCGasCap() *big.Int {
   537  	panic("implement me")
   538  }
   539  
   540  func (sb *StubBackend) SetHead(number uint64) {
   541  	panic("implement me")
   542  }
   543  
   544  func (sb *StubBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) {
   545  	panic("implement me")
   546  }
   547  
   548  func (sb *StubBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
   549  	panic("implement me")
   550  }
   551  
   552  func (sb *StubBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) {
   553  	panic("implement me")
   554  }
   555  
   556  func (sb *StubBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
   557  	panic("implement me")
   558  }
   559  
   560  func (sb *StubBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
   561  	panic("implement me")
   562  }
   563  
   564  func (sb *StubBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) {
   565  	panic("implement me")
   566  }
   567  
   568  func (sb *StubBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (vm.MinimalApiState, *types.Header, error) {
   569  	return &StubMinimalApiState{}, nil, nil
   570  }
   571  
   572  func (sb *StubBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (vm.MinimalApiState, *types.Header, error) {
   573  	return &StubMinimalApiState{}, nil, nil
   574  }
   575  
   576  func (sb *StubBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) {
   577  	panic("implement me")
   578  }
   579  
   580  func (sb *StubBackend) GetTd(blockHash common.Hash) *big.Int {
   581  	panic("implement me")
   582  }
   583  
   584  func (sb *StubBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
   585  	panic("implement me")
   586  }
   587  
   588  func (sb *StubBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription {
   589  	panic("implement me")
   590  }
   591  
   592  func (sb *StubBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription {
   593  	panic("implement me")
   594  }
   595  
   596  func (sb *StubBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error {
   597  	panic("implement me")
   598  }
   599  
   600  func (sb *StubBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) {
   601  	panic("implement me")
   602  }
   603  
   604  func (sb *StubBackend) GetPoolTransactions() (types.Transactions, error) {
   605  	panic("implement me")
   606  }
   607  
   608  func (sb *StubBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction {
   609  	panic("implement me")
   610  }
   611  
   612  func (sb *StubBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) {
   613  	panic("implement me")
   614  }
   615  
   616  func (sb *StubBackend) Stats() (pending int, queued int) {
   617  	panic("implement me")
   618  }
   619  
   620  func (sb *StubBackend) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) {
   621  	panic("implement me")
   622  }
   623  
   624  func (sb *StubBackend) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription {
   625  	panic("implement me")
   626  }
   627  
   628  func (sb *StubBackend) BloomStatus() (uint64, uint64) {
   629  	panic("implement me")
   630  }
   631  
   632  func (sb *StubBackend) GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) {
   633  	panic("implement me")
   634  }
   635  
   636  func (sb *StubBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) {
   637  	panic("implement me")
   638  }
   639  
   640  func (sb *StubBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
   641  	panic("implement me")
   642  }
   643  
   644  func (sb *StubBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
   645  	panic("implement me")
   646  }
   647  
   648  func (sb *StubBackend) ChainConfig() *params.ChainConfig {
   649  	return params.QuorumTestChainConfig
   650  }
   651  
   652  type StubMinimalApiState struct {
   653  }
   654  
   655  func (StubMinimalApiState) GetBalance(addr common.Address) *big.Int {
   656  	panic("implement me")
   657  }
   658  
   659  func (StubMinimalApiState) SetBalance(addr common.Address, balance *big.Int) {
   660  	panic("implement me")
   661  }
   662  
   663  func (StubMinimalApiState) GetCode(addr common.Address) []byte {
   664  	return nil
   665  }
   666  
   667  func (StubMinimalApiState) GetState(a common.Address, b common.Hash) common.Hash {
   668  	panic("implement me")
   669  }
   670  
   671  func (StubMinimalApiState) GetNonce(addr common.Address) uint64 {
   672  	panic("implement me")
   673  }
   674  
   675  func (StubMinimalApiState) SetNonce(addr common.Address, nonce uint64) {
   676  	panic("implement me")
   677  }
   678  
   679  func (StubMinimalApiState) SetCode(common.Address, []byte) {
   680  	panic("implement me")
   681  }
   682  
   683  func (StubMinimalApiState) GetPrivacyMetadata(addr common.Address) (*state.PrivacyMetadata, error) {
   684  	panic("implement me")
   685  }
   686  
   687  func (StubMinimalApiState) GetManagedParties(addr common.Address) ([]string, error) {
   688  	panic("implement me")
   689  }
   690  
   691  func (StubMinimalApiState) GetRLPEncodedStateObject(addr common.Address) ([]byte, error) {
   692  	panic("implement me")
   693  }
   694  
   695  func (StubMinimalApiState) GetProof(common.Address) ([][]byte, error) {
   696  	panic("implement me")
   697  }
   698  
   699  func (StubMinimalApiState) GetStorageProof(common.Address, common.Hash) ([][]byte, error) {
   700  	panic("implement me")
   701  }
   702  
   703  func (StubMinimalApiState) StorageTrie(addr common.Address) state.Trie {
   704  	panic("implement me")
   705  }
   706  
   707  func (StubMinimalApiState) Error() error {
   708  	panic("implement me")
   709  }
   710  
   711  func (StubMinimalApiState) GetCodeHash(common.Address) common.Hash {
   712  	panic("implement me")
   713  }
   714  
   715  func (StubMinimalApiState) SetState(common.Address, common.Hash, common.Hash) {
   716  	panic("implement me")
   717  }
   718  
   719  func (StubMinimalApiState) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
   720  	panic("implement me")
   721  }
   722  
   723  type StubPrivateTransactionManager struct {
   724  	notinuse.PrivateTransactionManager
   725  	creation bool
   726  }
   727  
   728  func (sptm *StubPrivateTransactionManager) Send(data []byte, from string, to []string, extra *engine.ExtraMetadata) (string, []string, common.EncryptedPayloadHash, error) {
   729  	return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash, nil
   730  }
   731  
   732  func (sptm *StubPrivateTransactionManager) EncryptPayload(data []byte, from string, to []string, extra *engine.ExtraMetadata) ([]byte, error) {
   733  	return nil, engine.ErrPrivateTxManagerNotSupported
   734  }
   735  
   736  func (sptm *StubPrivateTransactionManager) DecryptPayload(payload common.DecryptRequest) ([]byte, *engine.ExtraMetadata, error) {
   737  	return nil, nil, engine.ErrPrivateTxManagerNotSupported
   738  }
   739  
   740  func (sptm *StubPrivateTransactionManager) StoreRaw(data []byte, from string) (common.EncryptedPayloadHash, error) {
   741  	return arbitrarySimpleStorageContractEncryptedPayloadHash, nil
   742  }
   743  
   744  func (sptm *StubPrivateTransactionManager) SendSignedTx(data common.EncryptedPayloadHash, to []string, extra *engine.ExtraMetadata) (string, []string, []byte, error) {
   745  	return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes(), nil
   746  }
   747  
   748  func (sptm *StubPrivateTransactionManager) ReceiveRaw(data common.EncryptedPayloadHash) ([]byte, string, *engine.ExtraMetadata, error) {
   749  	if sptm.creation {
   750  		return hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"), "", nil, nil
   751  	} else {
   752  		return hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"), "", nil, nil
   753  	}
   754  }
   755  
   756  func (sptm *StubPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool {
   757  	return true
   758  }