Skip to content

Commit da76f12

Browse files
committed
Fix bug: transfer token to sqlchain but not decrease account's token
1 parent fda2ef7 commit da76f12

3 files changed

Lines changed: 83 additions & 12 deletions

File tree

‎blockproducer/metastate.go‎

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,17 @@ func newMetaState() *metaState {
5252
}
5353

5454
func (s *metaState) loadAccountObject(k proto.AccountAddress) (o *types.Account, loaded bool) {
55-
if o, loaded = s.dirty.accounts[k]; loaded {
56-
if o == nil {
55+
var old *types.Account
56+
if old, loaded = s.dirty.accounts[k]; loaded {
57+
if old == nil {
5758
loaded = false
59+
return
5860
}
61+
o = deepcopy.Copy(old).(*types.Account)
5962
return
6063
}
61-
if o, loaded = s.readonly.accounts[k]; loaded {
64+
if old, loaded = s.readonly.accounts[k]; loaded {
65+
o = deepcopy.Copy(old).(*types.Account)
6266
return
6367
}
6468
return
@@ -67,10 +71,17 @@ func (s *metaState) loadAccountObject(k proto.AccountAddress) (o *types.Account,
6771
func (s *metaState) loadOrStoreAccountObject(
6872
k proto.AccountAddress, v *types.Account) (o *types.Account, loaded bool,
6973
) {
70-
if o, loaded = s.dirty.accounts[k]; loaded && o != nil {
74+
var old *types.Account
75+
if old, loaded = s.dirty.accounts[k]; loaded {
76+
if old == nil {
77+
loaded = false
78+
return
79+
}
80+
o = deepcopy.Copy(old).(*types.Account)
7181
return
7282
}
73-
if o, loaded = s.readonly.accounts[k]; loaded {
83+
if old, loaded = s.readonly.accounts[k]; loaded {
84+
o = deepcopy.Copy(old).(*types.Account)
7485
return
7586
}
7687
s.dirty.accounts[k] = v
@@ -1044,6 +1055,7 @@ func (s *metaState) transferSQLChainTokenBalance(transfer *types.Transfer) (err
10441055

10451056
var (
10461057
sqlchain *types.SQLChainProfile
1058+
account *types.Account
10471059
ok bool
10481060
)
10491061
sqlchain, ok = s.loadSQLChainObject(transfer.Receiver.DatabaseID())
@@ -1063,6 +1075,17 @@ func (s *metaState) transferSQLChainTokenBalance(transfer *types.Transfer) (err
10631075
})
10641076
return
10651077
}
1078+
account, ok = s.loadAccountObject(realSender)
1079+
if account.TokenBalance[transfer.TokenType] < transfer.Amount {
1080+
err = ErrInsufficientBalance
1081+
log.WithFields(log.Fields{
1082+
"addr": account.Address.String(),
1083+
"amount": account.TokenBalance[transfer.TokenType],
1084+
"transfer_amount": transfer.Amount,
1085+
"token_type": transfer.TokenType.String(),
1086+
}).WithError(err).Warning("in transferSQLChainTokenBalance")
1087+
return
1088+
}
10661089

10671090
for _, user := range sqlchain.Users {
10681091
if user.Address == transfer.Sender {
@@ -1083,13 +1106,15 @@ func (s *metaState) transferSQLChainTokenBalance(transfer *types.Transfer) (err
10831106
}
10841107
user.Arrears = 0
10851108
user.Status = types.Normal
1109+
10861110
transfer.Amount -= user.Arrears
1111+
account.TokenBalance[transfer.TokenType] -= user.Arrears
10871112
} else {
10881113
err = ErrInsufficientTransfer
10891114
log.WithFields(log.Fields{
10901115
"arrears": user.Arrears,
10911116
"transfer_amount": transfer.Amount,
1092-
})
1117+
}).WithError(err).Warning("in transferSQLChainTokenBalance")
10931118
return
10941119
}
10951120
}
@@ -1107,15 +1132,17 @@ func (s *metaState) transferSQLChainTokenBalance(transfer *types.Transfer) (err
11071132
} else {
11081133
err = safeAdd(&user.AdvancePayment, &transfer.Amount)
11091134
if err != nil {
1110-
return err
1135+
return
11111136
}
11121137
}
1138+
account.TokenBalance[transfer.TokenType] -= transfer.Amount
11131139
if !user.Status.EnableQuery() {
11141140
if user.AdvancePayment > minDep {
11151141
user.Status = types.Normal
11161142
}
11171143
}
11181144
s.dirty.databases[transfer.Receiver.DatabaseID()] = sqlchain
1145+
s.dirty.accounts[realSender] = account
11191146
return
11201147
}
11211148
}

‎cmd/cql/main.go‎

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ var (
7171
type userPermission struct {
7272
TargetChain proto.AccountAddress `json:"chain"`
7373
TargetUser proto.AccountAddress `json:"user"`
74-
Perm types.UserPermission `json:"perm"`
74+
Perm string `json:"perm"`
7575
}
7676

7777
type tranToken struct {
@@ -327,7 +327,15 @@ func main() {
327327
return
328328
}
329329

330-
err := client.UpdatePermission(perm.TargetUser, perm.TargetChain, perm.Perm)
330+
var p types.UserPermission
331+
p.FromString(perm.Perm)
332+
if !p.Valid() {
333+
log.WithError(err).Errorf("update permission failed: invalid permission description")
334+
os.Exit(-1)
335+
return
336+
}
337+
338+
err := client.UpdatePermission(perm.TargetUser, perm.TargetChain, p)
331339

332340
if err != nil {
333341
log.WithError(err).Error("update permission failed")
@@ -336,6 +344,7 @@ func main() {
336344
}
337345

338346
log.Info("success in sending transaction to CovenantSQL")
347+
return
339348
}
340349

341350
if transferToken != "" {
@@ -347,22 +356,43 @@ func main() {
347356
return
348357
}
349358

350-
var validAmount = regexp.MustCompile(`^[0-9]+ *[a-zA-Z]+$`)
359+
var validAmount = regexp.MustCompile(`^([0-9]+) *([a-zA-Z]+)$`)
351360
if !validAmount.MatchString(tran.Amount) {
352361
log.Error("transfer token failed: invalid transfer description")
353362
os.Exit(-1)
354363
return
355364
}
365+
amountUnit := validAmount.FindStringSubmatch(tran.Amount)
366+
if len(amountUnit) != 3 {
367+
log.Error("transfer token failed: invalid transfer description")
368+
for _, v := range amountUnit {
369+
log.Error(v)
370+
}
371+
os.Exit(-1)
372+
return
373+
}
374+
amount, err := strconv.ParseUint(amountUnit[1], 10, 64)
375+
if err != nil {
376+
log.Error("transfer token failed: invalid token amount")
377+
os.Exit(-1)
378+
return
379+
}
380+
unit := types.FromString(amountUnit[2])
381+
if !unit.Listed() {
382+
log.Error("transfer token failed: invalid token type")
383+
os.Exit(-1)
384+
return
385+
}
356386

357-
// err := client.TransferToken(tran.TargetUser, tran.Amount, tran.TokenType)
358-
387+
err = client.TransferToken(tran.TargetUser, amount, unit)
359388
if err != nil {
360389
log.WithError(err).Error("transfer token failed")
361390
os.Exit(-1)
362391
return
363392
}
364393

365394
log.Info("success in sending transaction to CovenantSQL")
395+
return
366396
}
367397

368398
var (

‎types/account.go‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ func (up *UserPermission) Valid() bool {
7171
return *up >= Admin && *up < NumberOfUserPermission
7272
}
7373

74+
// FromString converts string to UserPermission.
75+
func (up *UserPermission) FromString(perm string) {
76+
switch perm {
77+
case "Admin":
78+
*up = Admin
79+
case "Write":
80+
*up = Write
81+
case "Read":
82+
*up = Read
83+
default:
84+
*up = UnknownPerm
85+
}
86+
}
87+
7488
// Status defines status of a SQLChain user/miner.
7589
type Status int32
7690

0 commit comments

Comments
 (0)