主页 > 苹果可以下载imtoken钱包吗 > 比特币和区块链学习笔记

比特币和区块链学习笔记

比特币的基本概念及相关理解

本笔记大部分基于比特币超详入门指南和阮一峰老师关于区块链的博客

区块链本质上是一个分布式数据库系统和一个开放式账本系统。

本质上,区块链是一个具有特定结构的数据库,一个有序列表,其中每个区块都连接到前一个区块。也就是说,块是按照它们插入的顺序存储的,每个块都连接到前一个块。这种结构让我们可以快速获取链上的最新区块,并通过高效地散列来检索区块。

挖矿(工作证明)

工作量证明是一种共识算法,在比特币中,工作是找到一个区块的有效哈希并证明其有效性。

获取指定数据的哈希值的过程称为哈希计算。哈希是计算数据的唯一表示。对于散列函数,输入任意大小的数据,它会输出一个固定大小的散列值。以下是哈希的几个关键属性:

原始数据无法从哈希值中恢复。也就是说,散列不是加密。

一个特定的数据只能有一个哈希值,并且这个哈希值是唯一的。

即使只更改输入数据中的一个字节,也会导致输出完全不同的哈希值。

在区块链中,散列用于保证区块的一致性。散列算法的输入数据包含前一个块的散列,因此不可能(或至少很难)修改链中的一个块:因为如果一个人想要修改前一个块的散列,那么他有重新计算该区块和所有后续区块的哈希值。

找到合适的哈希需要大量的计算,平均需要 10 分钟才能找到合适的哈希并生成 1 个新块。

交易

比特币有两种交易类型:

普通交易,输入会参考之前交易的输出。也就是花掉之前的交易输出

例外,coinbase 交易,即挖矿奖励,只输出

在交易中,需要注意的是:

然后,交易需要发送方、接收方和交易金额。整个交易流程如下:

从发送者那里找到足够交易量的未花费交易输出s(可能是多个输出的叠加)作为交易的输入

确定输出,输出可能是2,一个是接收方,另一个是发送方的零钱

值得注意的是,交易生成后并不会立即生效,而是先将交易放入内存池中,然后当矿工准备挖新块时,取出所有交易从内存池中,创建一个候选区块,当包含这些交易的区块被挖掘并添加到区块链时,其中的交易将不会开始被确认。

地址

当交易发生时如何检查发送方和接收方,如何在没有用户帐户的情况下检查所有未使用的输出?在比特币中,验证方式是密钥对、公钥和私钥。私钥代表你,所有交易中包含的信息都与公钥相关。

根据协议,公钥的长度为 512 位。这个长度不容易传播,所以协议还规定要为公钥生成一个 160 位的指纹。所谓指纹,就是一个比较短,易于传播的哈希值。 160位是二进制,写成十六进制,大约是26到35个字符,地址。

生成交易时,需要对数据进行签名。签名过程需要签名数据和私钥。该签名将存储在交易输入中。为了验证签名,需要签名的数据、签名和公钥。所以在一个交易的输入中,三个都被存储了。那么,什么时候进行验证呢?当事务从内存池中取出并放入一个块时,每个事务都必须经过验证。验证是什么意思?一是检查交易输入是否有权使用上一笔交易的输出,二是检查交易签名是否正确。

交易过程,交易是将比特币从一个地址转移到另一个地址。报告交易时,除了交易金额,发送比特币的一方还必须提供以下数据:

验证这笔交易的真实性需要三个步骤:

查找最后一笔交易并确认付款人的比特币来源

计算付款人公钥的指纹,确认与付款人地址相同,保证公钥为真

使用公钥解锁数字签名,保证私钥的真实性

交易确认,交易必须写入区块链才能生效。首先,所有交易数据都发送给矿工,矿工负责将这些交易写入区块链。根据比特币协议,一个区块的最大大小为 1MB,一个交易大约 500 字节,因此一个区块最多可以包含 2000 多个交易。矿工负责将这 2000 多笔交易打包在一起形成一个区块,然后计算这个区块的 Hash(工作量证明)。另外,鉴于区块链的分叉,根据比特币协议,分叉点首先达到6个区块的分支被认定为官方区块链,其他分支将被废弃。因此,a 要让交易真正生效,您必须等待至少 1 小时。

粘贴一点数据结构以供参考。

输入结构定义为

