美文网首页区块链研习社
比特币源码研读二(交易脚本)

比特币源码研读二(交易脚本)

作者: 方建强 | 来源:发表于2017-12-13 21:41 被阅读139次

    上一次我发了第一篇研读记录,不过我是在菜班长的研读记录上写的,哈哈,谁叫我零基础呢,继续写下去就对了。

    今天接着写五个全局静态常量,用于定义交易执行序列的规则.

    1、static const uint32_t sequence_final=oxffffffff

    如果交易中的所有输入都将nsequence赋值为该全局变量值,nlocktime将无效:无需考虑交易的锁定时间,最近的交易达到区块后,交易立刻执行,一般设置为零。

    2、static const uint32_t sequence_locktime_disable_flag

    =(1<<31)

    如果设置了这个变量,nsequence就不是相对锁定时间序列了。

    3、static const uint32_t sequence_locktime_type_flag=(1<<22)

    如果nsequence编码为相对锁定时间,并且设置了该规则,相对时间将以512秒作为基本单位,否则以1为单位特指区块数,即交易执行的时刻是按区块号来执行还是按时间执行。

    4、static const uint32_t sequence_locktime_mask=oxooooffff

    如果nsequence编码为相对锁定时间,该参数用于表示锁定时间依据sequence字段来定。

    5、static const int sequence_locktime_granularity=9

    考虑到时间编码长度的一致性以及比特币区块链生成时间(平均10分钟,也就是600秒),锁定时间的最小时间粒度为512秒(2^9)。所以我们将执行序列转换为执行时间的计算方法为:交易执行序列执行锁定时间的计算方式为序列号*2^9。


    交易数据结构_锁定时间(lock time):其定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置为零用来表示立即执行。如果锁定时间不是零并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前的交易没有被包含在这个区块链里。如果锁定时间大于5亿,则它被当作是一个unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间点之前没有被包含在这个区块链里。锁定时间的使用相当于将一张纸质支票把生效时间予以后延,可以把一个交易设定在一年以后再交易。


    交易流程分析:

    1、将比特币发送至目的地址—》2、验证发送地址—》3、生成比特币交易—》4、对交易进行签名加密—》5、交易被广播至全网其他节点—》6、验证交易的有效性—》7、交易被广播至全网其他节点,直到被大多数节点接受验证—》8、是否孤立交易(子交易进入交易池,待发现父交易)9、—》交易被打包至区块中—》10、挖矿成功—》11、交易跟随区块加入到区块链中—》12、交易被后续区块确认

    我先来讲讲其他节点的发送:在比特币全网是一个p2p网络,假如我发起一笔交易到某个地址,它不会直接发送到指定地址,而是经过相邻的节点,这样经过多次发送之后,才会到达我们的目的地址,真正接收这个地址,然后每个节点都会验证每个交易的有效性,如交易有效,就会广播至全网其他节点,直到被大多数节点验证,再交易被打包成区块前,对这个交易是否是孤立交易进行验证。

    孤立交易:当一条交易链被整个网络传送的时候。他们并不总是能够按照相同的顺序到达目的地,有时子交易在父交易之前到达。

    孤立交易池:没有父交易的交易池。一旦接受到父交易之后,所有与这个交易创建的utxo有关的孤立交易将会从池中释放出来,递归的重新验证,然后整条交易链被交易池包括进来,等待被区块挖走。交易链可以是任意长度,并且被任一数量的批次同时传走,在孤立池当中,保留孤块的机制,保证了其他合法的交易,不会只是因为父交易被耽误而被抛弃。并且无论接收顺序,最终整个链以正确的顺序重新构造出来。

    在内存当中储存的孤立交易数量其实是有限制的,这样做的目的是防止对比特币节点的“拒绝服务(dos)攻击",源码在max_orphan_transactions宏定义当中。如果达到设定值时,不会再接收新的孤立交易,而是会将旧的孤立交易去除。最大孤立交易变量定义在源码:Src/net_processing.h的头文件当中,默认值为100,说明孤立池中最多可容纳100个孤立交易,超过100个将会对此交易进行处理。

    当某个交易被区块确认之后,随之会被更多的区块进行确认,如果某个区块被修改的话,后面的区块都需要重新计算,这样使整个网络算力非常大,对于恶意攻击者来说是不划算的,将会远远超过他的成本,所以交易越多安全性就越高。


    交易验证:每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表

    1、交易语法与数据是否正确

    2、输入与输出列表都不能空(>=1)

    3、交易大小<max_block_base_size(1M)

    4、0<输出值与总量<2100万

    5、输出点中hash!=0,N!=-1(哈希值不能为零、序列号N不能为-1)

    6、nlocktime<int_max

    7、交易字节>=100字节

    8、解锁脚本(scriptSig)只能够将数字压入栈中,并且锁定脚本(scriptPubkey)必须要符合isStandard的格式 (该格式将会拒绝非标准交易)

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

    10、对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝

    11、验证孤立交易

    12、coinbase交易需经过100个确认

    13、输出必须存在,且未被花费

    14、0<输入值与总量<2100万

    15、如果输入值的总和小于输出值的总和,交易将被中止

    16、交易费用太低,则交易被拒绝

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

            区块链研习社源码研读班方建强

    相关文章

      网友评论

        本文标题:比特币源码研读二(交易脚本)

        本文链接:https://www.haomeiwen.com/subject/qqttwxtx.html