【编者Peter Ye按】

可以打开如下链接,详细阅读本系列的前几篇:

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 - 创世元灵:一切源自比特币

白话区块链 之7 - Bitcoin Core之客户端逻辑结构

白话区块链 之8 - 比特币的发行:挖矿

白话区块链 之9 - 比特币下载区块数据时,如何校验是否有问题呢?

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

白话区块链 之 11 - 区块链的链 是什么?

下面的段落对应书籍《白话区块链》的第1章的1.4.7节,原文标题为《比特币账户模型:UTXO》。

在这个小节,我们来认识一下比特币中交易事务的数据结构,首先看这个名词UTXO,这是一个简称,展开后的全称是Unspent Transaction Output,也就是“未花费事务输出”的意思,老实说,第一次看到这个术语的时候,一时之间真是有些懵,如果说是未花费的余额还能理解,我钱包里有1000,花了200,还有800未花费,这是很符合通常的理解逻辑的,可这个未花费的“事务输出”是个什么意思,实际上,这与比特币中的交易事务结构是很有关系的。

为了让大家更容易理解,我们暂且先不来解析这个交易数据结构,让我们进入到一个仓库,我们知道仓库的主要业务就是进和出,仓库也会把日常的进出流水账记录下来,为了查询统计方便,除了流水账通常还会汇总一份库存表出来,举例如下:

日期

方向

品名

数量

流水编号

2017-8-1

毛笔

10

0001

2017-8-2

毛笔

20

0002

2017-8-3

墨水

15

0003

2017-8-3

毛笔

15

0004

2017-8-4

墨水

5

0005

2017-8-5

毛笔

10

0006

以上图为例,这是从2017-8-1到2017-8-5之间,仓库记录的出入流水账,为了统计方便,仓库还汇总保存了一份每天的库存日报表,如下:

日期

品名

库存

品名

库存

2017-8-1

毛笔

10

墨水

0

2017-8-2

毛笔

30

墨水

0

2017-8-3

毛笔

15

墨水

15

2017-8-4

毛笔

15

墨水

10

2017-8-5

毛笔

25

墨水

10

每天仓库在需要出库的时候,只要查看一下库存日报表就知道数量是否足够了,比如2017-8-3需要出库15支毛笔,此时查看库存表发现毛笔的库存量有30支,足够发出,于是就将库存表中的毛笔数量减掉15,并且将出库明细记录在流水账中,然而,这里有一个问题,库存日报表是另外编制保存的,那就有可能发生数据不一致的情况,比如2017-8-2时毛笔的库存本来是30却误写为20,这样导致后续的账务就都是错的了,因此在有些系统中,为了防止出现这样的不一致,索性不再另外保存库存表,而只是出一张视图统计(逻辑统计,并非实际去保存这样一个统计表)。

比特币中的交易事务过程与上述的库存进出是很相像的,某个钱包地址中转入了一笔比特币,然后这个地址又向其他钱包地址转出了一笔比特币,这些不断发生的入和出跟仓库的进出是异曲同工的,然而,在比特币中并没有去保存一份“库存表”,每当在“出库”的时候也并不是去“库存表”中进行扣除,而是直接消耗“入库记录”,也就是说在出库的时候就去找有没有之前的入库记录拿来扣除,比如2017-8-3时需要出库15支毛笔,此时系统就会去搜索之前的入库记录,发现有2017-8-1和2017-8-2分别有一笔数量为10和20的入库记录,为了满足15的发出数量,首先可以消耗掉10的这一笔,然后从20的这一笔再消耗掉5支,判断成功后,系统会直接产生一条数量为10的出库记录和数量为5的出库记录,提供这样的方法,将每一笔入和出都对应了起来。

在比特币的交易事务结构中,“入”就是指金额转入,“出”就是指金额转出,为了让大家对这种金额转入转出有一个更加通俗的理解,我们来看一幅示意图:

上图展示了比特币中的交易事务结构,在比特币的交易事务数据中,存储的就是这样的输入和输出,相当于仓库中的进出流水账,并且“输入”和“输出”彼此对应,或者更准确的说,“输入”就是指向之前的“输出”,我们解释一下图中发生的交易事务:

