開發類似比特幣的軟體
我正在嘗試開發類似的東西
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"
事務 055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8 是使用此輸出的事務。
由於每個輸出都被使用,這意味著地址 1EoMoJK3FJPHg4EwrP31zPVu4iLqmCtQ6 的餘額為零。
如果我們想檢查/列出交易“055bd8148143c5b05bc2808ccafe54be43b292381449d41cc23462d02d3f85d8”,我們可以這樣做:
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>
我正在使用RocksDB和node.js。我的數據庫針對跟踪地址餘額和付款歷史進行了優化。它需要大約 143GB 的儲存空間,載入時間為 4 天。目前塊導入低於 2s。
我已經非常努力地使用 PostgreSQL 來實現這一點。這是可行的,但需要大量的黑客攻擊和導入后索引創建。我已經嘗試過 levelDB,但它比 SSD 驅動器上的 RocksDB 慢了大約 4 倍。
我正在使用自定義塊解析庫和半生不熟的全節點實現。