abit:BTS系统里的第三方担保转账/付款(escrow)

https://bitsharestalk.org/index.php?topic=14661.msg190277#msg190277

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. 总结
抛砖引玉,欢迎大家拍砖。

帖子题外话,现在ui界面有易货交易与HTLC哈希合约交易。

2赞

这是防止电信诈骗搞的24小时后到账么?
利益了谁?值得思考

好文章, 之前还真没留意这个功能

看不懂。。。。。

简单的理解就是UI上的易货担保交易

UI 上现在有了吗

barter啊

这个功能不错呢,场外充值是不是通过这个实现的?

似乎好像是的额鹅鹅鹅

UI 我一直停留在老版本没动过了

应该是类似这样的情形

易物担保交易已经有ui界面了,担保转账应该类似吧,如果有便捷的ui界面就好了