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: ¶ms.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 }