server_test.go 19 KB

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