1)001号交易为Coinbase交易,也就是挖矿交易,在这个交易中,“输入”部分没有对应的“输出”,而是由系统直接奖励发行比特币,矿工Alice得到了12.5个比特币的奖励,放在001号交易的“输出”部分。此时,对于Alice来说,拥有了这12.5个比特币的支配权,这12.5个比特币的输出可以作为下一笔交易的“输入”,所以,顾名思义,这笔“输出”就称之为是Alice的未花费输出,也就是Alice的UTXO的意思。

2)002号交易中,Alice转账6比特币到Bob的地址,Alice找到了自己的UTXO(如果Alice不止一笔UTXO,可以根据一定的规则去选用,比如将小金额的先花费掉),由于只是需要转账6比特币,可是UTXO中却有12.5个,因此需要找零6.5个到自己的地址中,由此产生了002号中的交易输出,注意,在002号交易输出中的Alice地址是可以和001号中的Alice地址不一样的,只要都是属于Alice自己的钱包地址就可以。

3)003号交易中,Bob转账了2比特币到Lidy的地址,过程与002号交易相同,就不再赘述了。

相信大家看到这里,已经基本理解了所谓的UTXO是什么意思,我们再来总结一下:

1)比特币的交易中不是通过账户的增减来实现的,而是一笔笔关联的输入输出交易事务。

2)每一笔的交易都要花费“输入”,然后产生“输出”,这个产生的“输出”就是所谓的“未花费过的交易输出”也就是UTXO,每一笔交易事务都有一个唯一的编号,称之为是交易事务ID,这是通过哈希算法计算而来的,当需要引用某一笔交易事务中的“输出”时,主要提供交易事务ID和所处“输出”列表中的序号就可以了。

3)由于没有一个账户的概念,因此当“输入”部分的金额大于所需的“输出”时,必须给自己找零,这个找零也是作为交易的一部分包含在“输出”中。

有朋友会问:这个UTXO的意思是明白了,可是就这么一条条的“输入”和“输出”,怎么证明哪一条UTXO是属于谁的呢?在比特币中,是使用输入脚本和输出脚本程序实现的,有时候也称为“锁定脚本”和“解锁脚本”,简单的说,就是通过“锁定脚本”,利用私钥签名解锁自己的某一条UTXO(也就是之前的“输出”),然后使用对方的公钥锁定新的“输出”,成功后,这笔新的“输出”就成为了对方的UTXO,对方也可以同样的使用“锁定脚本”和“解锁脚本”来实现转账。这个脚本程序其实本质上就可以看成是比特币中的数字合约,这也是为什么比特币被称为是可编程数字货币的原因,它的转入转出或者说输入输出是通过脚本程序的组合来自动实现的,实现过程中还使用到了私钥和公钥,也就是公开密钥算法,所以比特币还称为可编程加密数字货币。

扩展阅读:

2019-10-28,《被误解的区块链(1)》

2019-11-07,《被误解的区块链 (2) - 区块链一定要挖矿吗?》

2019-8-29,《当“算力地球”遇见区块链》

www.xinhuanet.com//globe/2019-08/29/c_138320671.htm

2019-6-27,《比特币涨价的5大原因》

2018-11-16,《两败俱伤!两个子比特币算力大战引发的思考》

2019-1-14,《你们都错了,比特币才是稳定币》

2019-6-4,《新世界的崛起和意义——区块链定义的虚拟世界》

2019-6-20,蔡维德《Facebook发行的稳定币Libra是美元继续称霸的工具,瑞波和USDT的终结者》

2019-6-20,孟岩、邵青 (数字资产研究院)《Facebook 数字货币:缘起、意义和后果》

感谢《白话区块链》作者蒋勇老师对微信公众号“乐生活与爱IT”的授权。大家可以打开如下链接,详细阅读本系列的前几篇:

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 -  创世元灵:一切源自比特币

白话区块链 之6 - 比特币核心程序

白话区块链 之7 - Bitcoin Core之客户端逻辑结构

白话区块链 之8 - 比特币的发行:挖矿

白话区块链 之9 - 比特币下载区块数据时,如何校验是否有问题呢?

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

白话区块链 之 11 - 区块链的链 是什么?

