Bitcoind

開發類似比特幣的軟體

  • November 30, 2021

我正在嘗試開發類似的東西bitcoin-abe,例如將整個區塊鏈導入數據庫。

對於我目前使用 Redis 的數據庫 - 我知道它會佔用大量 RAM,但假設沒關係。

另一種可能性可能是 MySQL、Postgress 甚至 CSV 文件。

我有bitcoind並且我正在一個接一個地導入一個塊。

對於每筆交易,我需要尋找“資助”目前交易的交易的輸出——我希望你明白我的意思。

我目前正在檢查 2017 年的區塊。大多數區塊都有 2000 多個交易。如果我們假設每筆交易都有單一輸入,這意味著我需要再查看 2000 筆交易。

目前,這 2000 次查找已返回到bitcoind,因為輸出數據庫可能是 csv 文件。

我可以以“懶惰”的方式完成所有這些操作,但是我將無法找到是否使用了某個地址。

有沒有更快的導入方式?

我正在使用 PHP,從 2017 年開始導入單個塊大約 1 分鐘。

輸出已用完(例如,如果出現在其他交易的“vin”中),我儲存一個指標。

現在處理單個塊 1-2 秒。

這意味著,

如果要檢查地址餘額,則需要檢查每個“輸入”並編譯未使用輸入的列表。

仍然不確定這是否是最好的方法。

更新 1

我終於把github上的軟體上傳到這裡了:

https ://github.com/nmmmnu/BlockchainWalker

更新 2

如果我們想找到地址“1EoMoJK3FJPHg4EwrP31zPVu4iLqmCtQ6”的餘額,下面是鍵的樣子:

127.0.0.1:2000> HGETALL a:1EoMoJK3FJPHg4EwrP31zPVu4iLqmCtQ6
1) "a:1EoMoJK3FJPHg4EwrP31zPVu4iLqmCtQ6:28c76c9d89f23c1b1f5435d8f4bb5cc66e6cb9d0798f1f0f4293faaac88fb7d0.0"
2) "0.01270199"

這是資金交易:

  • 28c76c9d89f23c1b1f5435d8f4bb5cc66e6cb9d0798f1f0f4293faaac88fb7d0,輸出0

這是價值:

  • 0.01270199

然後我們需要檢查這個是否被花費,所以我們檢查每個輸入如下:

127.0.0.1:2000> get t:28c76c9d89f23c1b1f5435d8f4bb5cc66e6cb9d0798f1f0f4293faaac88fb7d0.0:s
"055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8"

事務 055bd8148143c5b05bc2808cca​​fe54be43b292381449d41cc23462d02d3f85d8 是使用此輸出的事務。

由於每個輸出都被使用,這意味著地址 1EoMoJK3FJPHg4EwrP31zPVu4iLqmCtQ6 的餘額為零。


如果我們想檢查/列出交易“055bd8148143c5b05bc2808cca​​fe54be43b292381449d41cc23462d02d3f85d8”,我們可以這樣做:

127.0.0.1:2000> HGETALL t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8
1) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.-:i:28c76c9d89f23c1b1f5435d8f4bb5cc66e6cb9d0798f1f0f4293faaac88fb7d0.0"
2) "1"
3) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.-:i:39edb8741b701b6da2dbc4e02290e8e78cba244bdbad96da203e41ee2704c525.0"
4) "1"
5) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.0:o"
6) "1Kj76Sxe8c3UK85RAQwwdqScAxaBwAY2eb:0.00500000"
7) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.0:s"
8) "49f8bd582439a3b2351f92e0fdb5fcb1032acd42e3ab469c16d805627889ce14"
9) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.1:o"
10) "14yAJga4ZkULbaMz4LUW5vj8GhQYyzCPoW:0.01118727"
11) "t:055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8.1:s"
12) "edf55ace1396229c7a91a4b21cd63293c631ae2ddcc5987402b04ed540b9e5d8"

那些“t:xxxxx.-:i:xxxx”是輸入。

那些“t:xxxxx.N:o”是輸出

那些“t:xxxxx.N:s”是指標,如果輸出被花費或沒有。


請注意,這不是 Redis,它是我開發的具有 Redis 介面的數據庫。你可以在這裡查看:

<https://github.com/nmmmnu/HM4>

我正在使用RocksDBnode.js。我的數據庫針對跟踪地址餘額和付款歷史進行了優化。它需要大約 143GB 的儲存空間,載入時間為 4 天。目前塊導入低於 2s。

我已經非常努力地使用 PostgreSQL 來實現這一點。這是可行的,但需要大量的黑客攻擊和導入后索引創建。我已經嘗試過 levelDB,但它比 SSD 驅動器上的 RocksDB 慢了大約 4 倍。

我正在使用自定義塊解析庫和半生不熟的全節點實現。

引用自:https://bitcoin.stackexchange.com/questions/59380