github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/contracts/chequebook/cheque_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 //版权所有2016 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 chequebook 26 27 import ( 28 "crypto/ecdsa" 29 "math/big" 30 "os" 31 "path/filepath" 32 "testing" 33 "time" 34 35 "github.com/ethereum/go-ethereum/accounts/abi/bind" 36 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 37 "github.com/ethereum/go-ethereum/common" 38 "github.com/ethereum/go-ethereum/contracts/chequebook/contract" 39 "github.com/ethereum/go-ethereum/core" 40 "github.com/ethereum/go-ethereum/crypto" 41 ) 42 43 var ( 44 key0, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 45 key1, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") 46 key2, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") 47 addr0 = crypto.PubkeyToAddress(key0.PublicKey) 48 addr1 = crypto.PubkeyToAddress(key1.PublicKey) 49 addr2 = crypto.PubkeyToAddress(key2.PublicKey) 50 ) 51 52 func newTestBackend() *backends.SimulatedBackend { 53 return backends.NewSimulatedBackend(core.GenesisAlloc{ 54 addr0: {Balance: big.NewInt(1000000000)}, 55 addr1: {Balance: big.NewInt(1000000000)}, 56 addr2: {Balance: big.NewInt(1000000000)}, 57 }, 10000000) 58 } 59 60 func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) { 61 deployTransactor := bind.NewKeyedTransactor(prvKey) 62 deployTransactor.Value = amount 63 addr, _, _, err := contract.DeployChequebook(deployTransactor, backend) 64 if err != nil { 65 return common.Address{}, err 66 } 67 backend.Commit() 68 return addr, nil 69 } 70 71 func TestIssueAndReceive(t *testing.T) { 72 path := filepath.Join(os.TempDir(), "chequebook-test.json") 73 backend := newTestBackend() 74 addr0, err := deploy(key0, big.NewInt(0), backend) 75 if err != nil { 76 t.Fatalf("deploy contract: expected no error, got %v", err) 77 } 78 chbook, err := NewChequebook(path, addr0, key0, backend) 79 if err != nil { 80 t.Fatalf("expected no error, got %v", err) 81 } 82 chbook.sent[addr1] = new(big.Int).SetUint64(42) 83 amount := common.Big1 84 85 if _, err = chbook.Issue(addr1, amount); err == nil { 86 t.Fatalf("expected insufficient funds error, got none") 87 } 88 89 chbook.balance = new(big.Int).Set(common.Big1) 90 if chbook.Balance().Cmp(common.Big1) != 0 { 91 t.Fatalf("expected: %v, got %v", "0", chbook.Balance()) 92 } 93 94 ch, err := chbook.Issue(addr1, amount) 95 if err != nil { 96 t.Fatalf("expected no error, got %v", err) 97 } 98 99 if chbook.Balance().Sign() != 0 { 100 t.Errorf("expected: %v, got %v", "0", chbook.Balance()) 101 } 102 103 chbox, err := NewInbox(key1, addr0, addr1, &key0.PublicKey, backend) 104 if err != nil { 105 t.Fatalf("expected no error, got %v", err) 106 } 107 108 received, err := chbox.Receive(ch) 109 if err != nil { 110 t.Fatalf("expected no error, got %v", err) 111 } 112 113 if received.Cmp(big.NewInt(43)) != 0 { 114 t.Errorf("expected: %v, got %v", "43", received) 115 } 116 117 } 118 119 func TestCheckbookFile(t *testing.T) { 120 path := filepath.Join(os.TempDir(), "chequebook-test.json") 121 backend := newTestBackend() 122 chbook, err := NewChequebook(path, addr0, key0, backend) 123 if err != nil { 124 t.Fatalf("expected no error, got %v", err) 125 } 126 chbook.sent[addr1] = new(big.Int).SetUint64(42) 127 chbook.balance = new(big.Int).Set(common.Big1) 128 129 chbook.Save() 130 131 chbook, err = LoadChequebook(path, key0, backend, false) 132 if err != nil { 133 t.Fatalf("expected no error, got %v", err) 134 } 135 if chbook.Balance().Cmp(common.Big1) != 0 { 136 t.Errorf("expected: %v, got %v", "0", chbook.Balance()) 137 } 138 139 var ch *Cheque 140 if ch, err = chbook.Issue(addr1, common.Big1); err != nil { 141 t.Fatalf("expected no error, got %v", err) 142 } 143 if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 { 144 t.Errorf("expected: %v, got %v", "0", ch.Amount) 145 } 146 147 err = chbook.Save() 148 if err != nil { 149 t.Fatalf("expected no error, got %v", err) 150 } 151 } 152 153 func TestVerifyErrors(t *testing.T) { 154 path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") 155 backend := newTestBackend() 156 contr0, err := deploy(key0, common.Big2, backend) 157 if err != nil { 158 t.Errorf("expected no error, got %v", err) 159 } 160 chbook0, err := NewChequebook(path0, contr0, key0, backend) 161 if err != nil { 162 t.Errorf("expected no error, got %v", err) 163 } 164 165 path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json") 166 contr1, _ := deploy(key1, common.Big2, backend) 167 chbook1, err := NewChequebook(path1, contr1, key1, backend) 168 if err != nil { 169 t.Errorf("expected no error, got %v", err) 170 } 171 172 chbook0.sent[addr1] = new(big.Int).SetUint64(42) 173 chbook0.balance = new(big.Int).Set(common.Big2) 174 chbook1.balance = new(big.Int).Set(common.Big1) 175 amount := common.Big1 176 ch0, err := chbook0.Issue(addr1, amount) 177 if err != nil { 178 t.Fatalf("expected no error, got %v", err) 179 } 180 181 chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) 182 if err != nil { 183 t.Fatalf("expected no error, got %v", err) 184 } 185 186 received, err := chbox.Receive(ch0) 187 if err != nil { 188 t.Fatalf("expected no error, got %v", err) 189 } 190 191 if received.Cmp(big.NewInt(43)) != 0 { 192 t.Errorf("expected: %v, got %v", "43", received) 193 } 194 195 ch1, err := chbook0.Issue(addr2, amount) 196 if err != nil { 197 t.Fatalf("expected no error, got %v", err) 198 } 199 200 received, err = chbox.Receive(ch1) 201 t.Logf("correct error: %v", err) 202 if err == nil { 203 t.Fatalf("expected receiver error, got none and value %v", received) 204 } 205 206 ch2, err := chbook1.Issue(addr1, amount) 207 if err != nil { 208 t.Fatalf("expected no error, got %v", err) 209 } 210 received, err = chbox.Receive(ch2) 211 t.Logf("correct error: %v", err) 212 if err == nil { 213 t.Fatalf("expected sender error, got none and value %v", received) 214 } 215 216 _, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1)) 217 t.Logf("correct error: %v", err) 218 if err == nil { 219 t.Fatalf("expected incorrect amount error, got none") 220 } 221 222 received, err = chbox.Receive(ch0) 223 t.Logf("correct error: %v", err) 224 if err == nil { 225 t.Fatalf("expected incorrect amount error, got none and value %v", received) 226 } 227 228 } 229 230 func TestDeposit(t *testing.T) { 231 path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") 232 backend := newTestBackend() 233 contr0, _ := deploy(key0, new(big.Int), backend) 234 235 chbook, err := NewChequebook(path0, contr0, key0, backend) 236 if err != nil { 237 t.Errorf("expected no error, got %v", err) 238 } 239 240 balance := new(big.Int).SetUint64(42) 241 chbook.Deposit(balance) 242 backend.Commit() 243 if chbook.Balance().Cmp(balance) != 0 { 244 t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) 245 } 246 247 amount := common.Big1 248 _, err = chbook.Issue(addr1, amount) 249 if err != nil { 250 t.Fatalf("expected no error, got %v", err) 251 } 252 backend.Commit() 253 exp := new(big.Int).SetUint64(41) 254 if chbook.Balance().Cmp(exp) != 0 { 255 t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) 256 } 257 258 // 259 chbook.AutoDeposit(0, balance, balance) 260 _, err = chbook.Issue(addr1, amount) 261 if err != nil { 262 t.Fatalf("expected no error, got %v", err) 263 } 264 backend.Commit() 265 _, err = chbook.Issue(addr1, amount) 266 if err != nil { 267 t.Fatalf("expected no error, got %v", err) 268 } 269 backend.Commit() 270 if chbook.Balance().Cmp(balance) != 0 { 271 t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) 272 } 273 274 //自动沉积 275 chbook.AutoDeposit(0, common.Big0, balance) 276 _, err = chbook.Issue(addr1, amount) 277 if err != nil { 278 t.Fatalf("expected no error, got %v", err) 279 } 280 backend.Commit() 281 _, err = chbook.Issue(addr1, amount) 282 if err != nil { 283 t.Fatalf("expected no error, got %v", err) 284 } 285 backend.Commit() 286 287 exp = new(big.Int).SetUint64(40) 288 if chbook.Balance().Cmp(exp) != 0 { 289 t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) 290 } 291 292 //autodeposit every 200ms if new cheque issued 293 interval := 200 * time.Millisecond 294 chbook.AutoDeposit(interval, common.Big1, balance) 295 _, err = chbook.Issue(addr1, amount) 296 if err != nil { 297 t.Fatalf("expected no error, got %v", err) 298 } 299 backend.Commit() 300 _, err = chbook.Issue(addr1, amount) 301 if err != nil { 302 t.Fatalf("expected no error, got %v", err) 303 } 304 backend.Commit() 305 306 exp = new(big.Int).SetUint64(38) 307 if chbook.Balance().Cmp(exp) != 0 { 308 t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) 309 } 310 311 time.Sleep(3 * interval) 312 backend.Commit() 313 if chbook.Balance().Cmp(balance) != 0 { 314 t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) 315 } 316 317 exp = new(big.Int).SetUint64(40) 318 chbook.AutoDeposit(4*interval, exp, balance) 319 _, err = chbook.Issue(addr1, amount) 320 if err != nil { 321 t.Fatalf("expected no error, got %v", err) 322 } 323 backend.Commit() 324 _, err = chbook.Issue(addr1, amount) 325 if err != nil { 326 t.Fatalf("expected no error, got %v", err) 327 } 328 time.Sleep(3 * interval) 329 backend.Commit() 330 if chbook.Balance().Cmp(exp) != 0 { 331 t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) 332 } 333 334 _, err = chbook.Issue(addr1, amount) 335 if err != nil { 336 t.Fatalf("expected no error, got %v", err) 337 } 338 time.Sleep(1 * interval) 339 backend.Commit() 340 341 if chbook.Balance().Cmp(balance) != 0 { 342 t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) 343 } 344 345 chbook.AutoDeposit(1*interval, common.Big0, balance) 346 chbook.Stop() 347 348 _, err = chbook.Issue(addr1, common.Big1) 349 if err != nil { 350 t.Fatalf("expected no error, got %v", err) 351 } 352 backend.Commit() 353 354 _, err = chbook.Issue(addr1, common.Big2) 355 if err != nil { 356 t.Fatalf("expected no error, got %v", err) 357 } 358 359 time.Sleep(1 * interval) 360 backend.Commit() 361 362 exp = new(big.Int).SetUint64(39) 363 if chbook.Balance().Cmp(exp) != 0 { 364 t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) 365 } 366 367 } 368 369 func TestCash(t *testing.T) { 370 path := filepath.Join(os.TempDir(), "chequebook-test.json") 371 backend := newTestBackend() 372 contr0, _ := deploy(key0, common.Big2, backend) 373 374 chbook, err := NewChequebook(path, contr0, key0, backend) 375 if err != nil { 376 t.Errorf("expected no error, got %v", err) 377 } 378 chbook.sent[addr1] = new(big.Int).SetUint64(42) 379 amount := common.Big1 380 chbook.balance = new(big.Int).Set(common.Big1) 381 ch, err := chbook.Issue(addr1, amount) 382 if err != nil { 383 t.Fatalf("expected no error, got %v", err) 384 } 385 backend.Commit() 386 chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) 387 if err != nil { 388 t.Fatalf("expected no error, got %v", err) 389 } 390 391 //cashing latest cheque 392 if _, err = chbox.Receive(ch); err != nil { 393 t.Fatalf("expected no error, got %v", err) 394 } 395 if _, err = ch.Cash(chbook.session); err != nil { 396 t.Fatal("Cash failed:", err) 397 } 398 backend.Commit() 399 400 chbook.balance = new(big.Int).Set(common.Big3) 401 ch0, err := chbook.Issue(addr1, amount) 402 if err != nil { 403 t.Fatalf("expected no error, got %v", err) 404 } 405 backend.Commit() 406 ch1, err := chbook.Issue(addr1, amount) 407 if err != nil { 408 t.Fatalf("expected no error, got %v", err) 409 } 410 backend.Commit() 411 412 interval := 10 * time.Millisecond 413 //用10ms间隔设置AutoCash 414 chbox.AutoCash(interval, nil) 415 _, err = chbox.Receive(ch0) 416 if err != nil { 417 t.Fatalf("expected no error, got %v", err) 418 } 419 _, err = chbox.Receive(ch1) 420 if err != nil { 421 t.Fatalf("expected no error, got %v", err) 422 } 423 backend.Commit() 424 //after 3x interval time and 2 cheques received, exactly one cashing tx is sent 425 time.Sleep(4 * interval) 426 backend.Commit() 427 428 //停止AutoCash后不再发送TX 429 ch2, err := chbook.Issue(addr1, amount) 430 if err != nil { 431 t.Fatalf("expected no error, got %v", err) 432 } 433 chbox.Stop() 434 _, err = chbox.Receive(ch2) 435 if err != nil { 436 t.Fatalf("expected no error, got %v", err) 437 } 438 time.Sleep(2 * interval) 439 backend.Commit() 440 441 //autocash below 1 442 chbook.balance = big.NewInt(2) 443 chbox.AutoCash(0, common.Big1) 444 445 ch3, err := chbook.Issue(addr1, amount) 446 if err != nil { 447 t.Fatalf("expected no error, got %v", err) 448 } 449 backend.Commit() 450 451 ch4, err := chbook.Issue(addr1, amount) 452 if err != nil { 453 t.Fatalf("expected no error, got %v", err) 454 } 455 backend.Commit() 456 457 _, err = chbox.Receive(ch3) 458 if err != nil { 459 t.Fatalf("expected no error, got %v", err) 460 } 461 backend.Commit() 462 _, err = chbox.Receive(ch4) 463 if err != nil { 464 t.Fatalf("expected no error, got %v", err) 465 } 466 backend.Commit() 467 468 //autochash on receipt when maxUncashed is 0 469 chbook.balance = new(big.Int).Set(common.Big2) 470 chbox.AutoCash(0, common.Big0) 471 472 ch5, err := chbook.Issue(addr1, amount) 473 if err != nil { 474 t.Fatalf("expected no error, got %v", err) 475 } 476 backend.Commit() 477 478 ch6, err := chbook.Issue(addr1, amount) 479 if err != nil { 480 t.Fatalf("expected no error, got %v", err) 481 } 482 483 _, err = chbox.Receive(ch5) 484 if err != nil { 485 t.Fatalf("expected no error, got %v", err) 486 } 487 backend.Commit() 488 489 _, err = chbox.Receive(ch6) 490 if err != nil { 491 t.Fatalf("expected no error, got %v", err) 492 } 493 backend.Commit() 494 495 }