Bitcoin-Core
如何在最後一個塊中搜尋地址?
我想檢查比特幣核心,看看最後一個區塊是否有我的觀看地址。所以我的問題是我怎麼知道最後一個塊中是否包含特定地址?我可以搜尋,
getblock <hash> 2
但它只返回 vout 中的地址,我也需要那些在 vin 中的地址。
如果您啟用了 txindex 並且使用的是基於 debian 的 Linux 機器,請安裝 jq:
sudo apt install jq
並將此腳本保存為“any-name.sh”:
#!/bin/bash BLOCK_HASH=$(bitcoin-cli getbestblockhash) BLOCK_TEMPFILE=bestblock.json VIN_TXNS_TEMPFILE=vin_txns.temp VIN_N_TEMPFILE=vin_n.temp # Check if all temp files and addresses file exists, and delete them if they do before recreating them. if [ -f "${VIN_TXNS_TEMPFILE}" ]; then rm ${VIN_TXNS_TEMPFILE} fi if [ -f "${VIN_N_TEMPFILE}" ]; then rm ${VIN_N_TEMPFILE} fi if [ -f "${BLOCK_TEMPFILE}" ]; then rm ${BLOCK_TEMPFILE} fi # Get the block information in JSON format bitcoin-cli getblock ${BLOCK_HASH} 2 > ${BLOCK_TEMPFILE} # Get the block height for use in address file name BLOCK_HEIGHT=$(jq ".height" ${BLOCK_TEMPFILE}) # Check if the address file exists. If so, we do not need to run the script again. ADDRESSES_FILE="Block_${BLOCK_HEIGHT}_Addresses.txt" if [ -f "${ADDRESSES_FILE}" ]; then rm ${BLOCK_TEMPFILE} exit 0 fi touch ${ADDRESSES_FILE} touch ${VIN_TXNS_TEMPFILE} touch ${VIN_N_TEMPFILE} touch ${BLOCK_TEMPFILE} # Get the block transaction ID's, excluding the first transaction (coinbase) jq ".tx[].vin[].txid" ${BLOCK_TEMPFILE} > ${VIN_TXNS_TEMPFILE} tail -n +2 "${VIN_TXNS_TEMPFILE}" > "${VIN_TXNS_TEMPFILE}.temp" && mv "${VIN_TXNS_TEMPFILE}.temp" "${VIN_TXNS_TEMPFILE}" sed -i 's/"//g' ${VIN_TXNS_TEMPFILE} # Get the block transaction n's, excluding the first transaction (coinbase) jq ".tx[].vin[].vout" ${BLOCK_TEMPFILE} > ${VIN_N_TEMPFILE} tail -n +2 "${VIN_N_TEMPFILE}" > "${VIN_N_TEMPFILE}.temp" && mv "${VIN_N_TEMPFILE}.temp" "${VIN_N_TEMPFILE}" readarray -t n_vals < ${VIN_N_TEMPFILE} # Delete the vin n tempfile rm ${VIN_N_TEMPFILE} # Get the block txout addresses jq ".tx[].vout[].scriptPubKey.addresses | .[]?" ${BLOCK_TEMPFILE} > ${ADDRESSES_FILE} # Delete the block tempfile rm ${BLOCK_TEMPFILE} # Get each transaction's vout addresses i=0 while read line; do val=${n_vals[${i}]} echo $(bitcoin-cli getrawtransaction "$line" true) | jq ".vout[${val}].scriptPubKey.addresses | .[]?" >> ${ADDRESSES_FILE} let "i=i+1" done < ${VIN_TXNS_TEMPFILE} # Delete transaction IDs tempfile rm ${VIN_TXNS_TEMPFILE} sed -i 's/"//g' ${ADDRESSES_FILE} awk '!a[$0]++' ${ADDRESSES_FILE} > "${ADDRESSES_FILE}.temp" && mv "${ADDRESSES_FILE}.temp" "${ADDRESSES_FILE}"
使腳本可執行:
chmod +x any-name.sh
然後您可以使用
./any-name.sh
. 請記住,此腳本需要幾分鐘才能完成。我在樹莓派 3b 上執行一個節點,這個腳本大約需要 4 分鐘才能完成。腳本說明:最近一個區塊的 vins 包含一個交易 ID 以及來自該交易的 vout 索引。
bitcoin-cli getrawtransaction <transactionhash> true
只要我們啟用了 txindex,我們就可以使用該命令從交易中列印 JSON 資訊。對我們而言,最重要的資訊包括正在使用的地址(如果使用的地址不是標準地址類型,則為“null”)。所以對於區塊中的每一個 vin,我們找到相關的交易,並在指定的 vout 索引處獲取地址。
我用 Python3 編寫了一個程序,它允許你搜尋比特幣核心上的任何地址,無論它是否屬於你的錢包。
這是github連結:
<https://github.com/ORP967/Bitcoin_Core_RPC_par_address>
讓我知道您的想法,或者您是否有任何改進。