入金流量、使用者餘額
我在網站上工作,人們應該能夠將 BTC 存入他們的賬戶餘額,然後對這些餘額做一些事情。我發現我需要確定性錢包並為每個使用者生成不同的地址(基於使用者 ID),也許還為不同的存款(基於使用者存款總數 - 我已經讀過使用 1 個地址進行 1 次交易的最佳實踐) . 我希望能夠在我們看到未確認的交易和確認交易時通知使用者(將存款金額添加到使用者餘額中)。
存款流量:
1.1檢查
rawtx
輸出地址之一是否在數據庫中,因為某些使用者存入地址1.2如果是一些使用者地址在數據庫中創建新的存款,確認為 0 並且標記為待處理
1.3通知使用者我們可以看到他的存款,但尚未確認,一旦交易達到6次確認,他將獲得BTC到他的餘額
1.4
rawblock
獲取少於 6 個確認的所有存款並查詢 blockchain.info 以獲取確認計數(參見問題 c)。1.5更新confirmationCount 如果它>= 6 分配硬幣到餘額+ 通知使用者餘額變化 - 從現在起他的存款將被標記為已確認
現在的問題:
a)如果伺服器因任何原因(應用程序錯誤/網路問題/維護)離線,使用者仍然可以將硬幣存入先前複製的地址,我們不會擷取該交易 - 所以它永遠不會超過1.1。在 ZMQ 中,我可以通過檢查 sequenceNumber 來檢測網路問題(並查詢 RPC 是否缺少資訊?)。我無法在應用程序啟動時查詢所有地址以檢查應用程序關閉時是否有任何存款,所以我應該在數據庫中保留最後一個塊 ID(我的應用程序知道 - 在1.4之後更新),並在啟動時檢查所有較新的塊已確認的交易(並執行1.1、1.5)並檢查記憶體池中所有未確認的交易並執行1.1中的步驟-1.5 .
b)我解決****a)問題的另一個想法是跟踪應用程序記憶體/redis中的同步地址/使用者。使用者連接(註冊/登錄)後,檢查該使用者是否已在此應用程序生命週期中同步(此應用程序啟動 - 節點 index.js,kill,節點 inde.js 將是 2 個生命週期 - 我希望你知道我的意思)如果使用者已同步什麼也不做,如果不掃描所有使用者地址的所有事務並檢查它們是否已添加到數據庫。並將使用者標記為已同步。從現在開始1.4,1.5應該照顧其餘的(?)。
**c)**我寧願不使用諸如 blockchain.info 之類的外部服務,而只通過 RPC 獲取資訊,但由於雙重支出/塊重組等邊緣情況,整個確認檢查流程似乎很複雜。此外,我很難使用比特幣核心 RPC(這是因為我首先同步了 bitcoind,然後添加了索引,它仍在同步它們)。
d) Meaby 還有其他更安全/更容易/可擴展的方法嗎?
這些確實是難題,但幸運的是 BTCPay Server 已經提供了服務,具有閃電支付等額外功能:https ://github.com/btcpayserver/btcpayserver 。
您可以通過包含的 docker 配方 ( <https://github.com/btcpayserver/btcpayserver-docker> ) 執行它並通過其 API 與它通信。
或者,如果您真的想自己重新實現細節,請查看其程式碼或架構文件。