6 "github.com/vapor/protocol/bc"
13 PayToWitnessPubKeyHashDataSize = 20
14 PayToWitnessScriptHashDataSize = 32
17 // BTMAssetID is BTM's asset id, the soul asset of Bytom
18 var BTMAssetID = &bc.AssetID{
19 V0: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
20 V1: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
21 V2: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
22 V3: binary.BigEndian.Uint64([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
25 // BTMDefinitionMap is the ....
26 var BTMDefinitionMap = map[string]interface{}{
30 "description": `Bytom Official Issue`,
33 // BasicConfig indicate the basic config
34 type BasicConfig struct {
36 MaxBlockGas uint64 // the max used gas for all transactions of a block
37 MaxGasAmount int64 // the max gas for a transaction
38 DefaultGasCredit int64 // the max default credit gas for a transaction with non-BTM asset
39 VMGasRate int64 // the gas rate for VM
40 StorageGasRate int64 // the gas rate for storage
43 VotePendingBlockNumber uint64 // the valid block interval for vote utxo after the vote transaction is confirmed
44 CoinbasePendingBlockNumber uint64 // the valid block interval for coinbase utxo after the coinbase transaction is confirmed
45 CoinbaseArbitrarySizeLimit int // the max size for coinbase arbitrary
48 // DPOSConfig indicate the dpos consensus config
49 type DPOSConfig struct {
50 NumOfConsensusNode int64 // the number of consensus node
51 BlockNumEachNode uint64 // the number of generated continuous blocks for each node
52 RoundVoteBlockNums uint64 // the block interval which count the vote result in a round
53 MinConsensusNodeVoteNum uint64 // the min BTM amount for becoming consensus node(the unit is neu)
54 MinVoteOutputAmount uint64 // the min BTM amount for voting output in a transaction(the unit is neu)
55 BlockTimeInterval uint64 // the block time interval for producting a block
56 MaxTimeOffsetMs uint64 // the max number of seconds a block time is allowed to be ahead of the current time
59 // Checkpoint identifies a known good point in the block chain. Using
60 // checkpoints allows a few optimizations for old blocks during initial download
61 // and also prevents forks from old blocks.
62 type Checkpoint struct {
67 // ProducerSubsidy is a subsidy to the producer of the generated block
68 type ProducerSubsidy struct {
74 // Params store the config for different network
76 // Name defines a human-readable identifier for the network.
79 // Bech32HRPSegwit defines the prefix of address for the network
80 Bech32HRPSegwit string
82 // DefaultPort defines the default peer-to-peer port for the network.
85 // BasicConfig defines the gas and utxo relatived paramters.
88 // DPOSConfig defines the dpos consensus paramters.
91 // DNSSeeds defines a list of DNS seeds for the network that are used
92 // as one method to discover peers.
95 // Checkpoints defines the checkpoint blocks
96 Checkpoints []Checkpoint
98 // ProducerSubsidys defines the producer subsidy by block height
99 ProducerSubsidys []ProducerSubsidy
102 // VaporDPOSConfig return the dpos consensus config
103 func VaporDPOSConfig() DPOSConfig {
105 NumOfConsensusNode: 10,
106 BlockNumEachNode: 12,
107 MinConsensusNodeVoteNum: uint64(100000000000000),
108 MinVoteOutputAmount: uint64(10000000000),
109 BlockTimeInterval: 500,
112 dpos.RoundVoteBlockNums = uint64(uint64(dpos.NumOfConsensusNode) * dpos.BlockNumEachNode * 10)
113 dpos.MaxTimeOffsetMs = uint64(uint64(dpos.BlockTimeInterval) * dpos.BlockNumEachNode / 3)
117 // ActiveNetParams is the active NetParams
118 var ActiveNetParams = MainNetParams
120 // NetParams is the correspondence between chain_id and Params
121 var NetParams = map[string]Params{
122 "mainnet": MainNetParams,
123 "testnet": TestNetParams,
124 "solonet": SoloNetParams,
127 // MainNetParams is the config for vapor-mainnet
128 var MainNetParams = Params{
130 Bech32HRPSegwit: "vp",
131 DefaultPort: "56656",
132 DNSSeeds: []string{"www.mainnetseed.vapor.io"},
133 BasicConfig: BasicConfig{
134 MaxBlockGas: uint64(10000000),
135 MaxGasAmount: int64(640000),
136 DefaultGasCredit: int64(160000),
137 StorageGasRate: int64(1),
138 VMGasRate: int64(200),
139 VotePendingBlockNumber: uint64(3456000),
140 CoinbasePendingBlockNumber: uint64(7200),
141 CoinbaseArbitrarySizeLimit: 128,
143 DPOSConfig: VaporDPOSConfig(),
144 Checkpoints: []Checkpoint{},
145 ProducerSubsidys: []ProducerSubsidy{
146 {BeginBlock: 1, EndBlock: 63072000, Subsidy: 9512938},
150 // TestNetParams is the config for vapor-testnet
151 var TestNetParams = Params{
153 Bech32HRPSegwit: "tp",
154 DefaultPort: "56657",
155 DNSSeeds: []string{"www.testnetseed.vapor.io"},
156 BasicConfig: BasicConfig{
157 MaxBlockGas: uint64(10000000),
158 MaxGasAmount: int64(200000),
159 DefaultGasCredit: int64(160000),
160 StorageGasRate: int64(1),
161 VMGasRate: int64(200),
162 VotePendingBlockNumber: uint64(10000),
163 CoinbasePendingBlockNumber: uint64(1200),
164 CoinbaseArbitrarySizeLimit: 128,
166 DPOSConfig: DPOSConfig{
167 NumOfConsensusNode: 10,
168 BlockNumEachNode: 12,
169 MinConsensusNodeVoteNum: uint64(100000000000000),
170 MinVoteOutputAmount: uint64(100000000),
171 BlockTimeInterval: 500,
172 RoundVoteBlockNums: 1200,
173 MaxTimeOffsetMs: 2000,
175 Checkpoints: []Checkpoint{},
176 ProducerSubsidys: []ProducerSubsidy{
177 {BeginBlock: 1, EndBlock: 63072000, Subsidy: 15000000},
181 // SoloNetParams is the config for vapor solonet
182 var SoloNetParams = Params{
184 Bech32HRPSegwit: "sp",
185 DefaultPort: "56658",
186 BasicConfig: BasicConfig{
187 MaxBlockGas: uint64(10000000),
188 MaxGasAmount: int64(200000),
189 DefaultGasCredit: int64(160000),
190 StorageGasRate: int64(1),
191 VMGasRate: int64(200),
192 VotePendingBlockNumber: uint64(10000),
193 CoinbasePendingBlockNumber: uint64(1200),
194 CoinbaseArbitrarySizeLimit: 128,
196 DPOSConfig: DPOSConfig{
197 NumOfConsensusNode: 10,
198 BlockNumEachNode: 12,
199 MinConsensusNodeVoteNum: uint64(100000000000000),
200 MinVoteOutputAmount: uint64(100000000),
201 BlockTimeInterval: 500,
202 RoundVoteBlockNums: 1200,
203 MaxTimeOffsetMs: 2000,
205 Checkpoints: []Checkpoint{},
206 ProducerSubsidys: []ProducerSubsidy{
207 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
208 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
209 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
210 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
214 // BlockSubsidy calculate the coinbase rewards on given block height
215 func BlockSubsidy(height uint64) uint64 {
216 for _, subsidy := range ActiveNetParams.ProducerSubsidys {
217 if height >= subsidy.BeginBlock && height <= subsidy.EndBlock {
218 return subsidy.Subsidy
224 // BytomMainNetParams is the config for bytom mainnet
225 func BytomMainNetParams(vaporParam *Params) *Params {
226 bech32HRPSegwit := "sm"
227 switch vaporParam.Name {
229 bech32HRPSegwit = "bm"
231 bech32HRPSegwit = "tm"
233 return &Params{Bech32HRPSegwit: bech32HRPSegwit}