github.com/status-im/status-go@v1.1.0/eth-node/bridge/geth/waku.go (about)

     1  package gethbridge
     2  
     3  import (
     4  	"context"
     5  	"crypto/ecdsa"
     6  	"errors"
     7  	"time"
     8  
     9  	"github.com/libp2p/go-libp2p/core/peer"
    10  	"github.com/multiformats/go-multiaddr"
    11  
    12  	"github.com/ethereum/go-ethereum/common"
    13  	"github.com/ethereum/go-ethereum/p2p/enode"
    14  	"github.com/status-im/status-go/connection"
    15  	"github.com/status-im/status-go/eth-node/types"
    16  	"github.com/status-im/status-go/waku"
    17  	wakucommon "github.com/status-im/status-go/waku/common"
    18  )
    19  
    20  type GethWakuWrapper struct {
    21  	waku *waku.Waku
    22  }
    23  
    24  // NewGethWakuWrapper returns an object that wraps Geth's Waku in a types interface
    25  func NewGethWakuWrapper(w *waku.Waku) types.Waku {
    26  	if w == nil {
    27  		panic("waku cannot be nil")
    28  	}
    29  
    30  	return &GethWakuWrapper{
    31  		waku: w,
    32  	}
    33  }
    34  
    35  // GetGethWhisperFrom retrieves the underlying whisper Whisper struct from a wrapped Whisper interface
    36  func GetGethWakuFrom(m types.Waku) *waku.Waku {
    37  	return m.(*GethWakuWrapper).waku
    38  }
    39  
    40  func (w *GethWakuWrapper) PublicWakuAPI() types.PublicWakuAPI {
    41  	return NewGethPublicWakuAPIWrapper(waku.NewPublicWakuAPI(w.waku))
    42  }
    43  
    44  func (w *GethWakuWrapper) Version() uint {
    45  	return 1
    46  }
    47  
    48  // Added for compatibility with waku V2
    49  func (w *GethWakuWrapper) PeerCount() int {
    50  	return -1
    51  }
    52  
    53  // Added for compatibility with waku V2
    54  func (w *GethWakuWrapper) StartDiscV5() error {
    55  	return errors.New("not available in WakuV1")
    56  }
    57  
    58  // Added for compatibility with waku V2
    59  func (w *GethWakuWrapper) StopDiscV5() error {
    60  	return errors.New("not available in WakuV1")
    61  }
    62  
    63  // PeerCount function only added for compatibility with waku V2
    64  func (w *GethWakuWrapper) AddStorePeer(address multiaddr.Multiaddr) (peer.ID, error) {
    65  	return "", errors.New("not available in WakuV1")
    66  }
    67  
    68  // SubscribeToPubsubTopic function only added for compatibility with waku V2
    69  func (w *GethWakuWrapper) SubscribeToPubsubTopic(topic string, optPublicKey *ecdsa.PublicKey) error {
    70  	// not available in WakuV1
    71  	return errors.New("not available in WakuV1")
    72  }
    73  
    74  func (w *GethWakuWrapper) UnsubscribeFromPubsubTopic(topic string) error {
    75  	// not available in WakuV1
    76  	return errors.New("not available in WakuV1")
    77  }
    78  
    79  func (w *GethWakuWrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
    80  	// not available in WakuV1
    81  	return nil, errors.New("not available in WakuV1")
    82  }
    83  
    84  func (w *GethWakuWrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
    85  	// not available in WakuV1
    86  	return errors.New("not available in WakuV1")
    87  }
    88  
    89  func (w *GethWakuWrapper) RemovePubsubTopicKey(topic string) error {
    90  	// not available in WakuV1
    91  	return errors.New("not available in WakuV1")
    92  }
    93  
    94  // AddRelayPeer function only added for compatibility with waku V2
    95  func (w *GethWakuWrapper) AddRelayPeer(address multiaddr.Multiaddr) (peer.ID, error) {
    96  	return "", errors.New("not available in WakuV1")
    97  }
    98  
    99  // DialPeer function only added for compatibility with waku V2
   100  func (w *GethWakuWrapper) DialPeer(address multiaddr.Multiaddr) error {
   101  	return errors.New("not available in WakuV1")
   102  }
   103  
   104  // DialPeerByID function only added for compatibility with waku V2
   105  func (w *GethWakuWrapper) DialPeerByID(peerID peer.ID) error {
   106  	return errors.New("not available in WakuV1")
   107  }
   108  
   109  // ListenAddresses function only added for compatibility with waku V2
   110  func (w *GethWakuWrapper) ListenAddresses() ([]multiaddr.Multiaddr, error) {
   111  	return nil, errors.New("not available in WakuV1")
   112  }
   113  
   114  func (w *GethWakuWrapper) RelayPeersByTopic(topic string) (*types.PeerList, error) {
   115  	return nil, errors.New("not available in WakuV1")
   116  }
   117  
   118  // ENR function only added for compatibility with waku V2
   119  func (w *GethWakuWrapper) ENR() (*enode.Node, error) {
   120  	return nil, errors.New("not available in WakuV1")
   121  }
   122  
   123  // PeerCount function only added for compatibility with waku V2
   124  func (w *GethWakuWrapper) DropPeer(peerID peer.ID) error {
   125  	return errors.New("not available in WakuV1")
   126  }
   127  
   128  func (w *GethWakuWrapper) SubscribeToConnStatusChanges() (*types.ConnStatusSubscription, error) {
   129  	return nil, errors.New("not available in WakuV1")
   130  }
   131  
   132  func (w *GethWakuWrapper) SetCriteriaForMissingMessageVerification(peerID peer.ID, pubsubTopic string, contentTopics []types.TopicType) error {
   133  	return errors.New("not available in WakuV1")
   134  }
   135  
   136  // Peers function only added for compatibility with waku V2
   137  func (w *GethWakuWrapper) Peers() types.PeerStats {
   138  	p := make(types.PeerStats)
   139  	return p
   140  }
   141  
   142  // MinPow returns the PoW value required by this node.
   143  func (w *GethWakuWrapper) MinPow() float64 {
   144  	return w.waku.MinPow()
   145  }
   146  
   147  // MaxMessageSize returns the MaxMessageSize set
   148  func (w *GethWakuWrapper) MaxMessageSize() uint32 {
   149  	return w.waku.MaxMessageSize()
   150  }
   151  
   152  // BloomFilter returns the aggregated bloom filter for all the topics of interest.
   153  // The nodes are required to send only messages that match the advertised bloom filter.
   154  // If a message does not match the bloom, it will tantamount to spam, and the peer will
   155  // be disconnected.
   156  func (w *GethWakuWrapper) BloomFilter() []byte {
   157  	return w.waku.BloomFilter()
   158  }
   159  
   160  // GetCurrentTime returns current time.
   161  func (w *GethWakuWrapper) GetCurrentTime() time.Time {
   162  	return w.waku.CurrentTime()
   163  }
   164  
   165  func (w *GethWakuWrapper) SubscribeEnvelopeEvents(eventsProxy chan<- types.EnvelopeEvent) types.Subscription {
   166  	events := make(chan wakucommon.EnvelopeEvent, 100) // must be buffered to prevent blocking whisper
   167  	go func() {
   168  		for e := range events {
   169  			eventsProxy <- *NewWakuEnvelopeEventWrapper(&e)
   170  		}
   171  	}()
   172  
   173  	return NewGethSubscriptionWrapper(w.waku.SubscribeEnvelopeEvents(events))
   174  }
   175  
   176  func (w *GethWakuWrapper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) {
   177  	return w.waku.GetPrivateKey(id)
   178  }
   179  
   180  // AddKeyPair imports a asymmetric private key and returns a deterministic identifier.
   181  func (w *GethWakuWrapper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) {
   182  	return w.waku.AddKeyPair(key)
   183  }
   184  
   185  // DeleteKeyPair deletes the key with the specified ID if it exists.
   186  func (w *GethWakuWrapper) DeleteKeyPair(keyID string) bool {
   187  	return w.waku.DeleteKeyPair(keyID)
   188  }
   189  
   190  func (w *GethWakuWrapper) AddSymKeyDirect(key []byte) (string, error) {
   191  	return w.waku.AddSymKeyDirect(key)
   192  }
   193  
   194  func (w *GethWakuWrapper) AddSymKeyFromPassword(password string) (string, error) {
   195  	return w.waku.AddSymKeyFromPassword(password)
   196  }
   197  
   198  func (w *GethWakuWrapper) DeleteSymKey(id string) bool {
   199  	return w.waku.DeleteSymKey(id)
   200  }
   201  
   202  func (w *GethWakuWrapper) GetSymKey(id string) ([]byte, error) {
   203  	return w.waku.GetSymKey(id)
   204  }
   205  
   206  func (w *GethWakuWrapper) Subscribe(opts *types.SubscriptionOptions) (string, error) {
   207  	var (
   208  		err     error
   209  		keyAsym *ecdsa.PrivateKey
   210  		keySym  []byte
   211  	)
   212  
   213  	if opts.SymKeyID != "" {
   214  		keySym, err = w.GetSymKey(opts.SymKeyID)
   215  		if err != nil {
   216  			return "", err
   217  		}
   218  	}
   219  	if opts.PrivateKeyID != "" {
   220  		keyAsym, err = w.GetPrivateKey(opts.PrivateKeyID)
   221  		if err != nil {
   222  			return "", err
   223  		}
   224  	}
   225  
   226  	f, err := w.createFilterWrapper("", keyAsym, keySym, opts.PoW, opts.Topics)
   227  	if err != nil {
   228  		return "", err
   229  	}
   230  
   231  	id, err := w.waku.Subscribe(GetWakuFilterFrom(f))
   232  	if err != nil {
   233  		return "", err
   234  	}
   235  
   236  	f.(*wakuFilterWrapper).id = id
   237  	return id, nil
   238  }
   239  
   240  func (w *GethWakuWrapper) GetStats() types.StatsSummary {
   241  	return w.waku.GetStats()
   242  }
   243  
   244  func (w *GethWakuWrapper) GetFilter(id string) types.Filter {
   245  	return NewWakuFilterWrapper(w.waku.GetFilter(id), id)
   246  }
   247  
   248  func (w *GethWakuWrapper) Unsubscribe(ctx context.Context, id string) error {
   249  	return w.waku.Unsubscribe(id)
   250  }
   251  
   252  func (w *GethWakuWrapper) UnsubscribeMany(ids []string) error {
   253  	return w.waku.UnsubscribeMany(ids)
   254  }
   255  
   256  func (w *GethWakuWrapper) createFilterWrapper(id string, keyAsym *ecdsa.PrivateKey, keySym []byte, pow float64, topics [][]byte) (types.Filter, error) {
   257  	return NewWakuFilterWrapper(&wakucommon.Filter{
   258  		KeyAsym:  keyAsym,
   259  		KeySym:   keySym,
   260  		PoW:      pow,
   261  		AllowP2P: true,
   262  		Topics:   topics,
   263  		Messages: wakucommon.NewMemoryMessageStore(),
   264  	}, id), nil
   265  }
   266  
   267  func (w *GethWakuWrapper) ProcessingP2PMessages() bool {
   268  	return w.waku.ProcessingP2PMessages()
   269  }
   270  
   271  func (w *GethWakuWrapper) MarkP2PMessageAsProcessed(hash common.Hash) {
   272  	w.waku.MarkP2PMessageAsProcessed(hash)
   273  }
   274  
   275  func (w *GethWakuWrapper) RequestStoreMessages(ctx context.Context, peerID peer.ID, r types.MessagesRequest, processEnvelopes bool) (types.StoreRequestCursor, int, error) {
   276  	return nil, 0, errors.New("not implemented")
   277  }
   278  
   279  func (w *GethWakuWrapper) ConnectionChanged(_ connection.State) {}
   280  
   281  func (w *GethWakuWrapper) ClearEnvelopesCache() {
   282  	w.waku.ClearEnvelopesCache()
   283  }
   284  
   285  type wakuFilterWrapper struct {
   286  	filter *wakucommon.Filter
   287  	id     string
   288  }
   289  
   290  // NewWakuFilterWrapper returns an object that wraps Geth's Filter in a types interface
   291  func NewWakuFilterWrapper(f *wakucommon.Filter, id string) types.Filter {
   292  	if f.Messages == nil {
   293  		panic("Messages should not be nil")
   294  	}
   295  
   296  	return &wakuFilterWrapper{
   297  		filter: f,
   298  		id:     id,
   299  	}
   300  }
   301  
   302  // GetWakuFilterFrom retrieves the underlying whisper Filter struct from a wrapped Filter interface
   303  func GetWakuFilterFrom(f types.Filter) *wakucommon.Filter {
   304  	return f.(*wakuFilterWrapper).filter
   305  }
   306  
   307  // ID returns the filter ID
   308  func (w *wakuFilterWrapper) ID() string {
   309  	return w.id
   310  }
   311  
   312  func (w *GethWakuWrapper) ConfirmMessageDelivered(hashes []common.Hash) {
   313  }
   314  
   315  func (w *GethWakuWrapper) SetStorePeerID(peerID peer.ID) {
   316  }
   317  
   318  func (w *GethWakuWrapper) PeerID() peer.ID {
   319  	panic("not implemented")
   320  }
   321  
   322  func (w *GethWakuWrapper) PingPeer(context.Context, peer.ID) (time.Duration, error) {
   323  	return 0, errors.New("not available in WakuV1")
   324  }