虾说区块链-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)内容支持计划赞助。
之前写了点东西,随着对区块链的理解,发现有些理解的并不透彻,重新整理。如有理解不正确的地方,请及时指正,同时有兴趣一块交流的可以加笔者微信:
- 网站静态内容出版解决方案
- 如何复制图文消息封面图片?正文没显示
- C#基础知识回顾--线程传参
- 数据库进程间通信解决方案IPC
- 苹果后端的Oracle数据库
- C#基础知识回顾--C#遍历enum类型、获取enum项个数
- 用香蕉也能玩电脑游戏—Tensorflow对象检测接口的简单应用
- 通过图片定位给一张图片添加多个链接
- Struts Interceptor Example
- 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- matlab sum函数
- [tensorflow损失函数系列]softmax_cross_entropy_with_logits
- RESTful API 设计最佳实践
- Spring 是如何解决循环依赖的?
- 移动webhead参数
- 看了这篇泛型,下次设计链表别傻傻的用int 表示node节点的值了
- 标准TensorFlow格式 TFRecords
- LeetCode 05最长回文子串
- 基于NCNN的3x3可分离卷积再思考盒子滤波
- [译]Buidler 新手教程
- tf.train.shuffle_batch函数解析
- 网页小图标Favicon
- ASP.net Core MVC项目给js文件添加版本号
- 多目标优化非支配关系实现
- linux之shell