github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/chain_makers_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2015 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package core
    26  
    27  import (
    28  	"fmt"
    29  	"math/big"
    30  
    31  	"github.com/ethereum/go-ethereum/consensus/ethash"
    32  	"github.com/ethereum/go-ethereum/core/types"
    33  	"github.com/ethereum/go-ethereum/core/vm"
    34  	"github.com/ethereum/go-ethereum/crypto"
    35  	"github.com/ethereum/go-ethereum/ethdb"
    36  	"github.com/ethereum/go-ethereum/params"
    37  )
    38  
    39  func ExampleGenerateChain() {
    40  	var (
    41  		key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
    42  		key2, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
    43  		key3, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
    44  		addr1   = crypto.PubkeyToAddress(key1.PublicKey)
    45  		addr2   = crypto.PubkeyToAddress(key2.PublicKey)
    46  		addr3   = crypto.PubkeyToAddress(key3.PublicKey)
    47  		db      = ethdb.NewMemDatabase()
    48  	)
    49  
    50  //确保key1在Genesis区块有一些资金。
    51  	gspec := &Genesis{
    52  		Config: &params.ChainConfig{HomesteadBlock: new(big.Int)},
    53  		Alloc:  GenesisAlloc{addr1: {Balance: big.NewInt(1000000)}},
    54  	}
    55  	genesis := gspec.MustCommit(db)
    56  
    57  //此调用生成5个块的链。函数运行的目的是
    58  //每个块,并根据
    59  //块索引。
    60  	signer := types.HomesteadSigner{}
    61  	chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 5, func(i int, gen *BlockGen) {
    62  		switch i {
    63  		case 0:
    64  //在块1中,addr1发送addr2一些乙醚。
    65  			tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), params.TxGas, nil, nil), signer, key1)
    66  			gen.AddTx(tx)
    67  		case 1:
    68  //在块2中,addr1向addr2发送更多的乙醚。
    69  //addr2将其传递给addr3。
    70  			tx1, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key1)
    71  			tx2, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key2)
    72  			gen.AddTx(tx1)
    73  			gen.AddTx(tx2)
    74  		case 2:
    75  //块3为空,但由addr3开采。
    76  			gen.SetCoinbase(addr3)
    77  			gen.SetExtra([]byte("yeehaw"))
    78  		case 3:
    79  //块4包括块2和3作为叔叔头(带有修改的额外数据)。
    80  			b2 := gen.PrevBlock(1).Header()
    81  			b2.Extra = []byte("foo")
    82  			gen.AddUncle(b2)
    83  			b3 := gen.PrevBlock(2).Header()
    84  			b3.Extra = []byte("foo")
    85  			gen.AddUncle(b3)
    86  		}
    87  	})
    88  
    89  //导入链。这将运行所有块验证规则。
    90  	blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
    91  	defer blockchain.Stop()
    92  
    93  	if i, err := blockchain.InsertChain(chain); err != nil {
    94  		fmt.Printf("insert error (block %d): %v\n", chain[i].NumberU64(), err)
    95  		return
    96  	}
    97  
    98  	state, _ := blockchain.State()
    99  	fmt.Printf("last block: #%d\n", blockchain.CurrentBlock().Number())
   100  	fmt.Println("balance of addr1:", state.GetBalance(addr1))
   101  	fmt.Println("balance of addr2:", state.GetBalance(addr2))
   102  	fmt.Println("balance of addr3:", state.GetBalance(addr3))
   103  //输出:
   104  //最后一个街区:第5号
   105  //加1余额:989000
   106  //加2余额:10000
   107  //加3余额:196875000000000000001000
   108  }