multiple_psm.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package core
  2. import (
  3. "context"
  4. "fmt"
  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/rawdb"
  9. "github.com/ethereum/go-ethereum/core/state"
  10. "github.com/ethereum/go-ethereum/core/types"
  11. "github.com/ethereum/go-ethereum/ethdb"
  12. "github.com/ethereum/go-ethereum/rpc"
  13. "github.com/ethereum/go-ethereum/trie"
  14. )
  15. type MultiplePrivateStateManager struct {
  16. // Low level persistent database to store final content in
  17. db ethdb.Database
  18. privateStatesTrieCache state.Database
  19. privateCacheProvider privatecache.Provider
  20. residentGroupByKey map[string]*mps.PrivateStateMetadata
  21. privacyGroupById map[types.PrivateStateIdentifier]*mps.PrivateStateMetadata
  22. }
  23. func newMultiplePrivateStateManager(db ethdb.Database, privateCacheProvider privatecache.Provider, residentGroupByKey map[string]*mps.PrivateStateMetadata, privacyGroupById map[types.PrivateStateIdentifier]*mps.PrivateStateMetadata) (*MultiplePrivateStateManager, error) {
  24. return &MultiplePrivateStateManager{
  25. db: db,
  26. privateStatesTrieCache: privateCacheProvider.GetCacheWithConfig(),
  27. privateCacheProvider: privateCacheProvider,
  28. residentGroupByKey: residentGroupByKey,
  29. privacyGroupById: privacyGroupById,
  30. }, nil
  31. }
  32. func (m *MultiplePrivateStateManager) StateRepository(blockHash common.Hash) (mps.PrivateStateRepository, error) {
  33. privateStatesTrieRoot := rawdb.GetPrivateStatesTrieRoot(m.db, blockHash)
  34. return mps.NewMultiplePrivateStateRepository(m.db, m.privateStatesTrieCache, privateStatesTrieRoot, m.privateCacheProvider)
  35. }
  36. func (m *MultiplePrivateStateManager) ResolveForManagedParty(managedParty string) (*mps.PrivateStateMetadata, error) {
  37. psm, found := m.residentGroupByKey[managedParty]
  38. if !found {
  39. return nil, fmt.Errorf("unable to find private state metadata for managed party %s", managedParty)
  40. }
  41. return psm, nil
  42. }
  43. func (m *MultiplePrivateStateManager) ResolveForUserContext(ctx context.Context) (*mps.PrivateStateMetadata, error) {
  44. psi, ok := rpc.PrivateStateIdentifierFromContext(ctx)
  45. if !ok {
  46. psi = types.DefaultPrivateStateIdentifier
  47. }
  48. psm, found := m.privacyGroupById[psi]
  49. if !found {
  50. return nil, fmt.Errorf("unable to find private state for context psi %s", psi)
  51. }
  52. return psm, nil
  53. }
  54. func (m *MultiplePrivateStateManager) PSIs() []types.PrivateStateIdentifier {
  55. psis := make([]types.PrivateStateIdentifier, 0, len(m.privacyGroupById))
  56. for psi := range m.privacyGroupById {
  57. psis = append(psis, psi)
  58. }
  59. return psis
  60. }
  61. func (m *MultiplePrivateStateManager) NotIncludeAny(psm *mps.PrivateStateMetadata, managedParties ...string) bool {
  62. return psm.NotIncludeAny(managedParties...)
  63. }
  64. func (m *MultiplePrivateStateManager) CheckAt(root common.Hash) error {
  65. _, err := state.New(rawdb.GetPrivateStatesTrieRoot(m.db, root), m.privateStatesTrieCache, nil)
  66. return err
  67. }
  68. func (m *MultiplePrivateStateManager) TrieDB() *trie.Database {
  69. return m.privateStatesTrieCache.TrieDB()
  70. }