引自巴比特智能坊专版:
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
*/