github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/accounts/abi/method.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:31</date> 10 //</624450062050660352> 11 12 13 package abi 14 15 import ( 16 "fmt" 17 "strings" 18 19 "github.com/ethereum/go-ethereum/crypto" 20 ) 21 22 //方法表示给定“name”的可调用项,以及该方法是否为常量。 23 //如果方法为“const”,则不需要为此创建任何事务 24 //特定方法调用。它可以很容易地使用本地虚拟机进行模拟。 25 //例如,“balance()”方法只需要检索 26 //从存储器中,因此不需要发送到 27 //网络。像“transact”这样的方法需要一个tx,因此 28 //标记为“真”。 29 //输入指定此给定方法所需的输入参数。 30 type Method struct { 31 Name string 32 Const bool 33 Inputs Arguments 34 Outputs Arguments 35 } 36 37 //SIG根据ABI规范返回方法字符串签名。 38 // 39 //例子 40 // 41 //函数foo(uint32 a,int b)=“foo(uint32,int256)” 42 // 43 //请注意,“int”代替其规范表示“int256” 44 func (method Method) Sig() string { 45 types := make([]string, len(method.Inputs)) 46 for i, input := range method.Inputs { 47 types[i] = input.Type.String() 48 } 49 return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ",")) 50 } 51 52 func (method Method) String() string { 53 inputs := make([]string, len(method.Inputs)) 54 for i, input := range method.Inputs { 55 inputs[i] = fmt.Sprintf("%v %v", input.Type, input.Name) 56 } 57 outputs := make([]string, len(method.Outputs)) 58 for i, output := range method.Outputs { 59 outputs[i] = output.Type.String() 60 if len(output.Name) > 0 { 61 outputs[i] += fmt.Sprintf(" %v", output.Name) 62 } 63 } 64 constant := "" 65 if method.Const { 66 constant = "constant " 67 } 68 return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) 69 } 70 71 func (method Method) Id() []byte { 72 return crypto.Keccak256([]byte(method.Sig()))[:4] 73 } 74