双重授权-路印协议针对抢先交易的解决方案路印协议是构建去中心化交易网络的协议。在本文中,我们将简要论述一下去中心化交易网络中存在的抢先交易问题,并详细说明针对这个问题我们的解决方案-双重授权(Dual Authoring)。
我们的创始人王东通过研究,设计了一个解决抢先交易问题的增强解决方案,叫做双重授权(Dual Authoring)。我们已为Dual Authoring申请了专利,并将解决方案编入我们的智能合约。该功能将在路印协议v1.2版本中部署。我们相信Dual Authoring将为我们带来非常好的竞争优势。
去中心化交易所中的抢先交易
“抢先交易是是股票经纪人的一种非法行为,他们预先知道客户的未成交订单信息,利用这一点通过自己的账户执行订单交易从中获利。”[维基百科]
在去中心化交易中,抢先交易指有人试图撮合未成交交易池(mempool)已外的交易,可以通过指定较高的交易费用(油费)来实现。如果抢先交易者恰好是矿工,他为了谋取利益可以发送不正当的未成交交易订单。
在路印协议中存在的抢先交易(以及订单撮合的交易协议)主要为订单偷窃和环路偷窃。订单偷窃:抢先交易者从未成交的环路撮合交易中偷取一个或多个订单;环路偷窃:抢先交易者从未成交交易中偷取整个环路的订单。
值得一提的是,路印协议默认的撮合引擎不保证先到先得的服务(相反,它使用的是场外交易模式),即订单的时间戳会被完全忽略。这也就意味着,对订单的抢先交易不会影响该交易的实际价格 — 路印协议仅支持限价定单。
路印协议1.0 & 1.1中订单和环路分析
订单和签名
路印协议中的订单由管理用户私钥的钱包和工具创建。订单是JSON片段,并通过API以JSON payload的形式传输给中继。以下是路印协议1.0版本中的订单示例:

owner字段代表,订单成交后代币会被发送到的owner_address。订单(包括owner_address)必须使用owner_address的私钥进行签名。仅当order_signature(由r,v和s表示)有效时,订单才是有效。如下图所示,order_signature实际上是对订单哈希(order_hash)的签名,它是除r,v和s之外所有其他字段的keccak256函数输出。

计算order_hash很简单,用它可以验证签名地址是否确实是订单的owner_address。中继将验证接收到的每个订单签名; 订单符合以下两种情况时,路印协议智能合约同样会验证订单签名,1)订单是一个环路的一部分,2)取消订单时。
环路和签名
环路不采用JSON格式,它们由路印协议submitRing函数的所有参数表示。 但是如果我们想象一个环路的样子,它会看起来像下面的图 — 一个环路会封存这个环路上所有的订单数据(一个环路可以有2到10个订单)。同时,环路矿工也会将矿工地址(miner_address)和其他挖矿参数(或环路参数)存到环路中,根据这些输入的参数,submitRing函数会给出相应的计算。
矿工需要使用miner_address的私钥对环路哈希(ring_hash)和所有挖矿参数进行签名。ring_hash可以通过对所有order_hash的XOR运算得出结果或使用其他哈希计算函数。

请注意路印协议不需要msg.sender(信息发送者)进行任何签名。换句话说,环路 — 作为submitRing交易的有效载荷 — 可以通过挖矿地址签名,而区块链交易本身可以通过一个不同的交易地址签名(并广播)。采矿地址和交易地址的分离提供了更好的灵活性和安全优势。
下图说明了3个订单环路的submitRing交易的有效载荷(或参数)。

为什么矿工需要环路签名? 我们需要确保为矿工正确计算/更新所有交易数据。 流动性共享联盟链上的联盟成员可以使用这些数据计算每个成员的订单生成和消费以巩固联盟成员间的有效支付。
抢先交易和环路偷窃
正如上面所描述,当submitRing交易没有被确认并且仍然在未成交交易池中时,这样的交易很容易被人发现,环路偷窃者可以把自己的地址(filcher_address)替换成miner_address对payload重新签名,接着filcher_address就取代了环路签名。环路偷窃者可以对提交的订单设置更高的油费,这样更容易吸引矿工优先撮合他提交的订单,而不是原来的submitRing交易。

