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  }