コンテンツへスキップ

限られた情報からアドレスを見つけ出す

たまに自身のアドレスの一部をSNSに載せてしまう人がいます。興味本位でその人が他にどのような取引をしているのか調べたくても、部分的にしか分からないアドレスは検索が難しかったりします。限られた情報のなかからそのアドレスを探し当てる方法などを記載します。

下準備

  1. GethやNethermindを使ってイーサリアムのノード(全取引データ)をダウンロードする。セットアップ方法はこの記事に書いてます。Infuraなどのサードパーティを使って取引データを取得してもいいですが、通信制限にかかる可能性があるので自前のノードを用意した方が無難です。
  2. Pythonを使ってノードから情報を取ってくるのでPythonをインストールする。
  3. Web3をインストールする。
    pip install web3
  4. 接続先のローカルIPアドレスを確認して下記のコードを実行し、Connected to ethereum execution nodeと出力されれば無事ノードと通信できてます。
from web3 import Web3

# Connect to your local geth instance
w3 = Web3(Web3.HTTPProvider("http://192.168.0.123:8545"))

# Check if connected
if w3.is_connected():
    print("Connected to ethereum execution node.")
    # Fetch the latest block number as an additional verification step
    latest_block = w3.eth.block_number
    print(f"Latest block number: {latest_block}")
else:
    print("Not connected to ethereum execution node.")

「送信先アドレスの前後数文字」と「取引をしたざっくりとした時間」が分かる場合

from web3 import Web3

# Connect to your local geth instance
w3 = Web3(Web3.HTTPProvider("http://192.168.0.123:8545"))

start_block = 18346472


def find_transaction_with_address_pattern(
    address_type=None, start_pattern=None, end_pattern=None, start_block=None
):
    if address_type not in ["to", "from"]:
        print("Invalid address_type. Please choose 'to' or 'from'.")
        return

    if start_block is None:
        start_block = w3.eth.block_number

    current_block = start_block

    while current_block > 0:
        print(f"Searching block {current_block}...")
        block = w3.eth.get_block(current_block, True)
        for transaction in block.transactions:
            address = transaction.to if address_type == "to" else transaction["from"]

            if address_type == "to":
                # Check for standard token transfer
                if transaction.to and transaction.data.startswith("0xa9059cbb"):
                    # print(f"transfer: {transaction.hash.hex()}")
                    token_to_address = "0x" + transaction.data[34:74]
                    if address_type == "to":
                        address = token_to_address
                # Check for transferFrom token transfer
                elif transaction.to and transaction.data.startswith("0x23b872dd"):
                    # print(f"transferToken: {transaction.hash.hex()}")
                    token_to_address = "0x" + transaction.data[98:138]
                    if address_type == "to":
                        address = token_to_address

            if address:
                address = address.lower()
                start_pattern = start_pattern.lower()
                end_pattern = end_pattern.lower()
                if start_pattern and not address.startswith(start_pattern):
                    continue
                if end_pattern and not address.endswith(end_pattern):
                    continue
                print(
                    f"Found transaction {transaction.hash.hex()} in block {current_block} with {address_type} address {address}"
                )
                return
        current_block -= 1
    print("Transaction with desired pattern not found.")