Blockchainr原始碼剖析

2021-10-02 15:48:34 字數 2305 閱讀 7865

在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

具體過程就不說了,它主要就是通過一層層的迴圈將資料匯出的(思想如下):

for block in chain:

for tx in block:

for input in tx:..

.

search函式

使用dablooms這個bloom過濾器,設定了容量、錯誤率等,都定義了常量

const

( tickfreq =

10 bloomsize =

100000000

bloomrate =

0.005

)

這裡作者設定的容量是100000000,我覺得在2023年這個資料容量應該足夠了

filter :

= dablooms.

newscalingbloom

(bloomsize, bloomrate,

"blockchainr_bloom.bin"

)

主要的提取過程前面提到了分為兩步**如下:

if step ==

1else}}

else

if step ==

2

signatures是呼叫getsignatures獲得的,前文有提到過

signatures :

=getsignatures

(maxheigth, log, db)

//獲取簽名

rmap :

=make

(map[string]

*rdata)

key是string型別,value是rdata型別,所以它的索引中儲存的是簽名r,value儲存的是該簽名r的其它資訊。最後search函式返回rmap

main函式

首先給出了區塊資料的路徑以及資料庫型別:

var (

datadir = flag.

string

("datadir"

, filepath.

join

(btcutil.

("btcd"

, false)

,"data"),

"btcd: data directory"

) dbtype = flag.

string

("dbtype"

,"leveldb"

,"btcd: database backend"

))

之後通過btcdbsetup函式設定了btcdb:

log, db, dbcleanup :

=btcdbsetup

(*datadir,

*dbtype)

再呼叫search函式匯出區塊中重複r的各個簽名以及它們的相關資訊

duplicates :

=search

(log, db)

//返回值是rmap

作者新定義乙個與匯出集合型別一致的map,(value是儲存的該簽名r相關的資訊的乙個陣列,也就是說儲存著多組不同的rdata)這段**非常重要,是作者整個思想的核心,通過迴圈判斷value陣列的長度是否大於一,若是則證明簽名r是重複的,若不是則簽名r不重複。

realduplicates :

=make

(map[string]

*rdata)

for k, v :

= range duplicates

}

最後將上文**中的realduplicates匯出成檔案,至此完成了整個位元幣網路中相同簽名r及其相關資訊的匯出。

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...