白话区块链 之 12 - 未花费事务输出 (UTXO) 是什么?相关推荐

  1. 被寄予厚望的跨链,2020能否带来新亮点? | 白话区块链7问跨链

    跨链是 2019 年不可忽视的区块链热点,在彭博社年初发布的最值得期待项目中,Cosmos 和波卡作为跨链两大代表项目都名列其中,可见跨链关注度之高.2019 年即将结束,但跨链似乎依旧停留在概念上. ...

  2. 树图区块链学习(未完待续)

    树图区块链基本结构 1.每个区块只有一条父边指向父区块; 2.每个区块可能有多条关联边指向"happen-before" 关系的区块; 确定区块链的主链 1.从创世区块开始; 2. ...

  3. 蚂蚁区块链第12课 如何使用命令行编译工具solcjs编译Solidity智能合约?

    1,摘要 蚂蚁区块链合约平台支持 Solidity 智能合约,针对合约源代码的编译,可以直接通过蚂蚁区块链 Cloud IDE 合约开发环境进行合约编译.部署.测试和调试. 本文介绍由蚂蚁区块链平台提 ...

  4. Golang|区块链UTXO集源码分析

    区块链UTXO集源码分析 资源 go实现区块链 前提 在未实现UTXO集之前,假设系统需要查询某个钱包地址的余额,系统需要遍历区块链的所有区块,当区块链非常长时,这种做法的成本太高了. UTXO集是未 ...

  5. 区块链的一些名词解释

    地址: 比特币地址(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和数字组成.它其实是通过对160位二进制公钥哈希值进行base58check编码后的信息.就像 ...

  6. Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易(二) 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库&quo ...

  7. 区块链端对端交易性能分析

    区块链端到端交易性能分析 区块链从微观上来说就是一个不可篡改的可溯源系统,从宏观上来说具有三个特点:共识机制(这个被很多人所研究,包括改进,例如POW.POS.BPFT等等).分布式存储(每个节点对于 ...

  8. 用Go语言建立一个简单的区块链part6(2):交易(2)

    交易(2) 引言 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库& ...

  9. 用 Go 构建一个区块链 -- Part 6: 交易(2)

    翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...

  10. 陀螺研究院 | 产业区块链发展周报(12.19—12.25)

    摘要 产业动态: 人民银行正式发布<分布式数据库技术金融应用规范 技术架构>等3项金融行业标准 我国首个IEEE区块链国际标准发布 北京金融科技创新监管试点第三批应用对外公示,聚焦区块链等 ...

最新文章

  1. iOS中nil Nil NULL 区别
  2. Spring bean依赖注入、bean的装配及相关注解
  3. 修改注册表给windows防火墙添加例外 ------------ 转
  4. Qt C++属性类型提供给 QML调用(一)
  5. 老年人自学计算机,老年人怎样学电脑?请问从网上能找到学习资吗?
  6. 全球金融中心最新排位:深圳重回前十,大连杭州飙升
  7. php链接文字变色,Linux_不断变色的文字,不断变色的文字效果,漂亮而 - phpStudy...
  8. 第26条:优先考虑泛型
  9. 2022 年最佳 15 款网络监控工具
  10. android开发手机字体大小设置,安卓代码动态设置字体大小
  11. 怎么把数组转化成字符串呢?有没有现成的函数呢?
  12. LTE:下行峰值速率计算
  13. 左神算法基础class6—题目3拓扑排序
  14. 批处理文件rd \s\q **是什么意思?
  15. 技术太多学不过来?教你如何越学越带劲
  16. 华为设备vlan配置命令
  17. 我的世界末日之后无限法则服务器,Last Day Rules官方版
  18. ubuntu下以管理员权限开机自启动自己的程序
  19. Python爬取笑话存储在mysql里
  20. NTN(三) Timing

热门文章

  1. win11开热点连接之后无网络解决方案
  2. 敏捷软件开发 - 原则、模式与实践
  3. 2020年最新世界地图_2020年标准地图发布,为何要发布新版标准地图?
  4. varchar2转number 详解 Oracle
  5. “Network”游戏棋人机对弈的设计与实现(二)—判断步骤是否合法
  6. java分布式包含的技术_Java分布式架构核心技术[SSM组合+ springmvc+mybatis+shiro+restful+bootstrap]...
  7. 电脑同时打开多个软件如何设置
  8. Linux大实验 (图书管理系统)
  9. 怎么换c语言程序窗口背景图,vc++如何给窗体添加背景图片
  10. 线段树 2017.4.20