github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/consensus/general.go (about)

     1  package consensus
     2  
     3  import (
     4  	"encoding/binary"
     5  	"fmt"
     6  	"math"
     7  	"strings"
     8  
     9  	log "github.com/sirupsen/logrus"
    10  
    11  	"github.com/bytom/bytom/crypto/ed25519/chainkd"
    12  	"github.com/bytom/bytom/protocol/bc"
    13  )
    14  
    15  // consensus variables
    16  const (
    17  	// Max gas that one block contains
    18  	MaxBlockGas    = uint64(10000000)
    19  	VMGasRate      = int64(200)
    20  	StorageGasRate = int64(1)
    21  	MaxGasAmount   = int64(300000)
    22  
    23  	// These configs need add to casper config in elegant way
    24  	MaxNumOfValidators = int(10)
    25  	InitBTMSupply      = 169290721678579170 + 50000000000
    26  	RewardThreshold    = 0.5
    27  	BlockReward        = uint64(570776255)
    28  
    29  	// config parameter for coinbase reward
    30  	CoinbasePendingBlockNumber = uint64(10)
    31  	MinVoteOutputAmount        = uint64(100000000)
    32  
    33  	PayToWitnessPubKeyHashDataSize = 20
    34  	PayToWitnessScriptHashDataSize = 32
    35  	BCRPContractHashDataSize       = 32
    36  	CoinbaseArbitrarySizeLimit     = 128
    37  
    38  	BCRPRequiredBTMAmount = uint64(100000000)
    39  
    40  	BTMAlias = "BTM"
    41  	defaultVotePendingNum = 302400
    42  )
    43  
    44  type CasperConfig struct {
    45  	// BlockTimeInterval, milliseconds, the block time interval for producing a block
    46  	BlockTimeInterval uint64
    47  
    48  	// MaxTimeOffsetMs represent the max number of seconds a block time is allowed to be ahead of the current time
    49  	MaxTimeOffsetMs uint64
    50  
    51  	// BlocksOfEpoch represent the block num in one epoch
    52  	BlocksOfEpoch uint64
    53  
    54  	// MinValidatorVoteNum is the minimum vote number of become validator
    55  	MinValidatorVoteNum uint64
    56  
    57  	// VotePendingBlockNumber is the locked block number of vote utxo
    58  	VotePendingBlockNums []VotePendingBlockNum
    59  
    60  	FederationXpubs []chainkd.XPub
    61  }
    62  
    63  type VotePendingBlockNum struct {
    64  	BeginBlock uint64
    65  	EndBlock   uint64
    66  	Num        uint64
    67  }
    68  
    69  // BTMAssetID is BTM's asset id, the soul asset of Bytom
    70  var BTMAssetID = &bc.AssetID{
    71  	V0: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    72  	V1: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    73  	V2: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    74  	V3: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    75  }
    76  
    77  // BTMDefinitionMap is the ....
    78  var BTMDefinitionMap = map[string]interface{}{
    79  	"name":        BTMAlias,
    80  	"symbol":      BTMAlias,
    81  	"decimals":    8,
    82  	"description": `Bytom Official Issue`,
    83  }
    84  
    85  // IsBech32SegwitPrefix returns whether the prefix is a known prefix for segwit
    86  // addresses on any default or registered network.  This is used when decoding
    87  // an address string into a specific address type.
    88  func IsBech32SegwitPrefix(prefix string, params *Params) bool {
    89  	prefix = strings.ToLower(prefix)
    90  	return prefix == params.Bech32HRPSegwit+"1"
    91  }
    92  
    93  // Params store the config for different network
    94  type Params struct {
    95  	// Name defines a human-readable identifier for the network.
    96  	Name            string
    97  	Bech32HRPSegwit string
    98  	// DefaultPort defines the default peer-to-peer port for the network.
    99  	DefaultPort string
   100  
   101  	// DNSSeeds defines a list of DNS seeds for the network that are used
   102  	// as one method to discover peers.
   103  	DNSSeeds []string
   104  
   105  	// CasperConfig defines the casper consensus parameters
   106  	CasperConfig
   107  }
   108  
   109  // ActiveNetParams is ...
   110  var ActiveNetParams = MainNetParams
   111  
   112  // NetParams is the correspondence between chain_id and Params
   113  var NetParams = map[string]Params{
   114  	"mainnet": MainNetParams,
   115  	"wisdom":  TestNetParams,
   116  	"solonet": SoloNetParams,
   117  }
   118  
   119  // MainNetParams is the config for production
   120  var MainNetParams = Params{
   121  	Name:            "main",
   122  	Bech32HRPSegwit: "bn",
   123  	DefaultPort:     "46657",
   124  	DNSSeeds:        []string{},
   125  	CasperConfig: CasperConfig{
   126  		BlockTimeInterval:      6000,
   127  		MaxTimeOffsetMs:        3000,
   128  		BlocksOfEpoch:          100,
   129  		MinValidatorVoteNum:    1e14,
   130  		VotePendingBlockNums:   []VotePendingBlockNum{
   131  			{BeginBlock: 0, EndBlock: 432000, Num: 14400},
   132  			{BeginBlock: 432000, EndBlock: math.MaxUint64, Num: defaultVotePendingNum},
   133  		},
   134  		FederationXpubs: []chainkd.XPub{
   135  			xpub("f9003633ccbd8cc37e034f4dbe70d9fae980d437948d8cb908d0cab7909780d74a324b4decb5dfcd43fbc6b896ac066b7e02c733a1537360e933278a101a850c"),
   136  			xpub("d301fee5d4ba7eb5b9d41ca13ec56c19daceb5f6b752d91d49777fd1fc7c45891e5773cafb3b6d6ab764ef2794e8ba953c8bdb9dc77a3af51e979f96885f96b2"),
   137  			xpub("2ba14bdd29fd84c73f67d6025d2a98292dbdd46b90a2af29c8669dd88dacb1cec62a3e9448d8b731a448f0454b0aa367748659d6c01ad7125d395ffda972da54"),
   138  			xpub("1313379b05c38ff2d171d512f23f199f0f068a67d77b9d5b6db040f2da1edc0c35c68a21b068956f448fed6441b9c27294f1ca6aaedc2c580de322f3f0260c1f"),
   139  		},
   140  	},
   141  }
   142  
   143  // TestNetParams is the config for test-net
   144  var TestNetParams = Params{
   145  	Name:            "test",
   146  	Bech32HRPSegwit: "tn",
   147  	DefaultPort:     "46656",
   148  	DNSSeeds:        []string{},
   149  	CasperConfig: CasperConfig{
   150  		BlockTimeInterval:      6000,
   151  		MaxTimeOffsetMs:        3000,
   152  		BlocksOfEpoch:          100,
   153  		MinValidatorVoteNum:    1e8,
   154  		VotePendingBlockNums:   []VotePendingBlockNum{{BeginBlock: 0, EndBlock: math.MaxUint64, Num: 10}},
   155  		FederationXpubs: []chainkd.XPub{
   156  			xpub("7732fac62320799ff5e4eec1dc4ba7b07dc0e5a647850bf0bc34cb9aca195a05a1118b57d377947d7936156c831c87b700ed945a82cae63aff14905beb39d001"),
   157  			xpub("08543fef8c3ca27483954f80eee6d461c307b6aa564aafaf235a4bd2740debbc71b14af78715c94cbc1d16fa84da97a3eabc5b21f003ab49882e4af7f9f00bbd"),
   158  			xpub("0dd00fe3880c1cb5d5b0b5d03993c004e7fbe3697a47ff60c3bc12950bead964843dfe45b2bab5d01ae32fb23a4b0460049e822d7787a9a15b76d8bb9dfcec74"),
   159  			xpub("b0584ecaefc02d3c367f280e128ec310c9f9198d44cd76b6726cd6c06c002770a1a7dc069ddd06f7a821a176931573d40e63b015ce88b6de01a61205d719567f"),
   160  		},
   161  	},
   162  }
   163  
   164  // SoloNetParams is the config for test-net
   165  var SoloNetParams = Params{
   166  	Name:            "solo",
   167  	Bech32HRPSegwit: "sn",
   168  	CasperConfig: CasperConfig{
   169  		BlockTimeInterval:      6000,
   170  		MaxTimeOffsetMs:        24000,
   171  		BlocksOfEpoch:          100,
   172  		MinValidatorVoteNum:    1e8,
   173  		VotePendingBlockNums:   []VotePendingBlockNum{{BeginBlock: 0, EndBlock: math.MaxUint64, Num: 10}},
   174  		FederationXpubs:        []chainkd.XPub{},
   175  	},
   176  }
   177  
   178  func VotePendingBlockNums(height uint64) uint64 {
   179  	for _, pendingNum := range ActiveNetParams.VotePendingBlockNums {
   180  		if height >= pendingNum.BeginBlock && height < pendingNum.EndBlock {
   181  			return pendingNum.Num
   182  		}
   183  	}
   184  	return defaultVotePendingNum
   185  }
   186  
   187  // InitActiveNetParams load the config by chain ID
   188  func InitActiveNetParams(chainID string) error {
   189  	var exist bool
   190  	if ActiveNetParams, exist = NetParams[chainID]; !exist {
   191  		return fmt.Errorf("chain_id[%v] don't exist", chainID)
   192  	}
   193  	return nil
   194  }
   195  
   196  func xpub(str string) (xpub chainkd.XPub) {
   197  	if err := xpub.UnmarshalText([]byte(str)); err != nil {
   198  		log.Panicf("Fail converts a string to xpub")
   199  	}
   200  	return xpub
   201  }