Qtum量子链联合创始人Jordan Earls发表技术提案:支持免费生成UTXO
Qtum量子链联合创始人兼首席开发工程师Jordan Earls近日在海外媒体上发布名为:关于在Qtum量子链上支持免费生成UTXO的提案——此技术提案将会帮助全球DAPP用户在不持有token的情况下也能使用DApp服务,吸引更多用户体验去中心化应用,不再被手续费所束缚。
proposal to allow free utxo creation in Qtum 以下为完整译文
这个超棒的想法从何而来呢?
Qtum采用UTXO模型在使用上有一个明显的限制,即用户在链上发起任何行为都必须先获取UTXO。UTXO的获取并不困难,它可以是大于0的任意值,在用户无法免费生成UTXO的情况下,UTXO的获得方式为:
- 网络中的矿工在挖矿交易中把刚获得的UTXO赠送给你;
- 用户在交易过程中附赠你若干satoshi(QTUM的最小计量单位)。
智能合约通过发起一笔交易来检查是否花费了UTXO,这种方法不但看起来浪费,更大的限制在于——在没有UTXO的情况下,即使有用户代为付费也无法验证智能合约。
类似问题也会在其他情况下出现,比如你的钱包有多个地址,每个地址都有自己的一组UTXO,对于区块链来说,无法识别这些地址属于同一个钱包,如果用户选择将QRC20 Token发送到某个特定地址,但随后发现该地址没有UTXO时,用户将无法使用QRC20 Token,因为他无法向合约证明他就是该地址的拥有者。对于这个问题的官方解决方案是,向这个特定地址发送任意数量的Qtum(甚至仅仅是一个satoshi),证明拥有UTXO,那么用户就可以自由提取QRC20代币或其他东西。
但是这种做法不但浪费了宝贵的UTXO集合的存储空间,还提高了使用门槛。DApp开发团队、DApp用户、Qtum用户,甚至我自己都意识到这个问题,这无疑是Qtum及其DApp被广泛使用的一大阻碍。
针对上述问题,我的提议是在比特币的基础上进行扩展(虽然还没有100%验证可行性)。在比特币(以及如今的Qtum)网络中,用户如要在区块链上验证签名,他们必须指定一个TXID和vout值,以指出他们将支出哪一笔UTXO,然后添加签名来解锁该UTXO的vout脚本。
有没有其他方法来验证公钥和签名呢?
我的提议:允许TXID和vout都为0,但使其在其他方面是无限可使用的。为了防止可能出现的重复的交易验证,所有完整的交易必须包含至少一个TXID不为0的vin。
使用SIGHASH_ANYONECANPAY可能是非常不明智的,因为使用该方法创建的输入可以在任何交易中不受限制地使用(比如重复使用)。这不会对区块链构成什么实质性的威胁,但对于没有实际用途的用户来说可能是一个巨大的安全漏洞。
因此,在使用该功能时,SIGHASH_ANYONECANPAY很可能被禁止。为了提高安全姓,可能需要只对SIGHASH_ALL(默认)签名方案作允许。否则,任何对交易有深刻了解的人都有能力对交易进行篡改,例如执行另一个智能合约并消耗QRC20余额。
理论上如果允许的话,不引入新的操作码的做法目前对比特币或Qtum区块链都不会产生什么不良影响。
Qtum将通过扩展帐户抽象层来实现这个功能,这样它就可以运行这些没有实际作用的vin脚本。它可以验证模式匹配,从而可以将P2SH或PUBKEYHASH脚本识别并分类为地址,当然还可以将其作为正常脚本执行以验证签名。因此,可以使用区块链中从未使用过的地址,构造一个使用并验证该地址的vin,但不指向UTXO。理论上,这有许多用途。用户可以使用没有UTXO的P2SH/Multisig地址,从合约中发送消息,甚至使用Segwit地址。
模式匹配可能是目前最困难实现的,实际上这可能需要额外的操作代码来简化。操作码可以是OP_VOUTBEGINSHERE之类的仅作为模式匹配的标记。
实际案例
一个用户如果想要使用DApp但是之前从未使用过Qtum,那么在使用DApp之前,他们必须在区块链上注册一个账户。DApp维护人员拥有一个链下注册门户,允许用户在DApp上免费注册。
现如今这是由DApp的维护人员支付链上注册的gas费用来完成的,若实现我的提议,进行优化,那么我们可以实现真正的免费注册。
新用户必须有UTXO以证明其身份并完成注册。他们实际上并不需要任何资金,但要想证明某个地址的所有权,唯一的办法就是花钱购买UTXO。在本提案实现后,用户就有可能只用他们的公钥/私钥从零开始创建UTXO。
实际的工作流程是,用户可通过链下注册,证明他们值得DApp网站支付他们的gas费用。然后用户将他们的地址发送给DApp站点,接着DApp站点会向用户发送一个部分完成的交易,其组成如下:
输入:从TXID 0创建用户地址UTXO。此时还是未签名的。这是第一个输入,因此合约代码中的msg.sender对应用户地址
输入:DApp用于支付的UTXO;它是已签名的并标记为SIGHASH_ALL
输出:DApp合约执行过程中进行链上注册等工作。由DApp选择既定的gas费用。
输出:将剩余资金发送回DApp的找零地址UTXO
用户将收到该交易并验证它是否如预期的那样。他们会检查DApp合约输出是否仅仅只是做注册用,同时还将确保除了找零地址UTXO之外没有向交易添加其他额外的输出(将验证该输出以确保不存在隐藏合约的执行)。
一旦用户确定该交易是安全的,用户将对其第一个输入进行签名,并使用SIGHASH_ALL签名方案来确保不会对交易进行任何篡改。然后,用户将该交易广播到区块链(如果用户并未运行节点,则将交易交给DApp站点广播)。
一旦交易被执行并确认,用户的地址将在DApp链上完成注册,即使该地址从未实际收到过Qtum或是在区块链上有任何记录。
打破UTXO的限制究竟有什么意义
现在许多基于身份验证提供服务的DApp都在试图解决这个问题。
用户可能会使用比特币、信用卡或其他一些链下付款方式向DApp进行注册付款(以获取服务),但如果DApp将Qtum(或ETH)发送给该用户作为支付gas费用的补贴,对用户来说这笔QTUM在使用上是没有任何限制的。
用户可以将这笔QTUM直接提现,或是用于运行其它与该DApp不相关的智能合约,这就违背了DApp为用户提供服务的初衷,实际上演变成了代币与法币的兑换操作。
由于在大多数国家/地区将法币兑换为加密货币都有许多监管规定,DApp可能会遇到严重的法律问题,例如汇款许可等等。
通过这种方法,可以很好的解决上述问题,使DApp支付的QTUM仅可用于支付特定智能合约调用的gas费用。 因此,(顺便说一下,我不是律师,不要将此作为法律建议)该提案提供了一种在法律允许的条件下用法币支付特定链上交易手续费的解决方案。
另一个更简单的应用场景是QRC20 Token的发行方代付收发Token的gas费用。在实际应用场景中,用户可能并不持有QTUM币,但却想使用Qtum区块链上的DApps,这时就需要这种代付交易手续费的机制。
虽然在Qtum和以太坊中有各种针对这一问题的解决方案,但它们都不够完美,有诸多限制。这项提案只是第一步,未来可能还需要更多的工作使这一切成为现实。