# 钱包模块

## 1 模块介绍

钱包模块主要面向钱包app提供两大服务，一个是区块链账户管理，包括账户的创建，公私钥和地址信息的管理。钱包客户端可以通过这些服务接口创建和管理账户，导出导入私钥等。另一个是交易的签名和发送，用于bty转账和智能合约交易的发送。

![wallet1](../../assets/s13.png)

## 2 钱包模块结构

### 2.1 账户

#### 2.1.1 BIP44钱包结构

chain33钱包模块使用BIP44定义，通过一套seed管理多个币种，seed支持中文字符和英文字符。同时，用户对wallet设置一个password来加密seed信息，password由用户指定和保存。

![wallet2](../../assets/s14.png)

#### 2.1.2 私钥、地址、公钥信息管理

wallet模块对应有AccountDB，用于存储用户创建的账户信息，包括私钥、地址、公钥等。AccountDB对应的配置信息在chain33配置文件中可配。AccountDB中主要存储3张表，如下：

![wallet3](../../assets/s15.png)

AccountTable以时间戳和账户地址为key，主要用于所有Account账户的list输出
AddressTable以账户地址为key，主要用于通过address地址查询账户信息
LabelTable以label为key，主要用于通过label查询账户信息
账户信息以WalletAccountStore的格式存储，主要结构如下：

```
type WalletAccountStore struct {
    Privkey   string //账户地址对应的私钥
    Label     string //账户地址对应的标签
    Addr      string //账户地址
    TimeStamp string //创建账户时的时标
}

```

#### 2.1.3 账户结构

账户资金信息通过account来存储，结构如下：

```
type Account struct {
    Currency int32  //coins标识，目前只有0 一个值
    Balance  int64  //账户可用余额
    Frozen   int64  //账户冻结余额
    Addr     string //账户的地址
}
```

### 2.2 签名

wallet模块通过chain33签名框架完成对交易的签名，支持secp256k1签名

### 2.3 交易发送

wallet模块是普通交易发送的入口，对外提供WalletSendToAddress接口

## 3 服务接口

### 3.1 账户相关

```
/**
* 创建账户
* @param： param *types.ReqNewAccount 创建账户参数，包含账户标签lable
* @return：返回账户
*/
NewAccount(param *types.ReqNewAccount) (*types.WalletAccount, error)
/**
* 获取账户列表
* @param： req *types.ReqAccountList 获取账户请求参数，包含WithoutBalance
* @return：返回账户列表
*/
WalletGetAccountList(req *types.ReqAccountList) (*types.WalletAccounts, error)
/**
* 通过私钥导入账户
* @param： param *types.ReqWalletImportPrivkey 待导入账户的私钥
* @return：返回账户
*/
WalletImportprivkey(param *types.ReqWalletImportPrivkey) (*types.WalletAccount, error)
/**
* 导出账户私钥
* @param： param *types.ReqString 待导出的账户地址
* @return：返回私钥
*/
DumpPrivkey(param *types.ReqString) (*types.ReplyString, error)
/**
* 锁定钱包
* @return：返回操作状态
*/
WalletLock() (*types.Reply, error)
/**
* 解锁钱包
* @param： param *types.WalletUnLock 钱包解锁参数
* @return：返回操作状态
*/
WalletUnLock(param *types.WalletUnLock) (*types.Reply, error)
/**
* 设置钱包密码
* @param： param *types.ReqWalletSetPasswd 新旧密码
* @return：返回操作状态
*/
WalletSetPasswd(param *types.ReqWalletSetPasswd) (*types.Reply, error)
/**
* 设置钱包标签
* @param： param *types.ReqWalletSetLabel 待设置的钱包地址和标签
* @return：返回钱包账户
*/
WalletSetLabel(param *types.ReqWalletSetLabel) (*types.WalletAccount, error)
/**
* 获取钱包状态
* @return：返回钱包状态
*/
GetWalletStatus() (*types.WalletStatus, error)
/**
* 生成钱包seed
* @param： param *types.GenSeedLang seed字符语言(0:English, 1:简体中文)
* @return：返回生成的seed
*/
GenSeed(param *types.GenSeedLang) (*types.ReplySeed, error)
/**
* 通过密码获取钱包seed
* @param： param *types.GetSeedByPw seed获取参数，包含密码
* @return：返回seed
*/
GetSeed(param *types.GetSeedByPw) (*types.ReplySeed, error)
/**
* 保存钱包seed
* @param： param *types.SaveSeedByPw 保存seed参数，包含密码和seed字符串
* @return：返回seed
*/
SaveSeed(param *types.SaveSeedByPw) (*types.Reply, error)
/**
* 合并钱包所有账户余额到指定地址
* @param： param *types.ReqWalletMergeBalance 合并参数，包含指定地址
* @return：返回交易hash
*/
WalletMergeBalance(param *types.ReqWalletMergeBalance) (*types.ReplyHashes, error)
```

### 3.2 交易相关

```
/**
* 获取所有钱包的交易记录
* @param： param *types.ReqWalletTransactionList 获取参数，包含开始获取tx，获取数量及顺序
* @return：返回交易列表
*/
WalletTransactionList(param *types.ReqWalletTransactionList) (*types.WalletTxDetails, error)
/**
* 发送一笔交易给指定地址
* @param： param *types.ReqWalletSendToAddress 交易发送参数，包含from,to,amount等交易信息
* @return：返回交易hash
*/
WalletSendToAddress(param *types.ReqWalletSendToAddress) (*types.ReplyHash, error)
/**
* 设置钱包默认的手续费
* @param： param *types.ReqWalletSetFee 带设置手续费参数
* @return：返回操作状态
*/
WalletSetFee(param *types.ReqWalletSetFee) (*types.Reply, error)
```

### 3.3 签名相关

```
/**
* 签名交易
* @param： param *types.ReqSignRawTx 代签名的交易信息
* @return：返回已签名的交易
*/
SignRawTx(param *types.ReqSignRawTx) (*types.ReplySignRawTx, error)
```

