MCPcopy Index your code
hub / github.com/CovenantSQL/CovenantSQL / matchProvidersWithUser

Method matchProvidersWithUser

blockproducer/metastate.go:553–693  ·  view source on GitHub ↗
(tx *types.CreateDatabase)

Source from the content-addressed store, hash-verified

551}
552
553func (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)

Callers 1

applyTransactionMethod · 0.95

Calls 15

loadProviderObjectMethod · 0.95
filterNMinersMethod · 0.95
decreaseAccountTokenMethod · 0.95
generateGenesisBlockMethod · 0.95
loadSQLChainObjectMethod · 0.95
deleteProviderObjectMethod · 0.95
InfofFunction · 0.92
PubKeyHashFunction · 0.92
WithErrorFunction · 0.92
WithFieldsFunction · 0.92
WarnfFunction · 0.92
FromAccountAndNonceFunction · 0.92

Tested by

no test coverage detected