主页 > imtoken最新app下载 > 1.5比特币概述

1.5比特币概述

imtoken最新app下载 2023-01-17 00:15:07

§命令行工具bitcoin-cli

□ 控制比特币的节点。通过 JSON RPC API 接口访问比特币后端 bitcoind。用户可以通过发出指令完成比特币的各种操作,如余额查询、支付、转账等。

§ 比特币浏览器

□比特币提供了一个跨平台的C++ Libbitcoin库,支持比特币全节点服务器和浏览器作为客户端命令行工具。比特币浏览器命令提供与 bitcoin-cli 基本相同的功能。

□ 附加功能:密钥管理功能、处理工具。

§ 图形开发工具 (QT)

□Bitcoin Core是使用最广泛的比特币客户端,使用QT开发

节点背景

○功能:负责参与比特币网络的通信互联,维护区块链,验证区块,交易,广播,中继区块交易信息。

○比特币的后台程序主要由bitcoind和挖矿节点程序组成。

○ 区块链管理:包括初始区块链下载、连接区块、断开区块、验证区块和保存区块、找到链最长的区块。

§ 下载区块链

□ 比特币全节点首次加入网络时,必须下载整个区块链并进行验证。随着区块链容量的不断增加,它需要的时间越来越长。所以在新版本中,比特币发布了一种下载初始块的新方式。称为“块头等待”。这种方法可以大大提高初始块的下载速度。在这种模式下,新节点首先从相邻节点下载所有块头(一个块头占用80字节,一个块有1M,所以只下载块头可以大大加快速度)。全部头信息下载完毕后,节点可以从多个相邻节点并行下载不同区间的块,从而大大提高了整个区块链的下载速度。

§ 接收区块链

□ 在现有节点上开户时,整个区块索引会先从LevelDB转移到内存中。需要注意的问题是区块链的索引不是单条链,而可能是一棵树,也就是说每个区块只有一个父区块,但可能有多个子区块,所以可能导致分叉,这需要逐渐发现哪个子块属于最长的区块链。

□ 当节点接收到一个新块时,如果该块包含与该节点当前顶部哈希值相同的指向前一个块的块头哈希值,则该节点将尝试接收新块块,并使其成为当前链的最顶层区块,从而扩展了节点拥有的区块链。

§ 区块链验证

一个完整的比特币节点占内存多大

□ 在区块链管理中,连接区块功能是检测双花交易的关键。原理:该函数检查新收到的区块中的所有交易,并验证是否可以在当前的“Unspend Transaction Output-UTXO”记录中找到每笔交易的比特币。如果存在网络延迟,节点收到的块可能会乱序到达。在这种情况下,UTXO记录中可能暂时找不到某些交易的比特币来源,但是当延迟块稍后收到块后,更新UTXO记录,区块链就可以连接了。

§ 重组区块链

□ 当节点发现网络中有更长的区块链不是基于其当前区块链的,它需要断开现有区块并重新组织区块链。这种情况主要发生在不同矿工几乎同时挖出合法区块,出现分叉的情况。

□ 断开区块,重组区块链。这些涉及 UTXO 更改。断开块中的事务将回滚到事务内存池中。这时可以使用“回滚”记录来回滚断线。区块交易。

○区块验证(验证内容)

§ 交易格式必须正确

§ 交易输入输出不能为空

§ 交易大小不能超过定义的最大块大小 MAX_BLOCK_SIZE

§每笔交易的输出和所有输出的总和必须在一定范围内:0~2100万比特币

§输入的hash值不能为零,挖矿交易不得广播

§ nLockTime 不能大于 INT_MAX

§交易的字节大小必须大于等于100

§ 一笔交易的签名操作次数不能超过签名操作的上限

§解锁脚本只能将数字放入堆栈,锁定脚本必须是标准格式

§ 与接收到的交易匹配的交易必须在当前交易池或主链上的某个区块中找到

