eth錢包開發(fā)--java(掃塊監(jiān)聽)

掃塊監(jiān)聽邏輯

跑定時任務,每隔固定時間執(zhí)行一次輪詢,這里我采用的間隔時間是距上一次執(zhí)行完后45秒;
定時任務:從上一次輪詢的最后區(qū)塊開始掃描,獲取每個區(qū)塊中所有交易,進行對應查詢數據庫操作和判斷操作,執(zhí)行完后記錄輪詢到的區(qū)塊高度,方便下一次查詢;

相關依賴
<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>core</artifactId>
  <version>4.0.3</version>
</dependency>
  • 以下是使用spring管理的定時任務方法案例:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.methods.response.EthBlock;
import org.web3j.protocol.http.HttpService;

import java.io.IOException;
import java.math.BigInteger;

@Component
public class TransactionWatcherExample {

    private Web3j web3j = Web3j.build(new HttpService("http://localhost:8545"));

    //上次輪詢到的塊高度
    private BigInteger lastBlockNumber;

    /**
     * 掃塊監(jiān)聽eth交易,每45秒一次輪詢
     * @throws IOException
     */
    @Scheduled(fixedDelay = 45 * 1000)
    public void watchEthTransaction() throws IOException {

        //獲取當前塊高度
        BigInteger currentBlockNumber = web3j.ethBlockNumber().send().getBlockNumber();

        //運行初始化
        if (lastBlockNumber == null || currentBlockNumber.subtract(lastBlockNumber).compareTo(BigInteger.valueOf(100)) > 0) {
            lastBlockNumber = BigInteger.valueOf(currentBlockNumber.longValue());
            return;
        }

        long futureBlockNum = currentBlockNumber.intValue() + 1;

        //遍歷區(qū)塊
        for (int i = lastBlockNumber.intValue(); i < futureBlockNum; i++) {

            //獲取block
            EthBlock.Block block = web3j.ethGetBlockByNumber(DefaultBlockParameter.valueOf(BigInteger.valueOf(i)), true).send().getBlock();

            if (block == null) {
                continue;
            }

            // 遍歷block中的交易
            for (EthBlock.TransactionResult tx : block.getTransactions()) {
                if (tx instanceof EthBlock.TransactionObject) {

                    //transaction: 塊中的單筆交易
                    EthBlock.TransactionObject transaction = (EthBlock.TransactionObject) tx;


                    // todo 交易判斷和處理邏輯


                }
            }
        }

        lastBlockNumber = BigInteger.valueOf(futureBlockNum);

    }

}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 在一個方法內部定義的變量都存儲在棧中,當這個函數運行結束后,其對應的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,575評論 1 14
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 16,208評論 2 11
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,810評論 11 349
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,664評論 1 32
  • 時間像流水般匆匆流逝,留下的只是回憶。在我的記憶中有許許多多的事,但令我最感動的還是那一件。 記得我讀三年級時,因...
    峽溪飛瀑閱讀 213評論 0 0

友情鏈接更多精彩內容