区块链的运转流程

区块链的运转流程 当一笔交易经由某个节点或钱包产生时,这笔交易需要被转播给其他的节点来做验证。 产生一笔新交易 一笔新交易产生时,会被广播到区块链中的其他参与节点 各节点将多笔交易一起放进区块 每个节点会将数笔未验证的交易的hash值收集到区块中,每个区块可以包含数百笔或上千笔交易 决定由谁来打包区块 各个节点进行POW,来决定谁可以获得区块的打包权,由最快算出结果的节点打包该区块 各节点验证打包的区块 其他节点会确认这个区块所包含的交易是否有效,确认没被重复花费且具有有效数位签章后,接受该区块,此时该区块才能正式接上区块链 交易验证完成 所有节点一旦接受该区块后,先前没计算完POW工作的区块将会失效,各节点会重新建立一个区块,并开始下一轮POW计算工作 Q&A 节点如何验证某个区块的有效性? 当某个节点收到某个区块后,需要验证的信息有三个: 区块编号有效 对区块的header进行2次hash计算,计算出来的值就是当前区块的hash值 区块的上一个区块hash值有效 对比区块里的上一个区块hash值和当前节点区块链里的最后一个区块的编号(每个节点都有着一条完整的区块链数据),如果相同则验证通过,如果不同,需要顺着已有链往前查找,直到找到这个编号的页(找到了又怎么样呢?这就代表上一个区块后面已经有别的区块链啊???这就形成了多分支了)。如果没有找到,则验证不通过。 交易清单有效 这里即是确认每笔交易的付款人是否有足够的余额来支付这笔钱。确认交易输入的UTXO是否存在,且在此之前没有支付给别人,另外,产生交易的节点本身并不验证交易输入的UTXO是否有效,即不验证交易输出用户的余额是否充足,余额的验证是让其他节点来做的 当节点收到一笔新交易时,是否会立即开始打包成区块的操作? 矿工是一直在收集交易信息的,但只有等到上一个区块生成后,拿到上一个区块的hash值时,才会将收集到的交易信息打包新的区块,并进行POW工作 当一个区块发现它的上一个区块已经连接上了新的区块后,如何处理? 这就是区块链的多分支问题,当矿工收到两份不一样的区块,它们都基于当前这个矿工节点的链上的最后一个节点,并且内容都合法,都应将其保留,按分支的形式组织起来。区块链规定,任何时刻,都以最长的链作为主链,当某个分支的长度长于另外的分支后,该分支就称为主分支了,其他分支就会被遗忘。 由于多分支问题产生的双花问题该如何解决? 中本聪给出的解决方案是,建议收款人不要在公告挂出时立即确认交易完成,而是应该再看一段时间,等待各个挖矿小组再挂出6张确认账簿,并且之前的账簿没有被取消,才确认钱已到账。 中本聪解释道,之前设定变态的编号规则,正是为了防御这一点。根据前面所述,生成有效账簿页不是那么简单的,要花费大量的人力反复试不同的幸运数 字,而且过程完全是碰运气。如果某账簿页包含你收到钱的确认,并且在后面又延续了6个,那么攻击者想要在落后6页的情况下从另一个分支赶超当前主分支是非 常困难的,除非攻击者拥有非常多的人力,超过其他所有诚实矿工的人力之和。 而且,如果攻击者有如此多人力,与其花这么大力气搞这种攻击,还不如做良民挖矿来的收益大。这就从动机上杜绝了攻击的形成。 每个节点打包到区块里的交易都是一样的吗? 区块的打包是由矿工来做的,矿工可能是随机地选取某几笔交易进行打包,也可能是挑选交易手续费较高的交易进行打包,因此,每个节点产生的区块是不一样的。 如果各个节点打包的区块交易是完全不同的,那会怎么样? 比如,节点A打包了一个区块,所含的交易是1和2;节点B也打包了一个区块,所含的交易是3和4;由于两个节点打包的区块的前驱节点都是一致的,如果这两个区块都合法,且都被其他节点验证通过了,那么就会在链上形成分支。 当一个节点完成POW工作后,广播给其他节点验证时,如果有某个节点此时在进行着其他交易(即不包含相同的交易)的POW工作,会怎么样? 会停止当前工作,先验证区块的有效性 矿工是不间断地进行挖矿工作的吗?可以光挖矿而不打包普通交易吗? 矿工基本上就是在不间断地做POW工作的,矿工的收入主要来源于挖矿和手续费。一般来说,币的数量是有限的,前期矿工应该可以只挖矿,但为了获得更大的收益,都会选择打包有手续费的交易 产生一笔交易的时候,就会产生一个区块吗? 并不是,收集多少笔交易之后开始打包成区块,是由挖矿策略或者挖矿程序决定的。 是否有可能区块生成时,块里没有交易数据? 可能存在区块里有零笔普通交易,但有一个系统给予的挖矿奖励的交易。对于空交易的区块,由于数量量小,算出满足条件的区块hash值更快。据说早期的区块大都是这种。系统给予奖励,矿工们才有挖矿的热情。

October 5, 2018 · 1 min · Theme PaperMod