如何过滤以太坊地址

How to filter for ethereum address

我尝试编写一个脚本来获取我的以太坊地址发生的交易。 此脚本在监控合约地址时有效,但如果我想监控我自己的地址或非合约地址,它不会获得任何交易

def handle_event(event):
    print(event)
    print(Web3.toJSON(event))    

def log_loop(event_filter, poll_interval):
    while True:
        for event in event_filter.get_new_entries():
            handle_event(event)
        time.sleep(poll_interval)

def main():
    event_filter = web3.eth.filter({"address": trackAddress})
    #get_block = web3.eth.get_block('latest')
    #block_filter = web3.eth.filter('latest')
    log_loop(event_filter, 2)

if __name__ == '__main__':
    main()

据我所知,使用filter命令只能监控合约上发生的事件。此选项不适用于您的情况。

我会写 JavaScript 代码,因为我对它比较熟悉,但您可以将其改编为 python。我可能会这样做:

async function checkBlock(address) {
    const block = await web3.eth.getBlock('latest');
    console.log(`Checking new block ${block.number}`);

    for (let txHash of block.transactions) {
        const tx = await web3.eth.getTransaction(txHash);
        if (address === tx.to.toLowerCase()) {
            console.log(`New transaction found. Block - ${block.number}`);
            console.log(`Transaction: ${tx}`);
        }
    }
}

您可以将此函数插入​​ setInterval 并大约每 ~15 秒调用一次。为什么是 15 秒?平均而言,每 15 秒就会出现一个新区块。

另一种选择是使用 ethers.js library. You can subscribe directly to blocks 并请求新区块的交易信息。但是我不知道 python.

是否存在这样的库

您也可以通过以下方式执行类似操作:

const topicSets = [
    utils.id("Transfer(address,address,uint256)"),
    null,
    [
        null,
        hexZeroPad(address, 32)
    ]
]
provider.on(topicSets, (log, event) => {
    // Emitted any token is sent TO your address
})

在这种情况下,每次您的地址收到 ERC-20 代币时都会触发处理程序。