**版本：V6.2.0**
# 部分模块使用流程

# hashlock 哈希锁定合约  
`cli hashlock -h `
```
Available Commands:
  lock        Create hashlock lock transaction
  send        Create hashlock send transaction
  unlock      Create hashlock unlock transaction
```


## 合约操作流程 

Hashlock正常流程，完整过程：

1. 需要准备两个账户A和B，其中：  
A是returnAddr,用于在锁定时间结束后，可以返回余额；  
B是toAddr，在锁定时间内，能够进行操作转移金额。  
这里  
A：1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3      
B：1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW  
B地址需要小额BTY作为手续费  

2. hashlock要求在lock动作时，合约里存在余额，这些余额在lock后会被frozen  
`cli coins send_exec -a 500 -e hashlock`    
由A签名并发送   
查询A地址各合约余额    
`cli account balance -a 1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3`  
```
{
    "addr": "1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "499.9990",
                "frozen": "0.0000"
            }
        },
        {
            "execer": "hashlock",
            "account": {
                "balance": "500.0000",
                "frozen": "0.0000"
            }
        }
    ]
}
```


3. lock操作
`cli hashlock lock -a 500 -d 360 -r 1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3 -t 1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW -s mysecret`  
-d为lock周期，只有在此时间内，才能成功进行send，超出这个周期只能进行unlock操作；  
-s为唯一标识，目前的标识在使用过一次以后无法再次使用。  
**returnAddr需与签名地址一致。**  
由**A签名**并发送  
查询A地址合约余额：  
`cli account balance -a 1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3`  
```
{
    "addr": "1KVtEMhwaJqVE4nQEhdfxNkMPXFhRtEZd3",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "499.9980",
                "frozen": "0.0000"
            }
        },
        {
            "execer": "hashlock",
            "account": {
                "balance": "0.0000",
                "frozen": "500.0000"
            }
        }
    ]
}
```
hashlock的500已被冻结。  

4. send操作  
`cli hashlock send -s mysecret`  
-s的标识需与lock时的一致。  
由**B签名**并发送。  
查询B地址各合约余额：  
`cli account balance -a 1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW`  
```
{
    "addr": "1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "0.9990",
                "frozen": "0.0000"
            }
        },
        {
            "execer": "hashlock",
            "account": {
                "balance": "500.0000",
                "frozen": "0.0000"
            }
        }
    ]
}
```
hashlock的500已转移至B地址的hashlock合约中。  

5. 取回，从hashlock合约取钱  
`cli coins withdraw -a 500 -e hashlock`  
由**B签名**并发送。  
查询B地址余额：  
`cli account balance -a 1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW`  
```
{
    "addr": "1LgiDySWZBGGcR4njtsXbWpJ6AS2R9cdwW",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "500.9980",
                "frozen": "0.0000"
            }
        }
    ]
}
```
500已被取回B地址coins中。  



附：
unlock操作，在lock动作后，超过设定时间，可以进行unlock操作。  
unlock后，余额在**A账户**，解除冻结状态，可以由**A取回**。  
`cli hashlock unlock -s mysecret`

# retrieve 钱包找回合约
## 合约功能概述

私钥是花费数字加密货币的唯一手段， 一旦出现丢失的情况，个人财产将无法找回。  
目前，主流数字货币本地钱包均实现通过SEED找回私钥的功能，但应用场景局限，仍然存在很大改进空间。  
钱包/私钥找回功能为Chain33项目提供一种技术支持，通过实现多权限等级私钥，在保证安全的前提下，为数字加密货币的花费、找回增加灵活性。

## 合约方法描述 
钱包/私钥找回功能的实现并不是真正通过某种方式找回丢失的私钥，而是为默认私钥**备份**一个或一组私钥，当默认私钥丢失时，可以通过备份私钥花费之前备份的余额。  

要使用备份私钥找回余额，必须之前用默认私钥做过备份，在备份时，账户余额打入相应的retrieve合约地址。
当用户需要用备份私钥花费余额时，先进行prepare操作，这一步操作是为了防止备份私钥被盗的情形。经过此操作，账户余额与合约余额均不改变，只是通知网络，有一笔用私钥签名的操作发生，在一定的周期延时后，此备份私钥可以通过perform操作，将合约地址余额打入到自己合约地址，并后续进行取钱操作。
如果在这个阶段中，默认私钥执行了cancel操作，说明此次取回无效，即使到达限定周期，备份私钥也无法取钱。  

