(tx *types.CreateDatabase)
| 551 | } |
| 552 | |
| 553 | func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) { |
| 554 | log.Infof("create database: %s", tx.Hash()) |
| 555 | sender, err := crypto.PubKeyHash(tx.Signee) |
| 556 | if err != nil { |
| 557 | err = errors.Wrap(err, "matchProviders failed") |
| 558 | return |
| 559 | } |
| 560 | if sender != tx.Owner { |
| 561 | err = errors.Wrapf(ErrInvalidSender, "match failed with real sender: %s, sender: %s", |
| 562 | sender, tx.Owner) |
| 563 | return |
| 564 | } |
| 565 | |
| 566 | if tx.GasPrice <= 0 { |
| 567 | err = ErrInvalidGasPrice |
| 568 | return |
| 569 | } |
| 570 | if tx.ResourceMeta.Node <= 0 { |
| 571 | err = ErrInvalidMinerCount |
| 572 | return |
| 573 | } |
| 574 | minerCount := uint64(tx.ResourceMeta.Node) |
| 575 | |
| 576 | minAdvancePayment := minDeposit(tx.GasPrice, minerCount) |
| 577 | |
| 578 | if tx.AdvancePayment < minAdvancePayment { |
| 579 | err = ErrInsufficientAdvancePayment |
| 580 | log.WithError(err).Warningf("tx.AdvancePayment: %d, minAdvancePayment: %d", |
| 581 | tx.AdvancePayment, minAdvancePayment) |
| 582 | return |
| 583 | } |
| 584 | |
| 585 | miners := make(MinerInfos, 0, minerCount) |
| 586 | |
| 587 | for _, m := range tx.ResourceMeta.TargetMiners { |
| 588 | if po, loaded := s.loadProviderObject(m); !loaded { |
| 589 | log.WithFields(log.Fields{ |
| 590 | "miner_addr": m, |
| 591 | "user_addr": sender, |
| 592 | }).Error(err) |
| 593 | err = ErrNoSuchMiner |
| 594 | continue |
| 595 | } else { |
| 596 | miners, err = filterAndAppendMiner(miners, po, tx, sender) |
| 597 | if err != nil { |
| 598 | log.Warnf("miner filtered %v", err) |
| 599 | } |
| 600 | // if got enough, break |
| 601 | if uint64(miners.Len()) == minerCount { |
| 602 | break |
| 603 | } |
| 604 | } |
| 605 | } |
| 606 | |
| 607 | // not enough, find more miner(s) |
| 608 | if uint64(miners.Len()) < minerCount { |
| 609 | if uint64(len(tx.ResourceMeta.TargetMiners)) >= minerCount { |
| 610 | err = errors.Wrapf(err, "miners match target are not enough %d:%d", miners.Len(), minerCount) |
no test coverage detected