区块链网站|NFTS BTC教学指南 程序员比特币教程数据结构基础

程序员比特币教程数据结构基础

广告位

面向程序员的比特币教程之数据结构基础

最近刚开始了解区块链,花了一些时间努力学习,大致了解了比特币区块链的基本结构和运行机制。比特币并不复杂,但如果深入挖掘,也绝不是很简单。

阅读这篇文章不会增加你的硬币投机技巧,它只是介绍了区块链背后的技术细节。

让我们先来看看区块链的基本链结构。

区块链的这种结构与Java容器HashMap的内部结构非常相似,是二维结构。第一维是块的链表。矿工会想尽办法做新块,加到这个链表的末尾。制作新积木是一个非常困难的过程。目前一块能赚12.5BTC左右,两块能在北京安家。一维链表的头部是比特币创始人中本聪在芬兰赫尔辛基挖掘的第一个区块,这个区块被称为Genisis Block。

区块链的第二个维度是交易记录。每笔交易记录都写明了比特币交易的流通信息,比如张三给李四5 BTCs,李四给王五3 BTCs等信息。甚至是张三同时给李四2 BTCs,王五3 BTCs这样的多边交易记录。通常,除了努力创造新的区块之外,矿商还会接受来自浩瀚互联网的交易信息。当区块制造成功后,它们会将这段时间收到的交易信息串起来,打包到新的区块中,并添加到全局区块链表中。这个交易记录的二维链表有一个特殊的交易记录。这个交易没有来源,只有目的地。记录的是块主获得的比特币挖矿收入,是上帝用一种虚无主义的算法奖励给矿工的巨大宝藏。它叫做[CoinBase],是所有比特币的来源。所有CoinBase记录中包含的BTC量就是流通中的比特币总量。

每个块都有一个数字,这个数字叫做块的高度。我们把采矿想象成盖房子,每一块都是新的一层,所以高度的概念非常好理解。目前房子已经建到50w层,大概每10分钟就要建一层。这个高度没有上限,矿工会一直挖到天荒地老。我们知道比特币的数量是有上限的,大概是2100w W,如果矿工可以一直挖下去并获得CoinBase奖励,那么比特币的数量就不会有上限吗?中本聪在这里很自然地考虑到,算法会限制开采收入随区块高度减少,CoinBase的开采收入大约每隔几年就会减半。中本聪在创世纪区块获得了50BTC,而今天这个时候,在一个区块只发现了12.5BTC。

图中的事务字段是每个块中包含的事务数量。在区块链早期,很少有人使用比特币进行交易,这个数字非常小。近年来,人们使用比特币交易越来越频繁,这个数字也越来越大。它有一个上限。一个块的最大容量是1M,每个事务记录占用的空间是可变的,或大或小。交易涉及的账户越多,交易记录就越大。如上所述,交易可以是多边的。

作为程序员,我们知道每个数据库都有一个日志记录,记录了数据库所有的历史写操作。Redis里叫aof log,mysql里叫binlog。通过重放日志,可以恢复数据库的状态。比特币区块链也是一个分布式数据库,它对应的日志都是交易记录。通过跟踪所有的交易记录,我们可以准确地知道某个账户有多少钱。

在解释交易记录的数据结构之前,我们先解释一个概念,叫做【交易成本】。有一些经济学基础知识的同学都听过这个概念,是中介来要钱的动力。矿商不仅可以从采矿中获得利润,还可以通过收取交易费获得利润。每笔交易记录都会有一小笔费用会奖励给矿工。当采矿者成功地将新区块添加到全局区块链时,包含在该新区块中的所有交易记录的所有交易成本将归该采矿者所有。内部交易记录越多,交易金额相对越大,矿商获得的交易成本收益就越高。这样,当未来采矿的收入很少时,矿工仍然会通过交易成本保持继续采矿的动力。

在区块链,交易结构是最难理解的结构。它是一棵非常复杂的树,是一系列交易记录串在一起形成的一种跟踪树。我们可以通过追踪树来追踪一个账户里还剩多少比特币。

接下来,我们来看看交易记录的结构。

这个交易记录就是比特币基地记录,没有投入,没有交易费用。它是上帝给予勤劳矿工的采矿奖励,它存在于每个区块的第一笔交易记录中。比特币基地可以有多个输出,这意味着这个区块是由多个矿工挖的。那为什么输出是13.28BTC而不是12.5BTC?因为超出的部分是本区块所有交易支付的交易费用之和。

