簡體   English   中英

無法在 java web3j 的 EthBlock.transactionObject 中獲取交易值和發件人地址

[英]Unable to fetch transaction value and senders address in java web3j 's EthBlock.transactionObject

這是下面的代碼片段:-

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 包裝器提供了一些方法來讀取過去的日志和/或收聽新的日志。

如果要讀取過去發生的所有事件,可以使用ethGetLogs提供的 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*/);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM