Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modify internal log #151

Merged
merged 3 commits into from
Apr 19, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 50 additions & 31 deletions accountmanager/accountmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -1185,27 +1185,33 @@ func (am *AccountManager) IncAsset2Acct(fromName common.Name, toName common.Name
//}

//Process account action
func (am *AccountManager) Process(accountManagerContext *types.AccountManagerContext) error {
func (am *AccountManager) Process(accountManagerContext *types.AccountManagerContext) ([]*types.InternalLog, error) {
snap := am.sdb.Snapshot()
err := am.process(accountManagerContext)
internalLogs, err := am.process(accountManagerContext)
if err != nil {
am.sdb.RevertToSnapshot(snap)
}
return err
return internalLogs, err
}

func (am *AccountManager) process(accountManagerContext *types.AccountManagerContext) error {
func (am *AccountManager) process(accountManagerContext *types.AccountManagerContext) ([]*types.InternalLog, error) {
action := accountManagerContext.Action
number := accountManagerContext.Number

var internalLogs []*types.InternalLog

if !action.CheckValue() {
return nil, ErrAmountValueInvalid
}

if action.Type() != types.Transfer && action.Recipient() != common.Name(sysName) {
return ErrToNameInvalid
return nil, ErrToNameInvalid
}

//transfer
if action.Value().Cmp(big.NewInt(0)) > 0 {
if err := am.TransferAsset(action.Sender(), action.Recipient(), action.AssetID(), action.Value()); err != nil {
return err
return nil, err
}
}

Expand All @@ -1215,61 +1221,71 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
var acct AccountAction
err := rlp.DecodeBytes(action.Data(), &acct)
if err != nil {
return err
return nil, err
}

if err := am.CreateAnyAccount(action.Sender(), acct.AccountName, acct.Founder, number, 0, acct.PublicKey); err != nil {
return err
return nil, err
}

if action.Value().Cmp(big.NewInt(0)) > 0 {
if err := am.TransferAsset(common.Name(sysName), acct.AccountName, action.AssetID(), action.Value()); err != nil {
return err
return nil, err
}
actionX := types.NewAction(action.Type(), common.Name(sysName), acct.AccountName, 0, 0, action.AssetID(), action.Value(), nil)
internalLog := &types.InternalLog{Action: actionX.NewRPCAction(0), ActionType: "", GasUsed: 0, GasLimit: 0, Depth: 0, Error: ""}
internalLogs = append(internalLogs, internalLog)
}
break
case types.UpdateAccount:
var acct AccountAction
err := rlp.DecodeBytes(action.Data(), &acct)
if err != nil {
return err
return nil, err
}

if err := am.UpdateAccount(action.Sender(), &acct); err != nil {
return err
return nil, err
}
break
case types.UpdateAccountAuthor:
var acctAuth AccountAuthorAction
err := rlp.DecodeBytes(action.Data(), &acctAuth)
if err != nil {
return err
return nil, err
}
if err := am.UpdateAccountAuthor(action.Sender(), &acctAuth); err != nil {
return err
return nil, err
}
break
case types.IssueAsset:
var asset asset.AssetObject
err := rlp.DecodeBytes(action.Data(), &asset)
if err != nil {
return err
return nil, err
}

asset.SetAssetNumber(number)
if err := am.IssueAnyAsset(action.Sender(), &asset); err != nil {
return err
return nil, err
}
actionX := types.NewAction(action.Type(), common.Name(sysName), asset.GetAssetOwner(), 0, 0, asset.GetAssetId(), asset.GetAssetAmount(), nil)
internalLog := &types.InternalLog{Action: actionX.NewRPCAction(0), ActionType: "", GasUsed: 0, GasLimit: 0, Depth: 0, Error: ""}
internalLogs = append(internalLogs, internalLog)
break
case types.IncreaseAsset:
var inc IncAsset
var accountFrom = common.Name("")
err := rlp.DecodeBytes(action.Data(), &inc)
if err != nil {
return err
return nil, err
}
if err = am.IncAsset2Acct(action.Sender(), inc.To, inc.AssetId, inc.Amount); err != nil {
return err
return nil, err
}
actionX := types.NewAction(action.Type(), common.Name(accountFrom), inc.To, 0, 0, inc.AssetId, inc.Amount, nil)
internalLog := &types.InternalLog{Action: actionX.NewRPCAction(0), ActionType: "", GasUsed: 0, GasLimit: 0, Depth: 0, Error: ""}
internalLogs = append(internalLogs, internalLog)
break

case types.DestroyAsset:
Expand All @@ -1279,54 +1295,57 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
// return err
// }
if err := am.SubAccountBalanceByID(common.Name(sysName), action.AssetID(), action.Value()); err != nil {
return err
return nil, err
}

if err := am.ast.DestroyAsset(common.Name(sysName), action.AssetID(), action.Value()); err != nil {
return err
return nil, err
}
actionX := types.NewAction(action.Type(), common.Name(sysName), "", 0, 0, action.AssetID(), action.Value(), nil)
internalLog := &types.InternalLog{Action: actionX.NewRPCAction(0), ActionType: "", GasUsed: 0, GasLimit: 0, Depth: 0, Error: ""}
internalLogs = append(internalLogs, internalLog)
break
case types.UpdateAsset:
var asset asset.AssetObject
err := rlp.DecodeBytes(action.Data(), &asset)
if err != nil {
return err
return nil, err
}
acct, err := am.GetAccountByName(asset.GetAssetOwner())
if err != nil {
return err
return nil, err
}
if acct == nil {
return ErrAccountNotExist
return nil, ErrAccountNotExist
}
if len(asset.GetAssetFounder().String()) > 0 {
acct, err := am.GetAccountByName(asset.GetAssetFounder())
if err != nil {
return err
return nil, err
}
if acct == nil {
return ErrAccountNotExist
return nil, ErrAccountNotExist
}
}
if err := am.ast.UpdateAsset(action.Sender(), asset.GetAssetId(), asset.GetAssetOwner(), asset.GetAssetFounder()); err != nil {
return err
return nil, err
}
break
case types.SetAssetOwner:
var asset asset.AssetObject
err := rlp.DecodeBytes(action.Data(), &asset)
if err != nil {
return err
return nil, err
}
acct, err := am.GetAccountByName(asset.GetAssetOwner())
if err != nil {
return err
return nil, err
}
if acct == nil {
return ErrAccountNotExist
return nil, ErrAccountNotExist
}
if err := am.ast.SetAssetNewOwner(action.Sender(), asset.GetAssetId(), asset.GetAssetOwner()); err != nil {
return err
return nil, err
}
break
// case types.SetAssetFounder:
Expand All @@ -1352,8 +1371,8 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
//return am.TransferAsset(action.Sender(), action.Recipient(), action.AssetID(), action.Value())
break
default:
return ErrUnkownTxType
return nil, ErrUnkownTxType
}

return nil
return internalLogs, nil
}
6 changes: 3 additions & 3 deletions accountmanager/accountmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1564,7 +1564,7 @@ func TestAccountManager_Process(t *testing.T) {
sdb: tt.fields.sdb,
ast: tt.fields.ast,
}
if err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
if _, err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
t.Errorf("%q. AccountManager.Process() error = %v, wantErr %v", tt.name, err, tt.wantErr)
}
}
Expand Down Expand Up @@ -1631,7 +1631,7 @@ func TestAccountManager_Process(t *testing.T) {
sdb: tt.fields.sdb,
ast: tt.fields.ast,
}
if err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
if _, err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
t.Errorf("%q. AccountManager.Process() error = %v, wantErr %v", tt.name, err, tt.wantErr)
}
}
Expand Down Expand Up @@ -1845,7 +1845,7 @@ func TestAccountManager_SubAccount(t *testing.T) {
sdb: tt.fields.sdb,
ast: tt.fields.ast,
}
if err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
if _, err := am.Process(&types.AccountManagerContext{Action: tt.args.action, Number: 0}); (err != nil) != tt.wantErr {
t.Errorf("%q. AccountManager.Process() error = %v, wantErr %v", tt.name, err, tt.wantErr)
}
}
Expand Down
2 changes: 1 addition & 1 deletion asset/asset_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (

type AssetObject struct {
AssetId uint64 `json:"assetId"`
Number uint64 `json:"Number"`
Number uint64 `json:"number"`
AssetName string `json:"assetName,omitempty"`
Symbol string `json:"symbol,omitempty"`
Amount *big.Int `json:"amount"`
Expand Down
4 changes: 2 additions & 2 deletions blockchain/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ func (g *Genesis) ToBlock(db fdb.Database) (*types.Block, []*types.Receipt) {
}

for index, action := range actActions {
if err := accountManager.Process(&types.AccountManagerContext{
if _, err := accountManager.Process(&types.AccountManagerContext{
Action: action,
Number: 0,
}); err != nil {
Expand Down Expand Up @@ -283,7 +283,7 @@ func (g *Genesis) ToBlock(db fdb.Database) (*types.Block, []*types.Receipt) {
}

for index, action := range astActions {
if err := accountManager.Process(&types.AccountManagerContext{
if _, err := accountManager.Process(&types.AccountManagerContext{
Action: action,
Number: 0,
}); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion consensus/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ type IEngine interface {

Engine() IEngine

ProcessAction(chainCfg *params.ChainConfig, state *state.StateDB, action *types.Action) error
ProcessAction(chainCfg *params.ChainConfig, state *state.StateDB, action *types.Action) ([]*types.InternalLog, error)

GetDelegatedByTime(name string, timestamp uint64, state *state.StateDB) (*big.Int, *big.Int, uint64, error)

Expand Down
Loading