github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/consensus/misc/dao.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:34</date>
    10  //</624450075292078080>
    11  
    12  
    13  package misc
    14  
    15  import (
    16  	"bytes"
    17  	"errors"
    18  	"math/big"
    19  
    20  	"github.com/ethereum/go-ethereum/core/state"
    21  	"github.com/ethereum/go-ethereum/core/types"
    22  	"github.com/ethereum/go-ethereum/params"
    23  )
    24  
    25  var (
    26  //如果头不支持
    27  //Pro Fork客户端。
    28  	ErrBadProDAOExtra = errors.New("bad DAO pro-fork extra-data")
    29  
    30  //如果头确实支持no-
    31  //分支客户机。
    32  	ErrBadNoDAOExtra = errors.New("bad DAO no-fork extra-data")
    33  )
    34  
    35  //verifydaoHeaderextradata验证块头的额外数据字段
    36  //确保符合刀硬叉规则。
    37  //
    38  //DAO硬分叉扩展到头的有效性:
    39  //
    40  //使用fork特定的额外数据集
    41  //b)如果节点是pro fork,则需要特定范围内的块具有
    42  //唯一的额外数据集。
    43  func VerifyDAOHeaderExtraData(config *params.ChainConfig, header *types.Header) error {
    44  //如果节点不关心DAO分叉,则进行短路验证
    45  	if config.DAOForkBlock == nil {
    46  		return nil
    47  	}
    48  //确保块在fork修改的额外数据范围内
    49  	limit := new(big.Int).Add(config.DAOForkBlock, params.DAOForkExtraRange)
    50  	if header.Number.Cmp(config.DAOForkBlock) < 0 || header.Number.Cmp(limit) >= 0 {
    51  		return nil
    52  	}
    53  //根据我们支持还是反对fork,验证额外的数据内容
    54  	if config.DAOForkSupport {
    55  		if !bytes.Equal(header.Extra, params.DAOForkBlockExtra) {
    56  			return ErrBadProDAOExtra
    57  		}
    58  	} else {
    59  		if bytes.Equal(header.Extra, params.DAOForkBlockExtra) {
    60  			return ErrBadNoDAOExtra
    61  		}
    62  	}
    63  //好吧,header有我们期望的额外数据
    64  	return nil
    65  }
    66  
    67  //ApplyDaoHardFork根据DAO Hard Fork修改状态数据库
    68  //规则,将一组DAO帐户的所有余额转移到单个退款
    69  //合同。
    70  func ApplyDAOHardFork(statedb *state.StateDB) {
    71  //检索要将余额退款到的合同
    72  	if !statedb.Exist(params.DAORefundContract) {
    73  		statedb.CreateAccount(params.DAORefundContract)
    74  	}
    75  
    76  //将每个DAO帐户和额外的余额帐户资金转移到退款合同中
    77  	for _, addr := range params.DAODrainList() {
    78  		statedb.AddBalance(params.DAORefundContract, statedb.GetBalance(addr))
    79  		statedb.SetBalance(addr, new(big.Int))
    80  	}
    81  }
    82