比特股系统里的第三方担保转账/付款(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. 总结
抛砖引玉,欢迎大家拍砖。
现有问题
1) 是否退款或者部分退款,目前不知道怎么查。交易历史和控制台history命令结果里没有相关信息显示。
2) GUI里需要刷新一下才能显示确认付款或者退款后的余额变化
作者:abit
BTS帐号:abit
Pi Network News: Insider Moves of 102 Million Tokens Spark Doubts Over Pi Core Team’s Role
The post Pi Network News: Insider Moves of 102 Million Tokens Spark Doubts Over Pi Core Team’s Role ...
XRP Adoption Booms in Singapore! 2025 Crypto Report Reveals Shocking Surge
The post XRP Adoption Booms in Singapore! 2025 Crypto Report Reveals Shocking Surge appeared first o...
Ethereum Net Flows Turn Negative As Bulls Push For $3,500
Ethereum net flows have been mostly negative for the last week, and a continuation of this suggests ...