github.com/Unheilbar/quorum@v1.0.0/qlight/test/server_test.go (about)

     1  package test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/json"
     7  	"fmt"
     8  	"math/big"
     9  	"testing"
    10  
    11  	"github.com/ethereum/go-ethereum/common"
    12  	"github.com/ethereum/go-ethereum/consensus/ethash"
    13  	"github.com/ethereum/go-ethereum/core"
    14  	"github.com/ethereum/go-ethereum/core/mps"
    15  	"github.com/ethereum/go-ethereum/core/rawdb"
    16  	"github.com/ethereum/go-ethereum/core/types"
    17  	"github.com/ethereum/go-ethereum/core/vm"
    18  	"github.com/ethereum/go-ethereum/crypto"
    19  	"github.com/ethereum/go-ethereum/params"
    20  	"github.com/ethereum/go-ethereum/plugin/security"
    21  	"github.com/ethereum/go-ethereum/private"
    22  	"github.com/ethereum/go-ethereum/private/engine"
    23  	"github.com/ethereum/go-ethereum/qlight"
    24  	"github.com/golang/mock/gomock"
    25  	"github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto"
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_EmptyBlock(t *testing.T) {
    30  	assert := assert.New(t)
    31  	ctrl := gomock.NewController(t)
    32  	defer ctrl.Finish()
    33  
    34  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
    35  	mockptm := private.NewMockPrivateTransactionManager(ctrl)
    36  
    37  	saved := private.P
    38  	defer func() {
    39  		private.P = saved
    40  	}()
    41  	private.P = mockptm
    42  
    43  	mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true)
    44  	mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes()
    45  
    46  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
    47  
    48  	pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm)
    49  	blocks, _, _ := buildTestChainWithZeroTxPerBlock(1, params.QuorumMPSTestChainConfig)
    50  
    51  	blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String())
    52  
    53  	assert.Nil(err)
    54  	assert.Nil(blockPrivateData)
    55  }
    56  
    57  func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_PartyTransaction(t *testing.T) {
    58  	assert := assert.New(t)
    59  	ctrl := gomock.NewController(t)
    60  	defer ctrl.Finish()
    61  
    62  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
    63  	mockptm := private.NewMockPrivateTransactionManager(ctrl)
    64  	mockstaterepo := mps.NewMockPrivateStateRepository(ctrl)
    65  
    66  	saved := private.P
    67  	defer func() {
    68  		private.P = saved
    69  	}()
    70  	private.P = mockptm
    71  
    72  	mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("AAA", []string{"AAA", "CCC"}, common.FromHex(testCode), &engine.ExtraMetadata{
    73  		ACHashes:            nil,
    74  		ACMerkleRoot:        common.Hash{},
    75  		PrivacyFlag:         0,
    76  		ManagedParties:      []string{"AAA", "CCC"},
    77  		Sender:              "AAA",
    78  		MandatoryRecipients: nil,
    79  	}, nil).AnyTimes()
    80  	mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true)
    81  	mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes()
    82  
    83  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
    84  	mockpsm.EXPECT().NotIncludeAny(gomock.Any(), gomock.Any()).Return(false).AnyTimes()
    85  	mockpsm.EXPECT().StateRepository(gomock.Any()).Return(mockstaterepo, nil).AnyTimes()
    86  	mockpsm.EXPECT().PSIs().Return([]types.PrivateStateIdentifier{PSI1PSM.ID, PSI2PSM.ID, types.DefaultPrivateStateIdentifier, types.ToPrivateStateIdentifier("other")}).AnyTimes()
    87  
    88  	mockstaterepo.EXPECT().PrivateStateRoot(gomock.Any()).Return(common.StringToHash("PrivateStateRoot"), nil)
    89  
    90  	pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm)
    91  	blocks, _, _ := buildTestChainWithOneTxPerBlock(1, params.QuorumMPSTestChainConfig)
    92  
    93  	blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String())
    94  
    95  	assert.Nil(err)
    96  	assert.NotNil(blockPrivateData)
    97  	assert.Equal(common.StringToHash("PrivateStateRoot"), blockPrivateData.PrivateStateRoot)
    98  	assert.Equal(blocks[0].Hash(), blockPrivateData.BlockHash)
    99  	assert.Len(blockPrivateData.PrivateTransactions, 1)
   100  	privateTransactionData := blockPrivateData.PrivateTransactions[0]
   101  	assert.True(privateTransactionData.IsSender)
   102  	assert.Equal(common.FromHex(testCode), privateTransactionData.Payload)
   103  	assert.ElementsMatch(privateTransactionData.Extra.ManagedParties, []string{"AAA"})
   104  }
   105  
   106  func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_NonPartyTransaction(t *testing.T) {
   107  	assert := assert.New(t)
   108  	ctrl := gomock.NewController(t)
   109  	defer ctrl.Finish()
   110  
   111  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   112  	mockptm := private.NewMockPrivateTransactionManager(ctrl)
   113  
   114  	saved := private.P
   115  	defer func() {
   116  		private.P = saved
   117  	}()
   118  	private.P = mockptm
   119  
   120  	mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("", nil, nil, nil, nil).AnyTimes()
   121  	mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true)
   122  	mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes()
   123  
   124  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   125  
   126  	pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm)
   127  	blocks, _, _ := buildTestChainWithOneTxPerBlock(1, params.QuorumMPSTestChainConfig)
   128  
   129  	blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String())
   130  
   131  	assert.Nil(err)
   132  	assert.Nil(blockPrivateData)
   133  }
   134  
   135  func TestPrivateBlockDataResolverImpl_PrepareBlockPrivateData_PMTTransaction(t *testing.T) {
   136  	assert := assert.New(t)
   137  	ctrl := gomock.NewController(t)
   138  	defer ctrl.Finish()
   139  
   140  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   141  	mockptm := private.NewMockPrivateTransactionManager(ctrl)
   142  	mockstaterepo := mps.NewMockPrivateStateRepository(ctrl)
   143  
   144  	saved := private.P
   145  	defer func() {
   146  		private.P = saved
   147  	}()
   148  	private.P = mockptm
   149  
   150  	tx, err := types.SignTx(types.NewContractCreation(0, big.NewInt(0), testGas, nil, common.BytesToEncryptedPayloadHash([]byte("pmt private tx")).Bytes()), types.QuorumPrivateTxSigner{}, testKey)
   151  	assert.Nil(err)
   152  	txData := new(bytes.Buffer)
   153  	err = json.NewEncoder(txData).Encode(tx)
   154  	assert.Nil(err)
   155  
   156  	mockptm.EXPECT().Receive(common.BytesToEncryptedPayloadHash([]byte("pmt inner tx"))).Return("AAA", []string{"AAA", "CCC"}, txData.Bytes(), &engine.ExtraMetadata{
   157  		ACHashes:            nil,
   158  		ACMerkleRoot:        common.Hash{},
   159  		PrivacyFlag:         0,
   160  		ManagedParties:      []string{"AAA", "CCC"},
   161  		Sender:              "AAA",
   162  		MandatoryRecipients: nil,
   163  	}, nil).AnyTimes()
   164  	mockptm.EXPECT().Receive(common.BytesToEncryptedPayloadHash([]byte("pmt private tx"))).Return("AAA", []string{"AAA", "CCC"}, common.FromHex(testCode), &engine.ExtraMetadata{
   165  		ACHashes:            nil,
   166  		ACMerkleRoot:        common.Hash{},
   167  		PrivacyFlag:         0,
   168  		ManagedParties:      []string{"AAA", "CCC"},
   169  		Sender:              "AAA",
   170  		MandatoryRecipients: nil,
   171  	}, nil).AnyTimes()
   172  	mockptm.EXPECT().HasFeature(engine.MultiplePrivateStates).Return(true)
   173  	mockptm.EXPECT().Groups().Return(PrivacyGroups, nil).AnyTimes()
   174  
   175  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   176  	mockpsm.EXPECT().NotIncludeAny(gomock.Any(), gomock.Any()).Return(false).AnyTimes()
   177  	mockpsm.EXPECT().StateRepository(gomock.Any()).Return(mockstaterepo, nil).AnyTimes()
   178  	mockpsm.EXPECT().PSIs().Return([]types.PrivateStateIdentifier{PSI1PSM.ID, PSI2PSM.ID, types.DefaultPrivateStateIdentifier, types.ToPrivateStateIdentifier("other")}).AnyTimes()
   179  
   180  	mockstaterepo.EXPECT().PrivateStateRoot(gomock.Any()).Return(common.StringToHash("PrivateStateRoot"), nil)
   181  
   182  	pbdr := qlight.NewPrivateBlockDataResolver(mockpsm, mockptm)
   183  	blocks, _, _ := buildTestChainWithOnePMTTxPerBlock(1, params.QuorumMPSTestChainConfig)
   184  
   185  	blockPrivateData, err := pbdr.PrepareBlockPrivateData(blocks[0], PSI1PSM.ID.String())
   186  
   187  	assert.Nil(err)
   188  	assert.NotNil(blockPrivateData)
   189  	assert.Equal(common.StringToHash("PrivateStateRoot"), blockPrivateData.PrivateStateRoot)
   190  	assert.Equal(blocks[0].Hash(), blockPrivateData.BlockHash)
   191  	assert.Len(blockPrivateData.PrivateTransactions, 2)
   192  
   193  	pmtTransactionData := blockPrivateData.PrivateTransactions[0]
   194  	assert.True(pmtTransactionData.IsSender)
   195  	assert.Equal(txData.Bytes(), pmtTransactionData.Payload)
   196  	assert.ElementsMatch(pmtTransactionData.Extra.ManagedParties, []string{"AAA"})
   197  
   198  	privateTransactionData := blockPrivateData.PrivateTransactions[1]
   199  	assert.True(privateTransactionData.IsSender)
   200  	assert.Equal(common.FromHex(testCode), privateTransactionData.Payload)
   201  	assert.ElementsMatch(privateTransactionData.Extra.ManagedParties, []string{"AAA"})
   202  }
   203  
   204  func TestAuthProviderImpl_Authorize_AuthManagerNil(t *testing.T) {
   205  	assert := assert.New(t)
   206  	ctrl := gomock.NewController(t)
   207  	defer ctrl.Finish()
   208  
   209  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   210  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   211  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager { return nil })
   212  
   213  	err := authProvider.Initialize()
   214  	assert.Nil(err)
   215  
   216  	err = authProvider.Authorize("token", "psi1")
   217  	assert.Nil(err)
   218  }
   219  
   220  func TestAuthProviderImpl_Authorize_AuthManagerDisabled(t *testing.T) {
   221  	assert := assert.New(t)
   222  	ctrl := gomock.NewController(t)
   223  	defer ctrl.Finish()
   224  
   225  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   226  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   227  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager {
   228  		return &testAuthManager{
   229  			enabled:   false,
   230  			authError: nil,
   231  			authToken: nil,
   232  		}
   233  	})
   234  
   235  	err := authProvider.Initialize()
   236  	assert.Nil(err)
   237  
   238  	err = authProvider.Authorize("token", "psi1")
   239  	assert.Nil(err)
   240  }
   241  
   242  func TestAuthProviderImpl_Authorize_AuthManagerEnabledAuthError(t *testing.T) {
   243  	assert := assert.New(t)
   244  	ctrl := gomock.NewController(t)
   245  	defer ctrl.Finish()
   246  
   247  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   248  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   249  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager {
   250  		return &testAuthManager{
   251  			enabled:   true,
   252  			authError: fmt.Errorf("auth error"),
   253  			authToken: nil,
   254  		}
   255  	})
   256  
   257  	err := authProvider.Initialize()
   258  	assert.Nil(err)
   259  
   260  	err = authProvider.Authorize("token", "psi1")
   261  	assert.EqualError(err, "auth error")
   262  }
   263  
   264  func TestAuthProviderImpl_Authorize_AuthManagerEnabledNotEntitledToPSI(t *testing.T) {
   265  	assert := assert.New(t)
   266  	ctrl := gomock.NewController(t)
   267  	defer ctrl.Finish()
   268  
   269  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   270  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   271  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager {
   272  		return &testAuthManager{
   273  			enabled:   true,
   274  			authError: nil,
   275  			authToken: &proto.PreAuthenticatedAuthenticationToken{
   276  				RawToken:  nil,
   277  				ExpiredAt: nil,
   278  				Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{
   279  					Service:              "psi",
   280  					Method:               "psi2",
   281  					Raw:                  "psi://psi2",
   282  					XXX_NoUnkeyedLiteral: struct{}{},
   283  					XXX_unrecognized:     nil,
   284  					XXX_sizecache:        0,
   285  				}},
   286  				XXX_NoUnkeyedLiteral: struct{}{},
   287  				XXX_unrecognized:     nil,
   288  				XXX_sizecache:        0,
   289  			},
   290  		}
   291  	})
   292  
   293  	err := authProvider.Initialize()
   294  	assert.Nil(err)
   295  
   296  	err = authProvider.Authorize("token", "psi1")
   297  	assert.EqualError(err, "PSI not authorized")
   298  }
   299  
   300  func TestAuthProviderImpl_Authorize_AuthManagerEnabledMissingEntitlement(t *testing.T) {
   301  	assert := assert.New(t)
   302  	ctrl := gomock.NewController(t)
   303  	defer ctrl.Finish()
   304  
   305  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   306  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   307  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager {
   308  		return &testAuthManager{
   309  			enabled:   true,
   310  			authError: nil,
   311  			authToken: &proto.PreAuthenticatedAuthenticationToken{
   312  				RawToken:  nil,
   313  				ExpiredAt: nil,
   314  				Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{
   315  					Service:              "psi",
   316  					Method:               "psi1",
   317  					Raw:                  "psi://psi1",
   318  					XXX_NoUnkeyedLiteral: struct{}{},
   319  					XXX_unrecognized:     nil,
   320  					XXX_sizecache:        0,
   321  				}, &proto.GrantedAuthority{
   322  					Service:              "p2p",
   323  					Method:               "qlight",
   324  					Raw:                  "p2p://qlight",
   325  					XXX_NoUnkeyedLiteral: struct{}{},
   326  					XXX_unrecognized:     nil,
   327  					XXX_sizecache:        0,
   328  				},
   329  				},
   330  				XXX_NoUnkeyedLiteral: struct{}{},
   331  				XXX_unrecognized:     nil,
   332  				XXX_sizecache:        0,
   333  			},
   334  		}
   335  	})
   336  
   337  	err := authProvider.Initialize()
   338  	assert.Nil(err)
   339  
   340  	err = authProvider.Authorize("token", "psi1")
   341  	assert.EqualError(err, "The P2P token does not have the necessary authorization p2p=true rpcETH=false")
   342  }
   343  
   344  func TestAuthProviderImpl_Authorize_AuthManagerEnabledSuccess(t *testing.T) {
   345  	assert := assert.New(t)
   346  	ctrl := gomock.NewController(t)
   347  	defer ctrl.Finish()
   348  
   349  	mockpsm := mps.NewMockPrivateStateManager(ctrl)
   350  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(PSI1PSM, nil).AnyTimes()
   351  	authProvider := qlight.NewAuthProvider(mockpsm, func() security.AuthenticationManager {
   352  		return &testAuthManager{
   353  			enabled:   true,
   354  			authError: nil,
   355  			authToken: &proto.PreAuthenticatedAuthenticationToken{
   356  				RawToken:  nil,
   357  				ExpiredAt: nil,
   358  				Authorities: []*proto.GrantedAuthority{&proto.GrantedAuthority{
   359  					Service:              "psi",
   360  					Method:               "psi1",
   361  					Raw:                  "psi://psi1",
   362  					XXX_NoUnkeyedLiteral: struct{}{},
   363  					XXX_unrecognized:     nil,
   364  					XXX_sizecache:        0,
   365  				}, &proto.GrantedAuthority{
   366  					Service:              "p2p",
   367  					Method:               "qlight",
   368  					Raw:                  "p2p://qlight",
   369  					XXX_NoUnkeyedLiteral: struct{}{},
   370  					XXX_unrecognized:     nil,
   371  					XXX_sizecache:        0,
   372  				}, &proto.GrantedAuthority{
   373  					Service:              "rpc",
   374  					Method:               "eth_*",
   375  					Raw:                  "rpc://eth_*",
   376  					XXX_NoUnkeyedLiteral: struct{}{},
   377  					XXX_unrecognized:     nil,
   378  					XXX_sizecache:        0,
   379  				},
   380  				},
   381  				XXX_NoUnkeyedLiteral: struct{}{},
   382  				XXX_unrecognized:     nil,
   383  				XXX_sizecache:        0,
   384  			},
   385  		}
   386  	})
   387  
   388  	err := authProvider.Initialize()
   389  	assert.Nil(err)
   390  
   391  	err = authProvider.Authorize("token", "psi1")
   392  	assert.Nil(err)
   393  }
   394  
   395  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   396  ////// Helpers /////////////////////////////////////////////////////////////////////////////////////////////////////////
   397  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   398  
   399  const (
   400  	// testCode is the testing contract binary code which will initialises some
   401  	// variables in constructor
   402  	testCode = "0x60806040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060005534801561003457600080fd5b5060fc806100436000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c4dae8814603757806398a213cf146053575b600080fd5b603d607e565b6040518082815260200191505060405180910390f35b607c60048036036020811015606757600080fd5b81019080803590602001909291905050506084565b005b60005481565b806000819055507fe9e44f9f7da8c559de847a3232b57364adc0354f15a2cd8dc636d54396f9587a6000546040518082815260200191505060405180910390a15056fea265627a7a723058208ae31d9424f2d0bc2a3da1a5dd659db2d71ec322a17db8f87e19e209e3a1ff4a64736f6c634300050a0032"
   403  
   404  	// testGas is the gas required for contract deployment.
   405  	testGas = 144109
   406  )
   407  
   408  var (
   409  	testKey, _  = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
   410  	testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
   411  )
   412  
   413  func buildTestChainWithZeroTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) {
   414  	testdb := rawdb.NewMemoryDatabase()
   415  	genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000))
   416  	blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
   417  		block.SetCoinbase(common.Address{0})
   418  	})
   419  
   420  	hashes := make([]common.Hash, n+1)
   421  	hashes[len(hashes)-1] = genesis.Hash()
   422  	blockm := make(map[common.Hash]*types.Block, n+1)
   423  	blockm[genesis.Hash()] = genesis
   424  	for i, b := range blocks {
   425  		hashes[len(hashes)-i-2] = b.Hash()
   426  		blockm[b.Hash()] = b
   427  	}
   428  
   429  	blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil)
   430  	return blocks, blockm, blockchain
   431  }
   432  
   433  func buildTestChainWithOneTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) {
   434  	testdb := rawdb.NewMemoryDatabase()
   435  	genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000))
   436  	blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
   437  		block.SetCoinbase(common.Address{0})
   438  
   439  		signer := types.QuorumPrivateTxSigner{}
   440  		tx, err := types.SignTx(types.NewContractCreation(block.TxNonce(testAddress), big.NewInt(0), testGas, nil, common.FromHex(testCode)), signer, testKey)
   441  		if err != nil {
   442  			panic(err)
   443  		}
   444  		block.AddTx(tx)
   445  	})
   446  
   447  	hashes := make([]common.Hash, n+1)
   448  	hashes[len(hashes)-1] = genesis.Hash()
   449  	blockm := make(map[common.Hash]*types.Block, n+1)
   450  	blockm[genesis.Hash()] = genesis
   451  	for i, b := range blocks {
   452  		hashes[len(hashes)-i-2] = b.Hash()
   453  		blockm[b.Hash()] = b
   454  	}
   455  
   456  	blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil)
   457  	return blocks, blockm, blockchain
   458  }
   459  
   460  func buildTestChainWithOnePMTTxPerBlock(n int, config *params.ChainConfig) ([]*types.Block, map[common.Hash]*types.Block, *core.BlockChain) {
   461  	testdb := rawdb.NewMemoryDatabase()
   462  	genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000))
   463  	blocks, _ := core.GenerateChain(config, genesis, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
   464  		block.SetCoinbase(common.Address{0})
   465  
   466  		signer := types.LatestSigner(config)
   467  		tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.QuorumPrivacyPrecompileContractAddress(), big.NewInt(0), testGas, nil, common.BytesToEncryptedPayloadHash([]byte("pmt inner tx")).Bytes()), signer, testKey)
   468  		if err != nil {
   469  			panic(err)
   470  		}
   471  		block.AddTx(tx)
   472  	})
   473  
   474  	hashes := make([]common.Hash, n+1)
   475  	hashes[len(hashes)-1] = genesis.Hash()
   476  	blockm := make(map[common.Hash]*types.Block, n+1)
   477  	blockm[genesis.Hash()] = genesis
   478  	for i, b := range blocks {
   479  		hashes[len(hashes)-i-2] = b.Hash()
   480  		blockm[b.Hash()] = b
   481  	}
   482  
   483  	blockchain, _ := core.NewBlockChain(testdb, nil, config, ethash.NewFaker(), vm.Config{}, nil, nil, nil)
   484  	return blocks, blockm, blockchain
   485  }
   486  
   487  var PSI1PSM = mps.NewPrivateStateMetadata("psi1", "psi1", "private state 1", mps.Resident, PG1.Members)
   488  
   489  var PSI2PSM = mps.NewPrivateStateMetadata("psi2", "psi2", "private state 2", mps.Resident, PG2.Members)
   490  
   491  var PG1 = engine.PrivacyGroup{
   492  	Type:           "RESIDENT",
   493  	Name:           "RG1",
   494  	PrivacyGroupId: "RG1",
   495  	Description:    "Resident Group 1",
   496  	From:           "",
   497  	Members:        []string{"AAA", "BBB"},
   498  }
   499  
   500  var PG2 = engine.PrivacyGroup{
   501  	Type:           "RESIDENT",
   502  	Name:           "RG2",
   503  	PrivacyGroupId: "RG2",
   504  	Description:    "Resident Group 2",
   505  	From:           "",
   506  	Members:        []string{"CCC", "DDD"},
   507  }
   508  
   509  var PrivacyGroups = []engine.PrivacyGroup{
   510  	PG1,
   511  	PG2,
   512  	{
   513  		Type:           "LEGACY",
   514  		Name:           "LEGACY1",
   515  		PrivacyGroupId: "LEGACY1",
   516  		Description:    "Legacy Group 1",
   517  		From:           "",
   518  		Members:        []string{"LEG1", "LEG2"},
   519  	},
   520  }
   521  
   522  type testAuthManager struct {
   523  	enabled   bool
   524  	authError error
   525  	authToken *proto.PreAuthenticatedAuthenticationToken
   526  }
   527  
   528  func (am *testAuthManager) Authenticate(ctx context.Context, token string) (*proto.PreAuthenticatedAuthenticationToken, error) {
   529  	return am.authToken, am.authError
   530  }
   531  
   532  func (am *testAuthManager) IsEnabled(ctx context.Context) (bool, error) {
   533  	return am.enabled, nil
   534  }