2021-03-04 15:07 | 出处: 灰狼
有效地将基于UTXO的链上指标映射到基于比特币和以太坊的账户
作者基利安·海格(Kilian Heeg)和拉斐尔·舒尔茨·克拉夫特(Rafael Schultze-Kraft)
摘要。由于交易量或内部转账的变化,许多基于未用交易输出(UTXO)方案的加密货币资产的链上指标(例如比特币)遭受了不希望的贡献,这掩盖了真实的市场行为信号。在当前的工作中,我们使用实体的概念,将基于UTXO的区块链映射到有效的基于账户的模型,并在没有上述限制的情况下实现指标的计算。 此外,我们证明,许多最初为UTXO链设计的指标可以直接在以太坊等基于账户的真实系统中实现。我们希望这项工作构成基础,以提供有关链上市场行为的新颖而空前的见解。
比特币和以太坊之间的本质区别是,比特币基于未花费的交易输出(UTXO)方案,而以太坊是基于账户的系统。
如今,无数链上指标都使用了UTXO设计。然而,这些往往遭受不希望的贡献,这会大大掩盖真实的市场行为信号。
假设有一个市场参与者打算出售1个比特币,而他或她的UTXO的价值为10个比特币。忽略费用,交易输出将被分为两个新的UTXO,分别为1比特币和9 比特币,其中9比特币代表变化交易量。在这种情况下,幼稚的指标计算不会将9比特币识别为内部转移(由同一实体控制的地址内的比特币转移),而是假定总共10比特币作为转移值。这样,真实的市场行为可能会被高估,并且该指标会导致信息不完整或不正确。
我们在Glassnode视野的研究中涵盖了变化交易量的问题,并集成了变化调整交易量指标。
以一个市场参与者为例,他以1200美元的价格购买了1个比特币,不久后又以3000美元的价格购买了2个比特币,因此他或她控制着两个价值分别为1比特币和2比特币的UTXO。
如果用户现在决定以3000美元的价格出售1个比特币,那么最终的利润率是多少?
从基于账户的角度来看,用户每个比特币的平均购买价格为¥1200•1/3+¥1500•2/3=¥1400,因此得出的利润率为¥3000/¥1400≈2.14。从基于UTXO的角度来看,可以使用第一个,第二个或甚至两个UTXO,这在实际利润率上存在一些歧义。
这些示例与以下事实有关:市场参与者通常不控制一个UTXO(或地址),该UTXO(或地址)可以可视化为单根纱线,从一个交易转到下一个交易。取而代之的是,用户或实体通常会控制许多UTXO,或者为了留住画面,还需要控制一些纱线。这些纱线中的每一个都可以在不同的点开始和结束,有时会绑在一起,表示有多个输入或输出的事务。为了从区块链中提取最可靠的数据,需要查看线团,而不是单个纱线。
因此,仅从UTXO的角度来看,基于UTXO的链中的某些实际网络活动可能会被掩盖和扭曲。
在Glassnode,我们以前使用高级试探法和数据科学方法来解决此问题。有关更多信息,请参阅我们对比特币实体的研究(“有多少实体持有比特币?”)和我们的实体调整指标。
与比特币区块链等相反,第二类加密货币使用基于账户的方案来代替,最突出的是以太坊。但是,对于此类链,无法轻易应用针对UTXO链开发的大量指标。
为了克服此限制,以前已经进行了应用虚拟UTXO的概念的努力。但是,由于将平衡更改分配给此类虚拟UTXO的可能性很大,因此这些UTXO的定义不明确。反过来,这阻碍了它们在可靠指标中的适用性。
在这里,我们采用一种补充方法,而是将基于UTXO的区块链及其基于UTXO的指标分别映射到有效的基于账户的链和基于账户的指标。
这为解决上述两个问题提供了基础:
1.首先,可以从基于账户的角度研究UTXO区块链,从而启用指标,实现自然消除内部传输造成的“噪音”的指标。
2.其次,最初为UTXO链开发的大量度量标准可用于基于账户的区块链,例如以太坊。
如上所述,在基于UTXO的区块链中,实体通常控制多个UTXO。每个对象都有一个明确定义的创建日期,创建块,并根据当前市场价格确定一个明确定义的创建价格。
我们的方法为属于一个实体(“线团”)的整套UTXO定义了适当的平均虚拟数量,这些虚拟数量充当平均购买价格、购买时间或购买块数的角色。与上述示例II类似地执行该平均。此外,我们的方法是基于每个账户在区块级别上的余额变化,在这种情况下,余额的正向或负向变化可以分别视为创建或消费UTXO的对应方法。
这种处理有效地消除了分析中对任何UTXO的需求,因此也可以直接应用于基于账户的链。
使用这种方法,我们为比特币和以太坊实现了第一批基于账户的指标:
为了评估我们基于账户的公式化的潜力并验证其能否产生预期的结果,我们将上述基于账户的比特币指标与最初的UTXO对应指标进行了比较。为此,我们在计算中将我们先前介绍的账户(或实体)群集算法应用于比特币地址/UTXO,并消除了不需要的中继地址。
图1显示了此比较的四个示例指标(实际市值、MVRV、SOPR和ASOL)。
图1—基于比特币账户的指标与原始UTXO指标的比较。
从图1有两个重点。
首先,对于描述更大范围的区块链全球范围的指标,以及我们不希望出现重大差异的指标,原始比特币指标与其账户调整后的指标之间确实存在重大重叠。具体而言,如实际市值和MVRV的情况所示,我们观察到了近乎完美的一致性。
这一结果清楚地证明了我们基于账户的指标的方法实际上是准确的。
其次,对于某些指标,我们观察到原始版本和基于账户的版本之间存在较大差异(在图1中显示为SOPR和ASOL),尽管在长期行为和总体趋势上仍存在定性共识。这些指标由于其内部(“内部”)转移,即在同一实体地址内发生的交易,在短期内会受到多余的人工产物的极大影响。因此,这些指标的基于账户(或实体调整的版本)表示比特币原始指标的更准确和更可靠的版本。
由于大多数先进的链上指标都是以比特币及其UTXO概念为基础设计的,因此缺乏对以太坊区块链的类似见解。
我们基于账户的形式主义允许我们第一次为以太坊计算复杂的指标。
图2概述了为以太坊实现的当前基于账户的指标集。
图2–基于UTXO的指标映射到以太坊的基于账户的等效指标。
我们对为UTXO设计的常规链上指标进行了概括,以使其适用于基于通用账户的区块链。这使我们能够首次计算出一组准确的指标,例如SOPR、实际市值、MVRV、CDD、休眠、ASOL/MSOL和以太坊的活跃度。我们的方法可以轻松应用于其他基于账户的加密货币以及ERC-20代币。
此外,我们能够消除实体的内部转移,而内部转移通常会输入指标计算中使用的数据。通过将比特币映射到有效的基于账户的链,此类数据会从分析中固有地消失,从而使真实链上活动的情况更加清晰。
在Glassnode,我们不断开发新的基于账户的指标(敬请关注并在下面注册以获取更新),并继续开拓新方法来释放链上数据的全部潜力。
•关注我们的推特
•关于链上指标和活动图,请访问 Glassnode Studio
•关于交易所核心链上指标和活动的自动提醒,请访问我们的(Glassnode警示推特)
免责声明:本报告不提供任何投资建议。所有数据仅供参考。任何投资决策均不得基于此处提供的信息,您对自己的投资决策负全部责任。
特别感谢Micah Zoltu提出的一些建议
与2013-15年相比,我们对2020年智能合约和区块链协议设计的了解要多得多。结果,在较早的几年中引入了以太坊的许多功能,如果我们在2021年从头开始构建以太坊,就不会再引入。但是,从没有运行的生态系统的运行链中删除功能要比不将其添加到新系统更难。
其中一些“调查功能”是无害的。随着时间的推移,其他人可以安全、缓慢地删除或改进。还有一些应用太深地集成到太多应用中,无法考虑不断变化的情况(例如256位EVM就是一个例子)。另一方面,有些功能已经被删除或改进,或者即将推出(想到改进状态树,并用SSZ替换RLP)。
但是中间也有一些情况:由于其复杂性而对生态系统造成中等程度持续伤害的特征可以被删除,但是这样做的风险很小但不为零。如果我们删除这些功能,则少数应用程序可能会中断。但是,如果我们不这样做,它们将继续拖累生态系统,直到末日。
通常在“短期痛苦,长期收益”的情况下,很容易低估长期收益的幅度。特别是在我们的案例中,“已经编写了代码”来处理复杂性这一事实使我们觉得保留它没有成本。但实际上,有两个重大成本:
1.对该协议进行新实现的任何人的费用
2.更改与不需要的复杂功能A进行交互的某些功能B时,存在“交互错误”的风险
一个说明性的例子是状态树的重新设计:以太坊状态遵循一些简单的不变量的情况越多,就越容易用更有效的结构替换两层六叉Patricia树。然而,事实,例如。SELFDESTRUCT操作码可以在单个事务中无限数量地删除存储插槽,从而使状态树的转换更加困难。另一个例子是2300的gas津贴(参见下文),使gas定价更加复杂。
“合并”(当eth1 PoW链被丢弃并将其状态导入到eth2 PoS信标链中时发生的事件)可能是我们不得不摆脱其中一些痛苦的创可贴的最后机会,这篇文章为这样做提供了理由。
出于以下几个原因,合并是进行最后一轮重大更改的自然要点:
1.在合并后建立的客户可能甚至不会尝试处理PoW链,而是专门验证PoS信标链。因此,如果在合并时或合并之前消除了协议复杂性,则客户端可以最轻松地受益于此,因为它们根本不需要实现那些功能。(从技术上讲,即使是预合并构建的客户也可以设计为只处理从过去的1-2个硬分叉开始的链,但是当它是一个“单独的链”时,似乎不费吹灰之力处理遥远的过去也很容易。”)
2.已经发生了很大的变化,并且围绕“这是对以太坊的重大升级”这一想法,社区达成了共识。特别是,关于分片和合并完成之前,人们期望可以快速发展,而合并后,人们期望它具有更大的稳定性,这是整个社区的共识。
3.必然已经发生了向后不兼容的更改(例如,BLOCKHASH操作码不再是随机性的良好来源)。
这篇文章将介绍一些可以考虑删除的功能示例。
•它是什么?:当合约调用另一个合约时,接收者会自动获得2300gas,在此期间它可以执行非常有限的执行(足以进行一些计算并发出日志,但不足以填充存储槽)
•为什么引入?:最初是为了允许智能合约钱包在收到资金时发出日志而引入的。 从那时起,它也被用来实施防止合约接收ETH的“保护措施”。
•为什么不好?
o这是固定数量的gas,因此任何有关其支持哪种计算的主张都无法在gas定价中幸免。
o由于两个原因,它不能很好地满足其预期目的。 首先,许多用户仍在使用EOA,而EOA没有日志记录。其次,SELFDESTRUCT绕过津贴机制。从长远来看,预计EOA将不再强调通过账户抽象来支持合约,在此之后的文章提倡删除SELFDESTRUCT,但除非/除非这两项工作都做完,否则这是不充分的半成品解决方案。
•我们如何删除它?:这里有两种自然的可能性—2300数字可以用0(无子执行)或无穷大(子执行从父获得所有收益)代替。
•删除它可能会破坏什么?
o如果我们删除子执行,那么这将在调用中添加一个尴尬的两段式机制,其中0 gas被解释为0,其他任何数字都被解释为“发送所有gas”。它还会破坏反接收警卫和伐木。
o如果我们将执行过程中的全部精力交给子执行,那么用CALL发送ETH将成为“受信任”的操作,恶意合约可能会干扰某些应用。但是,Solidity文档已经不鼓励转移,而采用“提取”方式,这种方式不会带来任何风险。
•我们如何解决这些问题?
o进行所有ETH转移,包括由于通话和SELFDESTRUCT(在保留该操作码的情况下)引起的日志记录,因此钱包不需要
o添加一个规则,其中提供0gas的调用是“可以发出日志的STATICCALL(静态调用)”。就仅在仅含津贴gas的执行上下文中可以实际完成的工作而言,这将复制现有功能。
•它是什么?GAS操作码允许合约查看当前执行上下文中还剩下多少gas。CALL允许调用者为子上下文指定能够执行的固定gas量。
•为什么引入它?:反对CALL仅仅将父上下文的所有gas转发到子上下文的主要原因是允许“不信任的调用”:发件人不信任收件人的调用。一个简单的例子是将ETH发送给参与者的财务机制。另一个玩具示例是M-of-N预言机,它调用一定数量的合约,从每个合约中获取响应,然后输出结果的中位数。
•为什么不好?
o实际上,不信任调用很少有用例,如果没有不信任调用,用例就很难做到。对于转移,Solidity文档已不鼓励转移,而采用“提款”模式。 上面的M-of-N预言机示例玩具可以通过对每个预言机进行单独的事务来轻松实现。
o这使得很难进行gas定价,因为它使固定gas调用在gas价格变化时可能会中断
•我们如何删除它?
O调用会自动将父的全部gas转发子。GAS操作码只会返回交易的初始gas金额。
•删除它可能会破坏什么?
o我们知道的“不可信调用的合法用例”的主要类别是第三方发起的调用。第三方将发布包含您希望他们调用的交易,并且在调用后,他们会自动向您收取款项(您将发布使他们有权执行此操作的签名)。这对于用户没有任何ETH的智能合约钱包、混合器的隐私保护以及其他用例非常有用。需要进行限gas调用,以确保最终支付条款实际上被调用,并且不会由于gas不足问题而被还原。
•我们如何解决这些问题?
o矿工可以直接充当这些中介,如果事实证明他们不支付,他们将简单地放弃交易 请参阅菲尔戴安(Phil Daian)在创建第三方机器人生态系统中的工作,矿工可以自动生成“安全的”事务批处理。
o添加明确的协议内“第三方付款人”交易类型。参见例如EIP 2711。
还要注意,如果我们想更进一步,我们还可以调整63/64规则,这样,如果子调用失败,则父调用完全失败(因此甚至没有1/64)。这可能会破坏更多的用例(“如果子调用失败,则做一件简单的小事”),但它将确保未来的gas成本变化只能引起一种行为改变(交易失败而不是成功)。
参阅完整文档。
•它是什么?:SELFDESTRUCT-ing一个合约或将存储位置设置为零,可退还15000-25000gas。退款将在交易结束时应用,并减少发件人需要支付的费用。
•为什么引入它?:激励应用开发人员编写具有“良好状态卫生”的应用,清理不再需要的存储插槽和合约。
•为什么不好?
o在实践中,几乎没有人实际遵守良好的状态卫生习惯。诱因还不够高,不值得增加代码的复杂性,甚至尝试这样做都存在安全风险。
o退款产生了GasToken。GasToken在将gas空间从低收费期转变为高收费期方面具有优势,但它对网络也有不利影响,特别是在加剧状态规模和低效堵塞区块链gas使用方面
o它增加了块大小差异。块中实际消耗的理论最大gas量几乎是理论gas限制的两倍。这不是致命的,但仍然是不希望的,特别是考虑到退款可用于维持2倍的使用高峰期,而其使用时间比EIP 1559更长。
•我们如何删除它?:只需从协议中删除退款功能即可。
•删除它可能会破坏什么?
o我们可以完全确定没有应用会完全无法使用,因为退款仅在执行完成后才应用,因此消除退款不会改变任何执行上下文可用的gas量。
o GasToken将变得无用
o在异常高gas的时期,应用将失去削减成本的能力。但是,当今最主要的用户是Defi套利机器人,而套利机器人之间的gas价格竞争是零和活动,因此目前尚不清楚消除与他们对抗的武器是否会带来全局不利影响
•我们如何解决这些问题?
o Gastoken已经警告了将来协议更改的可能性,从而使GasToken在其网站上无用,因此对于用户来说这不足为奇
o我们可以提前公开发出此更改的信号
与上面的其他内容相比,我对专注于这些内容的价值信心不足,但是仍然值得保留一份清单。
•RIPEMD160预编译:很少有项目使用的非标准哈希函数(仅与比特币接口的事物)。可以用EVM代码实现代替,真正需要高效验证的项目可以只使用ZK-SNARK
•动态跳转:目标为变量的跳转使代码分析和代码操作变得更加困难(例如,无法轻松地用其他操作码序列搜索和替换某些操作码序列,或在某些代码之前添加代码)。删除动态跳转并仅允许具有相对偏移量的静态跳转以及子程序的某些专用指针方案(指针不作为整数公开)可以解决此问题。但是,这将是一个巨大的变化,并且可能会破坏许多定制合约,因此,收益/成本比似乎不如此列表中的其他项目那么有利。
•MODEXP预编译:对于大整数数学而言,显然是错误的“基本原语”,并且具有相当复杂的gas成本计算方案。更好的选择是(i)将bigints替换为ADD,MUL和MOD作为预编译,并将MODEXP替换为调用这些预编译的代码实现,或者(ii)将EVM384扩展为更多大小(256、384,、512、768、1024…8192)