这一交易记录表明,1.18366 BTC被分配到两个账户,一个账户得到0.692152 BTC,另一个账户得到0.4897 BTC,剩下的0.001808 BTC是奖励给矿工的交易费。

请注意,该事务记录的输入和输出包含相同的帐户ID。这是什么意思?意思是0.441 BTC打到一个账户,扣除交易费用后,还有19.14390825 BTC没有消费,退回原账户。

这个事务比较奇怪,有三个来自不同地址的输入。我们知道比特币只能由一个人发起。怎么能同时和三个账号挂钩呢?

原因是输入中显示的账户地址不一定是交易发起方的账户地址,而是之前给过交易发起方钱的人的账户地址。发起者的账户地址包含在该预交易的输出中,表明交易发起者从该预交易中获得了一个BTC,然后在该交易中使用该BTC进行支付。

那你为什么需要三个输入?因为一个预交易不能获得足够的BTC,您需要收集更多的预交易来弥补交易金额,因此您需要多个输入。

所以我们看到了交易和交易之间的关联。一个事务的输出是这个事务的输入,这个事务的输出是另一个事务的输出,这样就创建了事务链。交易链条很长,从coinbase诞生的比特币会一直延续到世界末日。

如果联邦调查局想要追踪一个黑人用户的BTC的来源,联邦调查局首先拷问用户的BTC账户地址,然后他们需要找出与这个账户相关的所有近期交易,并沿着交易树追溯到所有的比特币基地记录。在现代巨大的CPU和内存的前提下,这种回溯很容易做到。但问题是所有账户都是一个哈希码。FBI不知道这些账户在现实世界中是谁的账户,所以也查不出这些交易在现实世界中具体与谁有关。

上面提到的交易记录可以有多个输入和多个输出,每个输入和输出都是一个账户地址。其实并不是这样的。让我们看看原始的交易记录结构。

以上是从http://webbtc.com网站随机找到的一个交易记录的json展示。让我们暂时把结构中的scriptSig和scriptPubKey字段放在一边。这两个字段涉及区块链虚拟机脚本指令,我们稍后将研究它们。

我们看到事务记录有一个很长的散列字符串,它表示当前事务的惟一ID。它是基于加密算法计算的固定长度ID。in的输入字段中没有地址字段,但prev_out中有hash和n字段。hash字段很长,表示前置交易的ID,n表示前置交易输出列表中的第二个输出项[n下标从0开始]。该输出项对应的账户ID就是之前交易记录中显示的账户ID。out字段中有一个地址字段,它恰好是目标输出帐户ID。

所以我们得出结论,事务链是由事务id串联起来的树,有方向,从后驱动节点指向前驱动节点。从http://webexplorer.com的网站上,我们可以看到前者和后者,因为后者是由前者衍生而来的。所有的交易记录都有前驱动交易,但并不是所有的交易记录都有后驱动交易。所有这些没有反向驱动事务的节点输出都是UTXO[未使用事务的输出]。一个事务可以有多个输出,其中一些有反向驱动事务,而另一些可能没有反向驱动事务。不含后驱动处理的该器件输出为UXTO。账户中所有相关UXTO的价值之和即为该账户的余额。未爆炸弹药在区块链是一个非常重要的概念。可以理解为区块链记录的活跃中心。其他SXTO[失效交易记录]被保存在区块链中,仅供跟踪和查询。他们被冻死的记录。

图中输出列表项的后缀states U和S分别代表UXTO和SXTO。

UXTO可能存在于区块链的每个街区。比如中本聪老师在比特币早期挖到了很多硬币,这些硬币很大一部分从来没有参与过任何交易,就这样静静地躺在区块链的coinbase交易记录里。但他们是活的比特币,可以随时参与交易。有些Uxtos像僵尸一样躺在街区里。它们在2100w的比特币中形成一个黑洞。没人能用这些Uxtos,因为早期参与比特币项目的人都没把账户里的比特币当回事。那时候比特币不值钱,他们把账户的秘钥弄丢了。现在他们后悔了,即使他们找到了中本聪本人,他们也无能为力。

日本[虚拟货币女孩]偶像团体

多看相关文章,关注头条【代码洞】

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/btbjiaoxue/29260.html

作者: 花木

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部