自从我们在LocalCryptos添加新的加密货币以来已经过去了将近一年了,我们很高兴收很多来自客户的请求,要求将比特币现金作为我们非托管机制的下一个趋势。 漫长的等待终于结束了。
从今天开始,在 LocalCryptos 上可以进行P2P比特币现金交易。
比特币现金是 BTC 的一个分支,所以它具有类似的“比特币脚本”智能合约功能。 与我们针对比特币、莱特币和达世币的非托管托管脚本不同,LocalCryptos 利用“OP_CHECKDATASIG”操作码,该操作码仅在比特币现金交易中可用。
普通用户不会注意到这种新托管类型之间的差异,因为结果几乎与 LocalCryptos 的 非托管 BTC 托管脚本相同。 然而,从程序员的角度来看,非托管比特币现金 P2SH 脚本更加简单直观,并且还具有一些优势。
与LocalCryptos上的所有托管一样,技术上无法将托管运用到BCH。 我们只会在发生付款纠纷时才介入,即便介入了,我们也只能允许卖家或者买家赎回BCH。 单击此处详细了解使这成为可能的加密魔法。
当然,您在LocalCryptos上的比特币现金钱包也是自我保管。 你的密钥—你的硬币。 开发人员可以在本公告底部查看我们带注释的比特币现金脚本模板。
与我们为其他加密货币开发的非托管脚本一样,我们的非托管比特币现金托管代码是开源的。
该脚本的工作方式类似于多签名比特币交易,不同之处在于相关各方无需就比特币现金输出的使用方式和时间达成一致。 与传统的多重签名钱包不同,预言机—根据实际交易情况可以是卖方、买方或仲裁员——没有能力为交易设置条件。
这是因为对于传统的多重签名钱包,各方必须签署包括所有输出和输入的完整交易,而对于使用OP_CHECKDATASIG
的非托管托管交易,预言机只需 需要给获胜者一个签名,他们可以随时使用该签名以他们选择的任何方式解锁BCH。
这种类型的链上托管机制使买卖双方可以在未经许可的情况下进行交易,仲裁员可以在发生付款纠纷时作为非托管调解人进行干预。
为了将比特币现金转移到托管中,卖家生成具有两个输出的交易。 一个输出是买家的托管,另一个是可退还的费用。 如果交易不成功,卖家可以要求退还费用。
一般在交易中,卖家会允许买家使用托管输出。 这不需要我们的干预哦。 同样,如果买家选择自行取消交易,卖家可以在没有我们帮助的情况下输出费用。 第一个场景是“释放”,第二个场景是“返回”。
如果发生纠纷时,仲裁员可以介入并充当调解员。 根据系统机制,仲裁员只能允许卖家或买方家支出。 费用脚本允许仲裁员在解除托管后收取费用,或者如果交易不成功卖家可以要求退款。
OP_DUP # 之后我们需要再次使用该字节
# 获取我们需要比较的散列公钥(我们的和预言机)
OP_1
OP_EQUAL
OP_IF
<hash160(SellerPubKey)> # Oracle 公钥
<hash160(BuyerPubKey)> # Spender 公钥
OP_ELSE
OP_DUP
OP_2 # = 从仲裁员处释放
OP_EQUAL
OP_IF
<hash160(ArbPubKey)> # Oracle 公钥
<hash160(BuyerPubKey)> # Spender 公钥
OP_ELSE
OP_DUP
OP_3 # = 买家退货
OP_EQUAL
OP_IF
<hash160(BuyerPubKey)> # Oracle 公钥
<hash160(SellerPubKey)> # Spender 公钥
OP_ELSE
OP_DUP
OP_4 # = 仲裁员返回
OP_EQUALVERIFY # 必须为真,否则消息未知
<hash160(ArbPubKey)> # Oracle 公钥
<hash160(SellerPubKey)> # Spender 公钥
OP_ENDIF
OP_ENDIF
OP_ENDIF
# 将散列的公钥放在 alt 堆栈上
OP_TOALTSTACK
OP_TOALTSTACK # 堆栈有效复位到输入
# 在 alt 堆栈上,我们有: [ hash160(SpenderPubKey), hash160(OraclePubKey) ]
<EscrowKey> # 将 nonce 附加到托管密钥以生成消息
OP_CAT # 堆栈是 [ ..., <OraclePubKey>, <0x01 || EscrowKey> ]
OP_SWAP # 稍后使用;首先验证oracle公钥哈希
OP_DUP
OP_HASH160
OP_FROMALTSTACK # 从 alt 堆栈中获取散列公钥
OP_EQUALVERIFY # 公钥签出;现在验证oracle签名
OP_CHECKDATASIGVERIFY # 现在验证发件人
OP_DUP
OP_HASH160
OP_FROMALTSTACK
OP_EQUALVERIFY
OP_CHECKSIG
这是交易的费用部分。 如果交易不成功,费用可以由卖家收回; 如果交易成功,LocalCryptos将收取输出费。
OP_DEPTH#计算堆栈大小
OP_2
OP_EQUAL#输入栈是否只有两项?
OP_IF#如果是,这是所有者收取的费用;简单的PKH
OP_DUP
OP_HASH160
<hash160(ArbPubKey)>
OP_EQUALVERIFY
OP_CHECKSIG
OP_ELSE # 卖家正在花费“退回”(即取消)托管
OP_DUP
OP_3 # = 买家退货
OP_EQUAL
OP_IF
<hash160(BuyerPubKey)> # Oracle 公钥
OP_ELSE
OP_DUP
OP_4 # = 仲裁员返回
OP_EQUALVERIFY # 必须为真,否则消息未知
<hash160(ArbPubKey)> # Oracle 公钥
OP_ENDIF
<hash160(SellerPubKey)> # Spender 公钥
# 将散列的公钥放在 alt 堆栈上
OP_TOALTSTACK
OP_TOALTSTACK # 堆栈有效复位到输入
# 在 alt 堆栈上,我们有: [ hash160(SpenderPubKey), hash160(OraclePubKey) ]
<EscrowKey> # 将 nonce 附加到托管密钥以生成消息
OP_CAT # 堆栈是 [ ..., <OraclePubKey>, <0x01 || EscrowKey> ]
OP_SWAP # 稍后使用;首先验证oracle公钥哈希
OP_DUP
OP_HASH160
OP_FROMALTSTACK # 从 alt 堆栈中获取散列公钥
OP_EQUALVERIFY # 公钥签出;现在验证oracle签名
OP_CHECKDATASIGVERIFY # 验证发件人
OP_DUP
OP_HASH160
OP_FROMALTSTACK
OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF
要花费托管输出,花费者必须在其比特币现金交易的scriptSig
中提供:
<Sig> <SpenderPubKey> <OracleSignature> <OraclePubKey> <ActionByte>
#例如: <Sig> <OwnPubkey> <SignatureFromSeller> <SellerPubKey> OP_1
<ActionByte>
是与正在执行的情况相对应的字节。 1
:卖家正在释放托管2
:仲裁员正在释放托管3
:买家正在释放托管4
:仲裁员正在退回托管<OraclePubKey>
是签署释放/返回消息的公钥。 1
: <OraclePubKey>
= <SellerPubKey>
2
: <OraclePubKey>
= <ArbPubKey>
(由LocalCryptos控制)3
: <OraclePubKey>
= <BuyerPubKey>
4
: <OraclePubKey>
= <ArbPubKey>
(由LocalCryptos控制)<OracleSignature>
是来自ECDSA(<ActionByte> || <EscrowKey>)
的预言机的签名。 <EscrowKey>
是唯一的,因此签名不能跨托管重复使用。<SpenderPubKey>
是买家的公钥(如果是释放),否则是卖家的公钥。<Sig>
是来自花费者的交易签名。