主页 > 放imtoken钱包安全吗 > 区块链教程系列:比特币中的网络和区块链

区块链教程系列:比特币中的网络和区块链

放imtoken钱包安全吗 2023-03-25 06:32:29

内容

介绍

比特币的底层是区块链技术,区块链也因比特币而广为人知。与其他区块链技术相比,比特币的区块链有哪些特点?作为去区块链的鼻祖,有哪些独特的特点?快来和我们一起看看吧。

比特币的网络

比特币使用 P2P(点对点)网络。这种 P2P 不是点对点的。这是一个点对点的网络架构,而不是个人对个人的借贷模型。

P2P是指同一网络中的每台计算机都是对等的,每个节点共同提供网络服务,没有“特殊”节点。每个网络节点都以“平面”拓扑相互连接。P2P 网络中没有服务器、集中式服务和层次结构。

image.png

传统的网络结构是客户端-服务器模式。所有客户端都与服务器交互以获取信息。只要服务器挂了,客户端就没用了。

在P2P网络中,没有服务器的概念,每个节点都可以充当服务器。相比之下,P2P 网络在稳定性方面比基于 CS 的系统要稳定得多。

网络发现和同步

既然是P2P网络揭秘比特币和区块链(四),那么问题来了,这个P2P网络是怎么建立起来的呢?如何发现节点?

做过P2P下载的同学应该都听说过种子的概念,种子里面存储着其他活跃节点的地址。通过下载种子,您​​可以连接到相应的节点。

并且每个节点保存最近连接或活跃的节点,从而形成一个巨大的P2P网络。

比特币的 P2P 网络也是如此。

新节点如何发现网络中的对等点?虽然比特币网络中没有特殊的节点,但客户端维护了一个长期稳定运行的节点列表。这样的节点被称为“种子节点”

一个节点必须不断地做两件事:当现有连接丢失时发现新节点,并在其他节点出现时协助它们。

SPV 节点

正如我们之前介绍的,在比特币的世界中,既没有账户也没有余额,只有 UTXO(未使用的交易输出)分散在区块链中。

那么如果要对交易进行验证,就需要从历史交易中找出与该交易相关的所有交易,从而进行完整全面的验证。

这样做的问题是,如果你下载所有的历史记录,你将需要数百G的硬盘空间,这对于手机或其他轻量级客户端来说是不可想象的。

于是SPV出现了。SPV的全称是Simplified payment verification,简称为简单认证支付。

SPV 保存的不是整个区块链,而是区块链的头部。因为每个区块链头只有 80 字节揭秘比特币和区块链(四),所以即使所有的头都下载保存,也不会很大。

区块链头

块头由三组块元数据组成。第一个是引用父块哈希的一组数据,这组元数据用于将这个块连接到区块链中的前一个块。

第二组元数据,即难度、时间戳和随机数,与挖矿竞争有关。

第三组元数据是默克尔根(一种用于有效汇总块中所有交易的数据结构)。

挖掘过程中使用随机数、难度目标和时间戳,使用 Merkle 根对区块中的所有交易进行索引和组织。

image.png

上图是一串区块链头。

默克尔树

Merkle Tree是一种树(数据结构中的树),网上多称为Merkle Hash Tree,因为它所构造的Merkle Tree的所有节点都是Hash值。默克尔树具有以下特点:

它是一种树,可以是二叉树,也可以是多叉树,无论是少叉树,都具有树结构的所有特征;

Merkle 树的叶子节点上的值由你指定,主要取决于你的设计。例如,Merkle Hash Tree 会使用数据的哈希值作为叶子节点的值;

一个非叶子节点的值是根据它下面所有叶子节点的值再按照一定的算法计算出来的。例如,Merkle Hash Tree的一个非叶子节点的值的计算方法是将该节点的所有子节点组合起来,然后对组合后的结果进行hash计算,得到hash值。

image.png

有了 Merkle Tree,我们只需要知道其他 Merkle Tree 中与待验证交易相关的信息,然后我们就可以计算出整个 Merkle Tree 的值,这样我们就可以直接使用 header 信息进行验证了。这就是SPV的原理。

比特币中的区块链

区块链是一种数据结构,其中包含交易信息的块按从后到前的顺序链接。它可以存储为平面文件(包含没有相对关系的记录的文件),也可以存储在简单的数据库中。

比特币核心客户端使用谷歌的 LevelDB 数据库来存储区块链元数据。

它由一个包含元数据的块头和组成块体的一长串交易组成。区块头为 80 字节,而平均交易至少为 250 字节,平均区块包含至少 500 笔交易。

image.png

块标识符

那么它如何代表一个块呢?我们使用块标识符。

主要的块标识符是它的加密哈希值,一个数字指纹,通过使用 SHA256 算法对块头进行两次哈希处理获得。生成的 32 字节哈希称为区块哈希,但更准确的名称是:区块头哈希,因为只有区块头用于计算。

识别区块的第二种方法是通过它在区块链中的位置,称为“区块高度”。第一个块,块高为0

与区块哈希不同,区块高度不是唯一标识符。虽然单个块将始终具有明确的固定块高度,但反之则不成立,并且块高度并不总是标识单个块。两个或多个区块可能具有相同的区块高度并在区块链中竞争相同的位置。

创世区块

区块链中的第一个区块创建于 2009 年,称为创世区块。它是区块链中所有区块的共同祖先,这意味着如果你从任何区块往回走,你最终会到达创世区块。

由于创世块被编程到比特币客户端软件中,每个节点都以包含至少一个块的区块链开始,这确保了创世块不能被更改。每个节点都“知道”创世块的哈希值、结构、创建时间以及其中的交易。因此,每个节点都将这个区块视为区块链的第一个区块,从而构建了一个安全可信的区块链的根。

创世块的哈希值为:

0000000000 19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

创世区块包含一条隐藏消息。其 Coinbase 交易的条目包含“2009 年 1 月 3 日泰晤士报总理濒临对银行进行第二次救助”这句话。这句话是当天的泰晤士报头版头条,引用这句话既是对区块生成时间的提及,也可以算是半开玩笑的提醒区块链的重要性。一个独立的货币体系,同时告诉人们随着比特币的发展,将会发生一场前所未有的全球货币革命。该消息由比特币的创造者 Satoshi Nakamoto 嵌入到创世区块中。

image.png

COINBASE的:04FFFF001D01044545468652054696D657320303232F4A616E2F32F3539204392303366363656566C6220666E66E66E66E66E66E66E66E66E66E66E66E66E276F66E26EMENG66EF66EMENG66EF66EME

解码方法如下:

在 python 外壳下:

"04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73".decode('hex')

输出:

'\x04\xff\xff\x00\x1d\x01\x04EThe Times 03/Jan/2009 财政大臣濒临对银行进行第二次救助'

总结

本文介绍了比特币网络以及比特币中区块链的相关概念。我希望你喜欢它。