国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【web3j】java通過web3j監(jiān)聽并解析合約中的事件(event/emit)

這篇具有很好參考價(jià)值的文章主要介紹了【web3j】java通過web3j監(jiān)聽并解析合約中的事件(event/emit)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

① 查詢鏈上數(shù)據(jù)用的rpc(本示例是binance的,測試網(wǎng)可以使用:https://data-seed-prebsc-2-s2.binance.org:8545)

② 自己還要有一個(gè)測試鏈上部署好的合約,合約中要有一個(gè)方法emit了事件。

③ java依賴

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>4.9.7</version>
</dependency>
<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>codegen</artifactId>
    <version>4.9.7</version>
</dependency>

一、通過自己合約的abi和bin生成一個(gè)java文件,abi和bin可以在remix的compiler模塊中獲取,代碼如下這一步懶得做的可以跳過,在第二步傳合約地址的時(shí)候,直接傳一個(gè)字符串也行。這里就是順手存一下這個(gè)方法,其實(shí)實(shí)際使用也是直接傳的字符串,具體可以看頁面最下方的”三、“

    /**
     * 通過合約abi和bin獲得java文件
     */
    public void getJavaFileBySolidity(){
        // 生成的java類名,同ABI文件同名,自動(dòng)首字母大寫
        String packageName = "";
        String outDirPath = "/Users/maomo/Desktop/";
        String binDirPath = "/Users/maomo/Desktop/xxxbin.txt";
        String abiDirPath = "/Users/maomo/Desktop/xxxabi.txt";
        String[] arr = Arrays.asList(
                "-b", binDirPath,
                "-a", abiDirPath,
                "-p", packageName,
                "-o", outDirPath
        ).toArray(new String[0]);
        SolidityFunctionWrapperGenerator.main(arr);
    }

二、通過web3j查詢事件,通過eventethFilter增加過濾條件

    public void testSub() {
        Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s2.binance.org:8545"));
        //第一步生成的合約實(shí)體
        Contract contract;
        Disposable subscribe = null;
        try {
            Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();
            log.info("wen3j subscribe --clientVersion-- :{} ", clientVersion);
            //設(shè)置誰調(diào)用合約
            TransactionManager transactionManager = new ClientTransactionManager(web3j, "這里可以輸入自己的錢包地址");
            //加載智能合約(此處可以跳過,下面穿合約地址的地方 直接傳字符串)
            contract = Contract.load("你要監(jiān)聽的合約地址", web3j, transactionManager, ManagedTransaction.GAS_PRICE, org.web3j.tx.Contract.GAS_LIMIT);
            //設(shè)置過濾條件 這個(gè)示例是監(jiān)聽最新的1000個(gè)塊
            BigInteger blockNumber = web3j.ethBlockNumber().send().getBlockNumber()
                                        .subtract(new BigInteger("1000"));
            EthFilter ethFilter = new EthFilter(DefaultBlockParameter.valueOf(blockNumber),DefaultBlockParameterName.LATEST, contract.getContractAddress());
            //監(jiān)聽哪個(gè)事件,合約中的event寫了幾個(gè)參數(shù),這里就寫幾個(gè),類型對應(yīng)好
            Event event = new Event("startEvent",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Uint256>(true) {},
                            new TypeReference<Uint256>(false) {},
                            new TypeReference<Uint256>(false) {},
                            new TypeReference<Uint256>(false) {}));
            ethFilter.addSingleTopic(EventEncoder.encode(event));
            subscribe = web3j.ethLogFlowable(ethFilter).subscribe(tx -> {
                int newBlock = tx.getBlockNumber().intValue();
                log.info("wen3j subscribe --newBlock-- :{} ", newBlock);
                log.info("wen3j subscribe --tx-- :{} ", tx);
                EventValues eventValues = staticExtractEventParameters(event, tx);
                //定義接收參數(shù)(本示例使用的事件返回了6個(gè),具體按自己合約來)
                String address1 = "";String address2 = "";int uint1 = 0;
                int uint2 = 0;int uint3 = 0;int uint4 = 0;
                List<Type> indexedValues = eventValues.getIndexedValues();
                if (ObjectUtils.isNotEmpty(indexedValues) && indexedValues.size() == 3) {
                    Type type1 = indexedValues.get(0);
                    address1 = type1.getValue().toString();
                    Type type2 = indexedValues.get(1);
                    address2 = type2.getValue().toString();
                    Type type3 = indexedValues.get(2);
                    uint1 = Integer.parseInt(type3.getValue().toString());
                }
                List<Type> nonIndexedValues = eventValues.getNonIndexedValues();
                if (ObjectUtils.isNotEmpty(nonIndexedValues) && nonIndexedValues.size() == 3) {
                    Type type1 = nonIndexedValues.get(0);
                    uint2 = Integer.parseInt(type1.getValue().toString());
                    Type type2 = nonIndexedValues.get(1);
                    uint3 = Integer.parseInt(type2.getValue().toString());
                    Type type3 = nonIndexedValues.get(2);
                    uint4 = Integer.parseInt(type3.getValue().toString());
                }
                log.info("address1:{};address2:{};uint1:{};uint2:{};uint3:{};uint4:{}",address1, address2, uint1, uint2, uint3, uint4);
            });
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //關(guān)閉監(jiān)聽
            if(ObjectUtils.isNotEmpty(subscribe) && !subscribe.isDisposed()){
                subscribe.dispose();
            }
        }
    }
    /**
     * 解析log返回的data
     * @param event 合約中定義的事件
     * @param log 監(jiān)聽到的log
     * @return 解析后的數(shù)據(jù)
     */
    public EventValues staticExtractEventParameters(Event event, Log log) {
        final List<String> topics = log.getTopics();
        String encodedEventSignature = EventEncoder.encode(event);
        if (topics == null || topics.size() == 0 || !topics.get(0).equals(encodedEventSignature)) {
            return null;
        }
        List<Type> indexedValues = new ArrayList<>();
        List<Type> nonIndexedValues = FunctionReturnDecoder.decode(
                log.getData(), event.getNonIndexedParameters());
        List<TypeReference<Type>> indexedParameters = event.getIndexedParameters();
        for (int i = 0; i < indexedParameters.size(); i++) {
            Type value = FunctionReturnDecoder.decodeIndexedValue(
                    topics.get(i + 1), indexedParameters.get(i));
            indexedValues.add(value);
        }
        return new EventValues(indexedValues, nonIndexedValues);
    }

