OSDN Git Service

799185e9f3361deecd2096db4680fa40eddfc38a
[bytom/vapor.git] / consensus / general.go
1 package consensus
2
3 import (
4         "encoding/binary"
5         "fmt"
6
7         "github.com/bytom/vapor/protocol/bc"
8 )
9
10 // basic constant
11 const (
12         BTMAlias = "BTM"
13
14         PayToWitnessPubKeyHashDataSize = 20
15         PayToWitnessScriptHashDataSize = 32
16
17         _ = iota
18         SoftFork001
19 )
20
21 // BTMAssetID is BTM's asset id, the soul asset of Bytom
22 var BTMAssetID = &bc.AssetID{
23         V0: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
24         V1: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
25         V2: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
26         V3: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
27 }
28
29 // BTMDefinitionMap is the ....
30 var BTMDefinitionMap = map[string]interface{}{
31         "name":        BTMAlias,
32         "symbol":      BTMAlias,
33         "decimals":    8,
34         "description": `Bytom Official Issue`,
35 }
36
37 // BasicConfig indicate the basic config
38 type BasicConfig struct {
39         // gas config
40         MaxBlockGas      uint64 // the max used gas for all transactions of a block
41         MaxGasAmount     int64  // the max gas for a transaction
42         DefaultGasCredit int64  // the max default credit gas for a transaction with non-BTM asset
43         VMGasRate        int64  // the gas rate for VM
44         StorageGasRate   int64  // the gas rate for storage
45
46         // utxo config
47         VotePendingBlockNumber     uint64 // the valid block interval for vote utxo after the vote transaction is confirmed
48         CoinbasePendingBlockNumber uint64 // the valid block interval for coinbase utxo after the coinbase transaction is confirmed
49         CoinbaseArbitrarySizeLimit int    // the max size for coinbase arbitrary
50 }
51
52 // DPOSConfig indicate the dpos consensus config
53 type DPOSConfig struct {
54         NumOfConsensusNode      int64  // the number of consensus node
55         BlockNumEachNode        uint64 // the number of generated continuous blocks for each node
56         RoundVoteBlockNums      uint64 // the block interval which count the vote result in a round
57         MinConsensusNodeVoteNum uint64 // the min BTM amount for becoming consensus node(the unit is neu)
58         MinVoteOutputAmount     uint64 // the min BTM amount for voting output in a transaction(the unit is neu)
59         BlockTimeInterval       uint64 // the block time interval for producting a block
60         MaxTimeOffsetMs         uint64 // the max number of seconds a block time is allowed to be ahead of the current time
61 }
62
63 // Checkpoint identifies a known good point in the block chain.  Using
64 // checkpoints allows a few optimizations for old blocks during initial download
65 // and also prevents forks from old blocks.
66 type Checkpoint struct {
67         Height uint64
68         Hash   bc.Hash
69 }
70
71 // ProducerSubsidy is a subsidy to the producer of the generated block
72 type ProducerSubsidy struct {
73         BeginBlock uint64
74         EndBlock   uint64
75         Subsidy    uint64
76 }
77
78 // MovRewardProgram is a reward address corresponding to the range of the specified block height when matching transactions
79 type MovRewardProgram struct {
80         BeginBlock uint64
81         EndBlock   uint64
82         Program    string
83 }
84
85 // Params store the config for different network
86 type Params struct {
87         // Name defines a human-readable identifier for the network.
88         Name string
89
90         // Bech32HRPSegwit defines the prefix of address for the network
91         Bech32HRPSegwit string
92
93         // DefaultPort defines the default peer-to-peer port for the network.
94         DefaultPort string
95
96         // BasicConfig defines the gas and utxo relatived paramters.
97         BasicConfig
98
99         // DPOSConfig defines the dpos consensus paramters.
100         DPOSConfig
101
102         // DNSSeeds defines a list of DNS seeds for the network that are used
103         // as one method to discover peers.
104         DNSSeeds []string
105
106         // Checkpoints defines the checkpoint blocks
107         Checkpoints []Checkpoint
108
109         // ProducerSubsidys defines the producer subsidy by block height
110         ProducerSubsidys []ProducerSubsidy
111
112         SoftForkPoint map[uint64]uint64
113
114         // Mov will only start when the block height is greater than this value
115         MovStartHeight uint64
116
117         // Used to receive rewards for matching transactions
118         MovRewardPrograms []MovRewardProgram
119 }
120
121 // ActiveNetParams is the active NetParams
122 var ActiveNetParams = MainNetParams
123
124 // NetParams is the correspondence between chain_id and Params
125 var NetParams = map[string]Params{
126         "mainnet": MainNetParams,
127         "testnet": TestNetParams,
128         "solonet": SoloNetParams,
129 }
130
131 // MainNetParams is the config for vapor-mainnet
132 var MainNetParams = Params{
133         Name:            "main",
134         Bech32HRPSegwit: "vp",
135         DefaultPort:     "56656",
136         DNSSeeds:        []string{"www.mainnetseed.vapor.io"},
137         BasicConfig: BasicConfig{
138                 MaxBlockGas:                uint64(10000000),
139                 MaxGasAmount:               int64(640000),
140                 DefaultGasCredit:           int64(160000),
141                 StorageGasRate:             int64(1),
142                 VMGasRate:                  int64(200),
143                 VotePendingBlockNumber:     uint64(3456000),
144                 CoinbasePendingBlockNumber: uint64(7200),
145                 CoinbaseArbitrarySizeLimit: 128,
146         },
147         DPOSConfig: DPOSConfig{
148                 NumOfConsensusNode:      10,
149                 BlockNumEachNode:        12,
150                 MinConsensusNodeVoteNum: uint64(100000000000000),
151                 MinVoteOutputAmount:     uint64(100000000),
152                 BlockTimeInterval:       500,
153                 RoundVoteBlockNums:      1200,
154                 MaxTimeOffsetMs:         2000,
155         },
156         Checkpoints: []Checkpoint{},
157         ProducerSubsidys: []ProducerSubsidy{
158                 {BeginBlock: 1, EndBlock: 63072000, Subsidy: 9512938},
159         },
160         SoftForkPoint:  map[uint64]uint64{SoftFork001: 10461600},
161         MovStartHeight: 43354800,
162         MovRewardPrograms: []MovRewardProgram{
163                 {
164                         BeginBlock: 1,
165                         EndBlock:   126144000,
166                         Program:    "00141d00f85e220e35a23282cfc7f91fe7b34bf6dc18",
167                 },
168         },
169 }
170
171 // TestNetParams is the config for vapor-testnet
172 var TestNetParams = Params{
173         Name:            "test",
174         Bech32HRPSegwit: "tp",
175         DefaultPort:     "56657",
176         DNSSeeds:        []string{"www.testnetseed.vapor.io"},
177         BasicConfig: BasicConfig{
178                 MaxBlockGas:                uint64(10000000),
179                 MaxGasAmount:               int64(640000),
180                 DefaultGasCredit:           int64(160000),
181                 StorageGasRate:             int64(1),
182                 VMGasRate:                  int64(200),
183                 VotePendingBlockNumber:     uint64(3456000),
184                 CoinbasePendingBlockNumber: uint64(7200),
185                 CoinbaseArbitrarySizeLimit: 128,
186         },
187         DPOSConfig: DPOSConfig{
188                 NumOfConsensusNode:      10,
189                 BlockNumEachNode:        12,
190                 MinConsensusNodeVoteNum: uint64(100000000000000),
191                 MinVoteOutputAmount:     uint64(100000000),
192                 BlockTimeInterval:       500,
193                 RoundVoteBlockNums:      1200,
194                 MaxTimeOffsetMs:         2000,
195         },
196         Checkpoints: []Checkpoint{},
197         ProducerSubsidys: []ProducerSubsidy{
198                 {BeginBlock: 1, EndBlock: 63072000, Subsidy: 15000000},
199         },
200 }
201
202 // SoloNetParams is the config for vapor solonet
203 var SoloNetParams = Params{
204         Name:            "solo",
205         Bech32HRPSegwit: "sp",
206         DefaultPort:     "56658",
207         BasicConfig: BasicConfig{
208                 MaxBlockGas:                uint64(10000000),
209                 MaxGasAmount:               int64(200000),
210                 DefaultGasCredit:           int64(160000),
211                 StorageGasRate:             int64(1),
212                 VMGasRate:                  int64(200),
213                 VotePendingBlockNumber:     uint64(10000),
214                 CoinbasePendingBlockNumber: uint64(1200),
215                 CoinbaseArbitrarySizeLimit: 128,
216         },
217         DPOSConfig: DPOSConfig{
218                 NumOfConsensusNode:      10,
219                 BlockNumEachNode:        12,
220                 MinConsensusNodeVoteNum: uint64(100000000000000),
221                 MinVoteOutputAmount:     uint64(100000000),
222                 BlockTimeInterval:       500,
223                 RoundVoteBlockNums:      1200,
224                 MaxTimeOffsetMs:         2000,
225         },
226         Checkpoints: []Checkpoint{},
227         ProducerSubsidys: []ProducerSubsidy{
228                 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
229                 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
230                 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
231                 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
232         },
233 }
234
235 // BlockSubsidy calculate the coinbase rewards on given block height
236 func BlockSubsidy(height uint64) uint64 {
237         for _, subsidy := range ActiveNetParams.ProducerSubsidys {
238                 if height >= subsidy.BeginBlock && height <= subsidy.EndBlock {
239                         return subsidy.Subsidy
240                 }
241         }
242         return 0
243 }
244
245 // BytomMainNetParams is the config for bytom mainnet
246 func BytomMainNetParams(vaporParam *Params) *Params {
247         bech32HRPSegwit := "sm"
248         switch vaporParam.Name {
249         case "main":
250                 bech32HRPSegwit = "bm"
251         case "test":
252                 bech32HRPSegwit = "tm"
253         }
254         return &Params{Bech32HRPSegwit: bech32HRPSegwit}
255 }
256
257 // InitActiveNetParams load the config by chain ID
258 func InitActiveNetParams(chainID string) error {
259         var exist bool
260         if ActiveNetParams, exist = NetParams[chainID]; !exist {
261                 return fmt.Errorf("chain_id[%v] don't exist", chainID)
262         }
263         return nil
264 }