整个功能的状态机如下图所示，在backup和prepare状态，余额存在默认私钥对应的合约账户中，只有在成功执行perform操作时，余额才转移到备份私钥对应的合约账户，并可以进行下一步的取回到账户的操作。  
默认私钥和备份私钥不是一对一的关系，一个默认私钥可以设置多个备份私钥，这些私钥在进行prepare操作以后，能够执行perform的延迟周期不同。  
另外，多个默认私钥可以使用同一个备份私钥地址，这是通过内部关联实现的，当一组备份关系建立时，为这两个私钥建立关联，一旦最终进入performed或canceled状态，关联取消。  
![状态机](https://gitlab.33.cn/flyaway53/test/raw/master/img-folder/14.png)   

## 合约操作流程 
`cli retrieve -h`  
```
Available Commands:
  backup      Backup the wallet
  cancel      Cancel the retrieve
  perform     Perform the retrieve
  prepare     Prepare the wallet
  query       Backup the wallet
```

1. 需要准备两个账户A和B，B是A的备份  
我这里  
A:1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT  
B:1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U  
B地址需要小额BTY作为操作手续费。  

2. 为了使最后retrieve能够看到效果，需要由A账户先打点钱进retrieve合约  
`cli coins send_exec -a 100 -e retrieve`  
由**A签名**并发送

3. backup操作  
`cli retrieve backup -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT -d 61`   
由**A签名**并发送  
-b为备份地址，-t为原始地址，-d为指定的prepare以后多久能够进行perform操作，最少是60s。所以为了保证perform能够成功，需要在prepare以后等待一下再perform。  

查询retrieve状态：  
`cli retrieve query -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`  
```
{
    "delayPeriod": 61,
    "status": "backup"
}
```

4. prepare操作  
`cli retrieve prepare -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`  
由**B签名**并发送  

查询retrieve状态：  
`cli retrieve query -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`   
```
{
    "delayPeriod": 61,
    "status": "prepared"
}
```
查询A地址retrieve中余额：  
`cli account balance -a 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`  
```
{
    "addr": "1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "899.9980",
                "frozen": "0.0000"
            }
        },
        {
            "execer": "retrieve",
            "account": {
                "balance": "100.0000",
                "frozen": "0.0000"
            }
        }
    ]
}
```
A地址retrieve中的余额在prepare后被冻结。  


5. perform操作  
`cli retrieve perform -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`    
由**B签名**并发送  

查询retrieve状态：  
`cli retrieve query -b 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U -t 1QBKkYr2fH6JqDGBydmKUCEAJ2ZWXFkKyT`   
```
{
    "delayPeriod": 61,
    "status": "performed"
}
```
查询B地址retrieve中余额：  
`cli account balance -a 1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U`   
```
{
    "addr": "1Jg2UVwRxpx6t1L5pjnqnwmZvteRpWxp5U",
    "execAccount": [
        {
            "execer": "coins",
            "account": {
                "balance": "999.9980",
                "frozen": "0.0000"
            }
        },
        {
            "execer": "retrieve",
            "account": {
                "balance": "100.0000",
                "frozen": "0.0000"
            }
        }
    ]
}
```
A地址被冻结的部分已经取回到B地址的retrieve合约中。  


6. 取回，从retrieve合约取钱
./cli bty withdraw -a 100 -e retrieve
由**B签名**并发送

注意：
A. retrieve合约只能够负责合约里余额的转移，要想达到外部账户的效果，必须要往合约里打钱，并最后取回，否则即便retrieve操作成功，也看不到效果
B. 因为prepare/perform/withdraw都是由备份地址签名完成的，因此这个备份地址还需要有点钱作为手续费
C. 当前retrieve命令和一些其他的执行器类似，操作只是创建了交易，还需要签名并发送
D. retrieve操作需要注意，不同的操作需要不同的地址签名A/B
E. 备份过程指定了prepare以后多久能够进行perform操作，最少是60s，所以为了保证perform能够成功，需要在prepare以后等待一下再perform
F. 测试过程中可以用查询命令查看状态
./cli retrieve query -b 1KoVEeACNMyr42uEnfKR7SJTi5wE8nGWqx -t 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt


## multisig 多重签名合约
"1LmbKkDke6FB4mATfF1WQD2QLQQbk1JUFa" xs1
"1JDVvcppsUpfbaXqdoKyGTYV7eeakZgCHN" xs2
"1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7" xs3
"197MWT1nNxHnmz4Wd6SWCPbL3naUy5WLiz" xs4
"1PpeeGeWfT8hCUroKEYUur12SQsbTyMdQz" xs5
"1LFqpeEiGuWSVUMztxifLGTT7gsmJatGJi" xs6
  
地址4向unfreeze合约打入100JTT  
创建对地址3的合约解冻   
cli send unfreeze create fix_amount -a 0.01 -e token -s JTT -b 1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7  -p 60 -t 2 -k "197MWT1nNxHnmz4Wd6SWCPbL3naUy5WLiz"  

查询该合约状态  
cli unfreeze show --id mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657  
该id值无查询接口  需增加
```
{
    "unfreezeID": "mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657",
    "startTime": "1547625329",
    "assetExec": "token",
    "assetSymbol": "JTT",
    "totalCount": "200000000",
    "initiator": "197MWT1nNxHnmz4Wd6SWCPbL3naUy5WLiz",
    "beneficiary": "1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7",
    "remaining": "200000000",
    "means": "FixAmount",
    "fixAmount": {
        "period": "60",
        "amount": "1000000"
    }
}
```
查询可取回的份额  
cli unfreeze show_withdraw --id mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657  
```
{
    "unfreezeID": "mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657",
    "availableAmount": "14000000"
}
```
受益人取回冻结  
cli send unfreeze withdraw --id mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657 -k "1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7"  
查询余额  
cli token token_balance -a "1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7" -s JTT -e unfreeze  
```
[
    {
        "Token": "JTT",
        "balance": "0.3200",
        "frozen": "0.0000",
        "addr": "1GV8NGi8fgbG5kqpL6v64fQNkszkxyvwZ7"
    }
]
```
终止合约   
cli send unfreeze  terminate --id mavl-unfreeze-f9cf7a1f2482ad1137bdc5af49bd1c2bbe6407308710cdbb21e6162e0cba0657 -k "197MWT1nNxHnmz4Wd6SWCPbL3naUy5WLiz"  

终止合约后，已解冻的部分也被收回，需求是否需要修改  

创建合约时，设置解冻周期为0，交易成功，执行失败，返回输入数据非法，应增加cli端限制。  
设置总量为0时，返回encoding/hex: invalid byte: U+0074 't'  增加cli端限制
创建合约时，total值小于每次解冻值，交易成功并执行成功，应限制total大于每次解冻值  
## para 跨链合约




## token token合约
发行bty token，分为预创建及完成创建两个阶段
向token合约地址转币：(一步完成)
cli send bty send_exec -e token -a 数量 -k 签名地址 
```
返回交易哈希
```

预创建：（一步完成）
cli send token precreate -f 手续费 -i 介绍 -n token名称 -a 拥有者地址 -p 发币费 -s 标志，需大写 -t 发行数量 -k 创建者地址
预创建后会冻结token合约中设置的发币费，可查询预创建列表:
cli token get_precreated
```
---The 30th precreated token is below--------------------
{
    "name": "mouse",
    "symbol": "MOU",
    "introduction": "bigmouse",
    "total": 10002,
    "owner": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w",
    "creator": "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip"
}
```

完成创建需要token-finisher管理权限签名：
cli send token finish -f 手续费 -a 拥有者地址 -s 标志 -k 管理权限地址签名
可查询已完成创建的token：
cli token get_finish_created
```
---The 308th Finish Created token is below--------------------
{
    "name": "mouse",
    "symbol": "MOU",
    "introduction": "bigmouse",
    "total": 10002,
    "owner": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w",
    "creator": "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip",
    "status": 1
}
```

其余命令列表：
```
Available Commands:
  finish             Create a finish created token transaction
  get_finish_created Get finish created tokens
  get_precreated     Get precreated tokens
  precreate          Create a precreated token transaction
  revoke             Create a token revoke transaction
  token_assets       Get token assets
  token_balance      Get token balance of one or more addresses
  transfer           Create a token transfer transaction
  withdraw           Create a token withdraw transaction
```

### revoke 撤销预创建
cli send token revoke -a 拥有者地址 -f 手续费 -s 标志 -k 创建者签名

### token_assets 查询指定地址在指定合约中的所有token余额
cli token token_assets -a 地址 -e 执行器
```
[
    {
        "Token": "MOU",
        "balance": "10002.0000",
        "frozen": "0.0000",
        "addr": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w"
    }
]
```

### token_balance 查询指定地址在指定合约中，某指定token的余额
cli token token_balance -a 地址 -e 执行器 -s 标志
```
[
    {
        "Token": "MOU",
        "balance": "10002.0000",
        "frozen": "0.0000",
        "addr": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w"
    }
]
```


### transfere token转账
cli send token transfer -t 接收地址 -a 数量 -s 标志 -k 签名私钥
```
返回交易哈希
```

### withdraw 收回token
cli send token withdraw -a 数量 -s 标志 -e 执行器 -k 签名私钥
```
返回交易哈希
```
## trade trade合约
```
Available Commands:
  buy                     Create a buying token transaction
  buy_order               Show one's buying orders
  revoke                  Create a revoke token transaction
  sell                    Create a selling token transaction
  sell_order              Show one's token selling orders
  status_buy_order        Show one's buying orders of tokens
  status_order            Show one's orders with status
  status_sell_order       Show selling orders of the status
  status_token_buy_order  Show token buying orders of a status
  status_token_sell_order Show token selling orders of a status
```


要执行在trade中的交易，首先需要由token合约向trade合约转币：
获取trade合约地址：
cli exec addr -e trade
```
1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
```
向合约地址转币：
cli send token transfer -t 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 -a 数量 -k 签名地址  -s MOU

查询trade合约指定token余额
cli token token_balance -a 地址 -s MOU -e trade
```
[
    {
        "Token": "MOU",
        "balance": "100.0000",
        "frozen": "0.0000",
        "addr": "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip"
    }
]
```

### sell 挂卖
cli send trade sell -f 手续费 -m 最小手数 -p 价格 -s MOU -t 最大数量 -k "152xusBV1onddSYcyTmGcGr1Yva7GAc37w"
默认每手为0.01个token

### sell_order 根据地址查询挂卖单
cli trade  sell_order -s 152xusBV1onddSYcyTmGcGr1Yva7GAc37w -t MOU
```
{
    "sellOrders": [
        {
            "tokenSymbol": "MOU",
            "owner": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w",
            "amountPerBoardlot": "0.0100",
            "minBoardlot": 1,
            "pricePerBoardlot": "1.0000",
            "totalBoardlot": 2000,
            "tradedBoardlot": 0,
            "buyID": "",
            "status": 1,
            "sellID": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "txHash": "0x64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "height": 895679,
            "key": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "blockTime": 1536740067,
            "isSellOrder": true
        }
    ]
}
```
默认为0.01个每手，共20个token，故为2000手

购买trade中的挂卖时，需要先向trade合约转入bty
cli send bty transfer -t 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 -a 数量  -k 签名地址
```
返回交易哈希
```

### buy 购买token
cli send trade buy -c 购买手数 -s sellID -k 签名地址

购买后查询卖单
```
{
    "sellOrders": [
        {
            "tokenSymbol": "MOU",
            "owner": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w",
            "amountPerBoardlot": "0.0100",
            "minBoardlot": 1,
            "pricePerBoardlot": "1.0000",
            "totalBoardlot": 2000,
            "tradedBoardlot": 10,
            "buyID": "",
            "status": 1,
            "sellID": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "txHash": "0x64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "height": 895679,
            "key": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "blockTime": 1536740067,
            "isSellOrder": true
        }
    ]
}
```


### buy_order 查询买单
cli trade buy_order -b "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip" -t MOU
```
{
    "buyOrders": [
        {
            "tokenSymbol": "MOU",
            "owner": "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip",
            "amountPerBoardlot": "0.0100",
            "minBoardlot": 1,
            "pricePerBoardlot": "1.0000",
            "totalBoardlot": 10,
            "tradedBoardlot": 10,
            "buyID": "",
            "status": 6,
            "sellID": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "txHash": "0xd8e5f2dd4c5159f1e100b3f7f6d3de89c09f664bc8e00326d8eb66b6dc7bd67f",
            "height": 895679,
            "key": "0xd8e5f2dd4c5159f1e100b3f7f6d3de89c09f664bc8e00326d8eb66b6dc7bd67f",
            "blockTime": 1536741001,
            "isSellOrder": false
        }
    ]
}
```


### status_buy_order 查询指定地址的指定状态的买单
cli trade status_buy_order -b 查询地址 -s 买单状态
```
{
    "buyOrders": [
        {
            "tokenSymbol": "MOU",
            "owner": "165HDiXVdTaP1XgM54QbFJaciwAqDSBuip",
            "amountPerBoardlot": "0.0100",
            "minBoardlot": 1,
            "pricePerBoardlot": "1.0000",
            "totalBoardlot": 10,
            "tradedBoardlot": 10,
            "buyID": "",
            "status": 6,
            "sellID": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "txHash": "0xd8e5f2dd4c5159f1e100b3f7f6d3de89c09f664bc8e00326d8eb66b6dc7bd67f",
            "height": 895679,
            "key": "0xd8e5f2dd4c5159f1e100b3f7f6d3de89c09f664bc8e00326d8eb66b6dc7bd67f",
            "blockTime": 1536741001,
            "isSellOrder": false
        }
    ]
}
```

※ -s支持onbuy, boughtout or buyrevoked

### status_order 查询指定地址的指定状态的所有买卖单，可指定配置查询
cli trade status_order -a "152xusBV1onddSYcyTmGcGr1Yva7GAc37w" -s 1
```
{
    "orders": [
        {
            "tokenSymbol": "MOU",
            "owner": "152xusBV1onddSYcyTmGcGr1Yva7GAc37w",
            "amountPerBoardlot": "0.0100",
            "minBoardlot": 1,
            "pricePerBoardlot": "1.0000",
            "totalBoardlot": 2000,
            "tradedBoardlot": 10,
            "buyID": "",
            "status": 1,
            "sellID": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "txHash": "0x64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "height": 895679,
            "key": "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab",
            "blockTime": 1536740067,
            "isSellOrder": true
        }
    ]
}

```
※ -s后1: on, 2: done, 3: revoke
※ -c可选择输入，为显示的买卖单上限，默认为10；-d可选择输入，显示查询的方向，默认为1，即正向，0代表反向。

### revoke 撤销挂单

cli send trade revoke -s "mavl-trade-sell-64cb10c29bedbd5ad1b3e9317999c637aac695cfbcab64ff292922ef9e5881ab" -k "152xusBV1onddSYcyTmGcGr1Yva7GAc37w"


## privacy 隐私交易合约
# 测试准备
## 测试账户的SEED信息
cli seed generate -l 0
{
    "seed": "quantum frame fog mix way dignity surround peanut spin legal traffic neither penalty accident weasel"
}

## 保存SEED信息
cli seed save -s "quantum frame fog mix way dignity surround peanut spin legal traffic neither penalty accident weasel" -p 123456
{
    "isok": true,
    "msg": ""
}

## 挖矿地址
mine1   1PUiGcbsccfxW3zuvHXZBJfznziph5miAo
mine2   1EDnnePAZN48aC2hiTDzhkczfF39g1pZZX
mine3   12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv

## 测试账户地址（需要根据自己的实际情况调整）
shgA    1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t
shgB    13cS5G1BDN2YfGudsxRxr7X25yu6ZdgxMU
shgC    1JSRSwp16NvXiTjYBYK9iUQ9wqp3sCxz2p

# 隐私交易命令查询功能命令清单
## 查看当前账户列表信息
cli account list

## 解锁
cli wallet unlock -p 123456

## 查看隐私账户在隐私合约上的账户余额
cli account balance -e privacy -a 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t

## 查看指定地址的公钥对
公钥对在接下来转账过程中需要用到  
cli privacy showpk -a 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t

## 查询指定地址的可用、冻结币信息
cli privacy showpai -d 0 -a 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t  
其中-d参数是有4个选择，分别是
- 0：只显示该账户上可用、冻结和总金额
- 1：在0的基础上增加可用输出清单
- 2：在0的基础上增加冻结输出清单
- 3：显示以上0、1、2的所有信息

## 查看隐私交易合约地址
cli exec addr -e privacy

## 从矿机上转账到隐私账户公开地址
cli send bty transfer -k 1PUiGcbsccfxW3zuvHXZBJfznziph5miAo -t 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -n 转账到隐私合约  -a 9999

## 将隐私账户上的币转到隐私合约中，以执行后续的交易
cli send bty transfer -k 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -t 1FeyE6VDZ4FYgpK1n2okWMDAtPkwBuooQd -n 转账到隐私合约  -a 8000

## 查询区块链上的交易
cli tx query -s 0x4833aae9bedad2b60b0e95cd39659ebc538c8f6d23880c47cde6a002e1235ca4

## 主动创建一个UTXO
cli privacy createutxos -f 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -p 92fe6cfec2e19cd15f203f83b5d440ddb63d0cb71559f96dc81208d819fea85886b08f6e874fca15108d244b40f9086d8c03260d4b954a40dfb3cbe41ebc7389 -n createFromutxos -c 16 -a 1  
当当前账户可用UTXO不足时可以通过本命令，创建一批面值的UTXO。本交易需要扣除1coin的手续费

# 单步隐私交易功能清单
## 公开到隐私
公开到隐私，实际上是创建一个可用UTXO  
cli privacy pub2priv -f 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -p 92fe6cfec2e19cd15f203f83b5d440ddb63d0cb71559f96dc81208d819fea85886b08f6e874fca15108d244b40f9086d8c03260d4b954a40dfb3cbe41ebc7389 -n pub2priv_create -a 100 

## 隐私到隐私
cli privacy priv2priv -f 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -p 6326126c968a93a546d8f67d623ad9729da0e3e4b47c328a273dfea6930ffdc87bcc365822b80b90c72d30e955e7870a7a9725e9a946b9e89aec6db9455557eb -n sendA2B -a 3

## 隐私到公开
cli privacy priv2pub -f 13cS5G1BDN2YfGudsxRxr7X25yu6ZdgxMU -t 1JSRSwp16NvXiTjYBYK9iUQ9wqp3sCxz2p -n priv2pub -a 21

# 多步隐私交易功能命令清单
## 创建公开到隐私的交易
cli bty pub2priv -p 92fe6cfec2e19cd15f203f83b5d440ddb63d0cb71559f96dc81208d819fea85886b08f6e874fca15108d244b40f9086d8c03260d4b954a40dfb3cbe41ebc7389 -n public2privacy -a 5

## 创建隐私到隐私的交易
cli bty priv2priv -n privacy2privacy -p 6326126c968a93a546d8f67d623ad9729da0e3e4b47c328a273dfea6930ffdc87bcc365822b80b90c72d30e955e7870a7a9725e9a946b9e89aec6db9455557eb -s 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -a 5

## 创建隐私到公开的交易
cli bty priv2pub -n privacy2public -f 13cS5G1BDN2YfGudsxRxr7X25yu6ZdgxMU -o 1JSRSwp16NvXiTjYBYK9iUQ9wqp3sCxz2p -a 5

## 签名
cli wallet sign -m 1 -a 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -d 0xa64296792f90f364371e0b66fdac622080ceb7b2537ff9152e189aa9e88e61bd

## 发送交易
cli wallet send -m 1 -d 0xa64296792f90f364371e0b66fdac622080ceb7b2537ff9152e189aa9e88e61bd

## 查询当前未发送的交易
cli wallet queryctx -a 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t

## 删除当前未发送的交易
cli wallet deletectx -x 0xfe9283397b1cffc9598b37e35e374bdc40867297f474a9d958ae82fdcf7fc318

# 多步合并命令清单
## 创建公开到隐私的交易
cli send bty pub2priv -p 92fe6cfec2e19cd15f203f83b5d440ddb63d0cb71559f96dc81208d819fea85886b08f6e874fca15108d244b40f9086d8c03260d4b954a40dfb3cbe41ebc7389 -n public2privacy -k 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -a 5 -m 1

## 创建隐私到隐私的交易
cli send bty priv2priv -n privacy2privacy -p 6326126c968a93a546d8f67d623ad9729da0e3e4b47c328a273dfea6930ffdc87bcc365822b80b90c72d30e955e7870a7a9725e9a946b9e89aec6db9455557eb -s 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -a 5 -k 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -m 1

## 创建隐私到公开的交易
cli send bty priv2pub -n privacy2public -f 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -o 1JSRSwp16NvXiTjYBYK9iUQ9wqp3sCxz2p -k 1EDDghAtgBsamrNEtNmYdQzC1QEhLkr87t -a 5 -m 1
## tx group 构建交易组
即原子交易，将多个交易捆绑，若其中有任意一笔交易失败，则整个交易组所有交易失败。交易手续费由第一笔的交易的地址统一扣除。
首先构建多个交易：
cli bty transfer -t 地址A 
```
返回字符串A1
```
cli bty transfer -t 地址B
```
返回字符串A2
```

将两个交易组成交易组:

cli bty txgroup -t "字符串A1 字符串A2"
```
返回字符串A3
```

签名，需根据index指定签名
cli wallet sign -d 字符串A3 -i 1 -a 签名地址
```
返回字符串A4
```

cli wallet sign -d 字符串A4 -i 2 -a 签名地址
```
返回字符串A5
```

发送：
cli wallet send -d 字符串A5


