比特币交易模型——UTXO技术分析

本文内容来源于:HiBlock区块链社区微信群讨论

【众说区块链】是HiBlock区块链社区组织的微信群讨论活动,每周六晚9点准时开始,围绕一个主题进行讨论。




主题:比特币交易模型UTXO技术分析

时间:6月2月(周六)晚9点-10点

主持:佩瑶

特约嘉宾:胡华杰

资料:交易费用的官方说明  https://en.bitcoin.it/wiki/Transaction_fees

讨论内容:


双花问题:因为比特币网络会有一个天然的问题,就是所谓分叉问题,总是可能会出现多个比特币矿工挖出合法区块,然后再这个链上产生了分叉,那么这个时候,为了解决这个问题,规定最长的链被保留,这个时候会产生所谓的双花问题。

 

SPV:这个词的意思叫做简单支付验证,重点在于支付验证,不是交易验证。只是确认下这笔支付是否存在。这里面就有一个核心的技术概念,即merkle tree这么一个数据结构。比特币的区块分为区块头,这是一个80个字节的定长,这个区块头包含有merkle tree的根结点。这个根节点有什么用呢,它可以用来验证是否含有此笔交易。具体怎么验证呢,首先定位这笔交易存在哪个区块上,然后获取这个区块上交易所在的,merkle树的验证路径,然后通过哈希计算出merkle的root节点的值是否相等就可以知道这个交易是否存在。这种方式有什么好处呢,因为每个区块头都是固定的80个字节,即便按照现在的交易量,存储一百年的交易头数据,也不过几百兆,估计400兆左右,并不是很大。

 

UTXO模型的技术知识:它不用传统的基于account的记账模式,传统的交易模型都是采用这个模型存储用户的数据,因为基于传统的关系数据库,有事务的支持可以很轻松的实现。而在区块链网络上,不可能采用这种中心化数据库的方式来解决的。它换了一个思路,就是记录交易的流转过程,就想以前看过那种从山上利用竹管接水,引到山下。传统的账户模式,本质上是只记录结果。这种方式不但复杂,且容易出错。比特币的思想,本身就是,数据不可篡改,不可篡改最重要的实现就是记录整个流转过程,就像时间一样,任何事情都是有序的,git的版本原理,任何的修改都会被记录下来。用编程的术语可以理解为:面向过程,重视过程而不只是结果。因为有了过程自然就有结果。


讨论实录


颜颜:大家好,周六晚9点,HiBlock区块链社区特别栏目《众说区块链》准时和大家见面啦,我是主持人佩瑶,非常感谢大家对社区的支持。

 

据媒体报道,半月前一名恶意矿工以获得了51%的算力支持的方式对比特币黄金(BTG)网络成功实施了双花攻击,并谋取了暴利。比特币黄金作为第27大加密货币损失,此次虽对个人用户未造成损失,如果攻击者还拥有足够算力的话,不排除攻击还会发生的可能。

 

双花问题、交易验证问题、51%算力攻击到底是什么意思?最长链是否会被追上,SPV机制是否完美,双花攻击到底如何有效防止?

 

本期《众说区块链》讨论的主题是“比特币交易模型UTXO技术分析”,大家可以围绕这个主题分享自己的看法和见解。

 

接下来欢迎本期特约嘉宾胡华杰,带领大家一起聊聊UTXO技术~~~


@胡华杰:今天聊聊比特币的底层技术之一,UTXO模型,包括SPV等


@胡华杰:我之前参加过一个活动,有一位大神说51%供给的问题,这位大神是怎么说的呢?他说,如果前三大矿工被控制住的话,那么比特币网络就完蛋啦,怎么个完蛋法呢?他说这样他们就掌握了51%的算力,这样,就可以把你们的钱都转到他们的账户上


@胡华杰:我相信,大家一定看出问题所在了吧。我就不吐槽了。直接说吧,其实所谓算力攻击问题,即便是没有51%也一样有可能出现。所谓算力攻击,和篡改数据根本就不是一个概念。数据的篡改是由密码学保证的,是由一整套的机制来决定的。哪怕一个节点,你也没法篡改数据,最有可能是整个数据丢失掉而已。


@何强:掌握了51%算力到底意味着什么?


