Ripple
Ripple:如何可靠有效地監控多個賬戶?
rpc = RippleNetwork(app.config['RIPPLE_SERVER']) poll = RippleNetwork(app.config['RIPPLE_SERVER']) last_ledger = Variables.get('ripple_last_ledger') poll.subscribe(streams=['ledger']) while True: trans = [] try: rst = rpc.account_tx(account=withdraw_wallet, ledger_index_min=last_ledger, limit=1000) trans.extend(rst['transactions']) while rst.get('marker') is not None: rst = rpc.account_tx(account=withdraw_wallet, ledger_index_min=last_ledger, marker=rst['marker'], limit=1000) trans.extend(rst['transactions']) except RippleException as e: if e.resp['error'] == 'lgrIdxsInvalid': log.debug('ledger_index_min too new, sleeping for 10s') time.sleep(10) continue raise for rec in trans: tx = rec['tx'] log.debug('Got tx %s', tx['hash']) if tx['TransactionType'] != 'Payment': continue if tx['Destination'] != withdraw_wallet: continue log.info('Queue tx %s', tx['hash']) tube.put(str(tx['hash'])) last_ledger = rst['ledger_index_max'] + 1 Variables.set('ripple_last_ledger', last_ledger) db.session.commit() # Wait for next(or several) ledger close here.
上面的程式碼是我目前的實現,但這種方法不能擴展到數千個帳戶。
有沒有“最佳實踐”?
我不確定大程式碼粘貼是否是讓您的範例通過的最佳方式(例如,我不熟悉您正在使用的庫/API)。假設總結您正在循環是正確的,重複執行account_tx RPC 呼叫,最多延遲 10 秒;那麼即使對於少數帳戶,這也不是有效的。
對於少量的帳戶,我建議僅在重新啟動時執行類似循環的操作,以從您處理的最後一個已知分類帳中趕上。(例如,在中斷或斷開連接後重新啟動監控之後)。一旦趕上,最好將訂閱RPC 與您感興趣的一組 Ripple 帳戶一起使用。伺服器將在任何交易觸及您列出的任何帳戶時向您發送通知。這避免了輪詢並且效率更高,尤其是在帳戶空閒期間。(我只熟悉通過 websocket 使用訂閱,即使在幾天內它也能很好地工作;我不知道庫對此的支持是什麼樣的)。
一旦您嘗試監視的帳戶超過某個門檻值,特別是如果它們是非常活躍的帳戶,使用訂閱 RPC 訂閱所有交易並過濾那些僅影響您的帳戶的交易可能會更容易感興趣。此外,在這一點上,對您自己的本地執行的漣漪進行此類查詢可能會成為一個好主意,而不是依賴於公共 Ripple 伺服器。
我不清楚從訂閱帳戶列表與訂閱所有交易的最佳切換點。對於初學者,您可以在訂閱呼叫中指定的帳戶數量可能有限制;如果是這樣,也許修改本地執行的漣漪以消除任何此類限制並讓它進行過濾可能是合適的。