这是下面的代码片段:

while (block_no >= 0) {

        List<EthBlock.TransactionResult> txs = web3
                .ethGetBlockByNumber(DefaultBlockParameter.valueOf(BigInteger.valueOf(block_no)), true).send()
                .getBlock().getTransactions();

        txs.forEach(tx -> {
            int i = 0;

            EthBlock.TransactionObject transaction = (EthBlock.TransactionObject) tx.get();
            if ((transaction.getFrom().toLowerCase()).equals(address.toLowerCase())) {
                // System.out.println("***************GETTING INSDIE OF IF LOOP***********");
                ts[i] = new TransactionHistory();
                ts[i].setFrom(transaction.getFrom());
                ts[i].setTo(transaction.getTo());//not getting exact address except contract deployed address
                ts[i].setBlockNumber("" + transaction.getBlockNumber());
                ts[i].setGasPrice("" + transaction.getGasPrice());
                ts[i].setNonce("" + transaction.getNonce());
                history.add(ts[i]);
                i++;

        System.out.println("*******" + "\nValue Getting zero value" +
        transaction.getvalue() + "\nBlockNumber: "
                        + transaction.getBlockNumber() + "\n From: " +
        transaction.getFrom() + "\n To:"
                        + transaction.getTo() + "\n Nonce: " +
        transaction.getNonce() + "\n BlockHash:"
                        + transaction.getBlockHash() + "\n GasPrice:" +
        transaction.getGasPrice());
        //getting '0' instead of real value
        System.out.println(transaction.getValue());
    }


我如何使用java和web3js eth交易对象获取交易价值和发送者的地址?

最佳答案

您必须听听您的智能合约事件。事件以日志的形式存储在以太坊虚拟机中。 Web3j和您的Contract包装器提供了一些读取过去的日志和/或收听新日志的方法。

如果要读取过去发生的所有事件,可以使用Web3j提供的ethGetLogs方法。结果包含具有有关事务的某些属性的日志列表。对于您来说,有趣的字段是主题字段,它是字符串列表,并且如果事件是某些传输事件,则应包含发送者和接收者的地址。

YourContract contract // init contract
Web3j web3j // init web3j

EthFilter ethFilter = new EthFilter(DefaultBlockParameterName.EARLIEST,
                    DefaultBlockParameterName.LATEST, contract.getContractAddress());
ethFilter.addSingleTopic(EventEncoder.encode(contract.YOUR_EVENT));
EthLog eventLog = web3j.ethGetLogs(ethFilter).send();


另一种方法是订阅事件日志。因此,您的合同包装器和web3j提供了一些可能性。

yourContract.xxxEventFlowable(ethFilter).subscribe(/*doSomthing*/);


要么

web3j.ethLogFlowable(ethFilter).subscribe(/*doSomthing*/);

10-06 05:56