github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/mkalloc.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 //版权所有2017 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 //+不建 26 27 /* 28 29 mkalloc工具在genesis-alloc.go中创建genesis分配常量。 30 它输出一个const声明,其中包含一个RLP编码的(地址、平衡)元组列表。 31 32 运行mkalloc.go genesis.json 33 34 **/ 35 36 package main 37 38 import ( 39 "encoding/json" 40 "fmt" 41 "math/big" 42 "os" 43 "sort" 44 "strconv" 45 46 "github.com/ethereum/go-ethereum/core" 47 "github.com/ethereum/go-ethereum/rlp" 48 ) 49 50 type allocItem struct{ Addr, Balance *big.Int } 51 52 type allocList []allocItem 53 54 func (a allocList) Len() int { return len(a) } 55 func (a allocList) Less(i, j int) bool { return a[i].Addr.Cmp(a[j].Addr) < 0 } 56 func (a allocList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 57 58 func makelist(g *core.Genesis) allocList { 59 a := make(allocList, 0, len(g.Alloc)) 60 for addr, account := range g.Alloc { 61 if len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 { 62 panic(fmt.Sprintf("can't encode account %x", addr)) 63 } 64 a = append(a, allocItem{addr.Big(), account.Balance}) 65 } 66 sort.Sort(a) 67 return a 68 } 69 70 func makealloc(g *core.Genesis) string { 71 a := makelist(g) 72 data, err := rlp.EncodeToBytes(a) 73 if err != nil { 74 panic(err) 75 } 76 return strconv.QuoteToASCII(string(data)) 77 } 78 79 func main() { 80 if len(os.Args) != 2 { 81 fmt.Fprintln(os.Stderr, "Usage: mkalloc genesis.json") 82 os.Exit(1) 83 } 84 85 g := new(core.Genesis) 86 file, err := os.Open(os.Args[1]) 87 if err != nil { 88 panic(err) 89 } 90 if err := json.NewDecoder(file).Decode(g); err != nil { 91 panic(err) 92 } 93 fmt.Println("const allocData =", makealloc(g)) 94 }