§ 对于一笔交易的每一个输入,如果在当前交易池中能找到其对应的UTXO输出一个完整的比特币节点占内存多大,则该交易必须被拒绝(双花交易)。因为当前交易池是没有记录在区块链上的交易,而交易的每一个输入都应该来自于确认的UTXO,如果在当前交易池中找到,就是双花交易。

一个完整的比特币节点占内存多大

§对于一笔交易的每一个输入,如果在主链或当前交易池中都找不到其对应的UTXO输出,则为孤儿交易,应放入孤儿交易池中

§对于交易中的每一个输入,如果其对应的UTXO输出是一个挖矿初始交易,那么初始应该经过100个确认区块的确认

§对于交易中的每一个输入,对应的输出必须是一个UTXO

§ 使用对应的输出交易获取输入值,检查每个输入的值及其总和,应该在允许的范围内(0~2100W比特币)

§如果交易的总输入小于总输出,则交易必须被拒绝

§如果交易费用过低,拒绝交易

§每个输入解锁脚本必须配合对应的输出锁定脚本来验证交易的合规性

○ 内存池管理

§ 内存池管理就是事务池管理

§ 节点将经过验证的交易放入交易池中,准备好放入已开采的区块中。

§ 当矿工挖出一个合格的区块时,他会按照一定的优先级顺序从交易池中选出交易,放入区块中。

§ 优先级根据交易中输入对应的UTXO的“链龄”和交易金额的大小来划分。 UTXO 交易越老,交易价值越大,优先级越高。

§ 优先级计算公式:优先级 = Sum(Value Of input * Input Age) / Transaction Size

□UTXO链时代:从交易记录在链上的区块开始,按照后面的区块数计算,也就是衡量区块在区块链上的“深度”。

□ 交易大小以字节为单位。

□ 成为高优先级,一般来说高优先级的值高于57600000。这个优先级相当于1个比特币交易量的优先级,它的“链龄”为1天(相当于有 144 个区块确认)一个完整的比特币节点占内存多大,交易长度为 250 字节。比特币块中的前 50K 字节保留用于高优先级交易。

一个完整的比特币节点占内存多大

§ 当区块已满时,剩余的交易会留在内存池中,等待下一个区块的到来。随着等待时间的增加,“链龄”会逐渐增加,未来被选中的概率也会增加。内存池中的事务不会过期,但需要注意的是,内存池中的事务不会保存在硬盘上。挖矿节点重启后,内存池中的交易将被清空。

○ 邻居管理

§ 当一个新的比特币节点进行初始启动时,它需要发现网络中的其他节点并连接到至少一个节点。

§ 通常一个 TCP 连接是与 8333 商品上的一个已知节点建立的。

§ 新节点如何发现其邻居?

□ 方法一:用一些“DNS种子”查询DNS,“DNS种子”是提供比特币节点地址的DNS服务器。 Bitcoin Core 带有 5 种不同的“DNS 种子”,可提供稳定的比特币节点地址。

□ 方法二:直接使用一个已知的邻居节点作为种子节点,通过它发现更多的邻居节点。当发现新的邻居节点时,新节点通常会与种子节点断开连接。节点将自己的信息发送给它的邻居,邻居会不断地将新节点的地址转发给他们的邻居,这样新节点就可以被网络上的其他节点知道,并保持其在网络上的连接畅通。新节点通常会与 8 个邻居保持链接。新节点启动后,它会记住最近连接的邻居的地址。当它重新启动时,它可以快速完成与已知邻居的连接。如果之前的节点都没有连接,则重新启动初始启动过程。

□节点维护

如果一个连接在一段时间内没有交互,节点会周期性的发送一些信息来维持连接。如果节点与邻居节点之间的连接超过 90 分钟未连接,则邻居节点将被视为离线。该节点将寻找一个新的邻居来连接。

