|
1 | 1 | package autopilot
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "bytes" |
5 | 4 | "encoding/hex"
|
6 |
| - "errors" |
7 | 5 | "net"
|
8 | 6 | "sort"
|
9 |
| - "sync/atomic" |
10 |
| - "time" |
11 | 7 |
|
12 | 8 | "github.com/btcsuite/btcd/btcec/v2"
|
13 | 9 | "github.com/btcsuite/btcd/btcec/v2/ecdsa"
|
@@ -154,330 +150,6 @@ func (d *databaseChannelGraph) ForEachNode(cb func(Node) error) error {
|
154 | 150 | })
|
155 | 151 | }
|
156 | 152 |
|
157 |
| -// addRandChannel creates a new channel two target nodes. This function is |
158 |
| -// meant to aide in the generation of random graphs for use within test cases |
159 |
| -// the exercise the autopilot package. |
160 |
| -func (d *databaseChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey, |
161 |
| - capacity btcutil.Amount) (*ChannelEdge, *ChannelEdge, error) { |
162 |
| - |
163 |
| - fetchNode := func(pub *btcec.PublicKey) (*models.LightningNode, error) { |
164 |
| - if pub != nil { |
165 |
| - vertex, err := route.NewVertexFromBytes( |
166 |
| - pub.SerializeCompressed(), |
167 |
| - ) |
168 |
| - if err != nil { |
169 |
| - return nil, err |
170 |
| - } |
171 |
| - |
172 |
| - dbNode, err := d.db.FetchLightningNode(vertex) |
173 |
| - switch { |
174 |
| - case errors.Is(err, graphdb.ErrGraphNodeNotFound): |
175 |
| - fallthrough |
176 |
| - case errors.Is(err, graphdb.ErrGraphNotFound): |
177 |
| - graphNode := &models.LightningNode{ |
178 |
| - HaveNodeAnnouncement: true, |
179 |
| - Addresses: []net.Addr{ |
180 |
| - &net.TCPAddr{ |
181 |
| - IP: bytes.Repeat([]byte("a"), 16), |
182 |
| - }, |
183 |
| - }, |
184 |
| - Features: lnwire.NewFeatureVector( |
185 |
| - nil, lnwire.Features, |
186 |
| - ), |
187 |
| - AuthSigBytes: testSig.Serialize(), |
188 |
| - } |
189 |
| - graphNode.AddPubKey(pub) |
190 |
| - if err := d.db.AddLightningNode(graphNode); err != nil { |
191 |
| - return nil, err |
192 |
| - } |
193 |
| - case err != nil: |
194 |
| - return nil, err |
195 |
| - } |
196 |
| - |
197 |
| - return dbNode, nil |
198 |
| - } |
199 |
| - |
200 |
| - nodeKey, err := randKey() |
201 |
| - if err != nil { |
202 |
| - return nil, err |
203 |
| - } |
204 |
| - dbNode := &models.LightningNode{ |
205 |
| - HaveNodeAnnouncement: true, |
206 |
| - Addresses: []net.Addr{ |
207 |
| - &net.TCPAddr{ |
208 |
| - IP: bytes.Repeat([]byte("a"), 16), |
209 |
| - }, |
210 |
| - }, |
211 |
| - Features: lnwire.NewFeatureVector( |
212 |
| - nil, lnwire.Features, |
213 |
| - ), |
214 |
| - AuthSigBytes: testSig.Serialize(), |
215 |
| - } |
216 |
| - dbNode.AddPubKey(nodeKey) |
217 |
| - if err := d.db.AddLightningNode(dbNode); err != nil { |
218 |
| - return nil, err |
219 |
| - } |
220 |
| - |
221 |
| - return dbNode, nil |
222 |
| - } |
223 |
| - |
224 |
| - vertex1, err := fetchNode(node1) |
225 |
| - if err != nil { |
226 |
| - return nil, nil, err |
227 |
| - } |
228 |
| - |
229 |
| - vertex2, err := fetchNode(node2) |
230 |
| - if err != nil { |
231 |
| - return nil, nil, err |
232 |
| - } |
233 |
| - |
234 |
| - var lnNode1, lnNode2 *btcec.PublicKey |
235 |
| - if bytes.Compare(vertex1.PubKeyBytes[:], vertex2.PubKeyBytes[:]) == -1 { |
236 |
| - lnNode1, _ = vertex1.PubKey() |
237 |
| - lnNode2, _ = vertex2.PubKey() |
238 |
| - } else { |
239 |
| - lnNode1, _ = vertex2.PubKey() |
240 |
| - lnNode2, _ = vertex1.PubKey() |
241 |
| - } |
242 |
| - |
243 |
| - chanID := randChanID() |
244 |
| - edge := &models.ChannelEdgeInfo{ |
245 |
| - ChannelID: chanID.ToUint64(), |
246 |
| - Capacity: capacity, |
247 |
| - } |
248 |
| - edge.AddNodeKeys(lnNode1, lnNode2, lnNode1, lnNode2) |
249 |
| - if err := d.db.AddChannelEdge(edge); err != nil { |
250 |
| - return nil, nil, err |
251 |
| - } |
252 |
| - edgePolicy := &models.ChannelEdgePolicy{ |
253 |
| - SigBytes: testSig.Serialize(), |
254 |
| - ChannelID: chanID.ToUint64(), |
255 |
| - LastUpdate: time.Now(), |
256 |
| - TimeLockDelta: 10, |
257 |
| - MinHTLC: 1, |
258 |
| - MaxHTLC: lnwire.NewMSatFromSatoshis(capacity), |
259 |
| - FeeBaseMSat: 10, |
260 |
| - FeeProportionalMillionths: 10000, |
261 |
| - MessageFlags: 1, |
262 |
| - ChannelFlags: 0, |
263 |
| - } |
264 |
| - |
265 |
| - if err := d.db.UpdateEdgePolicy(edgePolicy); err != nil { |
266 |
| - return nil, nil, err |
267 |
| - } |
268 |
| - edgePolicy = &models.ChannelEdgePolicy{ |
269 |
| - SigBytes: testSig.Serialize(), |
270 |
| - ChannelID: chanID.ToUint64(), |
271 |
| - LastUpdate: time.Now(), |
272 |
| - TimeLockDelta: 10, |
273 |
| - MinHTLC: 1, |
274 |
| - MaxHTLC: lnwire.NewMSatFromSatoshis(capacity), |
275 |
| - FeeBaseMSat: 10, |
276 |
| - FeeProportionalMillionths: 10000, |
277 |
| - MessageFlags: 1, |
278 |
| - ChannelFlags: 1, |
279 |
| - } |
280 |
| - if err := d.db.UpdateEdgePolicy(edgePolicy); err != nil { |
281 |
| - return nil, nil, err |
282 |
| - } |
283 |
| - |
284 |
| - return &ChannelEdge{ |
285 |
| - ChanID: chanID, |
286 |
| - Capacity: capacity, |
287 |
| - Peer: &dbNode{ |
288 |
| - db: d.db, |
289 |
| - node: vertex1, |
290 |
| - }, |
291 |
| - }, |
292 |
| - &ChannelEdge{ |
293 |
| - ChanID: chanID, |
294 |
| - Capacity: capacity, |
295 |
| - Peer: &dbNode{ |
296 |
| - db: d.db, |
297 |
| - node: vertex2, |
298 |
| - }, |
299 |
| - }, |
300 |
| - nil |
301 |
| -} |
302 |
| - |
303 |
| -func (d *databaseChannelGraph) addRandNode() (*btcec.PublicKey, error) { |
304 |
| - nodeKey, err := randKey() |
305 |
| - if err != nil { |
306 |
| - return nil, err |
307 |
| - } |
308 |
| - dbNode := &models.LightningNode{ |
309 |
| - HaveNodeAnnouncement: true, |
310 |
| - Addresses: []net.Addr{ |
311 |
| - &net.TCPAddr{ |
312 |
| - IP: bytes.Repeat([]byte("a"), 16), |
313 |
| - }, |
314 |
| - }, |
315 |
| - Features: lnwire.NewFeatureVector( |
316 |
| - nil, lnwire.Features, |
317 |
| - ), |
318 |
| - AuthSigBytes: testSig.Serialize(), |
319 |
| - } |
320 |
| - dbNode.AddPubKey(nodeKey) |
321 |
| - if err := d.db.AddLightningNode(dbNode); err != nil { |
322 |
| - return nil, err |
323 |
| - } |
324 |
| - |
325 |
| - return nodeKey, nil |
326 |
| - |
327 |
| -} |
328 |
| - |
329 |
| -// memChannelGraph is an implementation of the autopilot.ChannelGraph backed by |
330 |
| -// an in-memory graph. |
331 |
| -type memChannelGraph struct { |
332 |
| - graph map[NodeID]*memNode |
333 |
| -} |
334 |
| - |
335 |
| -// A compile time assertion to ensure memChannelGraph meets the |
336 |
| -// autopilot.ChannelGraph interface. |
337 |
| -var _ ChannelGraph = (*memChannelGraph)(nil) |
338 |
| - |
339 |
| -// newMemChannelGraph creates a new blank in-memory channel graph |
340 |
| -// implementation. |
341 |
| -func newMemChannelGraph() *memChannelGraph { |
342 |
| - return &memChannelGraph{ |
343 |
| - graph: make(map[NodeID]*memNode), |
344 |
| - } |
345 |
| -} |
346 |
| - |
347 |
| -// ForEachNode is a higher-order function that should be called once for each |
348 |
| -// connected node within the channel graph. If the passed callback returns an |
349 |
| -// error, then execution should be terminated. |
350 |
| -// |
351 |
| -// NOTE: Part of the autopilot.ChannelGraph interface. |
352 |
| -func (m memChannelGraph) ForEachNode(cb func(Node) error) error { |
353 |
| - for _, node := range m.graph { |
354 |
| - if err := cb(node); err != nil { |
355 |
| - return err |
356 |
| - } |
357 |
| - } |
358 |
| - |
359 |
| - return nil |
360 |
| -} |
361 |
| - |
362 |
| -// randChanID generates a new random channel ID. |
363 |
| -func randChanID() lnwire.ShortChannelID { |
364 |
| - id := atomic.AddUint64(&chanIDCounter, 1) |
365 |
| - return lnwire.NewShortChanIDFromInt(id) |
366 |
| -} |
367 |
| - |
368 |
| -// randKey returns a random public key. |
369 |
| -func randKey() (*btcec.PublicKey, error) { |
370 |
| - priv, err := btcec.NewPrivateKey() |
371 |
| - if err != nil { |
372 |
| - return nil, err |
373 |
| - } |
374 |
| - |
375 |
| - return priv.PubKey(), nil |
376 |
| -} |
377 |
| - |
378 |
| -// addRandChannel creates a new channel two target nodes. This function is |
379 |
| -// meant to aide in the generation of random graphs for use within test cases |
380 |
| -// the exercise the autopilot package. |
381 |
| -func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey, |
382 |
| - capacity btcutil.Amount) (*ChannelEdge, *ChannelEdge, error) { |
383 |
| - |
384 |
| - var ( |
385 |
| - vertex1, vertex2 *memNode |
386 |
| - ok bool |
387 |
| - ) |
388 |
| - |
389 |
| - if node1 != nil { |
390 |
| - vertex1, ok = m.graph[NewNodeID(node1)] |
391 |
| - if !ok { |
392 |
| - vertex1 = &memNode{ |
393 |
| - pub: node1, |
394 |
| - addrs: []net.Addr{ |
395 |
| - &net.TCPAddr{ |
396 |
| - IP: bytes.Repeat([]byte("a"), 16), |
397 |
| - }, |
398 |
| - }, |
399 |
| - } |
400 |
| - } |
401 |
| - } else { |
402 |
| - newPub, err := randKey() |
403 |
| - if err != nil { |
404 |
| - return nil, nil, err |
405 |
| - } |
406 |
| - vertex1 = &memNode{ |
407 |
| - pub: newPub, |
408 |
| - addrs: []net.Addr{ |
409 |
| - &net.TCPAddr{ |
410 |
| - IP: bytes.Repeat([]byte("a"), 16), |
411 |
| - }, |
412 |
| - }, |
413 |
| - } |
414 |
| - } |
415 |
| - |
416 |
| - if node2 != nil { |
417 |
| - vertex2, ok = m.graph[NewNodeID(node2)] |
418 |
| - if !ok { |
419 |
| - vertex2 = &memNode{ |
420 |
| - pub: node2, |
421 |
| - addrs: []net.Addr{ |
422 |
| - &net.TCPAddr{ |
423 |
| - IP: bytes.Repeat([]byte("a"), 16), |
424 |
| - }, |
425 |
| - }, |
426 |
| - } |
427 |
| - } |
428 |
| - } else { |
429 |
| - newPub, err := randKey() |
430 |
| - if err != nil { |
431 |
| - return nil, nil, err |
432 |
| - } |
433 |
| - vertex2 = &memNode{ |
434 |
| - pub: newPub, |
435 |
| - addrs: []net.Addr{ |
436 |
| - &net.TCPAddr{ |
437 |
| - IP: bytes.Repeat([]byte("a"), 16), |
438 |
| - }, |
439 |
| - }, |
440 |
| - } |
441 |
| - } |
442 |
| - |
443 |
| - edge1 := ChannelEdge{ |
444 |
| - ChanID: randChanID(), |
445 |
| - Capacity: capacity, |
446 |
| - Peer: vertex2, |
447 |
| - } |
448 |
| - vertex1.chans = append(vertex1.chans, edge1) |
449 |
| - |
450 |
| - edge2 := ChannelEdge{ |
451 |
| - ChanID: randChanID(), |
452 |
| - Capacity: capacity, |
453 |
| - Peer: vertex1, |
454 |
| - } |
455 |
| - vertex2.chans = append(vertex2.chans, edge2) |
456 |
| - |
457 |
| - m.graph[NewNodeID(vertex1.pub)] = vertex1 |
458 |
| - m.graph[NewNodeID(vertex2.pub)] = vertex2 |
459 |
| - |
460 |
| - return &edge1, &edge2, nil |
461 |
| -} |
462 |
| - |
463 |
| -func (m *memChannelGraph) addRandNode() (*btcec.PublicKey, error) { |
464 |
| - newPub, err := randKey() |
465 |
| - if err != nil { |
466 |
| - return nil, err |
467 |
| - } |
468 |
| - vertex := &memNode{ |
469 |
| - pub: newPub, |
470 |
| - addrs: []net.Addr{ |
471 |
| - &net.TCPAddr{ |
472 |
| - IP: bytes.Repeat([]byte("a"), 16), |
473 |
| - }, |
474 |
| - }, |
475 |
| - } |
476 |
| - m.graph[NewNodeID(newPub)] = vertex |
477 |
| - |
478 |
| - return newPub, nil |
479 |
| -} |
480 |
| - |
481 | 153 | // databaseChannelGraphCached wraps a channeldb.ChannelGraph instance with the
|
482 | 154 | // necessary API to properly implement the autopilot.ChannelGraph interface.
|
483 | 155 | type databaseChannelGraphCached struct {
|
|
0 commit comments