Wallet

設計 BTC 存款流程的最佳方式?

  • October 31, 2022

我正在設計一個交換應用程序,使用者可以通過將 BTC 發送到一個唯一地址來將資金存入他們的帳戶。

監控 100,000 多個地址以獲取滿足一定數量的最低確認的傳入交易的最佳方法是什麼?

一種方法是使用 ZMQ 監聽rawtx事件以發現新事務,然後編寫一個程序以使用 JSON-RPC 定期查詢每個事務的確認數。但是,這種方法似乎很慢,因為它需要通過 RPC 呼叫反复錘擊節點。我不想使用像https://blockchain.info這樣的外部 API 。

實現這一目標的最有效方法是什麼?

實際上,不需要定期向節點查詢確認次數。確認的數量由確認交易的區塊高度和目前區塊高度隱含地給出。

以下假設您將 100,000 多個地址儲存在具有相當快速查找的數據庫中,它還可以儲存其他數據,並且您為查詢中使用的列建立索引。

僅確認交易

如果您只需要在交易獲得第一次確認後跟踪交易,問題就非常簡單。監聽rawblockZMQ 事件,檢查所有交易,每當交易發送到您正在跟踪的地址時,將此交易連同確認的區塊高度一起添加到數據庫中。然後,如果你想在例如 3 個確認之後執行一些操作,當一個新塊到達時,只需查找之前確認 3 個塊的交易。根據您所做的事情,為了獲得額外的穩健性,您可能希望跟踪哪些已確認的交易已經成功執行。

未經確認的交易

如果您還想顯示未確認的交易,它會變得更加複雜,因為交易可能會被替換或從節點的記憶體池中刪除。請參閱此問題以了解如何處理此問題。無論您使用哪種方法,其餘的都與上述相同。

趕上

如果您的應用程序必須重新啟動或崩潰,您可能會錯過塊。為了防止這種情況,您可以跟踪最後處理的塊高度,並在啟動時查詢節點以獲取目前塊高度。如果您發現自己落後了,只需查詢失去的塊(使用getblockRPC)並照常處理它們。

重組安全

為了讓您的應用程序在發生鏈重組時正常工作,還有一些額外的步驟。我發現一種​​行之有效的方法是儲存一些*最近的塊頭**(只需雜湊和高度就足夠了),當一個新塊到達時,遵循它之前的塊雜湊(使用getblockheaderRPC)直到你的數據庫在該高度具有與您的節點相同的塊雜湊,然後回滾在該高度之後進行的任何事務。如果沒有發生重組,最新的公共標頭將僅比新的鏈提示晚一個塊,因此您不需要回滾任何內容。

  • 如果您不擔心幾十 MB 的儲存空間,您也可以儲存所有塊頭。

** 儲存塊頭也是跟踪您處理的最後一個塊的便捷方式。

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