OSDN Git Service

9e2205bda91506b9bad3652fae8210146edefd04
[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: 42000000,
162 }
163
164 // TestNetParams is the config for vapor-testnet
165 var TestNetParams = Params{
166         Name:            "test",
167         Bech32HRPSegwit: "tp",
168         DefaultPort:     "56657",
169         DNSSeeds:        []string{"www.testnetseed.vapor.io"},
170         BasicConfig: BasicConfig{
171                 MaxBlockGas:                uint64(10000000),
172                 MaxGasAmount:               int64(640000),
173                 DefaultGasCredit:           int64(160000),
174                 StorageGasRate:             int64(1),
175                 VMGasRate:                  int64(200),
176                 VotePendingBlockNumber:     uint64(3456000),
177                 CoinbasePendingBlockNumber: uint64(7200),
178                 CoinbaseArbitrarySizeLimit: 128,
179         },
180         DPOSConfig: DPOSConfig{
181                 NumOfConsensusNode:      10,
182                 BlockNumEachNode:        12,
183                 MinConsensusNodeVoteNum: uint64(100000000000000),
184                 MinVoteOutputAmount:     uint64(100000000),
185                 BlockTimeInterval:       500,
186                 RoundVoteBlockNums:      1200,
187                 MaxTimeOffsetMs:         2000,
188         },
189         Checkpoints: []Checkpoint{},
190         ProducerSubsidys: []ProducerSubsidy{
191                 {BeginBlock: 1, EndBlock: 63072000, Subsidy: 15000000},
192         },
193 }
194
195 // SoloNetParams is the config for vapor solonet
196 var SoloNetParams = Params{
197         Name:            "solo",
198         Bech32HRPSegwit: "sp",
199         DefaultPort:     "56658",
200         BasicConfig: BasicConfig{
201                 MaxBlockGas:                uint64(10000000),
202                 MaxGasAmount:               int64(200000),
203                 DefaultGasCredit:           int64(160000),
204                 StorageGasRate:             int64(1),
205                 VMGasRate:                  int64(200),
206                 VotePendingBlockNumber:     uint64(10000),
207                 CoinbasePendingBlockNumber: uint64(1200),
208                 CoinbaseArbitrarySizeLimit: 128,
209         },
210         DPOSConfig: DPOSConfig{
211                 NumOfConsensusNode:      10,
212                 BlockNumEachNode:        12,
213                 MinConsensusNodeVoteNum: uint64(100000000000000),
214                 MinVoteOutputAmount:     uint64(100000000),
215                 BlockTimeInterval:       500,
216                 RoundVoteBlockNums:      1200,
217                 MaxTimeOffsetMs:         2000,
218         },
219         Checkpoints: []Checkpoint{},
220         ProducerSubsidys: []ProducerSubsidy{
221                 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
222                 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
223                 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
224                 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
225         },
226 }
227
228 // BlockSubsidy calculate the coinbase rewards on given block height
229 func BlockSubsidy(height uint64) uint64 {
230         for _, subsidy := range ActiveNetParams.ProducerSubsidys {
231                 if height >= subsidy.BeginBlock && height <= subsidy.EndBlock {
232                         return subsidy.Subsidy
233                 }
234         }
235         return 0
236 }
237
238 // BytomMainNetParams is the config for bytom mainnet
239 func BytomMainNetParams(vaporParam *Params) *Params {
240         bech32HRPSegwit := "sm"
241         switch vaporParam.Name {
242         case "main":
243                 bech32HRPSegwit = "bm"
244         case "test":
245                 bech32HRPSegwit = "tm"
246         }
247         return &Params{Bech32HRPSegwit: bech32HRPSegwit}
248 }
249
250 func InitActiveNetParams(chainID string) error {
251         var exist bool
252         if ActiveNetParams, exist = NetParams[chainID]; !exist {
253                 return fmt.Errorf("chain_id[%v] don't exist", chainID)
254         }
255         return nil
256 }