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