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

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

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

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、每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容