type TXInput struct {
    Txid      []byte  //一个输入引用之前交易的一个输出,txid为之前交易的ID
    Vout      int  //之前交易的输出可能有多个,需要指明是具体哪一个
    Signature []byte //签名
    PubKey    []byte //公钥
}

输出结构定义为

type TXOutput struct {
    Value      int  
    PubKeyHash []byte //公钥哈希
}

看到这两个结构的定义,可以想象签名的作用只是为了验证。输出中公钥哈希的使用场景是验证。例如,在搜索未使用的输出时,判断条件是输出中的公钥哈希是否与哈希后的当前公钥匹配,还有其他场景。查看交易的完整生命周期。

起初,创世区块包含一个 coinbase 交易。在 coinbase 交易中,没有输入,也不需要签名。 coinbase 交易的输出包含一个散列公钥(使用 RIPEMD16(SHA256(PubKey). )) 算法)

当有人发送硬币时,就创建了一笔交易,该交易的输入引用了前一笔交易的输出,同时还存储了一个公钥(未经过哈希处理)和整个交易的签名

比特币网络中接收交易的其他节点会验证该交易,除其他外,它们会检查在一个输入中,公钥哈希是否与引用的输出哈希匹配(这保证了发送者只能花费他们自己的硬币);签名是正确的(这保证了交易是由硬币的实际所有者创建的)。

当矿工准备好挖一个新区块时,他将交易放入区块并开始挖矿。

当一个新区块被挖出时,网络中的所有其他节点都会收到一条消息,告诉其他人该区块已被挖出并添加到区块链中。

当一个区块被添加到区块链中时,交易就完成了,它的输出可以在新的交易中被引用。

接下来是一些加密算法~

UTXO 设置

在查找一个公钥的所有未使用输出时,需要查找所有块和块中的每一笔交易,但是如果块太多,迭代成本会太大。解决方案是拥有一个仅包含未使用输出的索引,这是 UTXO 集所做的,一个由所有区块链交易构建的缓存(迭代块,但仅一次),然后使用它来计算余额并验证新交易。

默克尔树

Merkle 树是一种优化机制。它意识到在每个区块中都有一棵 Merkle 树。树的叶子节点是一个事务hash,从下到上,成对,连接两个节点的hash,把组合后的hash作为一个新的hash,新的hash就成为一个新的树节点,直到树的根,根哈希将作为整个区块交易的唯一标识比特币转账手续费是付现金吗,保存到区块头中,用于工作量证明。

Merkle 树的好处是节点无需下载整个区块即可验证交易是否包含在内。而这些只需要一个交易哈希、一个 Merkle 根哈希和一个 Merkle 路径。

P2PKH

比特币中有一种Script编程语言,用于锁定交易输出;交易输入提供解锁输出的数据。该脚本称为支付公钥哈希(P2PKH),是比特币中最常用的脚本。它所做的只是支付公钥哈希,即用某个公钥锁定一些硬币。这是比特币支付的核心:没有账户,没有转账;只是一个检查提供的签名和公钥是否正确的脚本。拥有这样的脚本语言实际上也可以使比特币成为一个智能合约平台:除了使用单个公钥转移资金外,该语言还支持许多其他支付方案。

数据库结构

简单来说,Bitcoin Core 使用两个“桶”来存储数据:

比特币转账手续费是付现金吗,存储描述链中所有块的元数据

chainstate,存储一条链的状态,即当前所有未使用的交易输出,以及一些元数据

此外,出于性能原因,Bitcoin Core 将每个块存储为磁盘上的不同文件。这样,就不需要为了读取单个块而将所有(或部分)块加载到内存中。

网络

区块链网络是去中心化的,这意味着没有服务器,客户端不需要依赖服务器来获取或处理数据。在区块链网络中,有节点,每个节点都是网络的成熟成员。节点就是一切:它既是客户端又是服务器。需要牢记这一点,因为这与传统的 Web 应用程序非常不同。

区块链网络是一个P2P(Peer-to-Peer,端到端)网络,即节点与其他节点直接相连。它的拓扑是扁平的,因为在节点的世界中没有层次结构。每个节点必须与许多其他节点交互,它必须请求其他节点的状态,与自己的状态进行比较,并在过期时更新状态。

当您付款时,您的节点会将交易告知另一个节点,直到该交易传遍整个网络。矿工从互联网上收集各种新发生的交易,并将它们打包到区块链中。一旦写入成功,矿工所在节点的区块链将成为最新版本,其他节点将复制新添加的区块,确保全网区块链一致。

节点角色: