Commit 619f4775 authored by heyubin's avatar heyubin Committed by vipwzw

add by hyb for get multisig account by owner

parent f5f0a308
......@@ -158,6 +158,9 @@ signType="secp256k1"
minerdisable=false
minerwhitelist=["*"]
[wallet.sub.multisig]
rescanMultisigAddr=false
[exec]
isFree=false
minExecFee=100000
......
......@@ -51,6 +51,7 @@ func MultiSigAccountCmd() *cobra.Command {
GetMultiSigAccUnSpentTodayCmd(),
GetMultiSigAccAssetsCmd(),
GetMultiSigAccAllAddressCmd(),
GetMultiSigAccByOwnerCmd(),
)
return cmd
}
......@@ -1100,3 +1101,30 @@ func isValidDailylimit(dailylimit float64) error {
}
return nil
}
//GetMultiSigAccByOwnerCmd 获取指定地址拥有的所有多重签名账户
func GetMultiSigAccByOwnerCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "owner",
Short: "get multisig accounts by the owner",
Run: getMultiSigAccByOwner,
}
getMultiSigAccByOwnerFlags(cmd)
return cmd
}
func getMultiSigAccByOwnerFlags(cmd *cobra.Command) {
cmd.Flags().StringP("addr", "a", "", "address of owner")
}
func getMultiSigAccByOwner(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
ownerAddr, _ := cmd.Flags().GetString("addr")
params := &types.ReqString{
Data: ownerAddr,
}
var res mty.OwnerAttrs
ctx := jsonclient.NewRPCCtx(rpcLaddr, "multisig.MultiSigAddresList", params, &res)
ctx.Run()
}
......@@ -34,6 +34,7 @@ Available Commands:
creator get all multisig accounts created by the address
dailylimit Create a modify assets dailylimit transaction
info get multisig account info
owner get multisig accounts by the owner
unspent get assets unspent today amount
weight Create a modify required weight transaction
......@@ -194,4 +195,6 @@ cli send multisig tx confirm -a "13q53Ga1kquDCqx7EWF8FU94tLUK18Zd47" -i 8 -k "1
cli send multisig tx confirm -a "13q53Ga1kquDCqx7EWF8FU94tLUK18Zd47" -i 8 -k "1C5xK2ytuoFqxmVGMcyz9XFKFWcDA8T3rK"
// 获取owner拥有的所有多重签名地址,不指定地址时返回的是本钱包拥有的所有多重签名地址
cli multisig account owner -a 166po3ghRbRu53hu8jBBQzddp7kUJ9Ynyf
*/
......@@ -192,6 +192,8 @@ func (m *MultiSig) Query_MultiSigTxInfo(in *mty.ReqMultiSigTxInfo) (types.Messag
}
if multiSigTx == nil {
multiSigTx = &mty.MultiSigTx{}
} else { //由于代码中使用hex.EncodeToString()接口转换的,没有加0x,为了方便上层统一处理再次返回时增加0x即可
multiSigTx.TxHash = "0x" + multiSigTx.TxHash
}
return multiSigTx, nil
}
......
......@@ -6,6 +6,7 @@ import (
"github.com/33cn/plugin/plugin/dapp/multisig/executor"
"github.com/33cn/plugin/plugin/dapp/multisig/rpc"
mty "github.com/33cn/plugin/plugin/dapp/multisig/types"
_ "github.com/33cn/plugin/plugin/dapp/multisig/wallet" // register wallet package
)
func init() {
......
......@@ -338,4 +338,15 @@ message Assets {
//账户地址列表
message AccAddress {
repeated string address = 1;
}
//owner拥有的多重签名账户信息
message OwnerAttr {
string multiSigAddr = 1;
string ownerAddr = 2;
uint64 weight = 3;
}
message OwnerAttrs {
repeated OwnerAttr items = 1;
}
\ No newline at end of file
......@@ -91,3 +91,13 @@ func (c *Jrpc) MultiSigAccTransferOutTx(param *mty.MultiSigExecTransferFrom, res
*result = hex.EncodeToString(data)
return nil
}
// MultiSigAddresList 获取owner地址上的多重签名账户列表{multiSigAddr,owneraddr,weight}
func (c *Jrpc) MultiSigAddresList(in *types.ReqString, result *interface{}) error {
reply, err := c.cli.ExecWalletFunc(mty.MultiSigX, "MultiSigAddresList", in)
if err != nil {
return err
}
*result = reply
return nil
}
......@@ -193,6 +193,14 @@ func testAccCreateTx(t *testing.T, mocker *testnode.Chain33Mock, jrpcClient *jso
assert.Equal(t, rep3.Address[0], multiSigAccAddr)
//t.Log(rep3)
//获取owner拥有的多重签名账户地址
req4 := &types.ReqString{
Data: GenAddr,
}
var res4 mty.OwnerAttrs
err = jrpcClient.Call("multisig.MultiSigAddresList", req4, &res4)
assert.Nil(t, err)
assert.Equal(t, res4.Items[0].OwnerAddr, GenAddr)
return multiSigAccAddr
}
......
This diff is collapsed.
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package wallet
const (
MaxCountPerTime int64 = 100
)
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package wallet
import (
"github.com/33cn/chain33/types"
)
//On_MultiSigAddresList 获取owner对应的多重签名地址列表
func (policy *multisigPolicy) On_MultiSigAddresList(req *types.ReqString) (types.Message, error) {
policy.getWalletOperate().GetMutex().Lock()
defer policy.getWalletOperate().GetMutex().Unlock()
//获取本钱包中记录的所有多重签名地址
if req.Data == "" {
reply, err := policy.store.listOwnerAttrs()
if err != nil {
bizlog.Error("On_MultiSigAddresList listOwnerAttrs", "err", err)
}
return reply, err
}
//值查询指定owner地址拥有的多重签名地址列表
reply, err := policy.store.listOwnerAttrsByAddr(req.Data)
if err != nil {
bizlog.Error("On_MultiSigAddresList listOwnerAttrsByAddr", "owneraddr", req.Data, "err", err)
}
return reply, err
}
This diff is collapsed.
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package wallet
import "fmt"
const (
// MultisigAddr 记录本钱包owner地址拥有的多重签名地址,key:"multisig-addr-owneraddr, value [](multisigaddr,owneraddr,weight)
MultisigAddr = "multisig-addr-"
)
func calcMultisigAddr(ownerAddr string) []byte {
return []byte(fmt.Sprintf("%s%s", MultisigAddr, ownerAddr))
}
func calcPrefixMultisigAddr() []byte {
return []byte(MultisigAddr)
}
This diff is collapsed.
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package wallet
import (
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
wcom "github.com/33cn/chain33/wallet/common"
mtypes "github.com/33cn/plugin/plugin/dapp/multisig/types"
)
func newStore(db db.DB) *multisigStore {
return &multisigStore{Store: wcom.NewStore(db)}
}
// multisigStore 多重签名数据库存储操作类
type multisigStore struct {
*wcom.Store
}
//获取指定owner拥有的多重签名地址
func (store *multisigStore) listOwnerAttrsByAddr(addr string) (*mtypes.OwnerAttrs, error) {
if len(addr) == 0 {
bizlog.Error("listMultisigAddrByOwnerAddr addr is nil")
return nil, types.ErrInvalidParam
}
ownerAttrByte, err := store.Get(calcMultisigAddr(addr))
if err != nil {
bizlog.Error("listMultisigAddrByOwnerAddr", "addr", addr, "db Get error ", err)
if err == db.ErrNotFoundInDb {
return nil, types.ErrNotFound
}
return nil, err
}
if nil == ownerAttrByte || len(ownerAttrByte) == 0 {
return nil, types.ErrNotFound
}
var ownerAttrs mtypes.OwnerAttrs
err = types.Decode(ownerAttrByte, &ownerAttrs)
if err != nil {
bizlog.Error("listMultisigAddrByOwnerAddr", "proto.Unmarshal err:", err)
return nil, types.ErrUnmarshal
}
return &ownerAttrs, nil
}
//获取本钱包地址拥有的所有多重签名地址
func (store *multisigStore) listOwnerAttrs() (*mtypes.OwnerAttrs, error) {
list := store.NewListHelper()
ownerbytes := list.PrefixScan(calcPrefixMultisigAddr())
if len(ownerbytes) == 0 {
bizlog.Error("listOwnerAttrs is null")
return nil, types.ErrNotFound
}
var replayOwnerAttrs mtypes.OwnerAttrs
for _, ownerattrbytes := range ownerbytes {
var ownerAttrs mtypes.OwnerAttrs
err := types.Decode(ownerattrbytes, &ownerAttrs)
if err != nil {
bizlog.Error("listOwnerAttrs", "Decode err", err)
continue
}
for _, ownerAttr := range ownerAttrs.Items {
replayOwnerAttrs.Items = append(replayOwnerAttrs.Items, ownerAttr)
}
}
return &replayOwnerAttrs, nil
}
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