三、為了方便以后復(fù)制粘貼(不是),最下面再傳一個(gè)不生成合約的版本

    public void testSub() {
        Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s2.binance.org:8545"));
        //第一步生成的合約實(shí)體
        Contract contract;
        Disposable subscribe = null;
        try {
            Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();
            log.info("wen3j subscribe --clientVersion-- :{} ", clientVersion);
            //設(shè)置過濾條件 這個(gè)示例是監(jiān)聽最新的1000個(gè)塊
            BigInteger blockNumber = web3j.ethBlockNumber().send().getBlockNumber()
                                        .subtract(new BigInteger("1000"));
            EthFilter ethFilter = new EthFilter(DefaultBlockParameter.valueOf(blockNumber),DefaultBlockParameterName.LATEST, "輸入合約地址");
            //監(jiān)聽哪個(gè)事件,合約中的event寫了幾個(gè)參數(shù),這里就寫幾個(gè),類型對應(yīng)好
            Event event = new Event("startEvent",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Uint256>(true) {},
                            new TypeReference<Uint256>(false) {},
                            new TypeReference<Uint256>(false) {},
                            new TypeReference<Uint256>(false) {}));
            ethFilter.addSingleTopic(EventEncoder.encode(event));
            subscribe = web3j.ethLogFlowable(ethFilter).subscribe(tx -> {
                int newBlock = tx.getBlockNumber().intValue();
                log.info("wen3j subscribe --newBlock-- :{} ", newBlock);
                log.info("wen3j subscribe --tx-- :{} ", tx);
                EventValues eventValues = staticExtractEventParameters(event, tx);
                //定義接收參數(shù)(本示例使用的事件返回了6個(gè),具體按自己合約來)
                String address1 = "";String address2 = "";int uint1 = 0;
                int uint2 = 0;int uint3 = 0;int uint4 = 0;
                List<Type> indexedValues = eventValues.getIndexedValues();
                if (ObjectUtils.isNotEmpty(indexedValues) && indexedValues.size() == 3) {
                    Type type1 = indexedValues.get(0);
                    address1 = type1.getValue().toString();
                    Type type2 = indexedValues.get(1);
                    address2 = type2.getValue().toString();
                    Type type3 = indexedValues.get(2);
                    uint1 = Integer.parseInt(type3.getValue().toString());
                }
                List<Type> nonIndexedValues = eventValues.getNonIndexedValues();
                if (ObjectUtils.isNotEmpty(nonIndexedValues) && nonIndexedValues.size() == 3) {
                    Type type1 = nonIndexedValues.get(0);
                    uint2 = Integer.parseInt(type1.getValue().toString());
                    Type type2 = nonIndexedValues.get(1);
                    uint3 = Integer.parseInt(type2.getValue().toString());
                    Type type3 = nonIndexedValues.get(2);
                    uint4 = Integer.parseInt(type3.getValue().toString());
                }
                log.info("address1:{};address2:{};uint1:{};uint2:{};uint3:{};uint4:{}",address1, address2, uint1, uint2, uint3, uint4);
            });
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //關(guān)閉監(jiān)聽
            if(ObjectUtils.isNotEmpty(subscribe) && !subscribe.isDisposed()){
                subscribe.dispose();
            }
        }
    }

