Bitcoin-Core

如何在最後一個塊中搜尋地址?

  • January 23, 2022

我想檢查比特幣核心,看看最後一個區塊是否有我的觀看地址。所以我的問題是我怎麼知道最後一個塊中是否包含特定地址?我可以搜尋,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>

讓我知道您的想法,或者您是否有任何改進。

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