比特股系统里的第三方担保转账/付款(escrow)

比特股系统里的第三方担保转账/付款(escrow)

无主之地 副船长 船龄 9.3年 来源 比特股之家
 30435  0

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 ,格式是

  1. 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),则相应转账命令为:

  1. wallet_transfer_from_with_escrow 5 CNY abit abit wildpig alt "3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5" "hello"

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

2.2 查询转账状态

任何时候,可以使用 wallet_escrow_summary 命令(可缩写为 escrow )查看指定账户的转账状态,格式是

  1. escrow [账户名]

注:

账户名是可选参数,如果输入则显示指定账户的转账状态,如果为空则显示块链上所有账户的escrow转账状态。

指定账户查询时,目前只能按付款人或者收款人来查,不能按照中间人来查询。

钱包里必须有付款人或者收款人的私钥,结果里才能显示出实际账户名,否则会显示成地址或者UNKNOWN(未知)。

命令返回结果示例

  1. >> escrow abit
  2.  
  3. [{
  4.     "creating_transaction_id": "1ab26c3e36fe3cf81a12f416aafe0e3c2f9e6d09",
  5.     "balance_id": "BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM",
  6.     "balance": {
  7.       "amount": 50000,
  8.       "asset_id": 14
  9.     },
  10.     "sender_account_name": "abit",
  11.     "receiver_account_name": "wildpig",
  12.     "escrow_agent_account_name": "alt",
  13.     "agreement_digest": "3b6675e1acde42ba912f6d37a0fdf3967c4b6f8cf2b8f86f47f3adfc9ce419c5"
  14.   }
  15. ]

其中:

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 ,格式如下:

  1. release <支付手续费的账户> <转账ID> <确认人> [退款金额] [确认付款金额]

注:

1) 带尖括号的是必要参数,带方括号的是可选参数。

2) 第一个参数是指付手续费的账号。因为这也是一个交易,需要向网络支付手续费,不能使用当前escrow交易内的资金支付,必须从钱包另外支付

3) 转账ID是指用 escrow 命令查到的 balance_id ,即“转账余额ID”

4) 确认人必须是 sender, receiver, agent 这三种之一,分别对应付款人、收款人、中间人,钱包拥有相应账号的私钥才能操作

5) 退款金额指将多少金额退回给付款人,默认为0

6) 确认付款金额指将多少金额确认发送给收款人,默认为0

7) 付款人可以用这个命令来部分或者全部确认付款,但是不可以用来退款
收款人可以用这个命令来部分或者全部退款,但是不可以用来确认付款
中间人(第三方)可以用这个命令来全部退款,或者全部确认付款,或者部分退款/部分确认付款

比如 abit 想将上一笔转账中的1CNY确认发送给 wildpig,则可以使用命令

  1. release abit BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM sender 0 1

再比如 wildpig 想将上述转账中的1.5CNY退款给 abit,则可以使用命令

  1. release wildpig BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM receiver 1.5 0

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

  1. release alt BTS3bEvmFzmfoziof1XMHm4CXunmHswi2sWM agent 1.3 2.2

3. 总结

抛砖引玉,欢迎大家拍砖。

现有问题

1) 是否退款或者部分退款,目前不知道怎么查。交易历史和控制台history命令结果里没有相关信息显示。

2) GUI里需要刷新一下才能显示确认付款或者退款后的余额变化

作者:abit

BTS帐号:abit

  • 全部
  • 最佳
登录 账号发表你的看法,还没有账号?立即免费 注册
推荐教程
换一批