今天接著寫五個全域性靜態常量,用於定義交易執行序列的規則.
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紀元時間戳(從2023年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、交易大小4、0《輸出值與總量<2100萬
5、輸出點中hash!=0,n!=-1(雜湊值不能為零、序列號n不能為-1)
6、nlocktime7、交易位元組》=100位元組
8、解鎖指令碼(scriptsig)只能夠將數字壓入棧中,並且鎖定指令碼(scriptpubkey)必須要符合isstandard的格式 (該格式將會拒絕非標準交易)
9、池中或位於主分支區塊中的乙個匹配交易必須是存在的
10、對於每乙個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕
11、驗證孤立交易
12、coinbase交易需經過100個確認
13、輸出必須存在,且未被花費
14、0《輸入值與總量<2100萬
15、如果輸入值的總和小於輸出值的總和,交易將被中止
16、交易費用太低,則交易被拒絕
17、每乙個輸入的解鎖指令碼必須依據相應輸出的鎖定指令碼來驗證
位元幣原始碼研讀之一
菜菜子 forest 關注 圖中紅色矩形框選中的src資料夾為位元幣原始碼所在目錄,因此我的位元幣原始碼之旅將從這個資料夾開始。二 找到入口函式 眾所周知,任何事物都有其起始位置,就像我們走進一棟房子應該先找到大門一樣。軟體程式也不例外,每個軟體程式都有其入口函式,那麼要研讀位元幣原始碼,首先需要從...
位元幣原始碼學習筆記(二)
2 14198 本章繼上一章交易建立之後介紹位元幣客戶端序列化資料的過程。位元幣客戶端所有的序列化函式均在seriliaze.h中實現。其中,cdatastream類是資料序列化的核心結構。cdatastream擁有乙個字元類容器用來存放序列化之後的資料。它結合乙個容器型別和乙個流 stream 介...
位元幣原始碼研讀(二)之搭環境遇到的那些坑
上面兩處被圈起來的地方都提到了乙個數字2256,特別是第一句話更是讓人費解,如果私鑰只能在1到2256間產生那豈不是太容易重複了。關於這點,我認為是在翻譯或者排版是出現了錯誤,2256應該是想表達2的256次方的意思。後續翻看其它資料是也證實了我的想法。我是在docker下進行的原始碼安裝,使用官方...