本文章介绍了基于Emercoin加密货币的大规模微支付子系统Randpay,强调其在无信任环境下的支付聚合机制。Randpay使用随机抽样支付的方法,通过创建“彩票”交易,显著减少了区块链上记录的交易数量,从而降低了微支付的成本和区块链的膨胀压力。文章还详细介绍了Randpay与Lightning Network的比较及其优缺点,提供了实现该机制所需的算法和接口。
本文描述了一种基于零信任彩票协议的支付聚合系统。我们展示了它在每年达到万亿级交易量的大规模结算中的适用性。在该协议下,支付接收方创建一个唯一的支付地址,并定义一个包含该地址的可能支付地址空间。付款方从指定空间中选择一个随机地址,创建一个付款交易到所选地址,然后将交易发送给支付接收方。如果收到的交易中指定的地址与先前创建的地址匹配,接收方会签署该交易并将其发布到区块链上,付款即被转移。如果地址不匹配,交易将被视为无效,并被忽略。在典型的Randpay场景中,每个“彩票”实例中支付的可能性不大。但由于此类实例的数量很高,所有参与者的余额将会以公平的方式更新。本文提供了一个数学模型,证明对于所有参与者,Randpay在统计上将趋向于他们在未使用此子系统的情况下该收到或发送的公平金额。此外,Randpay降低了付款方的交易成本,使其经济上可行,尤其适用于小额支付。
基于区块链的去中心化支付系统越来越受欢迎。乐观主义者和加密货币爱好者甚至认为,所有银行系统将很快变得过时,因为企业将使用比特币或其他加密货币进行直接结算。但是,由于其架构的原因,区块链系统在扩展性上存在根本性的限制,因为区块链必须包含所有曾经发生的交易。以电信行业为例,你可以轻松计算出,如果每个电话通话都以结算结束,那么在全球电信行业,每年200字节的交易量 — 通常更多 — 以及20万亿个电话通话,区块链每年将增长400TB。这显然是不可接受的。确实存在减少交易大小的机制。例如,Segwit几乎将交易大小减少了一半。但即使是每年200TB而非400TB,仍然对电信行业 — 如果每个电话都要付费 — 和其他需要大规模支付的领域造成无法逾越的障碍。
即使在今天,在加密货币支付远未普及的时代,主流的加密货币区块链已占用数百GB,维护一个完整的加密货币节点变得相当昂贵。想象一下,当加密货币支付开始大规模发生时会发生什么。
此外,这种分布式系统的每个节点实时接收所有网络参与者的所有交易。在大量交易流的情况下,这可能导致网络带宽问题。
我们不能说这个问题被加密货币开发者忽视。我们时不时会看到一些声明,称某种加密货币将在未来“与VISA相媲美的带宽”或关于分片的想法,即在参与者之间分割区块链数据库。但我们还没有见到任何实际上有效的原型。无论如何,我们祝愿这些开发者能够成功实现他们的承诺。
就我们而言,这里将重点关注已经存在、可以应用的解决方案。
我们提出一个现实的系统,通过聚合解决扩展性问题,即用少量最终支付替代大量小额支付,这些支付将被纳入区块链。此外,通过聚合,只需对聚合后的交易支付交易费用。换句话说,聚合不仅使支付系统具有可扩展性,还降低了每笔支付的交易成本。
闪电网络支付聚合系统构成一个通过支付通道连接的代理网络。两个代理可以通过将他们的币绑定到“开放通道交易”以创建一个通道。在仅彼此之间进行的支付后,他们通过将“关闭通道交易”发送到区块链来关闭该通道。因此,整个通道生命周期中只创建了两笔区块链交易(打开通道和关闭通道),而支付是在代理之间直接进行,不影响区块链网络。这种系统有其优点和缺点:
因此,闪电网络在目的和结构上类似于支付处理系统,如VISA/Mastercard,但它绑定普通的加密货币持有者,而不是银行。
Randpay支付聚合系统采用基于Ron Rivest(RC4、RSA及其他加密系统的创造者)提出的“彩票支付”理念的概率方法。
该思路是,不是以100%的概率把支付交易记录在区块链上,而是发行一张“彩票”,只有在付款方“输”而收款方“赢”的时候才会被记录到区块链上。在后者的情况下,只有中奖的彩票会作为交易发送到区块链。“空白”票不会被记录在区块链上,可以被丢弃。同时,对于每次彩票支付行为所转移的金额的期望值等于用常规支付交易发送的金额。使用这种方法,付款(针对中奖票)数量会相对较大,但支付本身记录在区块链上的频率要低得多。
假设你必须为电信服务每分钟支付$0.01。但是,交易成本和加密货币的限制使得这样的支付无利可图或者在大金额的情况下甚至不可能。使用彩票方法,客户(付款方)支付一个更高的金额 — 比如$100 — 但概率为1/10000。因此,平均每次支付行为为每分钟$0.01。
换句话说,客户(付款方)玩的是一种有9999个空位和一个带支付的手枪的俄罗斯轮盘。在一次支付行为中,如果没有触发支付(发生9999次中的10000次),客户“获胜”,并且获得了免费的一分钟服务。如果支付被触发(概率为1/10000),服务器(服务/产品提供者)获胜,$100的交易记录在区块链上。
因此,会有客户完全免费获得会话的情况以及他们为一分钟支付过多的情况。但是平均而言,如果客户定期使用服务 — 不一定来自同一供应商 — 支付金额接近公平价值,即真实每分钟支付的金额。与此同时,实际交易数量减少了99.99%(在此示例中),相应地降低了交易成本。
因此,在上述参数下,在电信系统中使用Randpay每年将只增长区块链的40GB,对于20万亿的电话。这个数量并不小,但对于实际使用来说是相当可接受的。增加聚合因子(例如,当每分钟的价格低于$0.01时)还可以进一步减少区块链的膨胀。这可以与其他对抗区块链膨胀的方法结合使用,例如Segwit和交易优化。
显然,由于Randpay支付过程的随机性,支付接收方实际收到的金额将等于中奖的彩票总和。这个总和将不同于如果每分钟都进行实际支付时应该收到的公平金额。但是,随着服务的提供,所收到的金额将线性增长,而偏差会以平方根形式增长。换句话说,随着服务的积极使用,相对误差将接近于零。如果需要,你可以在会计文件中记录这一不准确之处作为“意外运营开支”,或简单地指定实际金额。
让我们考虑一下Randpay系统与闪电网络相比的优缺点:
虽然Randpay协议在设计上是原创的,但它源于两个已知的密码学协议:
在Randpay协议中,服务器(收款方)给客户一个“挑战”,客户必须提供一个解决方案。该协议不依赖于客户和服务器之间的信任,挑战是选择一个地址。该协议使用以下算法:
有趣的是,在Randpay中,付款方通过选择收款方不拥有的地址(即猜错)而受益,而在经典的CHAP方案中,客户则试图给出正确答案(即正确猜测)。
从数学上讲,收款方通过在地址空间中均匀分布中奖地址获得最大收益,而付款方通过从提出的空间中选择均匀随机地址获得最大收益。在此情况下,平均支付金额等于数学期望,即公平。如果任何一方尝试以任何方式操控分布,它会使另一方生成一个利用这种操控的对策。例如,如果收款方在步骤1中总是创建偶数地址,则付款方可以发现(或假设)这一点,并在步骤3中总是选择奇数地址,从而永远不必付款。付款方试图以某种方式“优化”他们的猜测也是如此。在这种情况下,收款方可以提出一个特殊的难题,使付款方尽可能频繁地猜对。因此,当双方遵循协议中指定的均匀分布时,就达到了纳什均衡,如果任何一方试图操控分布,这不仅是无用的,而且可能对操控方造成损害。
其他欺诈手段,如减少交易金额、不签署交易、UTXO双重支付或使用指定空间外的地址,均可被轻松检测,收款方可以停止为这种欺诈客户提供服务。
上述简单算法是可行的,但它有一个严重的缺陷,使得在实践中几乎无法应用。缺陷在于收款方可能以非合作方式行为,在步骤5中始终将交易发送到区块链,无论付款方是否猜测了地址。请注意,收款方将无法使用交易中的资金,因为无论是他们还是其他人都没有用于消费的私钥。在这种情况下,资金将永远丢失。换句话说,非合作的收款方无法私自占有资金,但可以通过破坏付款方的资金,让他们损失,即使这些钱对他们没有用处。
真实算法在总体上与简单算法相似,但包含了一个机制,阻止收款方像上述描述那样表现出非合作行为。其思路是让收款方证明他们拥有支付地址的私钥,即付款方已从挑战中猜对了实际地址。其工作原理如下:
区块链的UTXO集合具有一个特殊的虚构输出编号0,来自一个不存在的交易,其中TXID=ECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECEC。
这个特殊的输出,从此称为RandpayUTXO,具有以下属性:
当付款方在步骤3中创建Randpay交易时,他们将多添加一个虚构的RandpayUTXO expenditure到vin输入数组,即他们添加randpay-in输入。通过这样做,付款方签署所有交易输入,除了这一项。如果收款方能够签名,这将在其后进行。付款方将待猜的支付地址放在待创建交易的vout[0]中。
如果收款方收到一笔中奖交易(付款方猜对了地址),则必须用他们打算接收资金的地址的私钥签署他们的randpay-in,即在vout[0]中指定的地址。收款方从而证明他们拥有vout[0]地址的私钥并有权接收付款,即在区块链上发布交易。
如果付款方没有猜对地址,收款方将无法签署randpay-in,因为他们没有vout[0]的私钥。区块链根本不会接受未签署的交易。因此,收款方只能忽略该交易,并无法对付款方造成伤害。
与闪电网络和其他支付系统不同,Randpay具有一个额外的自由度——聚合系数。它决定了多少笔支付被卷入/组合成一笔最终的真实支付交易并发送到区块链。在上述示例中,聚合系数为10,000。换句话说,10,000笔平均为$0.01的支付被卷入一笔$100的交易(我们称之为amount)。因此,它也是实际交易金额的增长次数。我们将这个聚合系数称为risk,因为它乘以付款方在Randpay支付行为中承担的风险。因此,在我们的示例中,付款方以risk的逆概率承担$100的风险:
因此,单次支付的期望值为:
让我们简化模型,假设系列中所有交易的参数为(p, amount)。我们之所以可以这样做,是因为Randpay支付是相互独立的,并且可以根据这些参数分组,然后我们可以分别对每个组应用以下内容。
由于Randpay支付序列遵循二项分布,系列中的一组统计显著的支付n可以近似为正态分布:
期望为:
方差为:
其中:
然后,所支付/收到金额的实际标准差(误差)与公平金额相比为:
相对误差(偏差与n笔支付时支付金额之比)为:
可以清楚地看到,当n接近无穷大时,相对误差接近于零:
换句话说,Randpay使用的时间越长,平均支付金额越接近经典支付中每笔交易会去区块链的金额。在Randpay中,并不是每笔交易都去区块链,因此它的增长速度是risk倍慢,相应地降低了实际交易成本:
似乎通过增加risk,我们可以轻松地几乎无限制地提高系统的效率,因为随着风险增加,区块链的通货膨胀和交易成本都减少。但是,增加risk会自动导致amount的增加和交易数量的减少。这可能是一个问题:
换句话说,系统以付款方愿意冒的amount限制风险增加的额度。有趣的是,系统并不限制其下移,这意味着它几乎可以无限地为纳米支付增加risk参数。例如,你可以想象一家以每个报价$0.00000001的价格出售当前股票报价信息的企业。或者为某些问题提供AI回答。或者新闻文章、数据库样本等。这使得在其他支付系统中由于与支付金额相比交易成本过高而无法实现的盈利商业模式成为可能。
这里考虑的一般协议是对付款方与收款方交互的建议。具体实现取决于使用此或类似协议的系统的开发者。我们强调,这些建议适用于代理之间的交互,而不是代理与Emer节点之间的交互。后者将在下面的Randpay API规范中讨论。
客户(付款方)向服务器(收款方)发送此请求,以通知他们希望以amount的金额进行Randpay支付,触发概率为p = 1 / risk。因此,单次支付的实际平均金额为amount / risk。例如,WANTPAY(100, 100000)意味着客户愿意以1/100,000的概率支付100 EMC,因此平均支付将是0.001 EMC。客户根据他们钱包中可用的钱和他们愿意承担相应大额支付的风险来确定金额和概率。整体上,增加风险参数对客户是有利的,因为它减少了交易费用的百分比。另一方面,他们受到“彩票”期间将被锁定的资金金额和支付这笔金额的风险的限制。
2. NEEDPAY(double amount, uint32_t risk, char [] addrchap)
服务器通过发送此响应来WANTPAY,通知希望以amount的金额,概率为p = 1 / risk进行支付,并提供给客户猜测地址的空间,基于(风险,addrchap)对。服务器传递给客户的(amount,risk)参数可能与客户在WANTPAY中提出的原参数不同。这可能发生在服务器认为金额太大且概率太低(风险过高),或如果他们不喜欢平均支付金额或其他原因。
3. PAYMENT(uint32_t risk, char[] rawtx)
客户向服务器发送满足NEEDPAY要求的Randpay交易。服务器将其发送到钱包进行验证,如果钱包批准(未检测到欺诈,金额充足),则向客户提供产品或服务。如果客户猜对了地址(以p = 1 / risk的概率),那么钱包会自动签署交易并将其发布到Emercoin区块链。
此API是Emercoin JSON/HTTP API的扩展,并允许Emer节点生成和处理Randpay交易。应用程序可以使用此API与Emer节点交互以进行或接收支付。如果API方法按预期工作,它们将返回以下指定的值。在输入不正确、欺诈尝试或运行时错误的情况下,返回标准错误代码及随附的文本消息。
此Emer节点方法由收款方调用,为付款方创建一个risk大小的可能地址空间。该结果在NEEDPAY协议步骤中使用。
它为指定的risk创建一对私钥/公钥,并根据公钥形成提供给付款方的“原始”地址的addrchap空间:
它不会对钱包(wallet.dat)或区块链做出任何更改,但在RAM中保留以下对:
addrchap -> Privkey
以供在timeout秒后收款方在randpay_submittx调用中接收Randpay付款时使用。
返回值:
收款方在NEEDPAY步骤中将生成的addrchap传递给付款方。
付款方调用此方法以创建一笔金额为amount的交易(彩票票据)至从addrchap随机生成的收款方地址。该交易中使用的输入在timeout(通常约为30-60)秒内被锁定。锁定是指这些UTXO在timeout秒内将无法在同一钱包中用于其他支付。服务器必须在此时间内完成支付并排走这些资金,否则资金将可用于其他支付。可选的naive参数使得可以利用早前描述过的简单Randpay交易。在这种情况下,交易较短一个输入。简单Randpay交易在调试中有用,或者如果付款方对收款方的合作行为感到自信。
算法:
uint160 pay_addr = risk * addrchap + GetRand(risk);
返回值:
此方法的结果是Randpay支付交易(彩票票据),付款方在PAYMENT步骤中将其发送给收款方。
在这里,收款方的节点首先验证Randpay交易,然后通过将付款方的地址与之前存储的addrchap -> Privkey对进行比较,以检查付款方是否已猜对地址。如果付款方运气不好,地址相同,则:
该方法支持risk=0的特殊值。这是轻量客户端交易的特殊案例。它告知Emer节点验证交易,并在randpay-in被签署时将其发送到区块链。在此过程中,该节点不使用addrchap -> Privkey对,不签署任何认证,也不将Privkey转移到其钱包。假定轻量钱包将自行完成这些操作。
返回值:
除了上述API外,Emercoin钱包还包含通过URI调用向来自外部应用程序(例如网络浏览器)发送Randpay支付的机制。这与比特币的BIP21机制相似,Emercoin也支持此机制。它允许网站通过在网页上创建特定的URI请求Emercoin小额支付。用户点击链接后,用户的钱包立即向网站发起Randpay支付(当然需要确认)。
网站可以使用此接口出售文章或内容(视频、音乐等)的访问权限。例如,一个网站可能因为访问文章而请求0.001 EMC,这通过创建一个Randpay请求,参数为amount=10&risk=10000来实现。以下是此请求的URI示例:
emercoin:randpay?amount=10.0&chap=00deadbeef&risk=10000&submit=http%3A%2F%2Frandpay.news.com%3Fid=777%26article=666
让我们详细检查Randpay URI结构。它的格式如下:
emercoin:[//]randpay?amount=DOUBLE&chap=chap_hex&risk=INT[&timeout=INT]&submit=CALLBACK_URI
方括号表示可选的URI元素。此接口的URI(amount,chap,risk,timeout)参数对应randpay_createtx()调用。
submit参数指定回调URI。用户的钱包将在此向生成的Randpay交易(彩票票据)发送HTTP POST,采用十六进制编码。按照RFC3986中保留的特殊字符(例如“/:&”),必须进行百分编码,以避免原始URI和回调URI之间的冲突。
钱包用户可以在emercoin.conf中指定控制接口行为的参数(默认值如下“=”后给出):
下面我们考虑一些付款方可能的欺诈场景及应对方法。我们还给出建议,使收款方最小化可能的欺诈损失。
攻击Randpay子系统可以通过两种方式:形成无效交易以支付更少或什么也不支付,或者通过双重支出(DS)攻击区块链共识来取消交易。
这里讨论的攻击场景在Randpay中是无用的,因为当前代码具有防止此类攻击的机制。尽管如此,我们仍然出于教育目的来考虑它们。
导致_submittx_中addrchap的提取不正确,从而导致错误代码。未压缩的addrcahp与他人的匹配概率微乎其微,可以忽略。即使发生这种情况,收款方也会收到资金,这也是件好事。
2. 尝试支付少于请求的金额。
在分析_submittx_返回的amount时检测到。
3. 尝试使用不存在或之前已支出的币支付交易。
在_submittx_验证期间检测到。返回错误代码。
4. 尝试使用收款方的地址作为输入,并通过找零盗取收款方的资金。
在_submittx_验证期间检测到。返回错误代码。
5. 尝试重新使用从先前发布的交易中获取的他人的签名进行RandpayUTXO。
没有任何意义,因为交易和目标地址由付款方创建。因此,他们没有理由使用在别处找到的签名的randpay-in。他们完全可以创建一个不包含任何randpay-in的简单交易,免去收款方证明对地址的拥有权。
Randpay交易同样容易受到双重支付(DS)共识攻击,就像任何其他支付交易那样。在这方面,它与后者没有好坏之分。对抗共识攻击的最有效方法是等待足够的区块确认,就像所有区块链系统那样。不过在某些情况下(例如,出售通话分钟),你没有时间等待确认,也别无选择,只能在没有确认的情况下工作。在这种情况下,Randpay的表现略优于经典机制,因为收款方决定是否出现胜利,以及是否在区块链上发布交易,即他们具有某种时间上的优势。接下来,我们将考虑几个针对未确认的Randpay交易的DS共识攻击场景。
请注意,骗子发起DS的时间越早,攻击成功的可能性越大(DS将出现在区块链上),但收款方检测到欺诈的可能性也越高。
然而,由于Randpay交易在大多数情况下无法生效,因此欺诈最有可能在失败的票上被检测到。但是如果网络拓扑未知,收款方平均面临损失实际支付金额一半的风险,即amount / risk / 2.
应对这类欺诈,收款方的策略是在提供产品或服务之前等待约0-10秒的随机时间,同时在区块链上监控欺诈DS交易。如果看到,尽管哪笔交易获胜,也不要提供产品。
2. 付款方生成DS,但仅在Randpay交易进入其内存池时才将DS发送到区块链。换句话说,他们仅在看到Randpay接收方赢得他们的资金后攻击,试图取回这笔钱。在这种情况下,付款方很可能无法拿回这笔款项,因为他们获得的获胜交易的副本已在区块链上分发,而可能会拒绝DS。
而且,由于Emercoin根据接收时间严格限制交易优先级,并且在这一点上没有费用相关的优先级,因此骗子无法通过“挤压”原始交易从内存池中提高其DS交易的优先级。为了最小化这种可能性,收款服务器的 connect 设置必须只允许与少数已知可靠的对等方建立连接,以避免将获胜的 Randpay 交易直接传递给诈骗者,并给其时间在区块链上“传播”:作弊者通过区块链获得 Randpay 副本的时间越晚,其 DS 获胜的机会就越小。在收款方获胜的情况下,延迟产品转移并持有金额也是有用的。
对于新的、未知的付款人,限制 风险 是有意义的,以避免他们膨胀获胜金额(请注意,如果攻击成功,获胜的是全部 金额 而不是 金额 / 风险)。
3. PoS 铸造诈骗
在这种情况下,诈骗者找到一个内核交易来解决区块,并立即附加一个包含 DS 的区块。但他们并没有将区块发送到区块链,而是进行了一次 Randpay 购买。在收到产品后,诈骗者在区块链上发布该区块,从而将钱退回来,因为 DS 交易会获得一个确认,而原始 Randpay 交易则没有任何确认!但我们注意到,只要付款人阻止区块被发布,就有可能会有人关闭该区块,付款人将失去解决它的铸造者奖励。这里有两个选择,类似于上述描述的情况:
在这两种情况下,由于延迟,铸造者的奖励有可能无法获得,因为其他人可能会关闭该区块并获得奖励。每延迟 6 秒,平均风险是金额的 1%。而且这种情况适用于每个区块,不仅仅是那些收款方获胜的区块。因此,损失金额必须乘以 风险:
损失 = 风险 * 区块奖励 * 时间延迟 / 600s.
还要注意,要进行这样的攻击,诈骗者必须有很多长时间未使用的硬币,因此攻击并不是总能实现。总的来说,这不适合系统性偷窃。
主要建议是等待几个确认(至少一个),就像普通交易一样。这将使你不被诈骗者欺骗而不会造成太多麻烦。
如果你确实需要实时销售,而不等待确认:
你可能会问:卖方是否可以通过提供一个拥有多个“获胜”地址的 addrchap 地址空间来欺骗付款人,即一个卖方拥有私人密钥的地址?换句话说,卖方是否可以在给付款人的地址空间中拥有两个或更多获胜票据?在这种情况下,付款的机会加倍,这也将加倍对平均支付金额的期望。
答案是:是的,这种情况在理论上是可能的,但其概率微不足道,可以忽略不计。让我们仔细看看。
正如我们所知,Emercoin 中的支付地址是由公钥的加密稳定哈希生成的 160 位数字,并且在整个可能值范围内均匀分布。我们假设系统中的平均 风险 为 2²⁰ 位,约为 1,000,000(实际值将低得多)。那么攻击者就有 2¹⁴⁰ (140=160–20) addrchap 选项来搜索并尝试生成一对相同 addrchap 的地址。采用基于 生日悖论 的策略,攻击者可以在大约 2⁷⁰ 次选择中解决配对搜索任务,同时使用 2⁷⁰ 个内存单元来存储密钥。假设现代计算机可以在 10 毫秒内生成一个密钥,那么我们得出的结果是找到配对需要超过 3740 亿年。为了加深理解,宇宙的年龄约为 120 亿年。即使我们假设攻击者有数百万台倍于现代 PC 功率的计算机,搜索时间仍然变为“仅仅” 374 年。
总体而言,这种攻击在理论上是可能的,但组织它需要大量的时间和资源。更实际的方法是简单地进行 Emercoin 挖矿。
文档作者及 Randpay 创建者: Oleg Khovayko
- 原文链接: medium.com/@emer.tech/ra...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!