Bitcoind

在 regtest 上設置費率,或者快速生成完整塊

  • June 29, 2021

我正在為閃電錢包設置一些自動化測試。我測試的核心是一個在 regtest 模式下執行的 bitcoind 實例。我需要能夠設置費率——報告的estimatesmartfee費率和交易需要匹配的費率才能得到確認。

到目前為止,我能看到的唯一方法是探勘大量填充了具有所需費率的交易的塊。我這樣做是sendtoaddress通過在循環中反複呼叫(通過比特幣-cli)向虛空發送少量資金來實現的。這是非常緩慢的——它涉及在 bitcoind 捕捉到這應該是新報告的費率的漂移之前生成約 2500 筆交易。而且我必須為每次測試都這樣做,有時每次測試多次,所以我的 CI 需要永遠。

我想知道是否有任何方法可以避免這樣做。是否有某種方法可以覆蓋 bitcoind 的估計費率,並讓它拒絕包括在探勘區塊時支付低於該費率的交易?如果沒有,有沒有比我正在做的更快的方法來填充交易塊?

您可以使用包裝器來模擬費率。

假設您正在用 Python 編寫測試。您可以為介面設置 Python RPC 包裝器bitcoind,並可選擇為特定測試打開模擬(而不是呼叫bitcoind’s estimatesmartfee,它會返回預設值)。

這就是它在 C-lightning 的功能測試中的做法。一個很好的例子是這個模擬崩潰的測試,bitcoind以測試lightningd可以支持其比特幣後端的虛假故障。另請參閱此處

的feerate mock 範例。

我創建了一個 bash 腳本,它比 @darosior 引用的 Python 腳本簡單,但受它的影響很大。它會不斷創建 10-30 個交易集,直到estimatesmartfee返回費用率。

#!/usr/bin/env bash

set -eo pipefail

cont=true
smartfee=$(bitcoin-cli estimatesmartfee 6)
if [[ "$smartfee" == *"\"feerate\":"* ]]; then
   cont=false
fi
while $cont
do
   counterb=0
   range=$(( $RANDOM % 11 + 20 ))
   while [ $counterb -lt $range ]
   do
       power=$(( $RANDOM % 29 ))
       randfee=`echo "scale=8; 0.00001 * (1.1892 ^ $power)" | bc`
       newaddress=$(bitcoin-cli getnewaddress)
       rawtx=$(bitcoin-cli createrawtransaction "[]" "[{\"$newaddress\":0.005}]")
       fundedtx=$(bitcoin-cli fundrawtransaction "$rawtx" "{\"feeRate\": \"0$randfee\"}" | jq -r ".hex")
       signedtx=$(bitcoin-cli signrawtransactionwithwallet "$fundedtx" | jq -r ".hex")
       senttx=$(bitcoin-cli sendrawtransaction "$signedtx")
       ((++counterb))
       echo "Created $counterb transactions this block"
   done
   bitcoin-cli generatetoaddress 1 "mp76nrashrCCYLy3a8cAc5HufEas11yHbh"
   smartfee=$(bitcoin-cli estimatesmartfee 6)
   if [[ "$smartfee" == *"\"feerate\":"* ]]; then
       cont=false
   fi
done
bitcoin-cli generatetoaddress 6 "mp76nrashrCCYLy3a8cAc5HufEas11yHbh"

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