在2014hitb-exploiting ecdsa failures in the bitcoin blockchain中他所使用提取簽名的方法是通過bloomfilter實現的,作者提到:
下面具體展開對原始碼的剖析
getsignature
此函式的目的是匯出區塊中所有的signature,作者定義了乙個結構體,用於存放與簽名相關的資訊
該函式的返回值是這個型別:type rdata struct
具體過程就不說了,它主要就是通過一層層的迴圈將資料匯出的(思想如下):func getsignatures
(maxheigth int64, log btclog.logger, db btcdb.db) chan *rdata
search函式for block in chain:
for tx in block:
for input in tx:..
.
使用dablooms這個bloom過濾器,設定了容量、錯誤率等,都定義了常量
這裡作者設定的容量是100000000,我覺得在2023年這個資料容量應該足夠了const
( tickfreq =
10 bloomsize =
100000000
bloomrate =
0.005
)
主要的提取過程前面提到了分為兩步**如下:filter :
= dablooms.
newscalingbloom
(bloomsize, bloomrate,
"blockchainr_bloom.bin"
)
signatures是呼叫getsignatures獲得的,前文有提到過if step ==
1else}}
else
if step ==
2
signatures :
=getsignatures
(maxheigth, log, db)
//獲取簽名
key是string型別,value是rdata型別,所以它的索引中儲存的是簽名r,value儲存的是該簽名r的其它資訊。最後search函式返回rmaprmap :
=make
(map[string]
*rdata)
main函式
首先給出了區塊資料的路徑以及資料庫型別:
之後通過btcdbsetup函式設定了btcdb:var (
datadir = flag.
string
("datadir"
, filepath.
join
(btcutil.
("btcd"
, false)
,"data"),
"btcd: data directory"
) dbtype = flag.
string
("dbtype"
,"leveldb"
,"btcd: database backend"
))
再呼叫search函式匯出區塊中重複r的各個簽名以及它們的相關資訊log, db, dbcleanup :
=btcdbsetup
(*datadir,
*dbtype)
作者新定義乙個與匯出集合型別一致的map,(value是儲存的該簽名r相關的資訊的乙個陣列,也就是說儲存著多組不同的rdata)這段**非常重要,是作者整個思想的核心,通過迴圈判斷value陣列的長度是否大於一,若是則證明簽名r是重複的,若不是則簽名r不重複。duplicates :
=search
(log, db)
//返回值是rmap
最後將上文**中的realduplicates匯出成檔案,至此完成了整個位元幣網路中相同簽名r及其相關資訊的匯出。realduplicates :
=make
(map[string]
*rdata)
for k, v :
= range duplicates
}
spring security認證原始碼剖析
spring security 和shiro目前最主流的安全框架,很好的保護了系統的安全性。shiro實現的原理和spring security具有異曲同工之妙,學會乙個框架,另乙個框架也會很容易上手。1 spring security流程 usernamepasswordauthenticatio...
ReentrantLock獨佔鎖原始碼剖析
在開始分析reentrantlock 獨佔鎖之前,我們先來簡單了解幾個概念 悲觀鎖指對資料被外界修改持保守態度,認為資料很容易就會被其他執行緒修改,所以在資料被處理前先對資料進行加鎖,並在整個資料處理過程中,使資料處於鎖定狀態。例如synchronized。樂觀鎖是相對悲觀鎖來說對,它認為資料在一般...
locust對應原始碼HttpUser剖析(7)
老規矩,先貼 self.client session比較簡單,無非就是繼承了user的各個屬性,這裡把類變數client清空了,不再是noclientwarningraiser 了。其他都是繼續沿用,只是例項化的時候client變成了session。這個時候第乙個關注點就是,例項化的時候一定要有ho...