[English](../en/asset.md) / 中文

<h1 align="center">数字资产管理 </h1>
<p align="center" class="version">Version 1.0.0 </p>

#钱包 Wallet

钱包Wallet是一个Json格式的数据存储文件。在Mixbee中， Wallet既可存储数字身份，也可以存储数字资产。

##1.	Wallet 数据规范
```javascript
{
	name: string;
    defaultOntid: string;
    defaultAccountAddress : string;
    createTime: string;
    version: string;
    scrypt: {
        "n": number;
        "r": number;
        "p": number;
    };
    identities: Array<Identity>;
    accounts: Array<Account>;
    extra: null;
}
```

- name 是用户为钱包所取的名称。

- defaultOntid 是钱包默认的数字身份的Ont ID。

- defaultAccountAddress 是钱包默认的资产账户的地址

- createTime 是ISO格式表示的钱包的创建时间，如 : “2018-02-06T03:05:12.360Z”

- version 目前为固定值1.0，留待未来功能升级使用。

- scrypt 是加密算法所需的参数，该算法是在钱包加密和解密私钥时使用。

- identities 是钱包中所有数字身份对象的数组

- accounts 是钱包中所有数字资产账户对象的数组

- extra 是客户端由开发者用来存储额外数据字段，可以为null。

##2.	创建钱包
用户可以从零开始创建自己的钱包。

1）创建一个空的钱包

用户只需要传入钱包名称。

```javascript
import {Wallet} from 'ontology-ts-sdk'
const wallet = Wallet.create(name);
```


2) 创建账户并添加到钱包中

用户需要提供私钥，密码，账户名称来创建新的账户，其中私钥可以使用SDK提供的方法生成。。也可以指定创建账户所需的算法对象。算法对象的结构如下：

```javascript
{
  algorithm: string // 算法名称
  parameters: {}    // 算法的参数
}

//默认算法
algorithm: 
   KeyType {
     label: 'ECDSA',
     hex: 18,
     defaultSchema: SignatureScheme { label: 'SHA256withECDSA', hex: 1, labelJWS: 'ES256' } },
  parameters: 
   KeyParameters {
     curve: CurveLabel { label: 'P-256', hex: 2, preset: 'p256' } } }

```

如果不传，SDK会使用默认的算法创建账户。

创建好账户后添加到钱包中。

```javascript
import {Wallet,Crypto,Account} from 'ontology-ts-sdk'
const wallet = Wallet.create(name);
var privateKey = Crypto.PrivateKey.random()
var account = Account.create( privateKey, 'password', 'name' )
wallet.addAccount(account)
```

##3.	Account 数据结构

```javascript
Account {
  'enc-alg': 'aes-256-gcm',
  label: 'test-account',
  lock: false,
  isDefault: false,
  publicKey: '034f7d67c2e3e4a49833d1d41d16715a8cd4153a9cf279f33bcada0e04db12d5b2',
  address: Address { value: '4ce7506dc668400a30f4d20ffa0b8eecd0673e82' },
  encryptedKey: 
   PrivateKey {
     key: 'AsVSh+2ZbUAfBw3GiBmR9X64dSDpxMiUKazcsyPlhaWSx+KKFYph4SRXoK7qsdx/',
     algorithm: KeyType { label: 'ECDSA', hex: 18, defaultSchema: { label: 'SHA256withECDSA', hex: 1, labelJWS: 'ES256' } },
     parameters: KeyParameters { curve: { label: 'P-256', hex: 2, preset: 'p256' } } },
  salt: 'V8HfG5xGtiHT14eF/EO2Jg==' }
```
- address 是base58编码的账户地址。

- label 是账户的名称。

- lock 表明账户是否是被用户锁住的。客户端不能消费掉被锁的账户中的资金。

- algorithm 是加密算法名称。

- parameters 是加密算法所需参数。

- key 是NEP-2格式的私钥。该字段可以为null（对于只读地址或非标准地址）。




##4.	创建账户
```javascript
import {Crypto,Account} from 'ontology-ts-sdk'
var privateKey = Crypto.PrivateKey.random()
//@param {PrivateKey} privateKey 用户的私钥
//@param {string} password 密码
//@param {string} label 账户的名称
//@param {object} algorithmObj 可选参数，加密算法对象
var account = Account.create(privateKey, password, label, algorithmObj)
```

##5.	导入账户
```javascript
import {Account} from 'ontology-ts-sdk'
//@param {label} 账户的名称
//@param {encryptedKey} 加密后的私钥
//@param {password} 用来加密私钥的密码
var account;
try {
    account = Account.importAccount(label, account.encryptedKey, password, account.address, account.salt);
} catch(error) {
    //密码或私钥不正确
}
```

#数字资产转账 Transfer

##1.	转账函数说明
1）构造交易数据
```javascript
import {OntAssetTxBuilder} from 'ontology-ts-sdk'
const tx = OntAssetTxBuilder.makeTransferTx(
        tokenType,
        from,
        to,
        value,
        gasPrice,
        gasLimit
      );

tokenType: token 类型 //ONT，ONG
from: 转账者的公钥哈希地址
to: 接收者的公钥哈希地址
value: 转账数值，需要乘以10^9以避免小数点后精度损失
gasPrice: gas价格
gasLimit: gas最高限制
```
2）签名交易
```javascript
import {TransactionBuilder} from 'ontology-ts-sdk'

TransactionBuilder.signTransaction(tx, PrivateKey);

tx：[Object]交易数据
PrivateKey：[PrivateKey]转账者公钥对应的私钥
```

3)  发送签名交易
```javascript
import {WebsocketClient} from 'ontology-ts-sdk'

const socketClient = new WebsocketClient("ws://polaris1.ont.io:20335");
const response = await socketClient.sendRawTransaction(
        tx.serialize(),
        false,
        true
      );
```
##1.	数字资产查询 getBalance
```javascript
import {RestClient} from 'ontology-ts-sdk'

const restClient = new RestClient("http://polaris1.ont.io:20334");
const to = new Crypto.Address("AdLUBSSHUuFaak9j169hiamXUmPuCTnaRz");
const result = await restClient.getBalance(to);
```