# mix执行器 基于零知识证明的混币隐私合约

## 场景
 1. 存款，公转私，支持一次存入一个或多个目标账户，目标账户隐藏(自己或对方账户)，转账金额公开(需要验证金额足够)，生成未花费支票
 1. 转账，私对私，花费某个支票，生成新支票即转账给目标账户，多出部分找零给自己，花费、目标和找零金额全隐藏
 1. 提款，私对公，花费某些支票，统一转出给签名地址，转账金额公开(验证)
 1. 授权，私对私，授权账户对某一请求其授权的转账支票授权，接收者或发送者都可看到支票在自己名下，但是锁定状态，
               授权者授权接收者或者发送者为可花费用户，可花费用户才能花费此支票。
    

## 介绍
1. 任一希望接收支票的用户需要先注册支票接收账号和秘密加密公钥
   1.1 支票账号分为接收key和花费key，花费key为用户链钱包账号私钥在c25519曲线上的公钥同时，花费key作为支票私钥，
       计算hash值生成支票接收key。发送者使用对方的钱包地址即可检索其支票接收key，构建发送交易
   1.2 为发送加密消息，接收者需要注册其加密公钥，发送者使用临时私钥和对方加密公钥生成密码，对消息对称加密

1. 支票有接收key，发送key，授权key，还有支票随机数等构成计算其hash，存到merkle树上。知道hash秘密数字的所有者
   即可通过构建零知识证明，花费此支票。花费支票需要提供花费key，发送者虽然知道秘密数字也无法花费此支票。   

1. 发送者用接收者的加密公钥和一次性临时私钥把支票私密数据进行加密，一次性临时公钥和秘密消息发送到链上，接收者可使用其加密私钥解密消息

1. 接收者需要使用加密私钥逐一检索尝试解密任一新的加密消息，解密成功即是发送给自己的加密消息

1. 对于需要授权的支票，发送者，授权者，接收者均可看到此支票，处于锁定状态，不能花费，只有授权者授权后，被授权方才可花费