@Victor H 乐天:意味着决定哪些块可以上链。也可以抛弃掉哪些块。


@范璟玮:这个我也没搞懂算力的定义,我觉得只要我比网络中所有人都快,我就可以实现双重支付了


@何强:快不是决定性的因素@范璟玮 


@胡华杰:所谓双花问题是这样的,因为比特币网络会有一个天然的问题,就是所谓分叉问题,总是可能会出现,多个比特币矿工挖出合法区块,然后再这个链上产生了分叉,那么这个时候,为了解决这个问题,规定最长的链被保留,这个时候会产生所谓的双花问题


@胡华杰:比如第一次显示我的交易进了区块链了,但是过段时间,可能因为分叉问题,花掉的钱又回来了,因为这个时候产生了分叉,导致了我交易所在的那个区块被丢失掉。如果这个时候,商家已经确认支付了,发现钱没了。


@范璟玮:@何强 为啥?我最快出块不就能控制分叉了吗?


@何强:@范璟玮 出块只是第一步。你还得在整个链上记账完成。这就像接力跑,你是一个团队,光一个人跑的快没用


@范璟玮:出块同时不就广播出去了吗?其他节点只做合法验证收到我的块就记录了呀,网络传播速度相同的话还是能保证我能控制分叉吧?


@胡华杰:接下来说SPV吧,这个词的意思叫做简单支付验证,重点在于支付验证,不是交易验证。只是确认下这笔支付是否存在?这里面就有一个核心的技术概念,即merkle tree这么一个数据结构。比特币的区块分为区块头,这是一个80个字节的定长,这个区块头包含有merkle tree的根结点。这个根节点有什么用呢,他可以用来验证是否含有此笔交易


@乾乾无咎:360说的所谓史诗级,到底什么鬼


@胡华杰:具体怎么验证呢,首先定位这笔交易存在哪个区块上,然后获取这个区块上交易所在的,merkle树的验证路径,然后通过哈希计算出merkle的root节点的值是否相等就可以知道这个交易是否存在。这种方式有什么好处呢,因为每个区块头都是固定的80个字节,即便按照现在的交易量,存储一百年的交易头数据,也不过几百兆,估计400兆左右,并不是很大。


@胡华杰:现在是时候开始真正的表演了!聊聊UTXO的模型的技术知识,我认为这是区块链技术上,最了不起的一个发明,很多人都觉得比特币是各种已经有的技术的组合,其实里面还有不少技术是聪哥本人的发明,这就是其中之一。很多其他区块链想当然的修改了或者取消UTXO的模型,搞了自己独步天下的链,实际上有不少最后又改回来了。


@胡华杰:来自一张btc coin的官网的图

 


@何强:UTXO是SPV的一种实现?


@胡华杰:UTXO是交易模型的内容,spv是一种简单支付验证的技术


@何强:UTXO和现在的常见的交易方式哪种比较像?


@胡华杰:为什么说这个设计的很巧妙呢?就是它不用传统的基于account的记账模式,传统的交易模型都是采用这个模型存储用户的数据,因为基于传统的关系数据库,有事务的支持可以很轻松的实现。而在区块链网络上,不可能采用这种中心化数据库的方式来解决的。它换了一个思路,就是,记录交易的流转过程,就想以前看过那种从山上利用竹管接水,引到山下。传统的账户模式,本质上是只记录结果。这种方式不但复杂,且容易出错。比特币的思想,本身就是,数据不可篡改,不可篡改最重要的实现就是记录整个流转过程,就像时间一样,任何事情都是有序的,git的版本原理,任何的修改都会被记录下来。用编程的术语可以理解为:面向过程,重视过程而不只是结果。因为有了过程自然就有结果。但是只记录结果,你并不知道结果是怎么来的。


@胡华杰:这里提下比特币,别看只有2100万枚,实际上比特币的最小单位是satoshis,1个比特币=100,000,000satoshis


@何强:但是现在的银行交易,不管从哪个维度去看,也都可以按照时间线来记录整个流转过程的啊? 比如我往银行存了钱,实际上银行也知道这个钱会走向哪里。


@胡华杰:比特币分成普通支付交易和coinbase交易,比特币是的源头是通过矿工挖出来的,因此除了coinbase交易之外,其他的所有交易都是必有input也有outinput,输入和输出的差就是矿工的手续费。每一笔交易发生之后,就相当于一笔资金从上一个水龙头打开留到这笔交易上,因此支付给的这笔钱,就相当于是临时存在你这里随时等待流出的一笔钱而已。这样验证那句话,钱就是用来花的。


@风静縠纹平:@何强 你问的很有水平。以太坊中就是有账户的,以太坊的解决方案是把账户状态和交易数据全都保存下来,这样就可以对照交易数据和最终影响的账户状态是否一致(正确)。这就和一般意义上的银行记账方式是一样的了。在比特币网络中,没有账户,通过UTXO,也就是交易流水可以达到一样的效果。


@何强:@风静縠纹平 清楚了。


@何强:输入和输出的差就是矿工的手续费===这个是预先设定好的不能改的还是后期可以动态调整的?


@胡华杰:这个矿工手续费是这样的,通常情况你可以选择免费,但是实际上,一些钱包默认的时候会选择小额的手续费,有的矿工会选择手续费高的交易进行优先打包,其实这个是复杂的问题,有博弈的问题在里面


@风静縠纹平:所以其实还是可以手工指定的


@胡华杰:https://en.bitcoin.it/wiki/Transaction_fees


@胡华杰:这里有官方的说明,Every Bitcoin transaction spends zero or more bitcoins to zero or more recipients. The difference between the amount being spent and the amount being received is the transaction fee (which must be zero or more).


@何强:@胡华杰 了解了。


@风静縠纹平:wiki里的解释是说会根据市场情况,包括区块大小、供需比例动态调整的,具体细节估计要看代码了


@胡华杰:关于比特币的技术就先分享到这里,总体来说的话,我建议应该直接去官网阅读官方的wiki和开发手册,包括源码,才能真正理解和掌握比特币以及区块链的底层技术,有助于提升对区块链的技术研发能力。


@回忆的。。。:如果采用传统的记账方式,一旦一个人的账户余额发生了变化,为了防止双花,就得同时更新全网账户的余额,这样效率很低,也容易造成数据冗余,比如我账户的btc没用动,但是因为别人的账户发生了变化,我的账号也得跟着更新,想象一下,每天我的账户要被动更新多少次,而每次更新的数据记录下来,这个数据量估计用不了多久连google的数据库都会被撑爆炸。。。。而btc稳定运行了这么多年,数据量才几百个g,就是因为采用UTXO的模式,把数据存储和双花问题都完美的解决了,真是个天才的设计


@Cynthia:其实对于UTXO之前很多人都没搞明白,这次胡老师以分享为主,给大家带来了很多干货,都明白了吗?有什么问题可以提出了一起交流,这期延长半小时讨论时间。


@回忆的。。,:所以有人说中本聪是应该获得诺贝尔经济学奖和图灵奖的第一人。


@胡华杰:极简的设计完美记录了交易的流转过程,这是一个UTXO设计的很棒的地方


@何强:不过我一直觉得中本聪后面是一个团队和公司。。不是一个人。。。像比特币中像UTXO这样让人眼前一亮的设计还有哪些呢?


@胡华杰:很简单啊,不需要事务啊,不需要复杂的各种锁啊,单向联通,关注过程,不需要关注结果


@何强:具体能给出一些点么? 这样去学习的时候好更有针对性一些


@胡华杰:比如:A转100块钱给B,我的传统思维是认为,A同时减少了100,B同时增加了100,把它想象成一个同时发生的行为,并且是相互伤害,你多了就是我少了。而UTXO的记录方式就是很简单,A-》B,这个过程记录,不需要事务,不需要什么原子操作。而且还抓住了事物的本质,很容易理解这个转账行为。钱并没有多也没有少,只是换了个主人而已。世界还是很美好的


@风静縠纹平:比特币的核心创新大概就是UTXO了,其他相关技术都不是什么新鲜东西。


@颜颜:感谢胡华杰老师的分享和各位的参加,今天先聊到这里,大家可以继续消化一下。讨论的内容会沉淀下来发布在公众号,还有想问的可以在文末留言哦~