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 }