github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/abigen/main.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 //版权所有2016 Go Ethereum作者 10 //此文件是Go以太坊的一部分。 11 // 12 //Go以太坊是免费软件:您可以重新发布和/或修改它 13 //根据GNU通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊的分布希望它会有用, 18 // 19 //适销性或特定用途的适用性。见 20 //GNU通用公共许可证了解更多详细信息。 21 // 22 //你应该已经收到一份GNU通用公共许可证的副本 23 //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package main 26 27 import ( 28 "encoding/json" 29 "flag" 30 "fmt" 31 "io/ioutil" 32 "os" 33 "strings" 34 35 "github.com/ethereum/go-ethereum/accounts/abi/bind" 36 "github.com/ethereum/go-ethereum/common/compiler" 37 ) 38 39 var ( 40 abiFlag = flag.String("abi", "", "Path to the Ethereum contract ABI json to bind, - for STDIN") 41 binFlag = flag.String("bin", "", "Path to the Ethereum contract bytecode (generate deploy method)") 42 typFlag = flag.String("type", "", "Struct name for the binding (default = package name)") 43 44 solFlag = flag.String("sol", "", "Path to the Ethereum contract Solidity source to build and bind") 45 solcFlag = flag.String("solc", "solc", "Solidity compiler to use if source builds are requested") 46 excFlag = flag.String("exc", "", "Comma separated types to exclude from binding") 47 48 pkgFlag = flag.String("pkg", "", "Package name to generate the binding into") 49 outFlag = flag.String("out", "", "Output file for the generated binding (default = stdout)") 50 langFlag = flag.String("lang", "go", "Destination language for the bindings (go, java, objc)") 51 ) 52 53 func main() { 54 //分析并确保指定了所有需要的输入 55 flag.Parse() 56 57 if *abiFlag == "" && *solFlag == "" { 58 fmt.Printf("No contract ABI (--abi) or Solidity source (--sol) specified\n") 59 os.Exit(-1) 60 } else if (*abiFlag != "" || *binFlag != "" || *typFlag != "") && *solFlag != "" { 61 fmt.Printf("Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity source (--sol) flag\n") 62 os.Exit(-1) 63 } 64 if *pkgFlag == "" { 65 fmt.Printf("No destination package specified (--pkg)\n") 66 os.Exit(-1) 67 } 68 var lang bind.Lang 69 switch *langFlag { 70 case "go": 71 lang = bind.LangGo 72 case "java": 73 lang = bind.LangJava 74 case "objc": 75 lang = bind.LangObjC 76 default: 77 fmt.Printf("Unsupported destination language \"%s\" (--lang)\n", *langFlag) 78 os.Exit(-1) 79 } 80 //如果指定了整个solidity代码,则基于该代码构建和绑定 81 var ( 82 abis []string 83 bins []string 84 types []string 85 ) 86 if *solFlag != "" || *abiFlag == "-" { 87 //生成要从绑定中排除的类型列表 88 exclude := make(map[string]bool) 89 for _, kind := range strings.Split(*excFlag, ",") { 90 exclude[strings.ToLower(kind)] = true 91 } 92 93 var contracts map[string]*compiler.Contract 94 var err error 95 if *solFlag != "" { 96 contracts, err = compiler.CompileSolidity(*solcFlag, *solFlag) 97 if err != nil { 98 fmt.Printf("Failed to build Solidity contract: %v\n", err) 99 os.Exit(-1) 100 } 101 } else { 102 contracts, err = contractsFromStdin() 103 if err != nil { 104 fmt.Printf("Failed to read input ABIs from STDIN: %v\n", err) 105 os.Exit(-1) 106 } 107 } 108 //收集所有未排除的合同进行约束 109 for name, contract := range contracts { 110 if exclude[strings.ToLower(name)] { 111 continue 112 } 113 abi, _ := json.Marshal(contract.Info.AbiDefinition) //扁平化编译器分析 114 abis = append(abis, string(abi)) 115 bins = append(bins, contract.Code) 116 117 nameParts := strings.Split(name, ":") 118 types = append(types, nameParts[len(nameParts)-1]) 119 } 120 } else { 121 //否则,从参数中加载abi、可选字节码和类型名。 122 abi, err := ioutil.ReadFile(*abiFlag) 123 if err != nil { 124 fmt.Printf("Failed to read input ABI: %v\n", err) 125 os.Exit(-1) 126 } 127 abis = append(abis, string(abi)) 128 129 bin := []byte{} 130 if *binFlag != "" { 131 if bin, err = ioutil.ReadFile(*binFlag); err != nil { 132 fmt.Printf("Failed to read input bytecode: %v\n", err) 133 os.Exit(-1) 134 } 135 } 136 bins = append(bins, string(bin)) 137 138 kind := *typFlag 139 if kind == "" { 140 kind = *pkgFlag 141 } 142 types = append(types, kind) 143 } 144 //生成合同绑定 145 code, err := bind.Bind(types, abis, bins, *pkgFlag, lang) 146 if err != nil { 147 fmt.Printf("Failed to generate ABI binding: %v\n", err) 148 os.Exit(-1) 149 } 150 //将其刷新为文件或显示在标准输出上 151 if *outFlag == "" { 152 fmt.Printf("%s\n", code) 153 return 154 } 155 if err := ioutil.WriteFile(*outFlag, []byte(code), 0600); err != nil { 156 fmt.Printf("Failed to write ABI binding: %v\n", err) 157 os.Exit(-1) 158 } 159 } 160 161 func contractsFromStdin() (map[string]*compiler.Contract, error) { 162 bytes, err := ioutil.ReadAll(os.Stdin) 163 if err != nil { 164 return nil, err 165 } 166 167 return compiler.ParseCombinedJSON(bytes, "", "", "", "") 168 }