Commit c7dfe374 authored by harrylee's avatar harrylee Committed by vipwzw

update accountmanager

parent 7275013e
...@@ -85,7 +85,7 @@ func TestAccountManager(t *testing.T) { ...@@ -85,7 +85,7 @@ func TestAccountManager(t *testing.T) {
} }
// set config key // set config key
item := &types.ConfigItem{ item := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameActiveTime, Key: "mavl-manage-" + ConfNameActiveTime,
Value: &types.ConfigItem_Arr{ Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{"10"}}, Arr: &types.ArrayConfig{Value: []string{"10"}},
}, },
...@@ -93,7 +93,7 @@ func TestAccountManager(t *testing.T) { ...@@ -93,7 +93,7 @@ func TestAccountManager(t *testing.T) {
stateDB.Set([]byte(item.Key), types.Encode(item)) stateDB.Set([]byte(item.Key), types.Encode(item))
item2 := &types.ConfigItem{ item2 := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameManagerAddr, Key: "mavl-manage-" + ConfNameManagerAddr,
Value: &types.ConfigItem_Arr{ Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{string(Nodes[0])}}, Arr: &types.ArrayConfig{Value: []string{string(Nodes[0])}},
}, },
...@@ -101,31 +101,92 @@ func TestAccountManager(t *testing.T) { ...@@ -101,31 +101,92 @@ func TestAccountManager(t *testing.T) {
stateDB.Set([]byte(item2.Key), types.Encode(item2)) stateDB.Set([]byte(item2.Key), types.Encode(item2))
item3 := &types.ConfigItem{ item3 := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameLockTime, Key: "mavl-manage-" + ConfNameLockTime,
Value: &types.ConfigItem_Arr{ Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{"15"}}, Arr: &types.ArrayConfig{Value: []string{"2"}},
}, },
} }
stateDB.Set([]byte(item3.Key), types.Encode(item3)) stateDB.Set([]byte(item3.Key), types.Encode(item3))
//注册 //注册
tx1,err := CreateRegister(&et.Register{AccountID:"harrylee2015"},PrivKeyB) tx1, err := CreateRegister(&et.Register{AccountID: "harrylee2015"}, PrivKeyB)
if err !=nil { if err != nil {
t.Error(err) t.Error(err)
} }
Exec_Block(t,stateDB,kvdb,env,tx1) Exec_Block(t, stateDB, kvdb, env, tx1)
tx2,err := CreateRegister(&et.Register{AccountID:"harrylee2015"},PrivKeyC) tx2, err := CreateRegister(&et.Register{AccountID: "harrylee2015"}, PrivKeyC)
err=Exec_Block(t,stateDB,kvdb,env,tx2) err = Exec_Block(t, stateDB, kvdb, env, tx2)
assert.Equal(t,err,et.ErrAccountIDExist) assert.Equal(t, err, et.ErrAccountIDExist)
tx3,err := CreateRegister(&et.Register{AccountID:"harrylee2020"},PrivKeyC) tx3, err := CreateRegister(&et.Register{AccountID: "harrylee2020"}, PrivKeyC)
Exec_Block(t,stateDB,kvdb,env,tx3) Exec_Block(t, stateDB, kvdb, env, tx3)
//转账
tx4, err := CreateTransfer(&et.Transfer{FromAccountID: "harrylee2015", ToAccountID: "harrylee2020", Amount: 1e8, Asset: &et.Asset{Execer: "coins", Symbol: "bty"}}, PrivKeyB)
assert.Equal(t, err, nil)
err = Exec_Block(t, stateDB, kvdb, env, tx4)
assert.Equal(t, err, nil)
//重置公钥
tx5, err := CreateReset(&et.ResetKey{Addr: "1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs", AccountID: "harrylee2015"}, PrivKeyA)
assert.Equal(t, err, nil)
err = Exec_Block(t, stateDB, kvdb, env, tx5)
//在锁定期内撤回请求
tx6, err := CreateApply(&et.Apply{Op: et.RevokeReset, AccountID: "harrylee2015"}, PrivKeyB)
assert.Equal(t, err, nil)
err = Exec_Block(t, stateDB, kvdb, env, tx6)
assert.Equal(t, err, nil)
//重置公钥
tx5, err = CreateReset(&et.ResetKey{Addr: "1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs", AccountID: "harrylee2015"}, PrivKeyA)
assert.Equal(t, err, nil)
err = Exec_Block(t, stateDB, kvdb, env, tx5)
time.Sleep(time.Second)
//过了锁定期,申请生效
tx6, err = CreateApply(&et.Apply{Op: et.EnforceReset, AccountID: "harrylee2015"}, PrivKeyD)
assert.Equal(t, err, nil)
err = Exec_Block(t, stateDB, kvdb, env, tx6)
tx7, _ := CreateTransfer(&et.Transfer{FromAccountID: "harrylee2015", ToAccountID: "harrylee2015", Amount: 1e8, Asset: &et.Asset{Execer: "coins", Symbol: "bty"}}, PrivKeyD)
err = Exec_Block(t, stateDB, kvdb, env, tx7)
assert.Equal(t, err, nil)
balance, err := Exec_QueryBalanceByID(&et.QueryBalanceByID{AccountID: "harrylee2015", Asset: &et.Asset{Symbol: "bty", Execer: "coins"}}, stateDB, kvdb)
assert.Equal(t, err, nil)
assert.Equal(t, balance.Balance, 199*types.Coin)
//将某个账户冻结
tx8, _ := CreateSupervise(&et.Supervise{
AccountIDs: []string{"harrylee2015"},
Op: et.Freeze,
}, PrivKeyA)
err = Exec_Block(t, stateDB, kvdb, env, tx8)
assert.Equal(t, err, nil)
//根据状态查询
accounts, err := Exec_QueryAccountsByStatus(et.Frozen, stateDB, kvdb)
assert.Equal(t, err, nil)
assert.Equal(t, accounts.Accounts[0].Status, et.Frozen)
balance, err = Exec_QueryBalanceByID(&et.QueryBalanceByID{Asset: &et.Asset{Execer: "coins", Symbol: "bty"}, AccountID: "harrylee2015"}, stateDB, kvdb)
assert.Equal(t, err, nil)
assert.Equal(t, balance.Frozen, 199*types.Coin)
tx4,err:=CreateTransfer(&et.Transfer{FromAccountID:"harrylee2015",ToAccountID:"harrylee2020",Amount:1e8,Asset:&et.Asset{Execer:"coins",Symbol:"bty"}},PrivKeyB) //解冻账户
if err !=nil { tx9, _ := CreateSupervise(&et.Supervise{
AccountIDs: []string{"harrylee2015"},
Op: et.UnFreeze,
}, PrivKeyA)
err = Exec_Block(t, stateDB, kvdb, env, tx9)
assert.Equal(t, err, nil)
//根据状态查询
accounts, err = Exec_QueryAccountsByStatus(et.Frozen, stateDB, kvdb)
assert.NotEqual(t, err, nil)
balance, err = Exec_QueryBalanceByID(&et.QueryBalanceByID{Asset: &et.Asset{Execer: "coins", Symbol: "bty"}, AccountID: "harrylee2015"}, stateDB, kvdb)
assert.Equal(t, err, nil)
assert.Equal(t, balance.Balance, 199*types.Coin)
//过期账户查询
time.Sleep(10 * time.Second)
t.Log(time.Now().Unix())
accs, err := Exec_QueryExpiredAccounts(time.Now().Unix(), stateDB, kvdb)
if err != nil {
t.Error(err) t.Error(err)
} }
err=Exec_Block(t,stateDB,kvdb,env,tx4) t.Log(accs)
assert.Equal(t,err,nil)
} }
func CreateRegister(register *et.Register, privKey string) (tx *types.Transaction, err error) { func CreateRegister(register *et.Register, privKey string) (tx *types.Transaction, err error) {
...@@ -206,7 +267,7 @@ func CreateSupervise(supervise *et.Supervise, privKey string) (tx *types.Transac ...@@ -206,7 +267,7 @@ func CreateSupervise(supervise *et.Supervise, privKey string) (tx *types.Transac
func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err error) { func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err error) {
ety := types.LoadExecutorType(et.AccountmanagerX) ety := types.LoadExecutorType(et.AccountmanagerX)
tx, err = ety.Create(et.NameSuperviseAction, apply) tx, err = ety.Create(et.NameApplyAction, apply)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -222,6 +283,7 @@ func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err er ...@@ -222,6 +283,7 @@ func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err er
} }
return tx, nil return tx, nil
} }
//模拟区块中交易得执行过程 //模拟区块中交易得执行过程
func Exec_Block(t *testing.T, stateDB db.DB, kvdb db.KVDB, env *execEnv, txs ...*types.Transaction) error { func Exec_Block(t *testing.T, stateDB db.DB, kvdb db.KVDB, env *execEnv, txs ...*types.Transaction) error {
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(types.GetDefaultCfgstring())
...@@ -285,6 +347,22 @@ func Exec_QueryAccountByID(accountID string, stateDB db.KV, kvdb db.KVDB) (*et.A ...@@ -285,6 +347,22 @@ func Exec_QueryAccountByID(accountID string, stateDB db.KV, kvdb db.KVDB) (*et.A
return msg.(*et.Account), err return msg.(*et.Account), err
} }
func Exec_QueryAccountByAddr(addr string, stateDB db.KV, kvdb db.KVDB) (*et.Account, error) {
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33")
exec := newAccountmanager()
q := queue.New("channel")
q.SetConfig(cfg)
api, _ := client.New(q.Client(), nil)
exec.SetAPI(api)
exec.SetStateDB(stateDB)
exec.SetLocalDB(kvdb)
msg, err := exec.Query(et.FuncNameQueryAccountByAddr, types.Encode(&et.QueryAccountByAddr{Addr: addr}))
if err != nil {
return nil, err
}
return msg.(*et.Account), err
}
func Exec_QueryAccountsByStatus(status int32, stateDB db.KV, kvdb db.KVDB) (*et.ReplyAccountList, error) { func Exec_QueryAccountsByStatus(status int32, stateDB db.KV, kvdb db.KVDB) (*et.ReplyAccountList, error) {
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(types.GetDefaultCfgstring())
...@@ -296,14 +374,14 @@ func Exec_QueryAccountsByStatus(status int32, stateDB db.KV, kvdb db.KVDB) (*et. ...@@ -296,14 +374,14 @@ func Exec_QueryAccountsByStatus(status int32, stateDB db.KV, kvdb db.KVDB) (*et.
exec.SetAPI(api) exec.SetAPI(api)
exec.SetStateDB(stateDB) exec.SetStateDB(stateDB)
exec.SetLocalDB(kvdb) exec.SetLocalDB(kvdb)
msg, err := exec.Query(et.FuncNameQueryAccountsByStatus, types.Encode(&et.QueryAccountsByStatus{Status:status})) msg, err := exec.Query(et.FuncNameQueryAccountsByStatus, types.Encode(&et.QueryAccountsByStatus{Status: status}))
if err != nil { if err != nil {
return nil, err return nil, err
} }
return msg.(*et.ReplyAccountList), err return msg.(*et.ReplyAccountList), err
} }
func Exec_QueryExpiredAccounts(status int32, stateDB db.KV, kvdb db.KVDB) (*et.ReplyAccountList, error) { func Exec_QueryBalanceByID(in *et.QueryBalanceByID, stateDB db.KV, kvdb db.KVDB) (*et.Balance, error) {
cfg := types.NewChain33Config(types.GetDefaultCfgstring()) cfg := types.NewChain33Config(types.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33") cfg.SetTitleOnlyForTest("chain33")
exec := newAccountmanager() exec := newAccountmanager()
...@@ -313,14 +391,29 @@ func Exec_QueryExpiredAccounts(status int32, stateDB db.KV, kvdb db.KVDB) (*et.R ...@@ -313,14 +391,29 @@ func Exec_QueryExpiredAccounts(status int32, stateDB db.KV, kvdb db.KVDB) (*et.R
exec.SetAPI(api) exec.SetAPI(api)
exec.SetStateDB(stateDB) exec.SetStateDB(stateDB)
exec.SetLocalDB(kvdb) exec.SetLocalDB(kvdb)
msg, err := exec.Query(et.FuncNameQueryExpiredAccounts, types.Encode(&et.QueryExpiredAccounts{})) msg, err := exec.Query(et.FuncNameQueryBalanceByID, types.Encode(in))
if err != nil { if err != nil {
return nil, err return nil, err
} }
return msg.(*et.ReplyAccountList), err return msg.(*et.Balance), err
} }
func Exec_QueryExpiredAccounts(expiredtime int64, stateDB db.KV, kvdb db.KVDB) (*et.ReplyAccountList, error) {
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
cfg.SetTitleOnlyForTest("chain33")
exec := newAccountmanager()
q := queue.New("channel")
q.SetConfig(cfg)
api, _ := client.New(q.Client(), nil)
exec.SetAPI(api)
exec.SetStateDB(stateDB)
exec.SetLocalDB(kvdb)
msg, err := exec.Query(et.FuncNameQueryExpiredAccounts, types.Encode(&et.QueryExpiredAccounts{ExpiredTime: expiredtime, Direction: 0}))
if err != nil {
return nil, err
}
return msg.(*et.ReplyAccountList), err
}
func signTx(tx *types.Transaction, hexPrivKey string) (*types.Transaction, error) { func signTx(tx *types.Transaction, hexPrivKey string) (*types.Transaction, error) {
signType := types.SECP256K1 signType := types.SECP256K1
c, err := crypto.New(types.GetSignName("", signType)) c, err := crypto.New(types.GetSignName("", signType))
......
...@@ -15,7 +15,7 @@ func (a *accountmanager) Exec_Register(payload *aty.Register, tx *types.Transact ...@@ -15,7 +15,7 @@ func (a *accountmanager) Exec_Register(payload *aty.Register, tx *types.Transact
return action.Register(payload) return action.Register(payload)
} }
func (a *accountmanager) Exec_Resetkey(payload *aty.ResetKey, tx *types.Transaction, index int) (*types.Receipt, error) { func (a *accountmanager) Exec_ResetKey(payload *aty.ResetKey, tx *types.Transaction, index int) (*types.Receipt, error) {
action := NewAction(a, tx, index) action := NewAction(a, tx, index)
return action.Reset(payload) return action.Reset(payload)
} }
...@@ -31,5 +31,6 @@ func (a *accountmanager) Exec_Supervise(payload *aty.Supervise, tx *types.Transa ...@@ -31,5 +31,6 @@ func (a *accountmanager) Exec_Supervise(payload *aty.Supervise, tx *types.Transa
} }
func (a *accountmanager) Exec_Apply(payload *aty.Apply, tx *types.Transaction, index int) (*types.Receipt, error) { func (a *accountmanager) Exec_Apply(payload *aty.Apply, tx *types.Transaction, index int) (*types.Receipt, error) {
return nil, types.ErrActionNotSupport action := NewAction(a, tx, index)
return action.Apply(payload)
} }
...@@ -94,7 +94,20 @@ func (a *accountmanager) ExecLocal_Transfer(payload *et.Transfer, tx *types.Tran ...@@ -94,7 +94,20 @@ func (a *accountmanager) ExecLocal_Transfer(payload *et.Transfer, tx *types.Tran
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
switch log.Ty { switch log.Ty {
case et.TyResetLog: case et.TyResetLog:
//账户信息不变更,不需要处理 receipt := &et.TransferReceipt{}
if err := types.Decode(log.Log, receipt); err != nil {
return nil, err
}
accountTable := NewAccountTable(a.GetLocalDB())
err := accountTable.Replace(receipt.FromAccount)
if err != nil {
return nil, err
}
kvs, err := accountTable.Save()
if err != nil {
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
} }
} }
} }
...@@ -112,6 +125,26 @@ func (a *accountmanager) ExecLocal_Supervise(payload *et.Supervise, tx *types.Tr ...@@ -112,6 +125,26 @@ func (a *accountmanager) ExecLocal_Supervise(payload *et.Supervise, tx *types.Tr
return nil, err return nil, err
} }
accountTable := NewAccountTable(a.GetLocalDB()) accountTable := NewAccountTable(a.GetLocalDB())
//当时续期操作得话,需要重建
if receipt.Op == et.AddExpire {
for _, account := range receipt.Accounts {
err := accountTable.DelRow(account)
if err != nil {
return nil, err
}
//重置主键
account.Index = receipt.Index
err = accountTable.Replace(account)
if err != nil {
return nil, err
}
}
kvs, err := accountTable.Save()
if err != nil {
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
} else {
for _, account := range receipt.Accounts { for _, account := range receipt.Accounts {
err := accountTable.Replace(account) err := accountTable.Replace(account)
if err != nil { if err != nil {
...@@ -124,6 +157,8 @@ func (a *accountmanager) ExecLocal_Supervise(payload *et.Supervise, tx *types.Tr ...@@ -124,6 +157,8 @@ func (a *accountmanager) ExecLocal_Supervise(payload *et.Supervise, tx *types.Tr
} }
dbSet.KV = append(dbSet.KV, kvs...) dbSet.KV = append(dbSet.KV, kvs...)
} }
}
} }
} }
return a.addAutoRollBack(tx, dbSet.KV), nil return a.addAutoRollBack(tx, dbSet.KV), nil
......
...@@ -10,6 +10,11 @@ func (s *accountmanager) Query_QueryAccountByID(in *et.QueryAccountByID) (types. ...@@ -10,6 +10,11 @@ func (s *accountmanager) Query_QueryAccountByID(in *et.QueryAccountByID) (types.
return findAccountByID(s.GetLocalDB(), in.AccountID) return findAccountByID(s.GetLocalDB(), in.AccountID)
} }
//根据ID查询账户信息
func (s *accountmanager) Query_QueryAccountByAddr(in *et.QueryAccountByAddr) (types.Message, error) {
return findAccountByAddr(s.GetLocalDB(), in.Addr)
}
//根据状态查询账户列表|| 账户状态 1 正常, 2表示冻结, 3表示锁定 4,过期注销 //根据状态查询账户列表|| 账户状态 1 正常, 2表示冻结, 3表示锁定 4,过期注销
func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatus) (types.Message, error) { func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatus) (types.Message, error) {
return findAccountListByStatus(s.GetLocalDB(), in.Status, in.Direction, in.PrimaryKey) return findAccountListByStatus(s.GetLocalDB(), in.Status, in.Direction, in.PrimaryKey)
...@@ -17,5 +22,10 @@ func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatu ...@@ -17,5 +22,10 @@ func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatu
//查询逾期注销的账户列表 //查询逾期注销的账户列表
func (s *accountmanager) Query_QueryExpiredAccounts(in *et.QueryExpiredAccounts) (types.Message, error) { func (s *accountmanager) Query_QueryExpiredAccounts(in *et.QueryExpiredAccounts) (types.Message, error) {
return findAccountListByIndex(s.GetLocalDB(), in.Direction, in.PrimaryKey) return findAccountListByIndex(s.GetLocalDB(), in.ExpiredTime, in.PrimaryKey)
}
//根据ID查询账户余额
func (s *accountmanager) Query_QueryBalanceByID(in *et.QueryBalanceByID) (types.Message, error) {
return queryBalanceByID(s.GetStateDB(), s.GetLocalDB(), s.GetAPI().GetConfig(), s.GetName(), in)
} }
...@@ -25,7 +25,7 @@ var opt_account = &table.Option{ ...@@ -25,7 +25,7 @@ var opt_account = &table.Option{
Prefix: KeyPrefixLocalDB, Prefix: KeyPrefixLocalDB,
Name: "account", Name: "account",
Primary: "index", Primary: "index",
Index: []string{"status", "accountID"}, Index: []string{"status", "accountID", "addr"},
} }
//状态数据库中存储具体账户信息 //状态数据库中存储具体账户信息
...@@ -74,7 +74,9 @@ func (m *AccountRow) Get(key string) ([]byte, error) { ...@@ -74,7 +74,9 @@ func (m *AccountRow) Get(key string) ([]byte, error) {
} else if key == "status" { } else if key == "status" {
return []byte(fmt.Sprintf("%d", m.Status)), nil return []byte(fmt.Sprintf("%d", m.Status)), nil
} else if key == "index" { } else if key == "index" {
return []byte(fmt.Sprintf("%014d", m.GetIndex())), nil return []byte(fmt.Sprintf("%018d", m.GetIndex())), nil
} else if key == "addr" {
return []byte(fmt.Sprintf("%s", m.GetAddr())), nil
} }
return nil, types.ErrNotFound return nil, types.ErrNotFound
} }
package executor package executor
import ( import (
"fmt" "github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
et "github.com/33cn/plugin/plugin/dapp/accountmanager/types"
"testing" "testing"
"time"
) )
func Test(t *testing.T) { func TestAccountTable(t *testing.T) {
t.Log(fmt.Sprintf("%-s", "aaaa100000b")) _, _, kvdb := util.CreateTestDB()
table:=NewAccountTable(kvdb)
now :=time.Now().Unix()
row1:= &et.Account{Index:now*int64(types.MaxTxsPerBlock),AccountID:"harry2015",Status:1,ExpireTime:now+10,Addr:"xxxx"}
row2:= &et.Account{Index:now*int64(types.MaxTxsPerBlock)+1,AccountID:"harry2020",Status:1,ExpireTime:now,Addr:"xxxx"}
table.Add(row1)
table.Add(row2)
kvs,err:=table.Save()
if err !=nil {
t.Error(err)
}
for _,kv :=range kvs{
kvdb.Set(kv.Key,kv.Value)
}
time.Sleep(2*time.Second)
list,err:=findAccountListByIndex(kvdb,time.Now().Unix(),"")
if err !=nil {
t.Error(err)
}
t.Log(list)
list,err=findAccountListByStatus(kvdb,et.Normal,0,"")
if err !=nil {
t.Error(err)
}
t.Log(list)
row1.Status=et.Frozen
err=table.Replace(row1)
if err !=nil {
t.Error(err)
}
kvs,err=table.Save()
if err !=nil {
t.Error(err)
}
for _,kv :=range kvs{
kvdb.Set(kv.Key,kv.Value)
}
list,err=findAccountListByStatus(kvdb,et.Frozen,0,"")
if err !=nil {
t.Error(err)
}
t.Log(list)
} }
\ No newline at end of file
...@@ -100,21 +100,24 @@ message TransferReceipt{ ...@@ -100,21 +100,24 @@ message TransferReceipt{
account ToAccount = 2; account ToAccount = 2;
int64 blockTime = 3; int64 index = 3;
} }
//回执日志 //回执日志
message SuperviseReceipt{ message SuperviseReceipt{
repeated account accounts = 1; repeated account accounts = 1;
int32 op = 2; int32 op = 2;
int64 blockTime = 3; int64 index = 3;
} }
message QueryExpiredAccounts{ message QueryExpiredAccounts{
string primaryKey = 1; string primaryKey = 1;
//第一次需要传入逾期时间,时间戳
int64 expiredTime = 2;
//单页返回多少条记录,默认返回10条 //单页返回多少条记录,默认返回10条
// 0降序,1升序,默认降序 // 0降序,1升序,默认降序
int32 direction = 2; int32 direction = 3;
} }
message QueryAccountsByStatus{ message QueryAccountsByStatus{
...@@ -129,6 +132,21 @@ message QueryAccountsByStatus{ ...@@ -129,6 +132,21 @@ message QueryAccountsByStatus{
message QueryAccountByID { message QueryAccountByID {
string accountID = 1; string accountID = 1;
} }
message QueryAccountByAddr {
string addr = 1;
}
message QueryBalanceByID {
string accountID = 1;
asset asset = 2;
}
message balance {
int64 balance = 1;
int64 frozen = 2;
}
service accountmanager { service accountmanager {
} }
...@@ -30,6 +30,8 @@ const ( ...@@ -30,6 +30,8 @@ const (
FuncNameQueryAccountByID = "QueryAccountByID" FuncNameQueryAccountByID = "QueryAccountByID"
FuncNameQueryAccountsByStatus = "QueryAccountsByStatus" FuncNameQueryAccountsByStatus = "QueryAccountsByStatus"
FuncNameQueryExpiredAccounts = "QueryExpiredAccounts" FuncNameQueryExpiredAccounts = "QueryExpiredAccounts"
FuncNameQueryAccountByAddr = "QueryAccountByAddr"
FuncNameQueryBalanceByID = "QueryBalanceByID"
) )
// log类型id值 // log类型id值
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment