github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/signer/core/validation_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 //版权所有2018 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 core 26 27 import ( 28 "fmt" 29 "math/big" 30 "testing" 31 32 "github.com/ethereum/go-ethereum/common" 33 "github.com/ethereum/go-ethereum/common/hexutil" 34 ) 35 36 func hexAddr(a string) common.Address { return common.BytesToAddress(common.FromHex(a)) } 37 func mixAddr(a string) (*common.MixedcaseAddress, error) { 38 return common.NewMixedcaseAddressFromString(a) 39 } 40 func toHexBig(h string) hexutil.Big { 41 b := big.NewInt(0).SetBytes(common.FromHex(h)) 42 return hexutil.Big(*b) 43 } 44 func toHexUint(h string) hexutil.Uint64 { 45 b := big.NewInt(0).SetBytes(common.FromHex(h)) 46 return hexutil.Uint64(b.Uint64()) 47 } 48 func dummyTxArgs(t txtestcase) *SendTxArgs { 49 to, _ := mixAddr(t.to) 50 from, _ := mixAddr(t.from) 51 n := toHexUint(t.n) 52 gas := toHexUint(t.g) 53 gasPrice := toHexBig(t.gp) 54 value := toHexBig(t.value) 55 var ( 56 data, input *hexutil.Bytes 57 ) 58 if t.d != "" { 59 a := hexutil.Bytes(common.FromHex(t.d)) 60 data = &a 61 } 62 if t.i != "" { 63 a := hexutil.Bytes(common.FromHex(t.i)) 64 input = &a 65 66 } 67 return &SendTxArgs{ 68 From: *from, 69 To: to, 70 Value: value, 71 Nonce: n, 72 GasPrice: gasPrice, 73 Gas: gas, 74 Data: data, 75 Input: input, 76 } 77 } 78 79 type txtestcase struct { 80 from, to, n, g, gp, value, d, i string 81 expectErr bool 82 numMessages int 83 } 84 85 func TestValidator(t *testing.T) { 86 var ( 87 //使用空数据库,对ABI特定的东西还有其他测试 88 db, _ = NewEmptyAbiDB() 89 v = NewValidator(db) 90 ) 91 testcases := []txtestcase{ 92 //校验和无效 93 {from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead", 94 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, 95 //有效的0x0000000000000000000000000000000标题 96 {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", 97 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0}, 98 //输入和数据冲突 99 {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", 100 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true}, 101 //无法分析数据 102 {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", 103 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1}, 104 //无法分析(输入时)数据 105 {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", 106 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1}, 107 //发送到0 108 {from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000", 109 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, 110 //创建空合同(无值) 111 {from: "000000000000000000000000000000000000dead", to: "", 112 n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1}, 113 //创建空合同(带值) 114 {from: "000000000000000000000000000000000000dead", to: "", 115 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true}, 116 //用于创建的小负载 117 {from: "000000000000000000000000000000000000dead", to: "", 118 n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1}, 119 } 120 for i, test := range testcases { 121 msgs, err := v.ValidateTransaction(dummyTxArgs(test), nil) 122 if err == nil && test.expectErr { 123 t.Errorf("Test %d, expected error", i) 124 for _, msg := range msgs.Messages { 125 fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) 126 } 127 } 128 if err != nil && !test.expectErr { 129 t.Errorf("Test %d, unexpected error: %v", i, err) 130 } 131 if err == nil { 132 got := len(msgs.Messages) 133 if got != test.numMessages { 134 for _, msg := range msgs.Messages { 135 fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) 136 } 137 t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got) 138 } else { 139 //调试打印输出,稍后删除 140 for _, msg := range msgs.Messages { 141 fmt.Printf("* [%d] %s: %s\n", i, msg.Typ, msg.Message) 142 } 143 fmt.Println() 144 } 145 } 146 } 147 }