译者:本文是Contractland开发小组在ethresear论坛(以太坊核心开发人员聚集地)网站发表的技术帖,文中对Contractland采用的Terra-Bridge协议如何应用于以太坊和比特币的跨链价值传输进行详细的介绍。Terra-Bridge协议作为一种新型的中继模式跨链技术,具备非常高的完成度,对于稳定币、去中心交易以及衍生品意义非凡。
英文原文网址如下(打开稍慢):https://ethresear.ch/t/terra-bridge-protocol-for-interchain-token-transfers-between-ethereum-and-bitcoin/4522/5
背景
Terra-Bridge是以太坊和比特币之间的跨链传输协议。
目的
该提案的目的是建立一个以太坊和比特币之间无许可资产跨链交换的详细机制。
用例
以太网和比特币之间的跨链交换在以下领域非常有用:
l 稳定币:像BTC这样的以太坊外部资产可以使以太坊的稳定币使抵押品多样化。
l 去中心化交易:将以太坊外部资产跨链转移到以太坊从而扩大了可交易的资产。
l 金融衍生产品:基于区块链的资产交换为各种金融衍生产品开辟了上链可能性。
现有解决方案
该领域现有已经有一些解决方案,例如Parity桥,POA桥等,但这些解决方案并不是为了将资产带入以太坊而设计的,而是一些基于EVM的侧链的可扩展性的解决方案。因此,这些解决方案仅是限于许可授权的EVM < - > EVM传输架构。
BTC Relay是首次将外部资产(BTC)带入以太坊的尝试之一,但它的设计限制了它只有从BTC到以太坊的单向连接的能力,中续连接的成本和缺乏适当的激励使得该项目目前比较沉寂。
我们的桥的设计目标是:
l支持通证双向转移:桥应支持以太坊和比特币之间的双向资产转移。
l标准化接口:桥应遵循标准化接口,以便于集成。
l无许可:桥应该在分布式的安全模型下运行。
术语
本链:我们将外部资产以本链代币(例如以太坊)的形式转移到的链。
外链:我们将资产转移到本链的源链(例如比特币)。
桥:帮助本链和外链用户之间执行消息中继,验证和保留/释放资产的系统。
验证器:运行桥客户端的角色。类似于传统PoW链的矿工。
概要
桥是一种双向挂钩机制,通过验证器集合和两个桥合约(此处的“合约”指的是在链上的可执行逻辑)。桥合约同时位于本链和外链,这里被称为本链桥和外链桥。
桥合约必须能够接受和锁定资金,验证传入的跨链传输事务的加密签名,并在成功传输时将通证释放到用户地址。不同链上的两个桥之间的消息中继由桥验证器以拜占庭容错方式产生。
外链 - >本链跨链交换流程
1.用户将BTC存入外链桥。该事务包含让验证器能够中继传输的元数据:
lT - 转移金额
lR -本链的收件人地址
3.验证器(1到N)在外链桥上查询和查找新的传入事务,并使用以下参数将消息发送到本链桥进行中继传输:
lR - 本链的收件人地址
lT - 转移金额
lSIG - 转移交易的验证器签名
4.本链桥接收传入消息,验证验证器签名并跟踪从验证器收集的签名。当针对给定TX收集超过N / 2个验证器签名时,T量BTCT(以通证形式在以太坊上的BTC的挂钩版本)被转移到接收者。
本链 -> 外链 跨链传输流程
1.用户将BTCT存入本链桥。该事务包含验证器中继传输的元数据:
lT - 转移金额
lR - 收件人外链地址
2.验证器(1到N)侦听事件并在本链桥上查找新的传入事务,并将消息发送到本链桥,以使用以下参数收集批准传输的签名:
lR - 收件人外链地址
lT - 转移金额
lSIG - 验证者的签名(见证)将用于解锁外链桥上的资金
3.一旦收集到足够的签名(N / 2 + 1)并进行验证,本链桥发出事件,通知验证者传输已完全批准。最后一个验证器,用于将转移事务提交到外链桥接器以及收集的验证器签名。
4.外链桥接器接收传入的传输请求,验证收集的签名,并将T量BTC传输给接收者
跨链交易笔数
比特币 - >以太币:1个初始用户在比特币上请求交易传输 +(N/2+1)验证器传输在以太坊上中继交易。
以太坊 - >比特币:1个初始用户在以太坊上请求交易传输 +(N/2+1)签名收集交易在以太坊上+1转移中继交易在比特币上。
通过选择BFT共识机制,以及选择由一组在桥合约中存入抵押物多少所产生的利益相关者所组成的验证器,我们能够通过不经常变化且数量适度的验证器获得安全的共识。
任何存入通证作为抵押物的验证人将成为下一个区块的验证器。类似地,退出合同的任何验证器将在以下块中撤销其验证器状态。参与的验证人必须通过本链和外链桥合约中的存款进行注册。由于本链是以太坊,验证者的通证和更新是简单的。由于比特币的功能有限,外链的情况稍微复杂一些。
经N / 2 + 1验证器批准的任何转移请求都将最终确定。除非N / 2或更多验证器无响应,否则此过程将无限期地继续,在这种情况下,桥将停止。
只要攻击者控制的验证器池少于51%,该桥就是安全的。
验证器通过转发转账获取转账费用来激励其保持在线并为桥的安全做贡献。对于每个中继传输消息,中继验证器将获得相应跨链转账费的一部分作为激励。同时,为了防止验证器脱机而不撤销其验证器状态(即撤回其抵押物),将采用削减机制,即如果验证者未能为转账消息执行转发,他其存入的部分抵押物将被削减。
桥的加密经济安全模型基于大多数(N/2+1)的验证器的诚实行为。这也为削减条件奠定了基础。鉴于我们收集验证器签名以便在桥的两个方向上进行传输,我们能够在本链桥上识别哪些验证器错过了参与特定交叉链传输的中继。一个简单的削减条件就可以惩罚那些在某个单位时间T(可能是块号,转移号等)之后已经收集了超过N/2+1个签名的转移而未能提交签名的验证者。
这意味着我们不会尝试从削减角度区分诚实或恶意验证器,而是假设大多数验证器都是诚实的。由于验证器的默认行为是中继所有传输,因此验证器是在经济地合乎需要地保持在线并且不偏离本职工作。
本链(以太坊)桥实施
本链桥将以Solidity编写并在EVM上运行。
本链桥将具有以下接口:
· transferToForeign(string recipient, uint amount)
事件:
· TransferToForeign (string recipient, uint256 value)
Dapps或合约可以调用函数transferToForeign将其BTC从本链桥撤回到提供的BTC地址,并收听TransferToForeign以获取传输结果。
本链通证
在本链上使用的挂钩通证代表外链通证,本链通证将是可铸的和可燃烧的 ERC20通证。 可铸的和可燃烧的属性允许开发者轻松管理挂钩通证。它可以转移到本链桥并在转出(到外链)时被燃烧,并在转移输入(来自外链)时创建并发送给接收者。
可用于从外链桥传输BTC的选择支出
用比特币用语称为:产出支出。在我们的例子中,支出-是指向外链桥输出的其中一笔比特币交易。要向收款人汇款,验证人必须就要在交易产出达成一致并签名。这些签名称为见证人,必须通过呼叫submitSignature(message, witness)将其推送到本链桥。当本链桥监控外桥上的所有传入和传出传输转换时,它可以确定可用于为给定传输消息花费的支出。
lmessage是需要被作为提款请求的标识符。它由以下变量组成:
· recipient 收款人地址
· value交易额
· transactionHash被用户调用 transferToForeign 后产生的交易
要获取见证验证程序,必须使用以下参数创建一个事务:
· inputs是一个数组:
[
{
'txid': txOutput['txid'],
'vout': txOutput['vout']
}
]
· outputs是一个数组:
[
{
recipientAddress: amountToSend
},
{
foreignBridgeAddress: change
},
{
rewardsMultisigAddress: validatorReward
}
]
创建无签名事务的一种可能方法是执行bitcoind rpc方法: createrawtransaction(inputs, outputs). 然后,此事务必须使用验证程序的私钥进行签名。签署traqnsaction的可能方法是使用bitcoind rpc方法: signrawtransactionwithkey(unsigned, [validatorPrivateKey], prevTxs).prevTxs是一系列将用于支出的交易数组。 signrawtransaction返回带有见证的事务。该证人必须在本链桥中的submitSignature(message, witness)方法中提交。
作为transferToForeign请求的一部分,桥合约需要能够验证从桥验证器收集的比特币交易签名(见证人)。幸运的是,我们可以在Solidity中使用ecrecover函数来实现这一点,因为以太坊和比特币都使用相同的椭圆曲线数字签名算法(ECDSA)进行签名。 ecrecover返回以太坊地址,但提供的签名是通过比特币创建的,因此为了验证签名,我们需要比较ecrecover返回的以太坊地址和验证器的比特币地址。比特币和以太坊地址之间存在巨大差异。为了进行验证,本链桥需要存储验证器公钥并从中导出以太坊地址。
见证人传递给ecrecover需要做的其他准备工作分为3部分(v,r,s),如Solidity文档中所述:
function parseWitness(witness) {
signature = bip66.decode(witness);
return {
r: signature.slice(0, 32),
s: signature.slice(32)
};
}
比特币见证人不包含v标量。v是必要的来识别恢复公钥的椭圆曲线部分,因此我们可以理清两种可能的变体:v = 0x1B或v = 0x1C。
外链(比特币)桥实施
使用多重签名地址实现比特币上的外链桥。我们可以根据BIP-13使用M-of-N P2SH多重签名地址来实现这一点。比特币参考实现已经有了将P2SH兑换脚本限制为最多520字节的验证规则,这意味着所有公钥的长度加上公钥的数量必须不是此字节限制。对于压缩公钥,这意味着最多N = 15。
根据BIP-16的兑换脚本可以使用以下格式的OP_CHECKMULTISIG操作码构造:
[M pubkey-1 pubkey-2 ... pubkey-N OP_CHECKMULTISIG]
<pubkey1> OP_CHECKSIG
OP_SWAP <pubkey2> OP_CHECKSIG OP_ADD
OP_SWAP <pubkey3> OP_CHECKSIG OP_ADD
...
OP_SWAP <pubkey67> OP_CHECKSIG OP_ADD
<m> OP_NUMEQUALVERIFY
用户可以使用任何支持Segwit的比特币钱包将BTC传输到multisig地址。
比特币面临的挑战是如何通过轮换验证器集安全地控制沉淀资金。这是通过在现有验证人之间达成共识来完成的,以便完全创建并将资金转移到新的多从签名multisig。当新验证器加入或现有验证器退出时。创建了一个新的multisig。现有的验证器集合达到共识(N / 2 + 1)以将资金转移到新的multisig地址。
在未来,我们还可以为单一货币支持多个桥对,以提高安全性。
鸣谢
鸣谢 合约大陆基金会 以及 @KiriKiri对该协议的研究和开发。
(以下为论坛开发者的讨论和互动)
评论1:
这个提议似乎与伦敦帝国理工学院的A. Zamyatin和D. Harz正在做的类似。他们在Bitcoin Scaling 2018会议上提出了类似的框架 - 请参阅视频6和论文6。
如果您之前没有看过,我希望视频/论文很有趣。
视频:https://www.youtube.com/watch?v=FI9cwksTrQs&feature=youtu.be&t=6410
论文:https://eprint.iacr.org/2018/643
评论2:
你怎么能识别这个?如果超过50%的签名被证明你会削减其他验证器?有超时吗?如何区分“所有验证器离线”和“没有转移请求”?
网友评论