虾说区块链-55-《精通比特币》笔记十

时间:2022-04-23
本文章向大家介绍虾说区块链-55-《精通比特币》笔记十,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一直在说区块链是一系列技术结合后的新的技术架构,那么这里分别介绍下这些相关技术,也涉及到一些扩展开去的相关内容。

区块链-《精通比特币》笔记十:

《精通比特币》第二版网络在线阅读地址:

http://book.8btc.com/books/6/masterbitcoin2cn/_book/ch08.html

交易独立验证:在钱包软件中,通过收集UTXO,提供正确的解锁脚本,新建一个支出给接收者来创建交易,随后交易广播到网络中。在节点收到交易的时候,首先验证该交易,检验正常则传播,检验不正常则在第一个节点就废弃。校验列表:

交易的语法和数据结构正确。

输出和输入列表不为空。

交易字节大小

输出的总量在2100万个(bitcoin的最大值)。

没有hash值为0,N等于-1的输出。

Nlocktime是小于或等于INT_MAX,或者nlocktime and nSequence的值满足Median TimePast。(Median Time是这个块的前面11个块按照block time排序后的中间时间)

交易字节大小是大于或等于100.

交易中签名数量小于签名操作数量上限。

解锁脚本只能将数字压入栈中,锁定脚本必须符合isStandard格式。

池中或者位于主分区区块中的一个匹配交易必须是存在的。

对于每一个输入,引用的输出必须存在,且没有被花费掉。

对于每一个输入,引用的输出存在于池中任何别的交易中则交易被拒绝。

对于每一个输入,主分支和交易池中寻找引用的输出交易,如检查缺少该输出交易中任何一个输出,该交易成为一个孤立交易,且其匹配的交易为出现在池中,那么加入到孤立交易池。

对于每一个输入,如果引用的输出交易是一个coinbase输出,那么该输入至少获得COINBASE_MATURITY(100)个确认。

使用引用的输出交易获得输入值,检查每一个输入值的总值是否在规定范围内,小于2100个bitcoin,大于0.

输入值的总和小于输出值的总和,交易中止。

交易费太低无法进入一个空区块,交易中止。

每一个输入的解锁脚本必须依据相应输出的锁定脚本验证。

以上交易验证在bitcoin客户端的AcceptToMemoryPool、CheckTransaction、CheckInputs函数中执行操作。

交易打包:在验证交易后,bitcoin节点会将这些交易添加到自己的内存池中(交易池),用来暂时存储未添加到区块的交易记录,验证这些交易,挖矿节点把这些交易整合到一个候选区块中。每一个挖矿节点维护本地的区块链数据副本,同时一直在网络上监听网络中的交易,本地区块高度和网络上区块高度对比,一旦收到信的高度的区块信息,那么就是下一个区块生成的竞争开始,在整个过程中,挖矿节点在计算新区块的数学难题的同事,也同时收集交易记录为再下一个区块做准备,这些交易存放在内存池,验证新区块产生后,检查区块中的交易同时移除自己内存池中在区块中生成的交易记录,剩余的等候在下一个区块生成。挖矿节点通过竞争机制,构建的区块是一个候选区块,只有在完成工作量证明解后,这个区块才生效。该命令索引区块信息:bitcoin-cli get blockhash 区块高度。

创币交易:区块中的第一个交易是一个特殊的交易,作为矿工的奖励,称为创币交易或者coinbase交易,这个交易发送到竞争胜利矿工的钱包。这个创币交易没有输入,不消耗UTXO,就称为coinbase输入。

Coinbase奖励、矿工费:矿工的奖励除了创币还有区块中交易的交易费。Total fees=Sum(Inputs)-Sum(Outputs)。Coinbase奖励:变量Subsidy表示初始奖励,值为COIN常量(100000000聪和50的乘积),奖励减半通过变量halvings来控制,halvings最大值64,然后这个函数二进制右移操作一位、等同于除2的操作。来实现减半。

创币交易结构:Transaction Hash(32bytes)、Output index(4bytes)、coinbase data size(1-9bytes)、coinbase data(variable)、sequence number(4bytes)。

Coinbase数据:创币交易中不含解锁脚本,这个字段被coinbase数据替代,长度2字节最大100字节,矿工可以使用其他部分填充任何数据。一段coinbase16进制字符串中,第一个字节,执行后面字节压入脚本栈,接下来三个字节翻转十进制为区块高度,接下来介个16进制是随机值,求解一个适当的工作量证明,coinbase数据结尾ASCII编码字符P2SH。

区块头构造:构造区块头的过程中,挖矿需要填充6个字段。Version(4bytes)、Previous block hash(32bytes)、Merkle root(32bytes)、timestamp(4bytes)、target(4bytes)、nonce(bytes)。

构建区块:挖矿最为简单理解就是不停的计算区块头的hash值,不断尝试,直到匹配。

本文由币乎社区(bihu.com)内容支持计划赞助。

之前写了点东西,随着对区块链的理解,发现有些理解的并不透彻,重新整理。如有理解不正确的地方,请及时指正,同时有兴趣一块交流的可以加笔者微信: