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

update accountmanager

parent 7275013e
......@@ -85,7 +85,7 @@ func TestAccountManager(t *testing.T) {
}
// set config key
item := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameActiveTime,
Key: "mavl-manage-" + ConfNameActiveTime,
Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{"10"}},
},
......@@ -93,7 +93,7 @@ func TestAccountManager(t *testing.T) {
stateDB.Set([]byte(item.Key), types.Encode(item))
item2 := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameManagerAddr,
Key: "mavl-manage-" + ConfNameManagerAddr,
Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{string(Nodes[0])}},
},
......@@ -101,31 +101,92 @@ func TestAccountManager(t *testing.T) {
stateDB.Set([]byte(item2.Key), types.Encode(item2))
item3 := &types.ConfigItem{
Key: "mavl-manage-"+ConfNameLockTime,
Key: "mavl-manage-" + ConfNameLockTime,
Value: &types.ConfigItem_Arr{
Arr: &types.ArrayConfig{Value: []string{"15"}},
Arr: &types.ArrayConfig{Value: []string{"2"}},
},
}
stateDB.Set([]byte(item3.Key), types.Encode(item3))
//注册
tx1,err := CreateRegister(&et.Register{AccountID:"harrylee2015"},PrivKeyB)
if err !=nil {
tx1, err := CreateRegister(&et.Register{AccountID: "harrylee2015"}, PrivKeyB)
if err != nil {
t.Error(err)
}
Exec_Block(t,stateDB,kvdb,env,tx1)
tx2,err := CreateRegister(&et.Register{AccountID:"harrylee2015"},PrivKeyC)
err=Exec_Block(t,stateDB,kvdb,env,tx2)
assert.Equal(t,err,et.ErrAccountIDExist)
tx3,err := CreateRegister(&et.Register{AccountID:"harrylee2020"},PrivKeyC)
Exec_Block(t,stateDB,kvdb,env,tx3)
Exec_Block(t, stateDB, kvdb, env, tx1)
tx2, err := CreateRegister(&et.Register{AccountID: "harrylee2015"}, PrivKeyC)
err = Exec_Block(t, stateDB, kvdb, env, tx2)
assert.Equal(t, err, et.ErrAccountIDExist)
tx3, err := CreateRegister(&et.Register{AccountID: "harrylee2020"}, PrivKeyC)
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)
}
err=Exec_Block(t,stateDB,kvdb,env,tx4)
assert.Equal(t,err,nil)
t.Log(accs)
}
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
func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err error) {
ety := types.LoadExecutorType(et.AccountmanagerX)
tx, err = ety.Create(et.NameSuperviseAction, apply)
tx, err = ety.Create(et.NameApplyAction, apply)
if err != nil {
return nil, err
}
......@@ -222,6 +283,7 @@ func CreateApply(apply *et.Apply, privKey string) (tx *types.Transaction, err er
}
return tx, nil
}
//模拟区块中交易得执行过程
func Exec_Block(t *testing.T, stateDB db.DB, kvdb db.KVDB, env *execEnv, txs ...*types.Transaction) error {
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
......@@ -285,6 +347,22 @@ func Exec_QueryAccountByID(accountID string, stateDB db.KV, kvdb db.KVDB) (*et.A
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) {
cfg := types.NewChain33Config(types.GetDefaultCfgstring())
......@@ -296,14 +374,14 @@ func Exec_QueryAccountsByStatus(status int32, stateDB db.KV, kvdb db.KVDB) (*et.
exec.SetAPI(api)
exec.SetStateDB(stateDB)
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 {
return nil, 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.SetTitleOnlyForTest("chain33")
exec := newAccountmanager()
......@@ -313,14 +391,29 @@ func Exec_QueryExpiredAccounts(status int32, stateDB db.KV, kvdb db.KVDB) (*et.R
exec.SetAPI(api)
exec.SetStateDB(stateDB)
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 {
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) {
signType := types.SECP256K1
c, err := crypto.New(types.GetSignName("", signType))
......
......@@ -15,7 +15,7 @@ func (a *accountmanager) Exec_Register(payload *aty.Register, tx *types.Transact
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)
return action.Reset(payload)
}
......@@ -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) {
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
for _, log := range receiptData.Logs {
switch log.Ty {
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
return nil, err
}
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 {
err := accountTable.Replace(account)
if err != nil {
......@@ -124,6 +157,8 @@ func (a *accountmanager) ExecLocal_Supervise(payload *et.Supervise, tx *types.Tr
}
dbSet.KV = append(dbSet.KV, kvs...)
}
}
}
}
return a.addAutoRollBack(tx, dbSet.KV), nil
......
......@@ -10,6 +10,11 @@ func (s *accountmanager) Query_QueryAccountByID(in *et.QueryAccountByID) (types.
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,过期注销
func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatus) (types.Message, error) {
return findAccountListByStatus(s.GetLocalDB(), in.Status, in.Direction, in.PrimaryKey)
......@@ -17,5 +22,10 @@ func (s *accountmanager) Query_QueryAccountsByStatus(in *et.QueryAccountsByStatu
//查询逾期注销的账户列表
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{
Prefix: KeyPrefixLocalDB,
Name: "account",
Primary: "index",
Index: []string{"status", "accountID"},
Index: []string{"status", "accountID", "addr"},
}
//状态数据库中存储具体账户信息
......@@ -74,7 +74,9 @@ func (m *AccountRow) Get(key string) ([]byte, error) {
} else if key == "status" {
return []byte(fmt.Sprintf("%d", m.Status)), nil
} 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
}
package executor
import (
"fmt"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
et "github.com/33cn/plugin/plugin/dapp/accountmanager/types"
"testing"
"time"
)
func Test(t *testing.T) {
t.Log(fmt.Sprintf("%-s", "aaaa100000b"))
func TestAccountTable(t *testing.T) {
_, _, 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{
account ToAccount = 2;
int64 blockTime = 3;
int64 index = 3;
}
//回执日志
message SuperviseReceipt{
repeated account accounts = 1;
int32 op = 2;
int64 blockTime = 3;
int64 index = 3;
}
message QueryExpiredAccounts{
string primaryKey = 1;
//第一次需要传入逾期时间,时间戳
int64 expiredTime = 2;
//单页返回多少条记录,默认返回10条
// 0降序,1升序,默认降序
int32 direction = 2;
int32 direction = 3;
}
message QueryAccountsByStatus{
......@@ -129,6 +132,21 @@ message QueryAccountsByStatus{
message QueryAccountByID {
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 {
}
......@@ -30,6 +30,8 @@ const (
FuncNameQueryAccountByID = "QueryAccountByID"
FuncNameQueryAccountsByStatus = "QueryAccountsByStatus"
FuncNameQueryExpiredAccounts = "QueryExpiredAccounts"
FuncNameQueryAccountByAddr = "QueryAccountByAddr"
FuncNameQueryBalanceByID = "QueryBalanceByID"
)
// 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