@@ -516,62 +516,37 @@ public class HumanObjectPeerTestInstance {
516
516
peerC. constructor? . interrupt ( )
517
517
}
518
518
}
519
-
520
- func testMessageHandling( ) async {
521
-
522
- let FUNDING_SATOSHI_AMOUNT : UInt64 = 100_000 // 100k satoshis
523
- let SEND_MSAT_AMOUNT_A_TO_B : UInt64 = 10_000_000 // 10k satoshis
524
- let SEND_MSAT_AMOUNT_B_TO_A : UInt64 = 3_000_000 // 3k satoshis
525
-
526
- let peer1 = Peer ( master: self , seed: 1 )
527
- let peer2 = Peer ( master: self , seed: 2 )
528
-
529
- do {
530
- // connect the nodes
531
- let originalPeersA = peer1. peerManager. getPeerNodeIds ( )
532
- let originalPeersB = peer2. peerManager. getPeerNodeIds ( )
533
- XCTAssertEqual ( originalPeersA. count, 0 )
534
- XCTAssertEqual ( originalPeersB. count, 0 )
535
-
536
- connectPeers ( peerA: peer1, peerB: peer2)
537
-
538
- // sleep for one second
539
- try ! await Task . sleep ( nanoseconds: 1_000_000_000 )
540
-
541
- let connectedPeersA = peer1. peerManager. getPeerNodeIds ( )
542
- let connectedPeersB = peer2. peerManager. getPeerNodeIds ( )
543
- XCTAssertEqual ( connectedPeersA. count, 1 )
544
- XCTAssertEqual ( connectedPeersB. count, 1 )
545
- }
546
-
519
+
520
+ fileprivate class func openChannel( peerA: Peer , peerB: Peer , fundingAmount: UInt64 , latestBlock: BTCBlock ? = nil , otherPeers: [ Peer ] = [ ] ) async -> BTCBlock ? {
547
521
do {
548
522
// initiate channel opening
549
523
let config = UserConfig . initWithDefault ( )
550
- let theirNodeId = peer2 . channelManager. getOurNodeId ( )
524
+ let theirNodeId = peerB . channelManager. getOurNodeId ( )
551
525
let userChannelId : [ UInt8 ] = [ UInt8] ( repeating: 42 , count: 16 ) ;
552
- let channelOpenResult = peer1 . channelManager. createChannel ( theirNetworkKey: theirNodeId, channelValueSatoshis: FUNDING_SATOSHI_AMOUNT , pushMsat: 1000 , userChannelId: userChannelId, overrideConfig: config)
526
+ let channelOpenResult = peerA . channelManager. createChannel ( theirNetworkKey: theirNodeId, channelValueSatoshis: fundingAmount , pushMsat: 1000 , userChannelId: userChannelId, overrideConfig: config)
553
527
554
528
XCTAssertTrue ( channelOpenResult. isOk ( ) )
555
- let channels = peer1 . channelManager. listChannels ( )
529
+ let channels = peerA . channelManager. listChannels ( )
556
530
let firstChannel = channels [ 0 ]
557
531
let fundingTxo = firstChannel. getFundingTxo ( )
558
532
XCTAssertNil ( fundingTxo)
559
533
}
560
534
561
- let channelsA = peer1 . channelManager. listChannels ( )
535
+ let channelsA = peerA . channelManager. listChannels ( )
562
536
XCTAssertEqual ( channelsA. count, 1 )
563
537
564
- let managerEvents = try ! await peer1 . getManagerEvents ( expectedCount: 1 )
538
+ let managerEvents = try ! await peerA . getManagerEvents ( expectedCount: 1 )
565
539
XCTAssertEqual ( managerEvents. count, 1 )
566
540
567
541
let managerEvent = managerEvents [ 0 ]
568
542
guard case . FundingGenerationReady = managerEvent. getValueType ( ) else {
569
- return XCTAssert ( false , " Expected .FundingGenerationReady, got \( managerEvent. getValueType ( ) ) " )
543
+ XCTAssert ( false , " Expected .FundingGenerationReady, got \( managerEvent. getValueType ( ) ) " )
544
+ return nil
570
545
}
571
546
572
547
let fundingReadyEvent = managerEvent. getValueAsFundingGenerationReady ( ) !
573
- XCTAssertEqual ( fundingReadyEvent. getChannelValueSatoshis ( ) , FUNDING_SATOSHI_AMOUNT )
574
- let expectedUserChannelId : [ UInt8 ] = [ UInt8] ( repeating: 42 , count: 16 ) ;
548
+ XCTAssertEqual ( fundingReadyEvent. getChannelValueSatoshis ( ) , fundingAmount )
549
+ let expectedUserChannelId : [ UInt8 ] = [ UInt8] ( repeating: 42 , count: 16 ) ;
575
550
XCTAssertEqual ( fundingReadyEvent. getUserChannelId ( ) , expectedUserChannelId)
576
551
577
552
let fundingOutputScript = fundingReadyEvent. getOutputScript ( ) ;
@@ -591,33 +566,37 @@ public class HumanObjectPeerTestInstance {
591
566
fundingTransaction. inputs = [ input]
592
567
fundingTransaction. setWitnessForInput ( inputIndex: 0 , witness: BTCTransaction . Witness ( stackElements: [ [ 1 ] ] ) )
593
568
594
- let output = BTCTransaction . Output ( value: FUNDING_SATOSHI_AMOUNT , script: fundingOutputScript)
569
+ let output = BTCTransaction . Output ( value: fundingAmount , script: fundingOutputScript)
595
570
fundingTransaction. outputs = [ output]
596
571
let serializedFundingTx = fundingTransaction. serialize ( )
597
- let fundingResult = peer1 . channelManager. fundingTransactionGenerated ( temporaryChannelId: temporaryChannelId, counterpartyNodeId: peer2 . channelManager. getOurNodeId ( ) , fundingTransaction: serializedFundingTx)
572
+ let fundingResult = peerA . channelManager. fundingTransactionGenerated ( temporaryChannelId: temporaryChannelId, counterpartyNodeId: peerB . channelManager. getOurNodeId ( ) , fundingTransaction: serializedFundingTx)
598
573
XCTAssertTrue ( fundingResult. isOk ( ) )
599
574
600
- let pendingBroadcasts = await peer1 . getPendingBroadcasts ( expectedCount: 1 )
575
+ let pendingBroadcasts = await peerA . getPendingBroadcasts ( expectedCount: 1 )
601
576
602
577
XCTAssertEqual ( pendingBroadcasts. count, 1 )
603
578
XCTAssertEqual ( pendingBroadcasts. first!, serializedFundingTx)
604
579
605
580
let fundingBlock = BTCBlock ( )
606
581
fundingBlock. version = 2
607
- fundingBlock. previousBlockHash = BTCHashing . SHA_ZERO_HASH
582
+ fundingBlock. previousBlockHash = latestBlock ? . calculateHash ( ) ?? BTCHashing . SHA_ZERO_HASH
608
583
fundingBlock. merkleRoot = BTCHashing . SHA_ZERO_HASH
609
584
fundingBlock. timestamp = 42
610
585
fundingBlock. difficultyTarget = 0
611
586
fundingBlock. nonce = 0
587
+ fundingBlock. height = ( latestBlock? . height ?? 0 ) + 1 ;
612
588
fundingBlock. transactions = [ fundingTransaction]
613
589
614
590
print ( " Connecting funding block… " )
615
- peer1. connectBlock ( block: fundingBlock, height: 1 , expectedMonitorUpdateLength: 0 )
616
- peer2. connectBlock ( block: fundingBlock, height: 1 , expectedMonitorUpdateLength: 0 )
591
+ peerA. connectBlock ( block: fundingBlock, height: fundingBlock. height, expectedMonitorUpdateLength: 0 )
592
+ peerB. connectBlock ( block: fundingBlock, height: fundingBlock. height, expectedMonitorUpdateLength: 0 )
593
+ for currentPeer in otherPeers {
594
+ currentPeer. connectBlock ( block: fundingBlock, height: 1 , expectedMonitorUpdateLength: 0 )
595
+ }
617
596
618
597
print ( " Connecting confirmation blocks… " )
619
598
var previousBlock = fundingBlock
620
- for height in 2 ..< 101 {
599
+ for height in ( fundingBlock . height + 1 ) ..< ( fundingBlock . height + 100 ) {
621
600
let currentBlock = BTCBlock ( )
622
601
currentBlock. version = 2
623
602
currentBlock. previousBlockHash = previousBlock. calculateHash ( )
@@ -626,29 +605,34 @@ public class HumanObjectPeerTestInstance {
626
605
currentBlock. difficultyTarget = 0
627
606
currentBlock. nonce = 0
628
607
629
- peer1. connectBlock ( block: currentBlock, height: UInt32 ( height) , expectedMonitorUpdateLength: 0 )
630
- peer2. connectBlock ( block: currentBlock, height: UInt32 ( height) , expectedMonitorUpdateLength: 0 )
608
+ peerA. connectBlock ( block: currentBlock, height: UInt32 ( height) , expectedMonitorUpdateLength: 0 )
609
+ peerB. connectBlock ( block: currentBlock, height: UInt32 ( height) , expectedMonitorUpdateLength: 0 )
610
+ for currentPeer in otherPeers {
611
+ currentPeer. connectBlock ( block: currentBlock, height: UInt32 ( height) , expectedMonitorUpdateLength: 0 )
612
+ }
631
613
previousBlock = currentBlock
632
614
}
633
615
634
- let peer1Events = try ! await peer1 . getManagerEvents ( expectedCount: 2 )
616
+ let peer1Events = try ! await peerA . getManagerEvents ( expectedCount: 2 )
635
617
let peer1ReadyEvent = peer1Events [ 1 ]
636
618
guard case . ChannelReady = peer1ReadyEvent. getValueType ( ) else {
637
- return XCTAssert ( false , " Expected .ChannelReady, got \( peer1ReadyEvent. getValueType ( ) ) " )
619
+ XCTAssert ( false , " Expected .ChannelReady, got \( peer1ReadyEvent. getValueType ( ) ) " )
620
+ return nil
638
621
}
639
622
640
- let peer2Events = try ! await peer2 . getManagerEvents ( expectedCount: 2 )
623
+ let peer2Events = try ! await peerB . getManagerEvents ( expectedCount: 2 )
641
624
let peer2ReadyEvent = peer2Events [ 1 ]
642
625
guard case . ChannelReady = peer2ReadyEvent. getValueType ( ) else {
643
- return XCTAssert ( false , " Expected .ChannelReady, got \( peer2ReadyEvent. getValueType ( ) ) " )
626
+ XCTAssert ( false , " Expected .ChannelReady, got \( peer2ReadyEvent. getValueType ( ) ) " )
627
+ return nil
644
628
}
645
629
646
630
var usableChannelsA = [ ChannelDetails] ( )
647
631
var usableChannelsB = [ ChannelDetails] ( )
648
632
print ( " Awaiting usable channels to populate… " )
649
633
while ( usableChannelsA. isEmpty || usableChannelsB. isEmpty) {
650
- usableChannelsA = peer1 . channelManager. listUsableChannels ( )
651
- usableChannelsB = peer2 . channelManager. listUsableChannels ( )
634
+ usableChannelsA = peerA . channelManager. listUsableChannels ( )
635
+ usableChannelsB = peerB . channelManager. listUsableChannels ( )
652
636
// sleep for 100ms
653
637
try ! await Task . sleep ( nanoseconds: 0_100_000_000 )
654
638
}
@@ -659,7 +643,7 @@ public class HumanObjectPeerTestInstance {
659
643
660
644
let channelAToB = usableChannelsA [ 0 ]
661
645
let channelBToA = usableChannelsB [ 0 ]
662
- XCTAssertEqual ( channelAToB. getChannelValueSatoshis ( ) , FUNDING_SATOSHI_AMOUNT )
646
+ XCTAssertEqual ( channelAToB. getChannelValueSatoshis ( ) , fundingAmount )
663
647
let shortChannelId = channelAToB. getShortChannelId ( ) !
664
648
665
649
let fundingTxId = fundingTransaction. calculateId ( )
@@ -670,7 +654,54 @@ public class HumanObjectPeerTestInstance {
670
654
let originalChannelBalanceBToA = channelBToA. getBalanceMsat ( )
671
655
print ( " original balance A->B mSats: \( originalChannelBalanceAToB) " )
672
656
print ( " original balance B->A mSats: \( originalChannelBalanceBToA) " )
657
+
658
+ // return the latest block after activating the channel
659
+ return previousBlock
660
+ }
673
661
662
+ func testMessageHandling( ) async {
663
+
664
+ let FUNDING_SATOSHI_AMOUNT : UInt64 = 100_000 // 100k satoshis
665
+ let SEND_MSAT_AMOUNT_A_TO_B : UInt64 = 10_000_000 // 10k satoshis
666
+ let SEND_MSAT_AMOUNT_B_TO_A : UInt64 = 3_000_000 // 3k satoshis
667
+ let SEND_MSAT_AMOUNT_A_TO_C : UInt64 = 5_000_000 // 5k satoshis, with intermediate hop
668
+
669
+ let peer1 = Peer ( master: self , seed: 1 )
670
+ let peer2 = Peer ( master: self , seed: 2 )
671
+ let peer3 = Peer ( master: self , seed: 3 )
672
+
673
+ do {
674
+ // connect the nodes
675
+ let originalPeersA = peer1. peerManager. getPeerNodeIds ( )
676
+ let originalPeersB = peer2. peerManager. getPeerNodeIds ( )
677
+ XCTAssertEqual ( originalPeersA. count, 0 )
678
+ XCTAssertEqual ( originalPeersB. count, 0 )
679
+
680
+ connectPeers ( peerA: peer1, peerB: peer2)
681
+ connectPeers ( peerA: peer2, peerB: peer3)
682
+
683
+ // sleep for one second
684
+ try ! await Task . sleep ( nanoseconds: 1_000_000_000 )
685
+
686
+ let connectedPeersA = peer1. peerManager. getPeerNodeIds ( )
687
+ let connectedPeersB = peer2. peerManager. getPeerNodeIds ( )
688
+ let connectedPeersC = peer3. peerManager. getPeerNodeIds ( )
689
+ XCTAssertEqual ( connectedPeersA. count, 1 )
690
+ XCTAssertEqual ( connectedPeersB. count, 2 )
691
+ XCTAssertEqual ( connectedPeersC. count, 1 )
692
+ }
693
+
694
+ var confirmedChannelBlock = await HumanObjectPeerTestInstance . openChannel ( peerA: peer1, peerB: peer2, fundingAmount: FUNDING_SATOSHI_AMOUNT, otherPeers: [ peer3] )
695
+
696
+ let usableChannelsA = peer1. channelManager. listUsableChannels ( )
697
+ let usableChannelsB = peer2. channelManager. listUsableChannels ( )
698
+ let channelAToB = usableChannelsA [ 0 ]
699
+ let channelBToA = usableChannelsB [ 0 ]
700
+ let originalChannelBalanceAToB = channelAToB. getBalanceMsat ( )
701
+ let originalChannelBalanceBToA = channelBToA. getBalanceMsat ( )
702
+
703
+ confirmedChannelBlock = await HumanObjectPeerTestInstance . openChannel ( peerA: peer2, peerB: peer3, fundingAmount: FUNDING_SATOSHI_AMOUNT, latestBlock: confirmedChannelBlock, otherPeers: [ peer1] )
704
+
674
705
let logger = TestLogger ( )
675
706
676
707
do {
0 commit comments