lnwallet: update tests to switch to new workflow
This commit is contained in:
parent
d24831dc29
commit
882e7640d5
@ -45,6 +45,7 @@ var (
|
|||||||
0x4f, 0x2f, 0x6f, 0x25, 0x88, 0xa3, 0xef, 0xb9,
|
0x4f, 0x2f, 0x6f, 0x25, 0x88, 0xa3, 0xef, 0xb9,
|
||||||
0x6a, 0x49, 0x18, 0x83, 0x31, 0x98, 0x47, 0x53,
|
0x6a, 0x49, 0x18, 0x83, 0x31, 0x98, 0x47, 0x53,
|
||||||
}
|
}
|
||||||
|
zeroHash = bytes.Repeat([]byte{0}, 32)
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertProperBalance(t *testing.T, lw *LightningWallet, numConfirms, amount int32) {
|
func assertProperBalance(t *testing.T, lw *LightningWallet, numConfirms, amount int32) {
|
||||||
@ -73,6 +74,18 @@ type bobNode struct {
|
|||||||
changeOutputs []*wire.TxOut
|
changeOutputs []*wire.TxOut
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *bobNode) Contribution() *ChannelContribution {
|
||||||
|
return &ChannelContribution{
|
||||||
|
Inputs: b.availableOutputs,
|
||||||
|
ChangeOutputs: b.changeOutputs,
|
||||||
|
MultiSigKey: b.channelKey,
|
||||||
|
CommitKey: b.channelKey,
|
||||||
|
DeliveryAddress: b.deliveryAddress,
|
||||||
|
RevocationHash: b.revocation,
|
||||||
|
CsvDelay: b.delay,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// signFundingTx generates signatures for all the inputs in the funding tx
|
// signFundingTx generates signatures for all the inputs in the funding tx
|
||||||
// belonging to Bob.
|
// belonging to Bob.
|
||||||
func (b *bobNode) signFundingTx(fundingTx *wire.MsgTx) ([][]byte, error) {
|
func (b *bobNode) signFundingTx(fundingTx *wire.MsgTx) ([][]byte, error) {
|
||||||
@ -290,7 +303,10 @@ func testBasicWalletReservationWorkFlow(lnwallet *LightningWallet, t *testing.T)
|
|||||||
// Bob initiates a channel funded with 5 BTC for each side, so 10
|
// Bob initiates a channel funded with 5 BTC for each side, so 10
|
||||||
// BTC total. He also generates 2 BTC in change.
|
// BTC total. He also generates 2 BTC in change.
|
||||||
fundingAmount := btcutil.Amount(5 * 1e8)
|
fundingAmount := btcutil.Amount(5 * 1e8)
|
||||||
|
fmt.Println("init res")
|
||||||
|
// TODO(roasbeef): include csv delay?
|
||||||
chanReservation, err := lnwallet.InitChannelReservation(fundingAmount, SIGHASH)
|
chanReservation, err := lnwallet.InitChannelReservation(fundingAmount, SIGHASH)
|
||||||
|
fmt.Println("fail init res")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unable to initialize funding reservation: %v", err)
|
t.Fatalf("unable to initialize funding reservation: %v", err)
|
||||||
}
|
}
|
||||||
@ -298,58 +314,76 @@ func testBasicWalletReservationWorkFlow(lnwallet *LightningWallet, t *testing.T)
|
|||||||
// The channel reservation should now be populated with a multi-sig key
|
// The channel reservation should now be populated with a multi-sig key
|
||||||
// from our HD chain, a change output with 3 BTC, and 2 outputs selected
|
// from our HD chain, a change output with 3 BTC, and 2 outputs selected
|
||||||
// of 4 BTC each.
|
// of 4 BTC each.
|
||||||
ourInputs, ourChange := chanReservation.OurFunds()
|
ourContribution := chanReservation.OurContribution()
|
||||||
if len(ourInputs) != 2 {
|
if len(ourContribution.Inputs) != 2 {
|
||||||
t.Fatalf("outputs for funding tx not properly selected, have %v "+
|
t.Fatalf("outputs for funding tx not properly selected, have %v "+
|
||||||
"outputs should have 2", len(ourInputs))
|
"outputs should have 2", len(ourContribution.Inputs))
|
||||||
}
|
}
|
||||||
ourMultiSigKey, ourCommitKey := chanReservation.OurKeys()
|
if ourContribution.ChangeOutputs[0].Value != 3e8 {
|
||||||
if ourMultiSigKey == nil {
|
t.Fatalf("coin selection failed, change output should be 3e8 "+
|
||||||
|
"satoshis, is instead %v", ourContribution.ChangeOutputs[0].Value)
|
||||||
|
}
|
||||||
|
if ourContribution.MultiSigKey == nil {
|
||||||
t.Fatalf("alice's key for multi-sig not found")
|
t.Fatalf("alice's key for multi-sig not found")
|
||||||
}
|
}
|
||||||
if ourCommitKey == nil {
|
if ourContribution.CommitKey == nil {
|
||||||
t.Fatalf("alice's key for commit not found")
|
t.Fatalf("alice's key for commit not found")
|
||||||
}
|
}
|
||||||
if ourChange[0].Value != 3e8 {
|
if ourContribution.DeliveryAddress == nil {
|
||||||
t.Fatalf("coin selection failed, change output should be 3e8 "+
|
t.Fatalf("alice's final delivery address not found")
|
||||||
"satoshis, is instead %v", ourChange[0].Value)
|
|
||||||
}
|
}
|
||||||
|
if bytes.Equal(ourContribution.RevocationHash[:], zeroHash) {
|
||||||
|
t.Fatalf("alice's revocation hash not found")
|
||||||
|
}
|
||||||
|
//if ourContribution.CsvDelay == 0 {
|
||||||
|
//t.Fatalf("csv delay not set")
|
||||||
|
//}
|
||||||
|
|
||||||
// Bob sends over his output, change addr, pub keys, initial revocation,
|
// Bob sends over his output, change addr, pub keys, initial revocation,
|
||||||
// final delivery address, and his accepted csv delay for the commitmen
|
// final delivery address, and his accepted csv delay for the commitmen
|
||||||
// t transactions.
|
// t transactions.
|
||||||
if err := chanReservation.AddContribution(bobNode.availableOutputs,
|
fmt.Println("init reset")
|
||||||
bobNode.changeOutputs, bobNode.channelKey, bobNode.channelKey,
|
if err := chanReservation.ProcessContribution(bobNode.Contribution()); err != nil {
|
||||||
bobNode.deliveryAddress, bobNode.revocation, bobNode.delay); err != nil {
|
|
||||||
t.Fatalf("unable to add bob's funds to the funding tx: %v", err)
|
t.Fatalf("unable to add bob's funds to the funding tx: %v", err)
|
||||||
}
|
}
|
||||||
|
fmt.Println("fin reset")
|
||||||
|
|
||||||
// At this point, the reservation should have our signatures, and a
|
// At this point, the reservation should have our signatures, and a
|
||||||
// partial funding transaction (missing bob's sigs).
|
// partial funding transaction (missing bob's sigs).
|
||||||
if len(chanReservation.OurFundingSigs()) != 2 {
|
theirContribution := chanReservation.TheirContribution()
|
||||||
|
ourFundingSigs, ourCommitSig := chanReservation.OurSignatures()
|
||||||
|
if len(ourFundingSigs) != 2 {
|
||||||
t.Fatalf("only %v of our sigs present, should have 2",
|
t.Fatalf("only %v of our sigs present, should have 2",
|
||||||
len(chanReservation.OurFundingSigs()))
|
len(ourFundingSigs))
|
||||||
|
}
|
||||||
|
if ourCommitSig == nil {
|
||||||
|
t.Fatalf("commitment sig not found")
|
||||||
}
|
}
|
||||||
// Additionally, the funding tx should have been populated.
|
// Additionally, the funding tx should have been populated.
|
||||||
if chanReservation.partialState.fundingTx == nil {
|
if chanReservation.partialState.fundingTx == nil {
|
||||||
t.Fatalf("funding transaction never created!")
|
t.Fatalf("funding transaction never created!")
|
||||||
}
|
}
|
||||||
// Their funds should also be filled in.
|
// Their funds should also be filled in.
|
||||||
theirInputs, theirChange := chanReservation.TheirFunds()
|
if len(theirContribution.Inputs) != 1 {
|
||||||
if len(theirInputs) != 1 {
|
|
||||||
t.Fatalf("bob's outputs for funding tx not properly selected, have %v "+
|
t.Fatalf("bob's outputs for funding tx not properly selected, have %v "+
|
||||||
"outputs should have 2", len(theirInputs))
|
"outputs should have 2", len(theirContribution.Inputs))
|
||||||
}
|
}
|
||||||
theirMultisigKey, theirCommitKey := chanReservation.TheirKeys()
|
if theirContribution.ChangeOutputs[0].Value != 2e8 {
|
||||||
if theirMultisigKey == nil {
|
t.Fatalf("bob should have one change output with value 2e8"+
|
||||||
|
"satoshis, is instead %v",
|
||||||
|
theirContribution.ChangeOutputs[0].Value)
|
||||||
|
}
|
||||||
|
if theirContribution.MultiSigKey == nil {
|
||||||
t.Fatalf("bob's key for multi-sig not found")
|
t.Fatalf("bob's key for multi-sig not found")
|
||||||
}
|
}
|
||||||
if theirCommitKey == nil {
|
if theirContribution.CommitKey == nil {
|
||||||
t.Fatalf("bob's key for commit tx not found")
|
t.Fatalf("bob's key for commit tx not found")
|
||||||
}
|
}
|
||||||
if theirChange[0].Value != 2e8 {
|
if theirContribution.DeliveryAddress == nil {
|
||||||
t.Fatalf("bob should have one change output with value 2e8"+
|
t.Fatalf("bob's final delivery address not found")
|
||||||
"satoshis, is instead %v", theirChange[0].Value)
|
}
|
||||||
|
if bytes.Equal(theirContribution.RevocationHash[:], zeroHash) {
|
||||||
|
t.Fatalf("bob's revocaiton hash not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Alice responds with her output, change addr, multi-sig key and signatures.
|
// Alice responds with her output, change addr, multi-sig key and signatures.
|
||||||
@ -359,9 +393,11 @@ func testBasicWalletReservationWorkFlow(lnwallet *LightningWallet, t *testing.T)
|
|||||||
t.Fatalf("unable to sign inputs for bob: %v", err)
|
t.Fatalf("unable to sign inputs for bob: %v", err)
|
||||||
}
|
}
|
||||||
var fakeCommitSig []byte
|
var fakeCommitSig []byte
|
||||||
|
fmt.Println("complete res")
|
||||||
if err := chanReservation.CompleteReservation(bobsSigs, fakeCommitSig); err != nil {
|
if err := chanReservation.CompleteReservation(bobsSigs, fakeCommitSig); err != nil {
|
||||||
t.Fatalf("unable to complete funding tx: %v", err)
|
t.Fatalf("unable to complete funding tx: %v", err)
|
||||||
}
|
}
|
||||||
|
fmt.Println("fin complete res")
|
||||||
|
|
||||||
// At this point, the channel can be considered "open" when the funding
|
// At this point, the channel can be considered "open" when the funding
|
||||||
// txn hits a "comfortable" depth.
|
// txn hits a "comfortable" depth.
|
||||||
@ -403,7 +439,7 @@ func testBasicWalletReservationWorkFlow(lnwallet *LightningWallet, t *testing.T)
|
|||||||
// Check each input and ensure all scripts are fully valid.
|
// Check each input and ensure all scripts are fully valid.
|
||||||
// TODO(roasbeef): remove this loop after nodetest hooked up.
|
// TODO(roasbeef): remove this loop after nodetest hooked up.
|
||||||
var zeroHash wire.ShaHash
|
var zeroHash wire.ShaHash
|
||||||
fundingTx := chanReservation.partialState.fundingTx
|
fundingTx := chanReservation.FinalFundingTx()
|
||||||
for i, input := range fundingTx.TxIn {
|
for i, input := range fundingTx.TxIn {
|
||||||
var pkscript []byte
|
var pkscript []byte
|
||||||
// Bob's txin
|
// Bob's txin
|
||||||
@ -449,23 +485,23 @@ func testFundingTransactionLockedOutputs(lnwallet *LightningWallet, t *testing.T
|
|||||||
|
|
||||||
// Neither should have any change, as all our output sizes are
|
// Neither should have any change, as all our output sizes are
|
||||||
// identical (4BTC).
|
// identical (4BTC).
|
||||||
ourInputs1, ourChange1 := chanReservation1.OurFunds()
|
ourContribution1 := chanReservation1.OurContribution()
|
||||||
if len(ourInputs1) != 2 {
|
if len(ourContribution1.Inputs) != 2 {
|
||||||
t.Fatalf("outputs for funding tx not properly selected, has %v "+
|
t.Fatalf("outputs for funding tx not properly selected, has %v "+
|
||||||
"outputs should have 2", len(ourInputs1))
|
"outputs should have 2", len(ourContribution1.Inputs))
|
||||||
}
|
}
|
||||||
if len(ourChange1) != 0 {
|
if len(ourContribution1.ChangeOutputs) != 0 {
|
||||||
t.Fatalf("funding transaction should have no change, instead has %v",
|
t.Fatalf("funding transaction should have no change, instead has %v",
|
||||||
len(ourChange1))
|
len(ourContribution1.ChangeOutputs))
|
||||||
}
|
}
|
||||||
ourInputs2, ourChange2 := chanReservation2.OurFunds()
|
ourContribution2 := chanReservation2.OurContribution()
|
||||||
if len(ourInputs2) != 2 {
|
if len(ourContribution2.Inputs) != 2 {
|
||||||
t.Fatalf("outputs for funding tx not properly selected, have %v "+
|
t.Fatalf("outputs for funding tx not properly selected, have %v "+
|
||||||
"outputs should have 2", len(ourInputs2))
|
"outputs should have 2", len(ourContribution2.Inputs))
|
||||||
}
|
}
|
||||||
if len(ourChange2) != 0 {
|
if len(ourContribution2.ChangeOutputs) != 0 {
|
||||||
t.Fatalf("funding transaction should have no change, instead has %v",
|
t.Fatalf("funding transaction should have no change, instead has %v",
|
||||||
len(ourChange2))
|
len(ourContribution2.ChangeOutputs))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now attempt to reserve funds for another channel, this time requesting
|
// Now attempt to reserve funds for another channel, this time requesting
|
||||||
|
Loading…
Reference in New Issue
Block a user