default_psm_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package core
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/core/mps"
  7. "github.com/ethereum/go-ethereum/core/privatecache"
  8. "github.com/ethereum/go-ethereum/core/state"
  9. "github.com/ethereum/go-ethereum/core/types"
  10. "github.com/ethereum/go-ethereum/core/vm"
  11. "github.com/ethereum/go-ethereum/params"
  12. "github.com/ethereum/go-ethereum/private"
  13. "github.com/ethereum/go-ethereum/rpc"
  14. "github.com/golang/mock/gomock"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. //Tests DefaultState, StatePSI, CommitAndWrite
  18. func TestLegacyPrivateStateCreated(t *testing.T) {
  19. mockCtrl := gomock.NewController(t)
  20. defer mockCtrl.Finish()
  21. mockptm := private.NewMockPrivateTransactionManager(mockCtrl)
  22. saved := private.P
  23. defer func() {
  24. private.P = saved
  25. }()
  26. private.P = mockptm
  27. mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("", []string{"psi1", "psi2"}, common.FromHex(testCode), nil, nil).AnyTimes()
  28. blocks, blockmap, blockchain := buildTestChain(2, params.QuorumTestChainConfig)
  29. for _, block := range blocks {
  30. parent := blockmap[block.ParentHash()]
  31. statedb, _ := state.New(parent.Root(), blockchain.StateCache(), nil)
  32. privateStateRepo, _ := blockchain.PrivateStateManager().StateRepository(parent.Root())
  33. _, privateReceipts, _, _, _ := blockchain.Processor().Process(block, statedb, privateStateRepo, vm.Config{})
  34. for _, privateReceipt := range privateReceipts {
  35. expectedContractAddress := privateReceipt.ContractAddress
  36. assert.False(t, privateStateRepo.IsMPS())
  37. privateState, _ := privateStateRepo.DefaultState()
  38. assert.True(t, privateState.Exist(expectedContractAddress))
  39. assert.NotEqual(t, privateState.GetCodeSize(expectedContractAddress), 0)
  40. defaultPrivateState, _ := privateStateRepo.StatePSI(types.DefaultPrivateStateIdentifier)
  41. assert.True(t, defaultPrivateState.Exist(expectedContractAddress))
  42. assert.NotEqual(t, defaultPrivateState.GetCodeSize(expectedContractAddress), 0)
  43. _, err := privateStateRepo.StatePSI(types.PrivateStateIdentifier("empty"))
  44. assert.Error(t, err, "only the 'private' psi is supported by the default private state manager")
  45. }
  46. //CommitAndWrite to db
  47. privateStateRepo.CommitAndWrite(false, block)
  48. for _, privateReceipt := range privateReceipts {
  49. expectedContractAddress := privateReceipt.ContractAddress
  50. latestBlockRoot := block.Root()
  51. //contract exists on default state
  52. _, privDb, _ := blockchain.StateAtPSI(latestBlockRoot, types.DefaultPrivateStateIdentifier)
  53. assert.True(t, privDb.Exist(expectedContractAddress))
  54. assert.NotEqual(t, privDb.GetCodeSize(expectedContractAddress), 0)
  55. //legacy psm doesnt have concept of emptystate
  56. _, _, err := blockchain.StateAtPSI(latestBlockRoot, types.ToPrivateStateIdentifier("empty"))
  57. assert.Error(t, err, "only the 'private' psi is supported by the default private state manager")
  58. //legacy psm doesnt support other private states
  59. _, _, err = blockchain.StateAtPSI(latestBlockRoot, types.ToPrivateStateIdentifier("other"))
  60. assert.Error(t, err, "only the 'private' psi is supported by the default private state manager")
  61. }
  62. }
  63. }
  64. func TestDefaultResolver(t *testing.T) {
  65. mockCtrl := gomock.NewController(t)
  66. defer mockCtrl.Finish()
  67. mockptm := private.NewMockPrivateTransactionManager(mockCtrl)
  68. saved := private.P
  69. defer func() {
  70. private.P = saved
  71. }()
  72. private.P = mockptm
  73. mockptm.EXPECT().Receive(gomock.Not(common.EncryptedPayloadHash{})).Return("", []string{}, common.FromHex(testCode), nil, nil).AnyTimes()
  74. mockptm.EXPECT().Receive(common.EncryptedPayloadHash{}).Return("", []string{}, common.EncryptedPayloadHash{}.Bytes(), nil, nil).AnyTimes()
  75. _, _, blockchain := buildTestChain(1, params.QuorumTestChainConfig)
  76. privateCacheProvider := privatecache.NewPrivateCacheProvider(blockchain.db, nil, nil, false)
  77. mpsm := newDefaultPrivateStateManager(blockchain.db, privateCacheProvider)
  78. psm1, _ := mpsm.ResolveForManagedParty("TEST")
  79. assert.Equal(t, psm1, mps.DefaultPrivateStateMetadata)
  80. ctx := rpc.WithPrivateStateIdentifier(context.Background(), types.DefaultPrivateStateIdentifier)
  81. psm1, _ = mpsm.ResolveForUserContext(ctx)
  82. assert.Equal(t, psm1, &mps.PrivateStateMetadata{ID: "private", Type: mps.Resident})
  83. psm1, _ = mpsm.ResolveForUserContext(context.Background())
  84. assert.Equal(t, psm1, &mps.PrivateStateMetadata{ID: "private", Type: mps.Resident})
  85. assert.Equal(t, mpsm.PSIs(), []types.PrivateStateIdentifier{types.DefaultPrivateStateIdentifier})
  86. }