主页 > imtoken钱包正确的下载地址 > 资深程序员告诉你为什么没有比特币余额只有UTXO? 什么是 UTXO?
资深程序员告诉你为什么没有比特币余额只有UTXO? 什么是 UTXO?
在比特币和区块链之前,没有UTXO这个词。
明确什么是UTXO?先介绍两个知识点,一个是什么是交易比特币钱包同步太慢,一个是什么是账户模型
1.什么是交易
交易更容易理解。 在英文中,Transaction 缩写为 TX。 按照我们平时对交易的理解,李四转了一笔50元给张三,也就是李四账户里的钱少了50元,张三账户里的钱多了50元; 张三又想到王五转账50元,这个过程叫做交易,那么这笔交易怎么记录保存在电脑里呢?
2. 什么是账户模型
目前的银行系统、证券交易系统、互联网第三方支付系统的核心都是基于账户设计,以MySQL、Oracle等关系型数据库为支撑。 这是最直接、最符合人类思维的直观方式。
为了照顾没有计算机和数据库基础知识的读者,这里对数据库知识做一个简单的介绍。
数据库是指以一定方式存储的、可被多个用户共享、独立于应用程序的数据集合。 简单的说,它可以看作是一个电子表格,用户可以在表格中进行数据的添加、更新、删除等操作。
可见,关系型数据库可以简单理解为表。 那么对于账户模型数据库,简单来说,可以设计成两张表:
账户表交易记录表
1 简化账户表格如下,用于记录所有者的银行卡号和余额信息。 实际情况会复杂得多:
2 交易记录表如下,用于记录所有转账记录
以上面李四给张三转账50元为例,在交易记录表中新增一条转账记录如下:
同时需要修改账户表单中的余额。 修改后的账户形式为
张三转账50元给王五后,两张表格的号码如下:
3.什么是UTXO模型
上面的账户模型其实是最直观、最直接、最容易理解的。 那么还有其他方式来表示交易吗? 中本聪设计的 UTXO 是一种表示交易的方式。
UTXO是Unspent Transaction Output的缩写,交易简称为TX,所以上面的词组简称为UTXO。 上面的账户模型由两个表组成。 UTXO 设计巧妙,不需要传统关系型数据库的支持。 UTXO 被翻译成未消费的交易输出。
我们知道比特币是挖出来的,假设张三、李四、王五都挖出了100个比特币
同样以上面李四转50元给张三为例
李四转账50元给张三.png
张三转账50元给王五后
解释以上图片的含义。
比特币的区块链账本记录着一笔一笔的交易。 每笔交易都有若干交易输入,即资金来源,以及若干交易输出,即资金去向。 一般来说,每笔交易都需要花费(spend)一个输入并产生一个输出,而产生的输出就是“未花费的交易输出”,即UTXO。
挖矿得到的奖励叫做coinbase,没有input source,所以张三、李四、王五的100个币(100个为了方便,其实按照减半机制,每个区块的奖励是2018年的比特币是12.5)都是挖矿的,假设TX哈希值分别是0x001、0x002、0x003。
李四转给张三50个币,转账交易的哈希号为0x004,输入TX号为0x001和0x002,输出为张三150个币,李斯50个币。 注意此处忽略交易打包费。
后来张三要转50个币给王五。 转账交易的哈希号为0x005。 如果你聪明,应该能猜出来。 输入为0x003和0x004,输出为张三100个硬币,王五150个硬币。 另外,这里忽略了交易打包费。
由此可见,UTXO交易遵循以下规则:
至此,你应该能理解为什么有人说:比特币网络没有账户,只有地址; 比特币不是余额,而是 UTXO。
你也可以理解为什么如果你想看到你的比特币钱包的最新余额,你必须同步到最高区块高度才能正确显示。
4、为什么要设计UTXO模型?
4.1 账户模型的缺点
一点题外话:其实对于大小的概念,人类的认知是不够的。 0.001秒对于人类来说是很短的时间,但是对于计算机来说却是很长的时间。 在计算机世界里,可能相当于人类的1天。 当我们嘲笑鱼的记忆力只有7秒时,如果电脑有意识,它可能还会嘲笑人类最长的记忆力,只有几十年,因为电脑的存储时间理论上是无限的。
让我先解释一下计算机的基础知识。
笔者上一篇文章讲解了图灵机(),其实我们现在所有的计算机都是图灵机。 从图灵机的模型我们知道,要修改一个数据,比如把一张银行卡的余额增加100元,需要三个步骤:
1.首先从账户中读取余额
2.余额值增加100元,得到新的余额值
3.将新余额写入账户
三步电脑操作在我们看来是瞬间完成(比如0.0001秒),但实际上在电脑内部需要一定的时间。 一步完成,多个CPU时钟内完成。
对于账户模型,上面我们已经了解到,需要两张表,在转账过程中,需要保证等式两边必须平衡。 所以发送的交易是给一个账户加钱,同时从另一个账户减钱,也就是修改两个账户的数据。 如果由于网络等原因交易被重发,将成为两笔重复扣款的交易。 ,这就是区块链中著名的“重放攻击”。
在分布式系统中,要保证加币和减币可以同时完成,就需要实现分布式事务。 相信做程序员的同学都会知道,这是一件非常非常困难和耗费资源的事情,同时也很容易。 有漏洞的地方,以太坊采用的是账户模型,所以以太坊智能合约经常因为编程不当导致被盗币
4.2 比特币没有开户流程,只有地址。
去中心化系统没有专门的机构让人们申请每个账户的产生和销毁。 这样的系统不需要记录和跟踪所有账户的信息。 使用 UTXO 而不是跟踪账户交易消耗更少的系统资源。 ,只要 UTXO 被跟踪比特币钱包同步太慢,就无法被篡改。
4.3 更好的匿名性
比特币的一个更好的特性是匿名性。 您可以为每笔交易交换一对公钥和私钥。 给自己输出的零钱往往输出到另一个账户。 UTXO迎合了这种需求,比如门罗币就是采用混币的方式来实现隐私。 使用帐户模型不太灵活。
4.4 更好的并行处理
UTXO 是一个独立的数据结构。 理论上,可以在不考虑交易问题的情况下,使用不同的 UTXO 并行发出多笔交易并广播到网络;
4.5 占用空间小
去中心化系统的考虑是全世界的人都可以使用它并打开多个地址。 从长远来看,UTXO不会因为地址的增加而增加额外的空间,所以数据占用更小,账户模型会越来越臃肿。
5. 来自UTXO的灵感
5.1 跳出人群思维。 比特币作为一种点对点的电子货币体系,跳出了传统货币体系的账户模型设计,采用全新的方式,以最低的成本解决了诸多分布式问题。
5.2 求等价,越简单越好。 等价是解决问题的一种非常有效的方法。 计算机领域有很多等价的例子,比如用二进制等于十进制,解决了机械运动直接计算十进制的非常复杂的情况; 又如人工智力问题等同于数学问题。 UTXO 将账户交易等同于一个简单的模型。 虽然不符合常规的思维方式,但是非常简洁,非常有美感。
5.3 学会做出一些妥协。 比特币最初的设计目的是让全世界的人都可以使用,而要具备去中心化、可追溯、不可篡改、匿名等特殊效果,就必须做出妥协。 例如,UTXO 设计很难实现 EVM 功能。 开发一个完整的智能合约是非常困难的。 这也是以太坊不采用 UTXO 模型的主要原因。