Author

Topic: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) (Read 1179 times)

hero member
Activity: 490
Merit: 500
我是一个用户,为什么把程序员没完成的事情交给我?
hero member
Activity: 518
Merit: 500
这是什么鬼?

国内唯一,全球领先的可编程智能合约项目——智能坊。 Grin

真是人才啊,表示要很久才能看得懂。
member
Activity: 105
Merit: 10
这是什么鬼?

国内唯一,全球领先的可编程智能合约项目——智能坊。 Grin
sr. member
Activity: 322
Merit: 250
这是什么鬼?
member
Activity: 84
Merit: 10
太复杂了。
member
Activity: 105
Merit: 10

引自巴比特智能坊专版:http://8btc.com/forum-113-1.html

此文档是doxgen 使用的文件,直接粘贴到论坛 有点不太好看。


/*!

\page CNM  guarantee担保交易+仲裁 代码逻辑


\section 具体实现过程
-   1. 买家A,卖家B,仲裁者C,都必须在系统中注册并充值。\n   

-   2.仲裁者C,设计数据项:仲裁费X,超时未判决的最大赔偿费用Ymax,无争议裁决费用Z(防止恶意攻击仲裁者),判决期限时间T,备注说明。\n
        允许仲裁者C执行如下操作:\n
       -a. 注册: 设置仲裁费X,超时未判决的最大赔偿费用Ymax,无争议裁决费用Z(防止恶意攻击仲裁者),判决期限时间T,备注说明。 \n               
       -b. 修改: 修改仲裁费X,超时未判决的最大赔偿费用Ymax,无争议裁决费用Z(防止恶意攻击仲裁者),判决期限时间T,备注说明。\n
       -c. 注销:删除仲裁者C注册的仲裁信息。       

-   3. 挂单:买家A或卖家B选定仲裁者,交易金额M,超时高度N,并声明要购买或卖的商品和联系电话,挂单展示出去。\n
          系统执行如下操作:\n
       (1)买家A的挂单:
         -   a.买家A账户:  冻结买家A账户交易金额M和可能要付的仲裁费X和无争议裁决费Z,冻结挂单费用10个币到开发者账户。\n
         -   b.卖家B账户: \n
         -   c.仲裁者C账户:\n         

       (2)卖家B的挂单:       
         -   a.买家A账户:  \n
         -   b.卖家B账户:冻结卖家B账户可能要付的仲裁费X和无争议裁决费Z,冻结挂单费用10个币到开发者账户.\n
         -   c.仲裁者C账户:\n

-   4. 挂单后没被接单之前,允许买家卖家自己发起取消。如果挂单一直没人接单,超时会自动解冻冻结金额\n

-   5. 取消:买家A或卖家B发起取消系统执行以下操作:\n
       (1)买家A的挂单:
         -   a.买家A账户:  解冻买家A账户交易金额M和可能要付的仲裁费X和无争议裁决费Z,解冻开发者账户挂单费5个币退回给挂单者,5个币给开发者自由账户。\n
         -   b.卖家B账户: \n
         -   c.仲裁者C账户:\n

       (2)卖家B的挂单: 
         -   a.买家A账户: \n
         -   b.卖家B账户:解冻卖家B账户可能要付的仲裁费X和无争议裁决费Z,解冻开发者账户挂单费5个币退回给挂单者,5个币给开发者自由账户 \n
         -   c.仲裁者C账户:\n

-   6. 接单:系统执行如下操作:\n   
       (1)买家A的挂单: (接单者发货,并通知买家及时确认收货)
         -   a.买家A账户:  解冻买家A账户无争议裁决费Z 付给仲裁者C,解冻交易金额M转入卖家B的冻结账户;更新可能要付的仲裁费x冻结时间,解冻开发者账户挂单费10个币。\n
         -   b.卖家B账户: 冻结卖家B账户可能要付的仲裁费X;\n
         -   c.仲裁者C账户:冻结仲裁者C可能要付的超时未判决的赔偿费用Y,且如果交易金额M大于等于超时未判决的最大赔偿费用Ymax,则最多只赔偿Ymax;否则只赔偿交易金额M。\n       

       (2)卖家B的挂单: (接单者预付款,并通知卖家及时发货)
         -   a.买家A账户: 将交易金额M转入卖家B冻结账户,冻结买家A账户可能要付的仲裁费X。\n
         -   b.卖家B账户:解冻卖家A账户无争议裁决费Z 付给仲裁者C,解冻开发者账户挂单费10个币\n
         -   c.仲裁者C账户:冻结仲裁者C可能要付的超时未判决的赔偿费用Y,且如果交易金额M大于等于超时未判决的最大赔偿费用Ymax,则最多只赔偿Ymax;否则只赔偿交易金额M。\n
                               
-   7. 确认:买家收货后确认,系统执行以下操作:\n
         -   a.买家A账户: 解冻买家A账户仲裁费X;\n
         -   b.卖家B账户:解冻卖家B账户的交易金额M和仲裁费X\n
         -   c.仲裁者C账户:解冻仲裁者C的超时未判决的赔偿费用Y。\n

-   8. 交易完成。\n
-   9. 如果买家A一直不发起确认收货交易,超时后系统将自动解冻卖家B的交易金额。\n
-   10. 买家A或卖家B不满意,发生纠纷,都可以向仲裁者C申请仲裁,系统执行以下操作:\n
         -a   仲裁发起者冻结账户仲裁费X付给仲裁者C。
         -b  将仲裁者C冻结账户的超时未判决的赔偿费用Y转入仲裁发起者的冻结账户。\n
-   11.仲裁者C接单后,如果一直拖着不判决,超时系统则将付给申请仲裁者 超时未判决的赔偿费用Y, 以保证仲裁者能及时做出裁决。\n

-   12.仲裁者C接单后,及时联系买卖双方,收集信息并做出公平裁决。\n
       以决定卖家B冻结账户里的交易金额M,最终付给卖家B多少钱,退还买家A多少钱,并且仲裁费最终由败诉方承担。\n
           系统则根据这个裁决去执行,保证买卖双方公平公正的交易.系统执行以下操作:\n
             -a  解冻卖家B账户里的交易金额M,转指定的金额给买家A,转指定的金额给卖家B自由账户;\n
             -b  将申请仲裁者冻结账户里的超时未判决的赔偿费用Y,解冻给仲裁者C;\n
             -c  如果胜诉方是申请仲裁者,解冻败诉方账户的仲裁费X付给胜诉方账户。\n


-        应用代码逻辑\n
说明:
   1.不检查,买家卖家仲裁者是否有做够多的自由金额支付冻结,因为系统会保证不够会操作不成功。\n
   2.每个账户的冻结项,tag=当前交易的HASH。\n
   3.支持仲裁者注册信息,随时修改;挂单时保存仲裁者当时注册的X,Y,Z,T,备注说明
   4.每个交易环节,超时时间会复位重新计算,每个账户冻结项 冻结时间要及时更新。
   5.仲裁者最大赔偿费用Y,如果交易金额M 大于等于Y,则最多只赔偿Y;否则只赔偿交易金额M;

   6.定义担保交易类型如下:
enum TXTYPE{
        TX_REGISTER = 0x01,   //注册仲裁账户
        TX_MODIFYREGISTER =0x02, // 修改仲裁者注册信息
        TX_UNREGISTER = 0x03, //注销仲裁账户
        TX_SEND = 0x04, //挂单
        TX_CANCEL = 0x05, //取消挂单
        TX_ACCEPT = 0x06, //接单
        TX_BUYERCONFIRM = 0x07, //买家确认收货
        TX_ARBITRATION = 0x08, //申请仲裁
        TX_FINALRESULT = 0x09, //裁决结果
};
   7. 定义挂单类型:
enum SEND_TYPE{      //!<挂单的状态
        SEND_TYPE_BUY = 0x00,   //!<挂单 买
        SEND_TYPE_SELL = 0x01,  //!<挂单 卖
};
   8.详细数据结构:


//注册输入数据结构
typedef struct  {
        Int64 arbiterMoneyX;             //!<仲裁费用X
        Int64 overtimeMoneyYmax;         //!<超时未判决的最大赔偿费用Y
        Int64 configMoneyZ;              //!<无争议裁决费用Z
        unsigned long  overtimeheightT;  //!<判决期限时间T 相对高度值
        unsigned char  ucLen;           //!<备注说明长度
        char  comment[128];             //!<备注说明
} DB_DATA_ARBITER;                  //!<仲裁者注册的信息

typedef struct {
        enum TXTYPE nType;            //!<交易类型
        DB_DATA_ARBITER db_data;        //!<仲裁者注册的信息
}TX_REGISTER_CONTRACT;  //!<注册仲裁账户


//挂单时的数据结构:
typedef struct{
        enum SEND_TYPE sendType;         //!<挂单类型:0 买  1卖
        ACCOUNT_ID arbitationID;        //!<仲裁者ID(采用6字节的账户ID)
        Int64 moneyM;                   //!<交易金额
        unsigned long height;           //!<每个交易环节的相对超时高度
}TX_SEND_PUBLICDATA;
typedef struct {
        enum TXTYPE nType;            //!<交易类型
        TX_SEND_PUBLICDATA tradeInfo;   //!<交易相关信息
        unsigned char ucLen;            //!<备注说明长度
        char  comment[128];             //!<备注说明
}TX_SNED_CONTRACT;                  //!<挂单

// DB_DATA详细结构:
typedef struct  {
        unsigned char state;             //!<标示交易状态
        TX_SEND_PUBLICDATA tradeInfo;    //!<交易相关信息
        unsigned char ucLen;             //!<备注说明长度
        char  comment[128];              //!<备注说明
        Int64 arbiterMoneyX;             //!<仲裁费用X
        Int64 arbiterovertimeMoneyY;     //!<超时未判决的赔偿费用Y
        Int64 configMoneyZ;              //!<无争议裁决费用Z
        unsigned long  overtimeheightT;  //!<判决期限时间T 相对高度值

        /////// LV格式 可选项
        unsigned char ucBuyerLen;        //!<买家ID 的长度
        ACCOUNT_ID         buyer;                   //!<买家ID(采用6字节的账户ID)可选项
        unsigned char ucSellerlen;       //!<卖家ID 的长度
        ACCOUNT_ID         seller;                   //!<卖家ID(采用6字节的账户ID)可选项
        unsigned char arbiterTypeLen;    //!<申请仲裁类型的长度
        unsigned char arbitrationType;   //!<申请仲裁类型 0:买家发起,1:卖家发起  可选项
} DB_DATA;    //!<需要保存的数据结构,交易过程中

// 取消挂单,接单,买家确认收货,申请仲裁的输入数据结构
typedef struct {
        enum TXTYPE nType;            //!<交易类型
        unsigned char txhash[32];       //!<挂单的交易hash
} TX_CONTRACT;

// 执行裁决结果的输入数据结构
typedef struct {
        enum TXTYPE nType;            //!<交易类型
        unsigned char sendhash[32];       //!<挂单的交易hash
        unsigned char accepthash[32];    //!<接单的交易hash
        ACCOUNT_ID         winner;              //!<赢家ID(采用6字节的账户ID)
        Int64 winnerMoney;            //!<最终获得的金额
        ACCOUNT_ID  loser;       //!<输家ID(采用6字节的账户ID)
        Int64 loserMoney;            //!<最终获得的金额
}TX_FINALRESULT_CONTRACT;        //!<最终裁决


    1.收到仲裁者注册或修改数据包:\n
          输入数据结构: 详细见 TX_REGISTER_CONTRACT
            1字节的交易类型 + 8字节的仲裁费X + 8字节的超时未判决的最大赔偿费用Y + 8字节的无争议裁决费用Z + 4字节的判决期限时间T + 1字节的备注长度ucLen(最大128个字节) + ucLen个字节的备注内容       
          执行过程:
             -a.合法性校验:校验仲裁费X,超时未判决的最大赔偿费用Y,无争议裁决费Z是否有效(X,Y,Z >=0),判决期限时间T,备注长度有效性。\n
             -b.数据库操作:key = "judge"+6字节的仲裁者ID,value = X + Y + Z + T + ucLen + ucLen长度的备注内容;将key-value写入脚本数据库。\n

    2.收到仲裁者注销数据包:\n
          输入数据结构:1字节的交易类型
          执行过程:
             -a.合法性校验:\n
             -b.数据库操作:key = "judge"+6字节的仲裁者ID,删除脚本数据库。\n   
                         
    3.设计存放交易中间结果的结构体DB_DATA 包含数据项: \n
        DB_DATA数据项由固定数据项和可变数据项组成,可变数据项采用LV 长度取值格式。
        固定数据项: 1字节的交易状态  + 1字节的挂单类型(买或卖) + 6字节的仲裁者ID  \n
                    + 8字节的交易金额M + 4字节的超时高度 + 1字节的备注说明长度ucLen(小于等于128) + 固定128字节的详细买卖备注说明 \n
                    + 8字节的仲裁费X +8字节的超时未判决的赔偿费Y + 8字节的无争议裁决费用Z + 4字节的判决期限时间T \n
        可变数据项:
            + 1字节的买家ID长度ucBuyerLen + ucBuyerLen字节的买家ID(可选) \n
            + 1字节的卖家ID长度ucSellerlen + ucSellerlen字节的卖家ID(可选) \n
            + 1字节的申请仲裁类型长度arbiterTypeLen + arbiterTypeLen字节的申请仲裁类型买家或卖家(可选) \n       

       key = 超时高度 + 发起担保交易的HASH \n

                 
    4.收到担保交易挂单数据包:\n
          输入数据结构: 详见 TX_SNED_CONTRACT
  1字节的交易类型 + 1字节挂单类型 + 6字节的仲裁者ID + 8字节的交易金额 + 4字节超时高度 + 1字节的备注长度ucLen + ucLen个字节的备注内容(最大128个字节) \n
          执行过程:
             -a.合法性校验:校验挂单类型,交易金额M是否有效。备注长度有效性。校验仲裁者ID是否注册。超时高度是否小于等于最大超时高度,是否大于判决期限时间T。\n                           
             -b.数据库操作:从脚本数据库中读出仲裁者ID注册的X,Y,Z,T值;初始化交易状态为挂单STATE_SEND,\n
                             填写必要的结构体DB_DATA数据项,并且用超时高度+当前交易HASH为key, 写入脚本数据库保存\n
             -c.账户操作:
            (1).挂单类型是买:             
                  -c.1买家A账户:冻结买家A账户交易金额M和可能要付的仲裁费X和无争议裁决费Z,冻结挂单费用10个币到开发者账户。\n
                  -c.2卖家B账户:
                  -c.3仲裁者C账户:                                   
            (2).挂单类型是卖家B发起挂单:
                  -c.1.买家A账户:  \n
                  -c.2.卖家B账户:冻结卖家B账户可能要付的仲裁费X和无争议裁决费Z,冻结挂单费用10个币到开发者账户.\n
                  -c.3.仲裁者C账户:\n
                                 
    5.收到取消挂单数据包:\n
          输入数据结构:详见 TX_CONTRACT
1字节的交易类型 + 32字节的挂单的交易\n
          执行过程:
               -a.合法性校验:根据挂单的交易HASH值,超时高度组对应key值,读出结构体DB_DATA数据项。校验交易状态是否为挂单状态STATE_SEND。\n
                            根据挂单类型校验发起者ID,校验超时高度\n
             -b.数据库操作:删除脚本数据库中对应HASH值的 DB_DATA数据项。\n
             -c.账户操作:
            (1).挂单类型是买:             
                  -c.1买家A账户:解冻买家A账户交易金额M和可能要付的仲裁费X和无争议裁决费Z,解冻开发者账户挂单费5个币退回给挂单者,5个币给开发者自由账户。\n
                  -c.2卖家B账户:
                  -c.3仲裁者C账户:                                   
            (2).挂单类型是卖:
                  -c.1.买家A账户:  \n
                  -c.2.卖家B账户:解冻卖家B账户可能要付的仲裁费X和无争议裁决费Z,解冻开发者账户挂单费5个币退回给挂单者,5个币给开发者自由账户 \n
                  -c.3.仲裁者C账户:\n                       
                         
    6.收到接单数据包:\n
          输入数据结构:详见 TX_CONTRACT
1字节的交易类型 + 32字节的挂单的交易HASH值 \n
          执行过程:\n
             -a.合法性校验:根据挂单的交易HASH值,超时高度组对应key值,读出结构体DB_DATA数据项。校验交易状态是否为STATE_SEND,\n
                            根据挂单类型校验接单者ID,不允许接单者既是买家又是卖家,\n
                            校验超时高度。\n
             -b.数据库操作:修改交易状态为接单状态STATE_ACCEPT,更新对应的买家或卖家ID,超时时间会复位重新计算,并更新保存到脚本数据库。\n
             -c.账户操作:
             (1).挂单类型是买:             
                  -c.1买家A账户:解冻买家A账户无争议裁决费Z 付给仲裁者C,解冻交易金额M转入卖家B的冻结账户;更新可能要付的仲裁费x冻结时间,解冻开发者账户挂单费10个币。(M,X,Z)\n
                  -c.2卖家B账户: 冻结卖家B账户可能要付的仲裁费X;(X)\n
                  -c.3仲裁者C账户:冻结仲裁者C可能要付的超时未判决的赔偿费用Y。(Y,10个币)\n                                         
             (2).挂单类型是卖:
                  -c.1.买家A账户:  将交易金额M转入卖家B冻结账户,冻结买家A账户可能要付的仲裁费X。(M,X)\n
                  -c.2.卖家B账户:解冻卖家B账户无争议裁决费Z 付给仲裁者C,更新可能要付的仲裁费x冻结时间,解冻开发者账户挂单费10个币.(Z)\n
                  -c.3.仲裁者C账户:冻结仲裁者C可能要付的超时未判决的赔偿费用Y。(Y,10个币)\n

                 
    7.收到买家A 确认收货数据包:\n
          输入数据结构:详见 TX_CONTRACT
1字节的交易类型 + 32字节的挂单的交易HASH值  \n
            执行过程:
             -a.合法性校验:根据挂单的交易HASH值,超时高度组对应key值,读出结构体DB_DATA数据项。校验交易状态是否为接单状态STATE_ACCEPT,校验买家ID,\n
                            校验超时高度。\n
             -b.数据库操作:删除脚本数据库中对应HASH值的 DB_DATA数据项。\n         
             -c.账户操作:
                  -c.1.买家A账户: 解冻买家A账户仲裁费X;\n
                  -c.2.卖家B账户:解冻卖家B账户的交易金额M和仲裁费X;\n
                  -c.3.仲裁者C账户:解冻仲裁者C的超时未判决的赔偿费用Y。\n

                                           
    8.收到买家A或卖家B发起的申请仲裁交易数据包:\n
           输入数据结构:详见 TX_CONTRACT
1字节的交易类型 + 32字节的挂单的交易HASH值\n
            执行过程:
             -a.合法性校验:根据挂单的交易HASH值,超时高度组对应key值,读出结构体DB_DATA数据项。校验交易状态是否为接单状态STATE_ACCEPT,校验申请仲裁者只能是买家A或卖家B,\n
                            校验超时高度。\n
             -b.数据库操作:修改交易状态为仲裁状态STATE_ARBITRATE,填写申请仲裁类型,超时时间会复位重新计算(以仲裁者C承诺的判决期限时间T为准),并更新保存到脚本数据库。\n       
             -c.账户操作:
                  -c.1.买家A账户: 如果买家申请,买家冻结账户仲裁费X付给仲裁者C。\n
                  -c.2.卖家B账户:如果买家申请,买家冻结账户仲裁费X付给仲裁者C。\n
                  -c.3.仲裁者C账户:将仲裁者C冻结账户的超时未判决的赔偿费用Y转入仲裁发起者的冻结账户。\n

                                   
    9.收到仲裁者C的最终判决交易数据包:\n
          输入数据结构: 详见 TX_FINALRESULT_CONTRACT
1字节的交易类型 + 32字节的挂单的交易HASH值 + 32字节的接单的交易HASH值 + 6字节的胜诉方ID + 8字节的胜诉方获得最终金额 + 6字节的败诉方ID + 8字节的败诉方获得最终金额\n
          执行过程:
             -a.合法性校验:根据挂单的交易HASH值,超时高度组对应key值,读出结构体DB_DATA数据项。校验交易状态是否为仲裁状态STATE_ARBITRATE,校验仲裁者ID,\n
                            校验超时高度,校验胜诉方ID和败诉方ID是否为对应的买家A或卖家B,校验胜诉方败诉方最终分配的交易金额之和是否等于交易金额。\n
             -b.数据库操作:删除脚本数据库中对应HASH值的 DB_DATA数据项。\n
             -c.账户操作:
                   (1).根据判决结果,解冻卖家B账户里的交易金额M,付给买家A指定的金额,付给卖家B指定的金额。\n                 
                   (2).将申请仲裁者冻结账户里的超时未判决的赔偿费用Y,解冻给仲裁者C。\n
                   (3).比较胜诉方是否为申请仲裁者,如果是则将败诉方冻结的仲裁费X付给胜诉方。保证仲裁费由败诉方承担。\n                 
                       
-   FAQ:

           

\section 虚拟机运行代码
    - \ref guarantee.cpp
*/

Jump to: