如何解决比特币发展的心智模型
扫描二维码
随时随地手机看文章
随着我在比特币开发方面获得越来越多的经验,我不时地有一个顿悟,它彻底改变了我的思维方式、我的想法以及我如何处理钱包软件中的基本构件。事实上,每次发生这种情况时,我都会在脑海中以新的视角彻底重写我正在创建的钱包。
在过去的几天里,我想我意识到还有另一种更好的方式来做我现在正在做的事情。不幸的是,重写我的钱包这次不是一个选项,因为Wasabi 钱包有一个重要的用户基础,它可能太冒险重构软件的本质。但至少我可以和你们分享这些见解。
1. 解决心智模型
比特币钱包有地址,这些地址里有余额。
我创建了我的第一个比特币钱包:DotNetWallet,附带一篇文章:构建自己的比特币钱包。这使用了这个心智模型。但比特币网络不是这样运作的。区块链上没有地址,并且根据地址组织基本数据结构可以防止将来进行任何远程高级操作。
2. 交易心理模型
下一步是考虑交易而不是地址。我的第二个比特币钱包: HiddenWallet,它是这样工作的:我有一堆交易,每当我必须做些什么的时候都需要向用户显示余额,找到未使用的UTXO时,我就从交易中计算出所有东西。这最终使我能够在任何时候都拥有正确的wallet-state并执行各种高级操作,但结果证明这是非常低效的,我需要添加各种辅助的数据结构,以减少这种痛苦。
3.代币心理模型
接下来,我转向UTXO模型,或者更确切地说是coin模型。我的代币很聪明,它们知道一堆事情:谁花了它们,它们花了谁,标签,匿名设置,等等……我的钱包的下一个迭代,Wasabi钱包使用这个数据结构为基础。
交易开始了,我将把相关的UTXO组织成代币。
问题是,随着软件的发展,当钱包变得太鼓时,那些检查我的代币列表的算法就会变得非常慢。因此,我也开始改变在钱包外添加代币的方式,这可以解决一些边缘情况,但我担心这会让一切变得更慢,这只会再次影响性能。我需要一种方法来正确地检查这些代币之间的关系。
4. 心智模型图
我的下一个小技巧是创建心智模型图。如果我要创建一个图形数据结构,其中节点将是我的代币,加权后的边将记录硬代币之间的关系,这可能会很好。
现在的代币是顶点,不过我会把一些东西移到边缘。边是这里的重要部分。
代币心智模型的问题是,代币通过txid相互连接:一枚硬代币在哪个tx中,又会在哪个tx中使用代币。但在现实中,代币之间有着各种各样的联系。例如代币会将共享脚本也应该连接起来。拥有相同标签的代币也会连接起来。
好吧,但是为什么要担心重量呢?以一笔交易为例:
假设输入#0(代币#0)和输出#2(代币#1)来自同一个用户,有6种不同的输出,所以代币#1的匿名集是6。但是如果0号代币和1号代币在同一个地址呢?那么1号代币的匿名集就是1。我们在Wasabi中处理这种关系,但是,这些额外的检查和启发是资源密集型的,并且遍布整个代码库。最好将这种关系添加到图的边缘,完全放弃匿名集的概念,转而使用概率模型。
然后我们可以这样说:
· 如果没有标签或脚本匹配,则代币1号和代币0号链接的强度为1/6。
· 如果存在标签、脚本或脚本匹配,则无论交易如何,链接的强度都为1。
引入更多的连接,并认识到链接的强度是图的权重。这将使我们能够做很多疯狂的图论的事情。例如,我们将能够决定哪些代币是最合理的合并在一起,这将导致最小的隐私妥协,只要看看重量!
蝴蝶效应
像这样的概念乍一看似乎无关紧要,但是在这些层次上的改变和调整会产生深远的影响。之前,我以一种非常有趣的方式讨论了导致深远影响的小变化,所以您可能想尝试一下。