• 比特币--挖矿过程


    参考文章

    比特币区块链数据结构

    2. 交易和交易验证

    2.1 交易的报文格式

    2.1 验证交易

    在收到交易后,每一个节点都会在全网广播前对这些交易进行校验,并以接收时的相应顺序,为有效的新交易建立一个池(交易池)。
    每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表:

    	交易的语法和数据结构必须正确。
    	输入与输出列表都不能为空。
    	交易的字节大小是小于MAX_BLOCK_SIZE的。
    	每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。
    	没有哈希等于0,N等于-1的输入(coinbase交易不应当被中继)。
    	nLockTime是小于或等于INT_MAX的。
    	交易的字节大小是大于或等于100的。
    	交易中的签名数量应小于签名操作数量上限。
    	解锁脚本(Sig)只能够将数字压入栈中,并且锁定脚本(Pubkey)必须要符合isStandard的格式 (该格式将会拒绝非标准交易)。
    	池中或位于主分支区块中的一个匹配交易必须是存在的。
    	对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝。
    	对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。
    	对于每一个输入,如果引用的输出交易是一个coinbase输出,该输入必须至少获得COINBASE_MATURITY (100)个确认。
    	对于每一个输入,引用的输出是必须存在的,并且没有被花费。
    	使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内 (小于2100万个币,大于0)。
    	如果输入值的总和小于输出值的总和,交易将被中止。
    	如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。
    	每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。
    

    3. 构造候选区块-打包交易

    a). 验证交易后,比特币节点将交易添加到自己的交易池中,用来暂存尚未被加入到区块的交易记录
    b). 比特币节点为交易池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块
    优先级从高到低: 创币交易(区块创建奖励交易) > 高优先级交易 > 按矿工费排序的交易 > 不含矿工费的交易

    c). 创币交易+高优先级交易 == 50K
    d). 区块被填满后,剩余交易继续留在交易池

    //区块结构
    一个区块将主要包括如下内容:
    	4 字节的区块大小信息;
    	80 字节的区块头信息:
    	版本号:4 字节;
    	上一个区块头的 SHA256 hash 值:链接到一个合法的块上,32 字节;
    	包含的所有验证过的交易的(Merkle)树根的哈希值,32 字节;
    	时间戳:4 字节;
    	难度指标:4 字节;
    	Nonce:4 字节,PoW 问题的答案;
    	交易个数计数器:1~9 字节;
    	所有交易的具体内容,可变长
    

    区块头部结构

    4. 挖掘-找到一个让区块有效的随机数

    4.1 挖矿算法

    挖矿节点不断重复进行尝试,直到它找到的随机调整数使得产生的哈希值低于某个特定的目标
    挖矿的过程即是找到x的值: SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
    • block的版本 version
    • 上一个block的hash值: prev_hash
    • 需要写入的交易记录的hash树(梅克尔树)的值: merkle_root
    • 更新时间: ntime
    • 当前难度: nbits (据此可算出TARGET)
    • x, 值0~2^32

    4.2 如何确定当前难度-nbits

    为什么需要调整

    比特币区块平均10分钟生成一个,是比特币的心跳时间,必须几十年内保持恒定。但是随着挖矿人数的不断变化,必须动态调整难度以调整产出时间。
    

    如何调整

    调整由每个完整节点独立自动完成,每2016个区块(2周)调整一次,调整公式是由最新2,016个区块的花费时长与20,160分钟比较得出的。
    为了防止难度的变化过快,每个周期的调整幅度必须小于一个因子(值为4)。如果要调整的幅度大于4倍,则按4倍调整。
    

    5. 成功构建区块-挖掘成功

    a). 挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。
    b). 其它节点在接收并验证这个新区块后,加入自身区块链中,并放弃正在计算的高度相同的区块,立即开始计算下一个区块
    c). 继续传播此区块。
    

    6. 区块链组装和选择-广播冲突

    区块链维护3种区块
    a). 连接到主链上的
    b). 主链上产生分支的(备用链) 比特币总是选择最长的链,所以分支链的情况会在再下一个块被找到时解决
    c). 已知链中没有找到已知父区块的 之后收到父区块时会被取出链接上



  • 相关阅读:
    可能是全网最详细的express--middleware
    带你学Node系列之express-CRUD
    简单聊聊ES6-Promise和Async
    Node学习图文教程之express重写留言本案例
    Node.js学习(第四章:初见express)
    彻底弄懂ES6中的Map和Set
    全网最easy的better-scroll实现上拉加载和下拉刷新
    Node中require第三方模块的规则
    canvas实现酷炫气泡效果
    Node.js实现用户评论社区(体验前后端开发的乐趣)
  • 原文地址:https://www.cnblogs.com/Desneo/p/7667485.html
Copyright © 2020-2023  润新知