BitShares Forum

Main => 中文 (Chinese) => Topic started by: abit on March 02, 2015, 06:10:35 am

Title: BTS系统里的第三方担保转账/付款(escrow)
Post by: abit on March 02, 2015, 06:10:35 am
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 ,格式是
Code: [Select]
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),则相应转账命令为:
Code: [Select]
wallet_transfer_from_with_escrow 5 CNY abit abit wildpig alt "3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5" "hello"

如果这个命令执行成功,会返回交易信息

2.2 查询转账状态
任何时候,可以使用 wallet_escrow_summary 命令(可缩写为 escrow )查看指定账户的转账状态,格式是
Code: [Select]
escrow [账户名]
注:
 账户名是可选参数,如果输入则显示指定账户的转账状态,如果为空则显示块链上所有账户的escrow转账状态。
 指定账户查询时,目前只能按付款人或者收款人来查,不能按照中间人来查询。
 钱包里必须有付款人或者收款人的私钥,结果里才能显示出实际账户名,否则会显示成地址或者UNKNOWN(未知)。

命令返回结果示例
Code: [Select]
>> 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 ,格式如下:
Code: [Select]
release <支付手续费的账户> <转账ID> <确认人> [退款金额] [确认付款金额]
注:
 1) 带尖括号的是必要参数,带方括号的是可选参数。
 2) 第一个参数是指付手续费的账号。因为这也是一个交易,需要向网络支付手续费,不能使用当前escrow交易内的资金支付,必须从钱包另外支付
 3) 转账ID是指用 escrow 命令查到的 balance_id ,即“转账余额ID”
 4) 确认人必须是 sender, receiver, agent 这三种之一,分别对应付款人、收款人、中间人,钱包拥有相应账号的私钥才能操作
 5) 退款金额指将多少金额退回给付款人,默认为0
 6) 确认付款金额指将多少金额确认发送给收款人,默认为0
 7) 付款人可以用这个命令来部分或者全部确认付款,但是不可以用来退款
    收款人可以用这个命令来部分或者全部退款,但是不可以用来确认付款
    中间人(第三方)可以用这个命令来全部退款,或者全部确认付款,或者部分退款/部分确认付款

比如 abit 想将上一笔转账中的1CNY确认发送给 wildpig,则可以使用命令
Code: [Select]
release abit BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM sender 0 1

再比如 wildpig 想将上述转账中的1.5CNY退款给 abit,则可以使用命令
Code: [Select]
release wildpig BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM receiver 1.5 0

还比如 alt 想将上述转账中的1.3CNY退款给 abit,其余部分(还剩2.2CNY)确认发送给wildpig
Code: [Select]
release alt BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM agent 1.3 2.2

3. 总结
抛砖引玉,欢迎大家拍砖。
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: abit on March 02, 2015, 06:15:18 am
现有问题
 1) 是否退款或者部分退款,目前不知道怎么查。交易历史和控制台history命令结果里没有相关信息显示。
 2) GUI里需要刷新一下才能显示确认付款或者退款后的余额变化
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: alt on March 02, 2015, 06:49:59 am
 +5%
这个牛啊,学习一下
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: agree on March 02, 2015, 07:47:57 am
学习了 +5%
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: nj-racoon on March 02, 2015, 08:40:16 am
 +5% Good
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: youlonghun on March 02, 2015, 11:37:02 am
功能越来越强大,只是都得调用命令,易用性不够,小白搞不来。
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: ssjpts on March 02, 2015, 01:12:46 pm
搞不明白了。学习下。
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: BTSdac on March 02, 2015, 02:08:45 pm
外部协议的hash 这个用途很强大,
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: bitshares on March 06, 2015, 07:54:12 am
强大 +5%
Title: Re: BTS系统里的第三方担保转账/付款(escrow)
Post by: sudo on March 23, 2015, 12:52:28 am
GUI部分有人跟进就好了。