github.com/turingchain2020/turingchain@v1.1.21/types/fork.go (about) 1 // Copyright Turing Corp. 2018 All Rights Reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package types 6 7 import ( 8 "strings" 9 ) 10 11 /* 12 MaxHeight 出于forks 过程安全的考虑,比如代码更新,出现了新的fork,旧的链只要不明确指定 fork的高度,那么默认fork高度为 MaxHeight 13 也就是新的代码默认不会被启用,直到使用的人明确指定了fork的高度 14 */ 15 const MaxHeight = 10000000000000000 16 17 //Forks fork分叉结构体 18 type Forks struct { 19 forks map[string]int64 20 } 21 22 func checkKey(key string) { 23 if strings.Contains(key, ".") { 24 panic("name must not have dot") 25 } 26 } 27 28 //SetFork 设置fork信息 29 func (f *Forks) SetFork(key string, height int64) { 30 checkKey(key) 31 f.setFork(key, height) 32 } 33 34 //ReplaceFork 替换fork信息 35 func (f *Forks) ReplaceFork(key string, height int64) { 36 checkKey(key) 37 f.replaceFork(key, height) 38 } 39 40 //SetDappFork 设置dapp的fork信息 41 func (f *Forks) SetDappFork(dapp, key string, height int64) { 42 checkKey(key) 43 f.setFork(dapp+"."+key, height) 44 } 45 46 //ReplaceDappFork 替换dapp的fork信息 47 func (f *Forks) ReplaceDappFork(dapp, key string, height int64) { 48 checkKey(key) 49 f.replaceFork(dapp+"."+key, height) 50 } 51 52 func (f *Forks) replaceFork(key string, height int64) { 53 if f.forks == nil { 54 f.forks = make(map[string]int64) 55 } 56 if _, ok := f.forks[key]; !ok { 57 panic("replace a not exist key " + " " + key) 58 } 59 f.forks[key] = height 60 } 61 62 func (f *Forks) setFork(key string, height int64) { 63 if f.forks == nil { 64 f.forks = make(map[string]int64) 65 } 66 f.forks[key] = height 67 } 68 69 // GetFork 如果不存在,那么fork高度为0 70 func (f *Forks) GetFork(key string) int64 { 71 height, ok := f.forks[key] 72 if !ok { 73 tlog.Error("get fork key not exisit -> " + key) 74 return MaxHeight 75 } 76 return height 77 } 78 79 // HasFork fork信息是否存在 80 func (f *Forks) HasFork(key string) bool { 81 _, ok := f.forks[key] 82 return ok 83 } 84 85 // GetDappFork 获取dapp fork信息 86 func (f *Forks) GetDappFork(app string, key string) int64 { 87 return f.GetFork(app + "." + key) 88 } 89 90 // SetAllFork 设置所有fork的高度 91 func (f *Forks) SetAllFork(height int64) { 92 for k := range f.forks { 93 f.forks[k] = height 94 } 95 } 96 97 // GetAll 获取所有fork信息 98 func (f *Forks) GetAll() map[string]int64 { 99 return f.forks 100 } 101 102 // IsFork 是否fork高度 103 func (f *Forks) IsFork(height int64, fork string) bool { 104 ifork := f.GetFork(fork) 105 if height == -1 || height >= ifork { 106 return true 107 } 108 return false 109 } 110 111 // IsDappFork 是否dapp fork高度 112 func (f *Forks) IsDappFork(height int64, dapp, fork string) bool { 113 return f.IsFork(height, dapp+"."+fork) 114 } 115 116 // SetTestNetFork turingchaincoin test net fork 117 func (f *Forks) SetTestNetFork() { 118 f.SetFork("ForkChainParamV1", 110000) 119 f.SetFork("ForkChainParamV2", 1692674) 120 f.SetFork("ForkCheckTxDup", 75260) 121 f.SetFork("ForkBlockHash", 209186) 122 f.SetFork("ForkMinerTime", 350000) 123 f.SetFork("ForkTransferExec", 408400) 124 f.SetFork("ForkExecKey", 408400) 125 f.SetFork("ForkWithdraw", 480000) 126 f.SetFork("ForkTxGroup", 408400) 127 f.SetFork("ForkResetTx0", 453400) 128 f.SetFork("ForkExecRollback", 706531) 129 f.SetFork("ForkTxHeight", 806578) 130 f.SetFork("ForkCheckBlockTime", 1200000) 131 f.SetFork("ForkMultiSignAddress", 1298600) 132 f.SetFork("ForkStateDBSet", 1572391) 133 f.SetFork("ForkBlockCheck", 1560000) 134 f.SetFork("ForkLocalDBAccess", 1572391) 135 f.SetFork("ForkTxGroupPara", 1687250) 136 f.SetFork("ForkBase58AddressCheck", 1800000) 137 //这个fork只影响平行链,注册类似user.p.x.exec的driver,新开的平行链设为0即可,老的平行链要设置新的高度 138 f.SetFork("ForkEnableParaRegExec", 0) 139 f.SetFork("ForkCacheDriver", 2580000) 140 f.SetFork("ForkTicketFundAddrV1", 3350000) 141 f.SetFork("ForkRootHash", 4500000) 142 } 143 144 func (f *Forks) setLocalFork() { 145 f.SetAllFork(0) 146 f.ReplaceFork("ForkBlockHash", 1) 147 f.ReplaceFork("ForkRootHash", 1) 148 } 149 150 //paraName not used currently 151 func (f *Forks) setForkForParaZero() { 152 f.SetAllFork(0) 153 f.ReplaceFork("ForkBlockHash", 1) 154 f.ReplaceFork("ForkRootHash", 1) 155 } 156 157 // IsFork 是否系统 fork高度 158 func (c *TuringchainConfig) IsFork(height int64, fork string) bool { 159 return c.forks.IsFork(height, fork) 160 } 161 162 // IsDappFork 是否dapp fork高度 163 func (c *TuringchainConfig) IsDappFork(height int64, dapp, fork string) bool { 164 return c.forks.IsDappFork(height, dapp, fork) 165 } 166 167 // GetDappFork 获取dapp fork高度 168 func (c *TuringchainConfig) GetDappFork(dapp, fork string) int64 { 169 return c.forks.GetDappFork(dapp, fork) 170 } 171 172 // SetDappFork 设置dapp fork高度 173 func (c *TuringchainConfig) SetDappFork(dapp, fork string, height int64) { 174 if c.needSetForkZero() { 175 height = 0 176 if fork == "ForkBlockHash" { 177 height = 1 178 } 179 } 180 c.forks.SetDappFork(dapp, fork, height) 181 } 182 183 // RegisterDappFork 注册dapp fork高度 184 func (c *TuringchainConfig) RegisterDappFork(dapp, fork string, height int64) { 185 if c.needSetForkZero() { 186 height = 0 187 if fork == "ForkBlockHash" { 188 height = 1 189 } 190 } 191 c.forks.SetDappFork(dapp, fork, height) 192 } 193 194 // GetFork 获取系统fork高度 195 func (c *TuringchainConfig) GetFork(fork string) int64 { 196 return c.forks.GetFork(fork) 197 } 198 199 // HasFork 是否有系统fork 200 func (c *TuringchainConfig) HasFork(fork string) bool { 201 return c.forks.HasFork(fork) 202 } 203 204 // IsEnableFork 是否使能了fork 205 func (c *TuringchainConfig) IsEnableFork(height int64, fork string, enable bool) bool { 206 if !enable { 207 return false 208 } 209 return c.IsFork(height, fork) 210 } 211 212 //fork 设置规则: 213 //所有的fork都需要有明确的配置,不开启fork 配置为 -1; forks即为从toml中读入文件 214 func (c *TuringchainConfig) initForkConfig(forks *ForkList) { 215 turingchainfork := c.forks.GetAll() 216 if turingchainfork == nil { 217 panic("turingchain fork not init") 218 } 219 //开始判断turingchainfork中的system部分是否已经设置 220 s := "" 221 for k := range turingchainfork { 222 if !strings.Contains(k, ".") { 223 if _, ok := forks.System[k]; !ok { 224 s += "system fork " + k + " not config\n" 225 } 226 } 227 } 228 for k := range turingchainfork { 229 forkname := strings.Split(k, ".") 230 if len(forkname) == 1 { 231 continue 232 } 233 if len(forkname) > 2 { 234 panic("fork name has too many dot") 235 } 236 exec := forkname[0] 237 name := forkname[1] 238 if forks.Sub != nil { 239 //如果这个执行器,用户没有enable 240 if _, ok := forks.Sub[exec]; !ok { 241 continue 242 } 243 if _, ok := forks.Sub[exec][name]; ok { 244 continue 245 } 246 } 247 s += "exec " + exec + " name " + name + " not config\n" 248 } 249 //配置检查没有问题后,开始设置配置 250 for k, v := range forks.System { 251 if v == -1 { 252 v = MaxHeight 253 } 254 if !c.HasFork(k) { 255 s += "system fork not exist : " + k + "\n" 256 } 257 // 由于toml文件中保存的是新的fork所以需要替换已有的初始化的fork 258 c.forks.SetFork(k, v) 259 } 260 //重置allow exec 的权限,让他只限制在配置文件设置的 261 AllowUserExec = [][]byte{ExecerNone} 262 for dapp, forklist := range forks.Sub { 263 AllowUserExec = append(AllowUserExec, []byte(dapp)) 264 for k, v := range forklist { 265 if v == -1 { 266 v = MaxHeight 267 } 268 if !c.HasFork(dapp + "." + k) { 269 s += "exec fork not exist : exec = " + dapp + " key = " + k + "\n" 270 } 271 // 由于toml文件中保存的是新的fork所以需要替换已有的初始化的fork 272 c.forks.SetDappFork(dapp, k, v) 273 } 274 } 275 if c.enableCheckFork { 276 if len(s) > 0 { 277 panic(s) 278 } 279 } 280 }