2019-10-24 13:04:26 +03:00
|
|
|
package migration_01_to_11
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"io/ioutil"
|
|
|
|
"math/rand"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/btcsuite/btcd/btcec"
|
|
|
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
|
|
|
"github.com/btcsuite/btcd/wire"
|
|
|
|
"github.com/btcsuite/btcutil"
|
|
|
|
_ "github.com/btcsuite/btcwallet/walletdb/bdb"
|
2021-01-15 13:12:08 +03:00
|
|
|
lnwire "github.com/lightningnetwork/lnd/channeldb/migration/lnwire21"
|
2019-10-24 13:04:26 +03:00
|
|
|
"github.com/lightningnetwork/lnd/keychain"
|
|
|
|
"github.com/lightningnetwork/lnd/shachain"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
key = [chainhash.HashSize]byte{
|
|
|
|
0x81, 0xb6, 0x37, 0xd8, 0xfc, 0xd2, 0xc6, 0xda,
|
|
|
|
0x68, 0x59, 0xe6, 0x96, 0x31, 0x13, 0xa1, 0x17,
|
|
|
|
0xd, 0xe7, 0x93, 0xe4, 0xb7, 0x25, 0xb8, 0x4d,
|
|
|
|
0x1e, 0xb, 0x4c, 0xf9, 0x9e, 0xc5, 0x8c, 0xe9,
|
|
|
|
}
|
|
|
|
rev = [chainhash.HashSize]byte{
|
|
|
|
0x51, 0xb6, 0x37, 0xd8, 0xfc, 0xd2, 0xc6, 0xda,
|
|
|
|
0x48, 0x59, 0xe6, 0x96, 0x31, 0x13, 0xa1, 0x17,
|
|
|
|
0x2d, 0xe7, 0x93, 0xe4,
|
|
|
|
}
|
|
|
|
testTx = &wire.MsgTx{
|
|
|
|
Version: 1,
|
|
|
|
TxIn: []*wire.TxIn{
|
|
|
|
{
|
|
|
|
PreviousOutPoint: wire.OutPoint{
|
|
|
|
Hash: chainhash.Hash{},
|
|
|
|
Index: 0xffffffff,
|
|
|
|
},
|
|
|
|
SignatureScript: []byte{0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62},
|
|
|
|
Sequence: 0xffffffff,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
TxOut: []*wire.TxOut{
|
|
|
|
{
|
|
|
|
Value: 5000000000,
|
|
|
|
PkScript: []byte{
|
|
|
|
0x41, // OP_DATA_65
|
|
|
|
0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,
|
|
|
|
0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,
|
|
|
|
0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,
|
|
|
|
0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,
|
|
|
|
0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,
|
|
|
|
0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,
|
|
|
|
0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,
|
|
|
|
0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,
|
|
|
|
0xa6, // 65-byte signature
|
|
|
|
0xac, // OP_CHECKSIG
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
LockTime: 5,
|
|
|
|
}
|
|
|
|
privKey, pubKey = btcec.PrivKeyFromBytes(btcec.S256(), key[:])
|
|
|
|
)
|
|
|
|
|
|
|
|
// makeTestDB creates a new instance of the ChannelDB for testing purposes. A
|
|
|
|
// callback which cleans up the created temporary directories is also returned
|
|
|
|
// and intended to be executed after the test completes.
|
|
|
|
func makeTestDB() (*DB, func(), error) {
|
|
|
|
// First, create a temporary directory to be used for the duration of
|
|
|
|
// this test.
|
|
|
|
tempDirName, err := ioutil.TempDir("", "channeldb")
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Next, create channeldb for the first time.
|
|
|
|
cdb, err := Open(tempDirName)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanUp := func() {
|
|
|
|
cdb.Close()
|
|
|
|
os.RemoveAll(tempDirName)
|
|
|
|
}
|
|
|
|
|
|
|
|
return cdb, cleanUp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func createTestChannelState(cdb *DB) (*OpenChannel, error) {
|
|
|
|
// Simulate 1000 channel updates.
|
|
|
|
producer, err := shachain.NewRevocationProducerFromBytes(key[:])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
store := shachain.NewRevocationStore()
|
|
|
|
for i := 0; i < 1; i++ {
|
|
|
|
preImage, err := producer.AtIndex(uint64(i))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := store.AddNextEntry(preImage); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
localCfg := ChannelConfig{
|
|
|
|
ChannelConstraints: ChannelConstraints{
|
|
|
|
DustLimit: btcutil.Amount(rand.Int63()),
|
|
|
|
MaxPendingAmount: lnwire.MilliSatoshi(rand.Int63()),
|
|
|
|
ChanReserve: btcutil.Amount(rand.Int63()),
|
|
|
|
MinHTLC: lnwire.MilliSatoshi(rand.Int63()),
|
|
|
|
MaxAcceptedHtlcs: uint16(rand.Int31()),
|
|
|
|
CsvDelay: uint16(rand.Int31()),
|
|
|
|
},
|
|
|
|
MultiSigKey: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
},
|
|
|
|
RevocationBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
},
|
|
|
|
PaymentBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
},
|
|
|
|
DelayBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
},
|
|
|
|
HtlcBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
remoteCfg := ChannelConfig{
|
|
|
|
ChannelConstraints: ChannelConstraints{
|
|
|
|
DustLimit: btcutil.Amount(rand.Int63()),
|
|
|
|
MaxPendingAmount: lnwire.MilliSatoshi(rand.Int63()),
|
|
|
|
ChanReserve: btcutil.Amount(rand.Int63()),
|
|
|
|
MinHTLC: lnwire.MilliSatoshi(rand.Int63()),
|
|
|
|
MaxAcceptedHtlcs: uint16(rand.Int31()),
|
|
|
|
CsvDelay: uint16(rand.Int31()),
|
|
|
|
},
|
|
|
|
MultiSigKey: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
KeyLocator: keychain.KeyLocator{
|
|
|
|
Family: keychain.KeyFamilyMultiSig,
|
|
|
|
Index: 9,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RevocationBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
KeyLocator: keychain.KeyLocator{
|
|
|
|
Family: keychain.KeyFamilyRevocationBase,
|
|
|
|
Index: 8,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
PaymentBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
KeyLocator: keychain.KeyLocator{
|
|
|
|
Family: keychain.KeyFamilyPaymentBase,
|
|
|
|
Index: 7,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
DelayBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
KeyLocator: keychain.KeyLocator{
|
|
|
|
Family: keychain.KeyFamilyDelayBase,
|
|
|
|
Index: 6,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
HtlcBasePoint: keychain.KeyDescriptor{
|
|
|
|
PubKey: privKey.PubKey(),
|
|
|
|
KeyLocator: keychain.KeyLocator{
|
|
|
|
Family: keychain.KeyFamilyHtlcBase,
|
|
|
|
Index: 5,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
chanID := lnwire.NewShortChanIDFromInt(uint64(rand.Int63()))
|
|
|
|
|
|
|
|
return &OpenChannel{
|
|
|
|
ChanType: SingleFunder,
|
|
|
|
ChainHash: key,
|
|
|
|
FundingOutpoint: wire.OutPoint{Hash: key, Index: rand.Uint32()},
|
|
|
|
ShortChannelID: chanID,
|
|
|
|
IsInitiator: true,
|
|
|
|
IsPending: true,
|
|
|
|
IdentityPub: pubKey,
|
|
|
|
Capacity: btcutil.Amount(10000),
|
|
|
|
LocalChanCfg: localCfg,
|
|
|
|
RemoteChanCfg: remoteCfg,
|
|
|
|
TotalMSatSent: 8,
|
|
|
|
TotalMSatReceived: 2,
|
|
|
|
LocalCommitment: ChannelCommitment{
|
|
|
|
CommitHeight: 0,
|
|
|
|
LocalBalance: lnwire.MilliSatoshi(9000),
|
|
|
|
RemoteBalance: lnwire.MilliSatoshi(3000),
|
|
|
|
CommitFee: btcutil.Amount(rand.Int63()),
|
|
|
|
FeePerKw: btcutil.Amount(5000),
|
|
|
|
CommitTx: testTx,
|
|
|
|
CommitSig: bytes.Repeat([]byte{1}, 71),
|
|
|
|
},
|
|
|
|
RemoteCommitment: ChannelCommitment{
|
|
|
|
CommitHeight: 0,
|
|
|
|
LocalBalance: lnwire.MilliSatoshi(3000),
|
|
|
|
RemoteBalance: lnwire.MilliSatoshi(9000),
|
|
|
|
CommitFee: btcutil.Amount(rand.Int63()),
|
|
|
|
FeePerKw: btcutil.Amount(5000),
|
|
|
|
CommitTx: testTx,
|
|
|
|
CommitSig: bytes.Repeat([]byte{1}, 71),
|
|
|
|
},
|
|
|
|
NumConfsRequired: 4,
|
|
|
|
RemoteCurrentRevocation: privKey.PubKey(),
|
|
|
|
RemoteNextRevocation: privKey.PubKey(),
|
|
|
|
RevocationProducer: producer,
|
|
|
|
RevocationStore: store,
|
|
|
|
Db: cdb,
|
|
|
|
FundingTxn: testTx,
|
|
|
|
}, nil
|
|
|
|
}
|