首页 > 解决方案 > Nethereum C# FilterInput.GetAllChanges 始终为空

问题描述

我在我的项目中使用 Nethereum 来获取特定智能合约地址上的所有待处理交易。为此,基于现有文档和 Nethereum Playground,我尝试以下操作:

private async Task MonitorPendingTransactions()
{
    var web = new Web3Geth("http://***.***.***.***:8545");
    var transferEventHandler = web3.Eth.GetEvent<TransferEventDTO>(contractAddr);
    var filterAllTransferEventsForContract = transferEventHandler.CreateFilterInput();
    var allTransferEventsForContract = await transferEventHandler.GetAllChanges(filterAllTransferEventsForContract);
    Thread.Sleep(10000);
    allTransferEventsForContract = await transferEventHandler.GetAllChanges(filterAllTransferEventsForContract);
}

我的 TransferEventDTO 与官方文档中的相同:

[Event("Transfer")]
public class TransferEventDTO : IEventDTO
{
    [Parameter("address", "_from", 1, true)]
    public string From { get; set; }

    [Parameter("address", "_to", 2, true)]
    public string To { get; set; }

    [Parameter("uint256", "_value", 3, false)]
    public BigInteger Value { get; set; }
}

到目前为止,我有 2 个问题:

  1. 我无法指定要从中获取输出的起始块,例如挂起而不是最新
  2. GetAllChanges()总是返回 0 个对象,无论我等待多长时间,我在过滤器配置中做错了什么还是应该通过其他方式查询待处理的事务?

标签: c#.net-coreethereumsmartcontracts

解决方案


可以改用 Web3 吗?请参考我的代码!

   var _web3 = new Web3("https://ropsten.infura.io/v3/APIKEY");
        var _transactionRpcResult = _web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync("0x02fca948c467b0247030d12f4e1bb6811a626f5b55013d3dbec10cea82f72110");
        var blockNumberResult = _web3.Eth.Blocks.GetBlockNumber.SendRequestAsync();
        blockNumberResult.Wait();
        ulong _currentblockNumber = (ulong)blockNumberResult.Result.Value;
        var transferEventHandler = _web3.Eth.GetEvent<TransferEventDTO>("0xfc420e5a883d3b08ab1fd8299a9fcc18cab74527");
        var filter = transferEventHandler.CreateFilterInput(fromBlock: new BlockParameter(_transactionRpcResult.Result.BlockNumber), toBlock: new BlockParameter(_currentblockNumber));
        var logsresult = transferEventHandler.GetAllChanges(filter);
        logsresult.Wait();
        var logs = logsresult.Result;

TransferEventDTO

[Event("Transfer")]
public class TransferEventDTO : IEventDTO
{
    [Parameter("address", "_from", 1, true)]
    public string From { get; set; }

    [Parameter("address", "_to", 2, true)]
    public string To { get; set; }

    [Parameter("uint256", "_value", 3, false)]
    public BigInteger Value { get; set; }
}

推荐阅读