Title: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: DSPay on September 16, 2015, 05:33:34 AM 引自巴比特智能坊专版:http://8btc.com/forum-113-1.html (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 */ Title: Re: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: Risackwpsp on September 16, 2015, 06:47:58 AM 太复杂了。
Title: Re: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: Abbey_j on September 16, 2015, 10:10:50 AM 这是什么鬼?
Title: Re: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: DSPay on September 17, 2015, 03:59:50 AM 这是什么鬼? 国内唯一,全球领先的可编程智能合约项目——智能坊。 ;DTitle: Re: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: v0yager on September 17, 2015, 05:48:49 AM 真是人才啊,表示要很久才能看得懂。 Title: Re: 【智能坊】担保交易+仲裁 代码逻辑 (欢迎拍砖) Post by: chennuan on September 17, 2015, 01:41:14 PM 我是一个用户,为什么把程序员没完成的事情交给我?
|