这样做的好处是无需中央控制,网络节点可以自由加入或离开网络,即比特币网络可以动态调整节点连接,保证比特币网络的正常运行。

○共识管理

§比特币中主要的共识管理包括挖矿、区块验证、交易验证规则

§比特币的关键是在陌生的P2P环境中建立共识机制,因此共识管理至关重要。

§比特币的共识管理必须支持前代兼容,即使过去的版本有缺陷也必须维护,否则会导致比特币网络分叉

○ 规则管理

§ 比特币的共识规则是所有节点都必须遵守的规则。每个节点可以采用除共识规则之外的一些修改规则,由规则管理模块实现。

一个完整的比特币节点占内存多大

§ 示例:在内存池中存储交易的规则。例如,节点可以拒绝保存和传输大于 200KB 的交易。

○密码模块

§密码模块主要处理比特币地址,使用RIPEMD和SHA-256算法和Base-58编码生成比特币地址。

§通过私钥生成比特币的公钥,然后通过SHA算法SHA256和RIPEMD算法RIPEMD160对公钥进行处理,最后通过Base58编码形成比特币地址

§ Base58 与 Base64 的相似之处在于它过滤掉了一些令人困惑的字符,例如数字“0”、O(大写 o)、l(小写 L)、I(大写 i)、“+”、“/”

§Base58Check的校验码对地址信息进行双重SHA256哈希处理,取前4位作为校验码加到比特币地址的后面。所以比特币地址有校验信息,可以防止人为错误

○签名模块

§ 比特币使用椭圆曲线数字签名算法 (ECDSA) 来实现数字签名并生成公钥。

○ 脚本引擎

§ 比特币的脚本语言是一种专门设计的、类似“Forth”、基于堆栈的编程脚本语言。

§基于堆栈的语言中的指令仅按顺序执行一次,即没有循环或跳转指令。

§ 脚本指令的数量给出了程序运行时间和需要多少内存的上限。

§设计原因:防止矿工提交可能存在无限循环的脚本。

§作为一个虚拟货币系统,比特币的这种设计足以满足需求,还有很大的扩展空间

§ 比特币的脚本语言非常小,只有 256 条指令,每条指令长一个字节。

§ 在 256 条指令中,75 条保留,15 条废弃。

一个完整的比特币节点占内存多大

§ 很多命令不能在比特币网络上执行,因为每个节点都可以有自己的脚本白名单,并且只允许在白名单上运行命令。

§常用命令如下:

OP_DUP 复制栈头的内容并将其压入栈中

OP_HASH160弹出栈头的内容,先用SHA256哈希,再用RIPEMD-160再哈希,结果压栈

OP_EQUALVERIFY将两个内容弹出栈头,如果两个内容相同,返回“true”值,否则返回“false”值

OP_CHECKSIG 用输入公钥检查输入签名,如果签名匹配,返回true,否则返回false

OP_CHECKMULTISIG 使用多个提供的公钥检查多重签名的正确性

○挖矿

§ 比特币核心没有挖矿功能

§设备进化史:CPU-->GPU-->FPGA-->ASIC

§挖矿进化史:个人矿机-->矿池

§挖掘算法SHA256算法

§ 挖矿原理:不断对区块头进行哈希,每次尝试改变一个随机数,直到区块头的哈希值满足指定条件:计数挖出一个合格的区块。

§ 由于哈希处理是不可逆的,即不能从哈希值中推导出输入值,因此无法预测输入参数,只能进行随机测试。

§ 比特币挖掘的难度目标大约决定了网络挖掘一个区块需要多长时间。

§平均约10分钟挖一个区块,可调

§ 比特通过调整挖矿难度来调整出块速度。具体来说,每 2016 个区块,所有节点都要重新更新比特币挖矿难度目标,因此达到 2016 个区块所需的时间应该是 20160 分钟。如果实际时间小于20160,说明难度太高。低,需要增加难度,如果实际时间大于20160,难度高,需要降低难度