主页 > imtoken下载app钱包 > 比特币程序员数据结构基础教程
比特币程序员数据结构基础教程
最近才开始了解区块链,花了一些时间努力学习了解比特币区块链的基本结构和运行机制。 比特币并不复杂,但如果深入下去,绝非很简单。
阅读本文不会增加你的炒币技巧,它只是呈现了区块链背后的技术细节。
首先我们来看一下区块链的基本链结构
区块链的结构与Java容器HashMap的内部结构非常相似,都是二维结构。 第一个维度是区块链列表。 矿工将努力创建新区块并将其添加到链表的末尾。 创建新块是一个非常困难的过程。 目前,一个区块可以赚取大约 12.5 BTC。 创建两个 现在我可以在北京安家了。 一维链表的头部是比特币创始人中本聪先生在芬兰赫尔辛基挖出的第一个区块。 这个区块被称为创世区块【Genesis Block】。
区块链的第二个维度是交易记录。 每条交易记录都包含比特币交易流通的信息。 张三给了李四5个BTC,李四给了王五3个BTC等等,甚至张三同时给了李四2个BTC和王五3个BTC可以是多方交易记录。 矿工们除了努力创造新的区块外,通常还要从浩瀚的互联网上接收交易信息。 当区块成功产生后,他们将这段时间收到的交易信息串起来,打包成新的区块,加入到全球区块链表中。 这个二维交易记录链表有一个特殊的交易记录。 此交易没有来源,只有目的地。 记录的是区块所有者获得的比特币挖矿收益,是算法之神奖励给矿工的一大宝藏。 它叫做 [CoinBase]比特币中的数据结构比特币中的数据结构,它是所有比特币的来源。 所有 CoinBase 记录中包含的 BTC 数量是流通中的比特币总量。
每个区块都有一个数字,这个数字称为区块的高度[Height]。 我们把挖矿想象成盖房子,每一块都是新的一层,所以高度的概念很好理解。 目前这个房子已经建到50w层,大约每10分钟就会建一层。 这个高度没有上限,矿工们会一直挖到时间的尽头。 我们或多或少知道比特币的数量是有上限的,大约是2100万枚。 如果矿工可以一直挖下去,获得 CoinBase 奖励,那么比特币的数量是无限的? 在这里,中本聪自然考虑到算法会限制区块高度越高,挖矿收益越少,CoinBase 挖矿收益大约每隔几年就会减半。 在创世区块中,中本聪获得了 50 BTC。 今天这个时候,一个区块只有 12.5 BTC。
图中的Transactions字段是每个区块包含的交易记录数。 在区块链早期,很少有人用比特币进行交易,而且这个数额很小。 近年来,人们越来越频繁地使用比特币进行交易,而且这个数字也在不断增长。 它有一个上限。 一个块的最大容量是1M。 每条交易记录占用的空间是不确定的,有大有小。 交易涉及的账户越多,交易记录越大。 如上所述,交易可以是多边的。
作为程序员,我们知道数据库有一个日志记录,它记录了数据库的所有历史写操作。 在Redis中称为aof日志,在mysql中称为binlog。 通过重放日志,可以恢复数据库的状态。 比特币区块链也是一个分布式数据库,它对应的日志就是所有的交易记录。 通过跟踪所有的交易记录,我们可以准确地知道一个账户里有多少钱。
在解释交易记录数据结构之前,先解释一个概念,叫做【交易手续费】。 稍微有点经济学背景的同学都听说过这个概念,这就是中介机构赚钱的原动力。 矿工除了通过挖矿赚取收入外,还可以通过收取交易手续费来赚取收入。 每笔交易记录都会向矿工收取少量费用。 当矿工成功将一个新区块添加到全球区块链后,新区块中包含的所有交易记录的所有交易费用均归矿工所有。 如果内部交易记录多,交易金额比较大,矿工获得的交易手续费收入就越高。 这样,当未来挖矿收益很小的时候,矿工依然会通过手续费保持继续挖矿的动力。
交易结构是区块链中最难理解的结构。 这是一棵非常复杂的树。 这棵树是一棵由一系列交易记录串起来形成的跟踪树。 我们可以通过追踪树来追踪账户中还剩下多少比特币。
接下来我们看看交易记录的结构。
这个交易记录是一个 Coinbase 记录,它没有输入,也没有交易费用。 它是算法大神给予辛勤矿工的挖矿奖励,存在于每个区块的第一笔交易记录中。 Coinbase 可以有多个输出,这意味着这个区块是由多个矿工挖出的。 那为什么输出的不是12.5BTC而是13.28BTC,因为多出来的部分是这个区块所有交易支付的交易手续费之和。
这条交易记录显示,1.18366 BTC被分配给两个账户,一个账户获得0.692152 BTC,另一个账户获得0.4897 BTC,剩下的0.001808 BTC是奖励给矿工的交易手续费。
请注意交易记录输入和输出包含相同的帐户 ID,这是什么意思。 即0.441 BTC被调用到账户并扣除手续费后,还有19.14390825 BTC未被消费,将退回原账户。
这笔交易比较奇怪,实际上有 3 个来自不同地址的输入。 我们知道一笔比特币交易只能由一个人发起,怎么可能同时关联3个账户呢?
原因是输入中显示的账户地址不一定是交易发起人的账户地址,而是之前向交易发起人汇款的人的账户地址。 这个预交易的输出有发起方的账户地址,说明交易发起方从上一笔交易中得到一个BTC,然后用这个BTC在本次交易中进行支付。
那为什么我们需要3个输入呢? 因为一次预交易获得的BTC数量是不够的,我们需要再补几笔预交易来凑齐交易金额,所以需要多次输入。
所以我们看到了交易和交易之间的相关性。 另一笔交易的输出是这笔交易的输入,这笔交易的输出又是另一笔交易的输出,这样就产生了一条交易链。 交易链条很长,从coinbase诞生的比特币会一直延续到世界末日。
如果FBI要追查一个黑人用户的BTC来源,FBI会先通过拷问得到用户的BTC账户地址,然后他们需要找出该账户关联的所有近期交易,并沿着交易树追溯,回到所有 Coinbase 记录。 在现代巨大的CPU和内存的前提下,这种回溯是很容易做到的。 但问题是,所有账户都是一个哈希码,FBI不知道这些账户在现实世界中属于谁的账户,因此无法查出这些交易与现实世界中的哪些人有关。
如前所述,交易记录可以有多个输入和多个输出,每个输入和输出都是一个账户地址。 其实不是这样的,我们看一下原来的交易记录结构。
以上是从网站上随机找来的一条交易记录的json形式展示。 现在让我们忽略结构中的 scriptSig 和 scriptPubKey 字段。 这两个字段与区块链虚拟机的脚本指令相关,后面会仔细研究。
我们看到交易记录有一个很长的hash字符串,代表了当前交易的唯一ID,是一个基于密码算法计算出来的定长ID。 in的input域没有address域,被prev_out中的hash和n域代替。 hash字段很长,代表预交易的ID,n代表预交易输出列表中的第二个。 一个输出项[n下标从0开始],这个输出项对应的账户ID就是之前交易记录中显示的账户ID。 out字段中有一个address字段,恰好是目标输出账户ID。
所以我们得出结论,交易链是一棵由交易ID连接起来的树。 它有一个方向,从后续节点到前导节点。 从网站上,我们既可以看到交易的前身,也可以看到后身的交易,因为后身关系是从前身关系衍生出来的。 所有的交易记录都有前置交易,但不是所有的后续交易。 所有这些没有反向驱动交易的节点的输出是 UTXO [unspent transaction output]。 一笔交易可以有多个输出,其中一些有尾随交易,而另一些可能没有尾随交易。 这部分没有反向驱动事务的输出是 UXTO。 一个账户所有关联的UXTO值的总和就是该账户的余额。 UXTO是区块链中一个非常重要的概念。 可以理解为区块链记录的活跃中心。 其他SXTO【花费交易记录】固化在区块链中,仅供追踪查询。 这是冻死的记录。
图中的输出列表项后缀状态U和S分别代表UXTO和SXTO。
UXTO 可能存在于区块链的每一个区块中。 比如比特币早期,中本聪先生就挖了很多币。 这些币大部分都没有参与过任何交易,静静地躺在区块链的coinbase交易记录中。 但它们是活的比特币,准备参与交易。 还有一些像僵尸一样躺在区块里的UXTO,它们在2100万比特币中形成了一个黑洞,没有人可以使用这些UXTO,因为早期参与比特币项目的人并没有把账户里的比特币当回事,在那个时候,比特币不值钱,他们把账户的秘钥弄丢了。 现在他们后悔了,就算找到中本聪本人,他们也无能为力。