路印协议1.0 和 1.1中的解决方案
在路印协议v1.0和v1.1版本中,我们允许环路矿工在提交实际环路订单前,调用batchSubmitRinghash或submitRinghash函数来保留环哈希。当一个环路被提交时,路印协议会检查环路的哈希是否已经被其它矿工提交/保留,如果是,协议会拒绝环路请求,submitRing交易会失败。
但这个解决方案有一些缺点:它需要更多的交易支持,因此矿工会消耗更多的油费,同时撮合一个环路要花费至少双倍的区块时间。
双重授权 — 我们的新解决方案
我们的新解决方案包括为订单设置两个级别的授权机制:一个用于结算,另一个用于挖矿。 我们称之为“双重授权”(Dual Authoring)。
工作原理
双重授权如何工作:
- 对于每个订单,钱包软件将生成随机的公钥/私钥对,并将密钥对加入订单的JSON片段中。(另一种方法是使用公钥派生的地址代替公钥本身,以减小字节大小,我们使用auth_address来表示这样一个派生地址,auth_private_key表示auth_addres的配对私钥)。
- 订单中除auth_private_key以外所有的字段都使用owner_address的私钥(不是auth_private_key)进行签名,如下图所示。

- 钱包会将订单和auth_private_key一起发送给矿工(中继)进行撮合。矿工将验证auth_private_key和auth_address是否正确配对,且订单的签名对owner_address有效。
- 当矿工发现一个新提交的环路时,矿工将使用每个订单的auth_private_key对ring_hash、miner_address和所有mining_parameters进行签名。下面的例子中,一个环路包含三个订单,因此3个auth_private_keys产生3个签名,我们称这些签名为auth_signature。 与路印协议v1.0和v1.1方式相同,矿工还需要使用miner_address的私钥对ring_hash及所有挖矿参数进行签名。

- 矿工使用路印协议v1.0和v1.1中的所有参数和上面的3个auth_signatures调用submitRing函数。请注意,auth_private_keys不是链上交易的一部分,因此除中继本身没有任何人知道,如下图所示。

- 路印协议现在会对每个订单相应的auth_address验证其auth_signature,如果发现任何无效的auth_signature,就会拒绝该环路的交易。
为什么这种技术可以防止抢先交易?
除非偷窃者拥有一个环路所有订单的auth_private_keys,否则他无法窃取这个环路的任何信息。原因如下:
- 订单的签名(通过owner_address的私钥签署)保证订单和auth_address不被修改。
- 矿工的签名(由miner_address的私钥签署)保证没有人可以窃取他/她的身份进行环路撮合。
- auth_signature保证整个环路都不能被篡改,包括miner_address。 由于环路偷窃者无权访问auth_private_keys,因此无法重新生成一组新的auth_signatures,也就无法完成一个窃取交易。
双重授权的一些变体
部分双重授权
双重授权Dual Authoring需要环路中所有auth_private_keys的签名。双重授权的一个变体是仅需要确认一个或几个auth_signatures。这种部分双重授权方案同样可以保证整个环路不被盗取,但仍然面临订单偷窃的风险。订单窃取者可以在另外一个部分双重授权的环路撮合交易中使用已经窃取的订单,这种条件下并不需要提供已窃取订单的auth_private_key。
密钥共享双重授权
中继可以生成auth_address / auth_private_key配对,并要求所有连接到它的钱包对所有订单使用相同的共享auth_address(因为钱包没有auth_private_key,订单的JSON API payload中将没有这个字段)。这个密钥共享双重授权方案仅允许中继对它生成的auth_address / auth_private_key对应的订单进行撮合。因此,钱包不能与其他中继共享订单。
总结
路印协议的双重授权(Dual Authoring) 解决方案可以防止环路偷窃和订单偷窃,同时确保环路结算在一个交易事物中完成。另外,双重授权(Dual Authoring)还为中继的订单共享提供了两种方式:不匹配共享和可匹配共享。如果您对双重授权(Dual Authoring)有任何疑问或建议,请随时直接向路印协议发邮件。
获取路印协议更多最新的动态,请访问我们的社区帐号:
⭑ Twitter: twitter.com/loopringorg
⭑ Reddit: reddit.com/r/loopringorg
⭑ Telegram: t.me/loopring_en
⭑ Telegram: t.me/loopringfans (中文)