Skip to content

Commit

Permalink
Einsteinium (EMC2) params
Browse files Browse the repository at this point in the history
  • Loading branch information
MatijaMitic committed Jul 20, 2018
1 parent 10b0df6 commit c4ad9aa
Show file tree
Hide file tree
Showing 9 changed files with 334 additions and 11 deletions.
6 changes: 6 additions & 0 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

82 changes: 82 additions & 0 deletions chainparams.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"github.com/lightningnetwork/lnd/keychain"
litecoinCfg "github.com/ltcsuite/ltcd/chaincfg"
einsteiniumCfg "github.com/MatijaMitic/emc2d-chainconfig"
litecoinWire "github.com/ltcsuite/ltcd/wire"
"github.com/btcsuite/btcd/chaincfg"
bitcoinCfg "github.com/btcsuite/btcd/chaincfg"
Expand Down Expand Up @@ -30,6 +31,14 @@ type litecoinNetParams struct {
CoinType uint32
}

// einsteiniumNetParams couples the p2p parameters of a network with the
// corresponding RPC port of a daemon running on the particular network.
type einsteiniumNetParams struct {
*litecoinCfg.Params //TODO cnahge to to einsteiniumCfg in ltcd/chaincfg
rpcPort string
CoinType uint32
}

// bitcoinTestNetParams contains parameters specific to the 3rd version of the
// test network.
var bitcoinTestNetParams = bitcoinNetParams{
Expand Down Expand Up @@ -70,6 +79,38 @@ var litecoinMainNetParams = litecoinNetParams{
CoinType: keychain.CoinTypeLitecoin,
}

// litecoinRegtestParams contains the parameters specific to the current
// Litecoin regtest.
var litecoinRegtestParams = litecoinNetParams{
Params: &litecoinCfg.RegressionNetParams,
rpcPort: "19334",
CoinType: keychain.CoinTypeLitecoin,
}

// einsteiniumTestNetParams contains parameters specific to the 4th version of the
// Einsteinium test network.
var einsteiniumTestNetParams = einsteiniumNetParams{
Params: &einsteiniumCfg.TestNet4Params,
rpcPort: "31876",
CoinType: keychain.CoinTypeTestnet,
}

// einsteiniumMainNetParams contains the parameters specific to the current
// Einsteinium mainnet.
var einsteiniumMainNetParams = einsteiniumNetParams{
Params: &einsteiniumCfg.MainNetParams,
rpcPort: "41876",
CoinType: keychain.CointTypeEinsteinium,
}

// einsteiniumRegtestParams contains the parameters specific to the current
// Einsteinium regtest.
var einsteiniumRegtestParams = einsteiniumNetParams{
Params: &einsteiniumCfg.RegressionNetParams,
rpcPort: "31882",
CoinType: keychain.CointTypeEinsteinium,
}

// regTestNetParams contains parameters specific to a local regtest network.
var regTestNetParams = bitcoinNetParams{
Params: &bitcoinCfg.RegressionNetParams,
Expand Down Expand Up @@ -118,6 +159,47 @@ func applyLitecoinParams(params *bitcoinNetParams, litecoinParams *litecoinNetPa
params.CoinType = litecoinParams.CoinType
}

// applyEinsteiniumParams applies the relevant chain configuration parameters that
// differ for einsteinium to the chain parameters typed for btcsuite derivation.
// This function is used in place of using something like interface{} to
// abstract over _which_ chain (or fork) the parameters are for.
func applyEinsteiniumParams(params *bitcoinNetParams, einsteiniumParams *einsteiniumNetParams) {
params.Name = einsteiniumParams.Name
params.Net = bitcoinWire.BitcoinNet(einsteiniumParams.Net)
params.DefaultPort = einsteiniumParams.DefaultPort
params.CoinbaseMaturity = einsteiniumParams.CoinbaseMaturity

copy(params.GenesisHash[:], einsteiniumParams.GenesisHash[:])

// Address encoding magics
params.PubKeyHashAddrID = einsteiniumParams.PubKeyHashAddrID
params.ScriptHashAddrID = einsteiniumParams.ScriptHashAddrID
params.PrivateKeyID = einsteiniumParams.PrivateKeyID
params.WitnessPubKeyHashAddrID = einsteiniumParams.WitnessPubKeyHashAddrID
params.WitnessScriptHashAddrID = einsteiniumParams.WitnessScriptHashAddrID
params.Bech32HRPSegwit = einsteiniumParams.Bech32HRPSegwit

copy(params.HDPrivateKeyID[:], einsteiniumParams.HDPrivateKeyID[:])
copy(params.HDPublicKeyID[:], einsteiniumParams.HDPublicKeyID[:])

params.HDCoinType = einsteiniumParams.HDCoinType

checkPoints := make([]chaincfg.Checkpoint, len(einsteiniumParams.Checkpoints))
for i := 0; i < len(einsteiniumParams.Checkpoints); i++ {
var chainHash chainhash.Hash
copy(chainHash[:], einsteiniumParams.Checkpoints[i].Hash[:])

checkPoints[i] = chaincfg.Checkpoint{
Height: einsteiniumParams.Checkpoints[i].Height,
Hash: &chainHash,
}
}
params.Checkpoints = checkPoints

params.rpcPort = einsteiniumParams.rpcPort
params.CoinType = einsteiniumParams.CoinType
}

// isTestnet tests if the given params correspond to a testnet
// parameter configuration.
func isTestnet(params *bitcoinNetParams) bool {
Expand Down
85 changes: 82 additions & 3 deletions chainregistry.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,20 @@ const (
defaultLitecoinStaticFeeRate = lnwallet.SatPerVByte(200)
defaultLitecoinDustLimit = btcutil.Amount(54600)

defaultEinsteiniumMinHTLCMSat = lnwire.MilliSatoshi(1000)
defaultEinsteiniumBaseFeeMSat = lnwire.MilliSatoshi(1000)
defaultEinsteiniumFeeRate = lnwire.MilliSatoshi(1)
defaultEinsteiniumTimeLockDelta = 576
defaultEinsteiniumStaticFeeRate = lnwallet.SatPerVByte(200)
defaultEinsteiniumDustLimit = btcutil.Amount(54600)

// btcToLtcConversionRate is a fixed ratio used in order to scale up
// payments when running on the Litecoin chain.
btcToLtcConversionRate = 60

// btcToEmc2ConversionRate is a fixed ratio used in order to scale up
// payments when running on the Einsteinium chain.
btcToEmc2ConversionRate = 20000
)

// defaultBtcChannelConstraints is the default set of channel constraints that are
Expand All @@ -67,6 +78,13 @@ var defaultLtcChannelConstraints = channeldb.ChannelConstraints{
MaxAcceptedHtlcs: lnwallet.MaxHTLCNumber / 2,
}

// defaultEmc2ChannelConstraints is the default set of channel constraints that are
// meant to be used when initially funding a Einsteinium channel.
var defaultEmc2ChannelConstraints = channeldb.ChannelConstraints{
DustLimit: defaultEinsteiniumDustLimit,
MaxAcceptedHtlcs: lnwallet.MaxHTLCNumber / 2,
}

// chainCode is an enum-like structure for keeping track of the chains
// currently supported within lnd.
type chainCode uint32
Expand All @@ -77,6 +95,9 @@ const (

// litecoinChain is Litecoin's testnet chain.
litecoinChain

// einsteiniumChain is Einsteinium's testnet chain.
einsteiniumChain
)

// String returns a string representation of the target chainCode.
Expand All @@ -86,6 +107,8 @@ func (c chainCode) String() string {
return "bitcoin"
case litecoinChain:
return "litecoin"
case einsteiniumChain:
return "einsteinium"
default:
return "kekcoin"
}
Expand Down Expand Up @@ -127,6 +150,9 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
if registeredChains.PrimaryChain() == litecoinChain {
homeChainConfig = cfg.Litecoin
}
if registeredChains.PrimaryChain() == einsteiniumChain {
homeChainConfig = cfg.Einsteinium
}
ltndLog.Infof("Primary chain is set to: %v",
registeredChains.PrimaryChain())

Expand All @@ -153,6 +179,16 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
cc.feeEstimator = lnwallet.StaticFeeEstimator{
FeeRate: defaultLitecoinStaticFeeRate,
}
case einsteiniumChain:
cc.routingPolicy = htlcswitch.ForwardingPolicy{
MinHTLC: cfg.Einsteinium.MinHTLC,
BaseFee: cfg.Einsteinium.BaseFee,
FeeRate: cfg.Einsteinium.FeeRate,
TimeLockDelta: cfg.Einsteinium.TimeLockDelta,
}
cc.feeEstimator = lnwallet.StaticFeeEstimator{
FeeRate: defaultEinsteiniumStaticFeeRate,
}
default:
return nil, nil, fmt.Errorf("Default routing policy for "+
"chain %v is unknown", registeredChains.PrimaryChain())
Expand Down Expand Up @@ -259,13 +295,15 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
svc.Stop()
nodeDatabase.Close()
}
case "bitcoind", "litecoind":
case "bitcoind", "litecoind", "einsteiniumd":
var bitcoindMode *bitcoindConfig
switch {
case cfg.Bitcoin.Active:
bitcoindMode = cfg.BitcoindMode
case cfg.Litecoin.Active:
bitcoindMode = cfg.LitecoindMode
case cfg.Einsteinium.Active:
bitcoindMode = cfg.EinsteiniumdMode
}
// Otherwise, we'll be speaking directly via RPC and ZMQ to a
// bitcoind node. If the specified host for the btcd/ltcd RPC
Expand Down Expand Up @@ -375,8 +413,25 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
if err := cc.feeEstimator.Start(); err != nil {
return nil, nil, err
}
} else if cfg.Einsteinium.Active {
ltndLog.Infof("Initializing einsteiniumd backed fee estimator")

// Finally, we'll re-initialize the fee estimator, as
// if we're using einsteiniumd as a backend, then we can
// use live fee estimates, rather than a statically
// coded value.
fallBackFeeRate := lnwallet.SatPerVByte(25)
cc.feeEstimator, err = lnwallet.NewBitcoindFeeEstimator(
*rpcConfig, fallBackFeeRate,
)
if err != nil {
return nil, nil, err
}
if err := cc.feeEstimator.Start(); err != nil {
return nil, nil, err
}
}
case "btcd", "ltcd":
case "btcd", "ltcd", "emc2d":
// Otherwise, we'll be speaking directly via RPC to a node.
//
// So first we'll load btcd/ltcd's TLS cert for the RPC
Expand All @@ -389,6 +444,8 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
btcdMode = cfg.BtcdMode
case cfg.Litecoin.Active:
btcdMode = cfg.LtcdMode
case cfg.Einsteinium.Active:
btcdMode = cfg.Emc2dMode
}
var rpcCert []byte
if btcdMode.RawRPCCert != "" {
Expand Down Expand Up @@ -460,7 +517,7 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
// If we're not in simnet or regtest mode, then we'll attempt
// to use a proper fee estimator for testnet.
if !cfg.Bitcoin.SimNet && !cfg.Litecoin.SimNet &&
!cfg.Bitcoin.RegTest && !cfg.Litecoin.RegTest {
!cfg.Bitcoin.RegTest && !cfg.Litecoin.RegTest && !cfg.Einsteinium.RegTest {

ltndLog.Infof("Initializing btcd backed fee estimator")

Expand Down Expand Up @@ -499,6 +556,9 @@ func newChainControlFromConfig(cfg *config, chanDB *channeldb.DB,
if registeredChains.PrimaryChain() == litecoinChain {
channelConstraints = defaultLtcChannelConstraints
}
if registeredChains.PrimaryChain() == einsteiniumChain {
channelConstraints = defaultEmc2ChannelConstraints
}

keyRing := keychain.NewBtcWalletKeyRing(
wc.InternalWallet(), activeNetParams.CoinType,
Expand Down Expand Up @@ -569,14 +629,33 @@ var (
0x59, 0x40, 0xfd, 0x1f, 0xe3, 0x65, 0xa7, 0x12,
})

// einsteiniumTestnetGenesis is the genesis hash of Einsteinium's testnet4
// chain.
einsteiniumTestnetGenesis = chainhash.Hash([chainhash.HashSize]byte{
0xee, 0x6b, 0x40, 0x9e, 0x82, 0x15, 0x46, 0x57,
0xbe, 0xaf, 0xb4, 0xf2, 0x55, 0x7a, 0x9a, 0x1e,
0x74, 0x54, 0xd4, 0x76, 0x3a, 0x18, 0xe7, 0xc3,
0x92, 0x00, 0xe6, 0xb5, 0x88, 0x18, 0x27, 0xa4,
})

// einsteiniumMainnetGenesis is the genesis hash of Einsteinium's main chain.
einsteiniumMainnetGenesis = chainhash.Hash([chainhash.HashSize]byte{
0x4b, 0xd9, 0xae, 0x11, 0x46, 0x71, 0x8f, 0x86,
0x42, 0x7b, 0xeb, 0x97, 0x5b, 0x3b, 0x30, 0x84,
0xf9, 0x03, 0x5f, 0x84, 0x1c, 0xff, 0x60, 0xf8,
0x06, 0xac, 0xb8, 0xb7, 0x4b, 0x20, 0x56, 0x4e,
})

// chainMap is a simple index that maps a chain's genesis hash to the
// chainCode enum for that chain.
chainMap = map[chainhash.Hash]chainCode{
bitcoinTestnetGenesis: bitcoinChain,
litecoinTestnetGenesis: litecoinChain,
einsteiniumTestnetGenesis: einsteiniumChain,

bitcoinMainnetGenesis: bitcoinChain,
litecoinMainnetGenesis: litecoinChain,
einsteiniumMainnetGenesis: einsteiniumChain,
}

// chainDNSSeeds is a map of a chain's hash to the set of DNS seeds
Expand Down
Loading

0 comments on commit c4ad9aa

Please sign in to comment.