github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/dao_test.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:35</date> 10 //</624450078605578240> 11 12 13 package core 14 15 import ( 16 "math/big" 17 "testing" 18 19 "github.com/ethereum/go-ethereum/consensus/ethash" 20 "github.com/ethereum/go-ethereum/core/vm" 21 "github.com/ethereum/go-ethereum/ethdb" 22 "github.com/ethereum/go-ethereum/params" 23 ) 24 25 //启用DAO分叉的客户端可以正确筛选分叉开始的测试 26 //基于其外部数据字段的块。 27 func TestDAOForkRangeExtradata(t *testing.T) { 28 forkBlock := big.NewInt(32) 29 30 //为pro-forkers和non-forkers生成一个公共前缀 31 db := ethdb.NewMemDatabase() 32 gspec := new(Genesis) 33 genesis := gspec.MustCommit(db) 34 prefix, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, int(forkBlock.Int64()-1), func(i int, gen *BlockGen) {}) 35 36 //创建并发的、冲突的两个节点 37 proDb := ethdb.NewMemDatabase() 38 gspec.MustCommit(proDb) 39 40 proConf := *params.TestChainConfig 41 proConf.DAOForkBlock = forkBlock 42 proConf.DAOForkSupport = true 43 44 proBc, _ := NewBlockChain(proDb, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) 45 defer proBc.Stop() 46 47 conDb := ethdb.NewMemDatabase() 48 gspec.MustCommit(conDb) 49 50 conConf := *params.TestChainConfig 51 conConf.DAOForkBlock = forkBlock 52 conConf.DAOForkSupport = false 53 54 conBc, _ := NewBlockChain(conDb, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) 55 defer conBc.Stop() 56 57 if _, err := proBc.InsertChain(prefix); err != nil { 58 t.Fatalf("pro-fork: failed to import chain prefix: %v", err) 59 } 60 if _, err := conBc.InsertChain(prefix); err != nil { 61 t.Fatalf("con-fork: failed to import chain prefix: %v", err) 62 } 63 //尝试用其他camp块迭代扩展pro-fork和non-fork链 64 for i := int64(0); i < params.DAOForkExtraRange.Int64(); i++ { 65 //创建一个pro fork块,并尝试将其输入到no fork链中 66 db = ethdb.NewMemDatabase() 67 gspec.MustCommit(db) 68 bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) 69 defer bc.Stop() 70 71 blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) 72 for j := 0; j < len(blocks)/2; j++ { 73 blocks[j], blocks[len(blocks)-1-j] = blocks[len(blocks)-1-j], blocks[j] 74 } 75 if _, err := bc.InsertChain(blocks); err != nil { 76 t.Fatalf("failed to import contra-fork chain for expansion: %v", err) 77 } 78 if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil { 79 t.Fatalf("failed to commit contra-fork head for expansion: %v", err) 80 } 81 blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 82 if _, err := conBc.InsertChain(blocks); err == nil { 83 t.Fatalf("contra-fork chain accepted pro-fork block: %v", blocks[0]) 84 } 85 //为反向分叉器创建一个适当的无分叉块 86 blocks, _ = GenerateChain(&conConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 87 if _, err := conBc.InsertChain(blocks); err != nil { 88 t.Fatalf("contra-fork chain didn't accepted no-fork block: %v", err) 89 } 90 //创建一个无叉块,并尝试输入到pro叉链中 91 db = ethdb.NewMemDatabase() 92 gspec.MustCommit(db) 93 bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) 94 defer bc.Stop() 95 96 blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) 97 for j := 0; j < len(blocks)/2; j++ { 98 blocks[j], blocks[len(blocks)-1-j] = blocks[len(blocks)-1-j], blocks[j] 99 } 100 if _, err := bc.InsertChain(blocks); err != nil { 101 t.Fatalf("failed to import pro-fork chain for expansion: %v", err) 102 } 103 if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil { 104 t.Fatalf("failed to commit pro-fork head for expansion: %v", err) 105 } 106 blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 107 if _, err := proBc.InsertChain(blocks); err == nil { 108 t.Fatalf("pro-fork chain accepted contra-fork block: %v", blocks[0]) 109 } 110 //为Pro Forker创建适当的Pro Fork块 111 blocks, _ = GenerateChain(&proConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 112 if _, err := proBc.InsertChain(blocks); err != nil { 113 t.Fatalf("pro-fork chain didn't accepted pro-fork block: %v", err) 114 } 115 } 116 //在分叉完成后,验证contra forker是否接受pro fork额外数据。 117 db = ethdb.NewMemDatabase() 118 gspec.MustCommit(db) 119 bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) 120 defer bc.Stop() 121 122 blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) 123 for j := 0; j < len(blocks)/2; j++ { 124 blocks[j], blocks[len(blocks)-1-j] = blocks[len(blocks)-1-j], blocks[j] 125 } 126 if _, err := bc.InsertChain(blocks); err != nil { 127 t.Fatalf("failed to import contra-fork chain for expansion: %v", err) 128 } 129 if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil { 130 t.Fatalf("failed to commit contra-fork head for expansion: %v", err) 131 } 132 blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 133 if _, err := conBc.InsertChain(blocks); err != nil { 134 t.Fatalf("contra-fork chain didn't accept pro-fork block post-fork: %v", err) 135 } 136 //在分叉完成后,验证pro forker是否接受contra fork额外数据。 137 db = ethdb.NewMemDatabase() 138 gspec.MustCommit(db) 139 bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) 140 defer bc.Stop() 141 142 blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) 143 for j := 0; j < len(blocks)/2; j++ { 144 blocks[j], blocks[len(blocks)-1-j] = blocks[len(blocks)-1-j], blocks[j] 145 } 146 if _, err := bc.InsertChain(blocks); err != nil { 147 t.Fatalf("failed to import pro-fork chain for expansion: %v", err) 148 } 149 if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil { 150 t.Fatalf("failed to commit pro-fork head for expansion: %v", err) 151 } 152 blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) 153 if _, err := proBc.InsertChain(blocks); err != nil { 154 t.Fatalf("pro-fork chain didn't accept contra-fork block post-fork: %v", err) 155 } 156 } 157