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