=========================分割線=========================

還有一種把web3j.ethLogFlowable(ethFilter).subscribe換成查詢的方法,做個(gè)記錄

把這段代碼

subscribe = web3j.ethLogFlowable(ethFilter).subscribe(tx -> {

    //邏輯...
}

換成文章來源地址http://www.zghlxwxcb.cn/news/detail-483681.html

List<EthLog.LogResult> resp = web3j.ethGetLogs(ethFilter).send().getLogs();
    for (EthLog.LogResult logItem : resp) {
                EthLog.LogObject tx = ObjectUtils.isNotEmpty(logItem.get()) ? (EthLog.LogObject) logItem.get() : null;
                if(ObjectUtils.isEmpty(tx)){
                    return false;
                }

    //邏輯...

    }

到了這里,關(guān)于【web3j】java通過web3j監(jiān)聽并解析合約中的事件(event/emit)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • web3j的基礎(chǔ)用法-6合約的監(jiān)聽器事件Event和過濾器EthFilter,以及NullPointed,調(diào)用失敗導(dǎo)致的bug解決

    web3j的基礎(chǔ)用法-6合約的監(jiān)聽器事件Event和過濾器EthFilter,以及NullPointed,調(diào)用失敗導(dǎo)致的bug解決

    本篇以Uniswap為例(https://uniswap.org/) 合約地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni) 監(jiān)聽合約Tranfer事件 調(diào)用代碼 核心代碼實(shí)現(xiàn)在這里 之前實(shí)驗(yàn)全量區(qū)塊,導(dǎo)致請求多次失敗,是由于個(gè)人RPC節(jié)點(diǎn)的請求和數(shù)據(jù)有限,為了測試出結(jié)果,從13763721L block到當(dāng)前,結(jié)果毫秒級返

    2024年02月11日
    瀏覽(29)
  • java通過web3j獲取ETH交易明細(xì)

    ? ? 我們在項(xiàng)目里面如果想要得到用戶的ETH交易明細(xì)怎么做呢?有兩種方式: ? ?1、直接獲取ETH最新塊的交易明細(xì)。 ? ?2、通過塊獲取用戶的交易明細(xì)。 廢話不多說,直接貼代碼看了 ???????? 下面是項(xiàng)目的相關(guān)依賴:

    2024年02月05日
    瀏覽(22)
  • java使用web3j,部署智能合約在測試鏈上,并調(diào)用(萬字詳細(xì)教程)

    java使用web3j,部署智能合約在測試鏈上,并調(diào)用(萬字詳細(xì)教程)

    最近在學(xué)區(qū)塊鏈相關(guān),想做點(diǎn)自己感興趣的。網(wǎng)上關(guān)于這塊部分的坑也比較多,最近也是問了很多行業(yè)從事者才慢慢填坑,因此記錄下來分享一下。 錢包 :metemask、 solidity編譯器 :remix 、 java ide :idea。 智能合約編寫的我選擇在remix上方便,而且部署的時(shí)候不需要自定義gasP

    2024年01月16日
    瀏覽(25)
  • web3j的基礎(chǔ)用法-3ETH交易監(jiān)聽器

    web3j的基礎(chǔ)用法-3ETH交易監(jiān)聽器

    demo簡單實(shí)現(xiàn)了4種 監(jiān)聽區(qū)塊 監(jiān)聽所有交易 監(jiān)聽待上鏈的交易 監(jiān)聽指定合約的交易事件(例如監(jiān)控大戶流轉(zhuǎn),實(shí)現(xiàn)跟單,拋售等后續(xù)邏輯) github 地址 https://github.com/jambestwick/we3jdemo

    2024年02月11日
    瀏覽(20)
  • Java Web3j nonce 獲取

    Web3j 獲取 nonce 的參考代碼 獲取一個(gè) address nonce 值的時(shí)候,其中有一個(gè)參數(shù)為 DefaultBlockParameter,上面代碼中采用的是 DefaultBlockParameterName 類,它有 3 個(gè)值,分別為 EARLIEST ( \\\"earliest\\\" ) LATEST ( \\\"latest\\\" ) PENDING ( \\\"pending\\\" ) earliest:創(chuàng)世區(qū)塊 latest:最新區(qū)塊 (區(qū)塊鏈的頭號區(qū)塊) pending:

    2024年02月14日
    瀏覽(30)
  • java web3j4.8.4版本的使用記錄

    java web3j4.8.4版本的使用記錄

    最近公司做NFT市場開發(fā),特記錄一下自己在使用web3j組件測試調(diào)用區(qū)塊鏈合約的時(shí)使用的方法和踩過的坑,便于自己以后查看。 主要用到工具有4個(gè) idea,谷歌瀏覽,小狐貍錢包(metamask)插件,remix在線智能合約平臺 1.1、java項(xiàng)目 ?在pom.xml中添加引用倉庫地址,添加web3j的引入 1.2、

    2023年04月14日
    瀏覽(27)
  • 以太坊Dapp通過web3js部署調(diào)用智能合約

    以太坊Dapp通過web3js部署調(diào)用智能合約

    參考視頻:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 https://remix.ethereum.org/ 創(chuàng)建一個(gè)新的文件夾 mkdir MyDapp2 啟動(dòng) ganache-cli 下載web3 npm install web3 ,注:ganache的啟動(dòng)和deploy.js要在同一個(gè)目錄。 先進(jìn)行測試 node deploy.js 部署合約 web3的版本:1.7.1 復(fù)制 WEB3DEPLOY 的內(nèi)容到deploy.js == ganache需要

    2023年04月23日
    瀏覽(27)
  • Web3j使用教程(2)

    Web3j使用教程(2)

    首先安裝solc(用于編譯智能合約)和web3j命令行工具(用于打包智能合約) npm install -g solc web3j安裝地址:?Releases · web3j/web3j · GitHub,選擇對應(yīng)操作系統(tǒng) 首先準(zhǔn)備一個(gè)智能合約 Owner.sol,建議先在remix上測試一下Remix - Ethereum IDE 先編譯? solcjs Owner.sol --bin --abi --optimize -o . 然后

    2023年04月24日
    瀏覽(30)
  • HTML頁面通過Web3JS連接智能合約并調(diào)用其中接口

    HTML頁面通過Web3JS連接智能合約并調(diào)用其中接口

    之前我們學(xué)習(xí)solidity 并用它編寫了智能合約 登上區(qū)塊鏈 然后也做了基本的測試 但是 其實(shí)在web3時(shí)代 前端依舊扮演者非常重要的角色 我們現(xiàn)在就來打通web3 從合約到頁面的一個(gè)管理 首先 我們還是將自己的ganache環(huán)境起起來 然后 在我們之前智能合約的項(xiàng)目終端執(zhí)行 將我們的智

    2024年02月16日
    瀏覽(39)
  • Web3j 5.0版本的簽名與驗(yàn)簽

    2024年02月13日
    瀏覽(158)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包