github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/chain_makers_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 //</624450078563635200> 11 12 13 package core 14 15 import ( 16 "fmt" 17 "math/big" 18 19 "github.com/ethereum/go-ethereum/consensus/ethash" 20 "github.com/ethereum/go-ethereum/core/types" 21 "github.com/ethereum/go-ethereum/core/vm" 22 "github.com/ethereum/go-ethereum/crypto" 23 "github.com/ethereum/go-ethereum/ethdb" 24 "github.com/ethereum/go-ethereum/params" 25 ) 26 27 func ExampleGenerateChain() { 28 var ( 29 key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 30 key2, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") 31 key3, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") 32 addr1 = crypto.PubkeyToAddress(key1.PublicKey) 33 addr2 = crypto.PubkeyToAddress(key2.PublicKey) 34 addr3 = crypto.PubkeyToAddress(key3.PublicKey) 35 db = ethdb.NewMemDatabase() 36 ) 37 38 //确保key1在Genesis区块有一些资金。 39 gspec := &Genesis{ 40 Config: ¶ms.ChainConfig{HomesteadBlock: new(big.Int)}, 41 Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(1000000)}}, 42 } 43 genesis := gspec.MustCommit(db) 44 45 //此调用生成5个块的链。函数运行的目的是 46 //每个块,并根据 47 //块索引。 48 signer := types.HomesteadSigner{} 49 chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 5, func(i int, gen *BlockGen) { 50 switch i { 51 case 0: 52 //在块1中,addr1发送addr2一些乙醚。 53 tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), params.TxGas, nil, nil), signer, key1) 54 gen.AddTx(tx) 55 case 1: 56 //在块2中,addr1向addr2发送更多的乙醚。 57 //addr2将其传递给addr3。 58 tx1, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key1) 59 tx2, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key2) 60 gen.AddTx(tx1) 61 gen.AddTx(tx2) 62 case 2: 63 //块3为空,但由addr3开采。 64 gen.SetCoinbase(addr3) 65 gen.SetExtra([]byte("yeehaw")) 66 case 3: 67 //块4包括块2和3作为叔叔头(带有修改的额外数据)。 68 b2 := gen.PrevBlock(1).Header() 69 b2.Extra = []byte("foo") 70 gen.AddUncle(b2) 71 b3 := gen.PrevBlock(2).Header() 72 b3.Extra = []byte("foo") 73 gen.AddUncle(b3) 74 } 75 }) 76 77 //导入链。这将运行所有块验证规则。 78 blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) 79 defer blockchain.Stop() 80 81 if i, err := blockchain.InsertChain(chain); err != nil { 82 fmt.Printf("insert error (block %d): %v\n", chain[i].NumberU64(), err) 83 return 84 } 85 86 state, _ := blockchain.State() 87 fmt.Printf("last block: #%d\n", blockchain.CurrentBlock().Number()) 88 fmt.Println("balance of addr1:", state.GetBalance(addr1)) 89 fmt.Println("balance of addr2:", state.GetBalance(addr2)) 90 fmt.Println("balance of addr3:", state.GetBalance(addr3)) 91 //输出: 92 //最后一个街区:第5号 93 //加1余额:989000 94 //加2余额:10000 95 //加3余额:196875000000000000001000 96 } 97