BTS系统里的第三方担保转账/付款(escrow)
1. 什么是escrow
普通的转账,比如A转100CNY给B,转账指令发出之后,相应转账金额就直接从A的账户扣减,进入B的账户了。
第三方担保转账,比如A转100CNY给B,指定一个中间人C,转账指令发出后,金额从A的账户扣减,但是不进入B的账户,而是进入一个特别账户X,C可以决定最终转多少金额给B,以及退回多少金额给A。(C如何进行决定这里暂不讨论)
在传统第三方支付系统里,一般来说特别账户X是C有权控制的账户,可能会由银行D来进行监管,或者没有监管。
在BTS系统里,特别账户X由系统生成,C对特别账户的权限只有确认转账给B或者退回给A,无法挪用,不需要监管。
2. BTS系统里的escrow
v0.6.x的标准客户端(重钱包)里支持第三方托管转账(escrow)。
转账分两步完成:
第一步,发起转账
第二步,确认付款/退款
2.1 发起转账
发起转账的命令是 wallet_transfer_from_with_escrow ,格式是
wallet_transfer_from_with_escrow <金额> <币种> <实际付款人> <显示付款人> <收款人> <第三方> [可选协议hash值] [可选留言] [可选投票方式]
注:
1) 带尖括号的是必要参数,带方括号的是可选参数。
2) 实际付款人和显示付款人可以相同,也可以不同,具体用途待研究
3) 可选协议hash值,是指A可以将A和B之间达成的协议(属于系统外数据)通过一个hash算法比如sha256计算出一个值,记录在这个交易中,
以备争议产生时可以用来仲裁。A和B都可以用原始协议及hash算法来验证该hash值是否正确。
默认为空。
(这个参数必须是一个hash,只接受只包含0-9/a-f的字符串,需要在系统外生成后在这里使用,比如用sha256sum来生成)。
4) 可选留言默认为空
5) 投票是指对受托人投票,与一般转账时的投票相同,默认是按自己选择的受托人的推荐名单投票
比如,abit想要转5CNY给wildpig,指定中间人是alt,留言"hello",协议内容为"buy 1000 BTS"(经过sha256sum计算后结果为 3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5),则相应转账命令为:
wallet_transfer_from_with_escrow 5 CNY abit abit wildpig alt "3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5" "hello"
如果这个命令执行成功,会返回交易信息
2.2 查询转账状态
任何时候,可以使用 wallet_escrow_summary 命令(可缩写为 escrow )查看指定账户的转账状态,格式是
escrow [账户名]
注:
账户名是可选参数,如果输入则显示指定账户的转账状态,如果为空则显示块链上所有账户的escrow转账状态。
指定账户查询时,目前只能按付款人或者收款人来查,不能按照中间人来查询。
钱包里必须有付款人或者收款人的私钥,结果里才能显示出实际账户名,否则会显示成地址或者UNKNOWN(未知)。
命令返回结果示例
>> escrow abit
[{
"creating_transaction_id": "1ab26c3e36fe3cf81a12f416aafe0e3c2f9e6d09",
"balance_id": "BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM",
"balance": {
"amount": 50000,
"asset_id": 14
},
"sender_account_name": "abit",
"receiver_account_name": "wildpig",
"escrow_agent_account_name": "alt",
"agreement_digest": "3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5"
}
]
其中:
1) creating_transaction_id 是发起转账的交易id
2) balance_id 是转账余额ID,后面命令中会用到
3) amount 是当前转账交易的剩余金额,要除以币种对应的小数位数,才是实际金额。CNY的小数是4位,所以例子里的50000实际上是5CNY
4) asset_id 是币种ID,CNY对应的ID是14
5) sender_account_name 是付款人
6) receiver_account_name 是收款人
7) escrow_agent_account_name 是中间人
8 ) agreement_digest 是前面输入的协议hash
2.3 确认付款/退款
进行确认付款、退款操作时,使用 wallet_release_escrow 命令,可简写为 release ,格式如下:
release <支付手续费的账户> <转账ID> <确认人> [退款金额] [确认付款金额]
注:
1) 带尖括号的是必要参数,带方括号的是可选参数。
2) 第一个参数是指付手续费的账号。因为这也是一个交易,需要向网络支付手续费,不能使用当前escrow交易内的资金支付,必须从钱包另外支付
3) 转账ID是指用 escrow 命令查到的 balance_id ,即“转账余额ID”
4) 确认人必须是 sender, receiver, agent 这三种之一,分别对应付款人、收款人、中间人,钱包拥有相应账号的私钥才能操作
5) 退款金额指将多少金额退回给付款人,默认为0
6) 确认付款金额指将多少金额确认发送给收款人,默认为0
7) 付款人可以用这个命令来部分或者全部确认付款,但是不可以用来退款
收款人可以用这个命令来部分或者全部退款,但是不可以用来确认付款
中间人(第三方)可以用这个命令来全部退款,或者全部确认付款,或者部分退款/部分确认付款
比如 abit 想将上一笔转账中的1CNY确认发送给 wildpig,则可以使用命令
release abit BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM sender 0 1
再比如 wildpig 想将上述转账中的1.5CNY退款给 abit,则可以使用命令
release wildpig BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM receiver 1.5 0
还比如 alt 想将上述转账中的1.3CNY退款给 abit,其余部分(还剩2.2CNY)确认发送给wildpig
release alt BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM agent 1.3 2.2
3. 总结
抛砖引玉,欢迎大家拍砖。