cranberry

Форк
0
/
tx_service.go 
68 строк · 1.6 Кб
1
package services
2

3
import (
4
	"database/sql"
5

6
	"gitverse.ru/IvanTimofeev/cranberry/internal/db"
7
	memorypool "gitverse.ru/IvanTimofeev/cranberry/internal/pool"
8
	pbapi "gitverse.ru/IvanTimofeev/cranberry/pkg/grpc"
9
	"gitverse.ru/IvanTimofeev/cranberry/pkg/utility"
10
)
11

12
type TxService struct {
13
	memorypool *memorypool.MemoryPool
14
	db         *db.Db
15
}
16

17
func (s *TxService) ExecuteTx(txc *pbapi.TxContainer, bc *pbapi.BlockContainer, dbtx *sql.Tx) error {
18
	// сохраняем транзакцию в БД
19
	err := s.db.SaveTx(txc, bc, dbtx)
20
	if err != nil {
21
		return err
22
	}
23
	// создаем или обновляем аккаунты и балансы в БД
24
	toAcc, ok, err := s.db.GetAccountByTx(txc.Tx.To, dbtx)
25
	if err != nil {
26
		return err
27
	}
28
	if !ok {
29
		err = s.db.SaveAccount(&pbapi.Account{
30
			Addr:    txc.Tx.To,
31
			Balance: txc.Tx.Amount,
32
		}, dbtx)
33
		if err != nil {
34
			return err
35
		}
36
	} else {
37
		toAcc.Balance += txc.Tx.Amount
38
		err = s.db.SaveAccount(toAcc, dbtx)
39
		if err != nil {
40
			return err
41
		}
42
	}
43
	from := utility.GetAddrFromPubKey(txc.PubKey)
44
	fromAcc, ok, err := s.db.GetAccountByTx(from, dbtx)
45
	if err != nil {
46
		return err
47
	}
48
	if !ok {
49
		//это невозможно, поскольку такой аккаунт и баланс не существует
50
		if err != nil {
51
			return err
52
		}
53
	}
54
	fromAcc.Balance -= txc.Tx.Amount
55
	fromAcc.PubKey = txc.PubKey
56
	err = s.db.SaveAccount(fromAcc, dbtx)
57
	if err != nil {
58
		return err
59
	}
60
	return nil
61
}
62

63
func NewTxService(memorypool *memorypool.MemoryPool, db *db.Db) *TxService {
64
	return &TxService{
65
		memorypool: memorypool,
66
		db:         db,
67
	}
68
}
69

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.