web3J solidity event

1655362915056.png

我們需要監(jiān)聽某個(gè)事件 需要根據(jù)event 的topic[0] 來篩選。所以當(dāng)我們要去監(jiān)聽一個(gè) 日志時(shí)就需要知道topic[0]的值

List<EthLog.LogResult> logs = web3j.ethGetLogs(new EthFilter(DefaultBlockParameter.valueOf(new BigInteger(start.toString())), DefaultBlockParameter.valueOf(new BigInteger(end.toString()))
                , contract).addOptionalTopics(transferTopic)).send().getLogs();

然后這個(gè)topic[0] 可以使用

        List<TypeReference<?>> parameters = new ArrayList<>();
        parameters.add(new TypeReference<Address>(true) {
        });
        parameters.add(new TypeReference<Address>(true) {
        });

        Event event = new Event("name", parameters);
        topic[0] =  EventEncoder.encode(event);

正常情況都是正常的 但是當(dāng)日志里面有一個(gè)我們自己定義的結(jié)構(gòu)體 就發(fā)現(xiàn)不對(duì)了

public static String encode(Event event) {

        String methodSignature = buildMethodSignature(event.getName(), event.getParameters());

        return buildEventSignature(methodSignature);
    }

    static <T extends Type> String buildMethodSignature(
            String methodName, List<TypeReference<T>> parameters) {

        StringBuilder result = new StringBuilder();
        result.append(methodName);
        result.append("(");
        String params =
                parameters.stream().map(p -> Utils.getTypeName(p)).collect(Collectors.joining(","));
        result.append(params);
        result.append(")");
        return result.toString();
    }

    public static String buildEventSignature(String methodSignature) {
        byte[] input = methodSignature.getBytes();
        byte[] hash = Hash.sha3(input);
        return Numeric.toHexString(hash);
    }

看上面代碼發(fā)現(xiàn) 以event Transfer(address indexed from, address indexed to,uint256 indexed id ); 其實(shí)這個(gè)topic[0] = keccak256("Transfer(address, address,uint256)") 如果有自己定義的機(jī)構(gòu)體怎么表示?
如果我們用 EventEncoder.encode(event) 方法 ; Utils.getTypeName(p) 它會(huì)找到我們?cè)俅a里面定義的類名 然后拼接去 keccak256,這是不對(duì)的 。

因?yàn)?event的topic[0] 和方法簽名有點(diǎn)類似 就去看看方法簽名時(shí)怎么處理的 (DefaultFunctionEncoder)

 public String encodeFunction(final Function function) {
        final List<Type> parameters = function.getInputParameters();

        final String methodSignature = buildMethodSignature(function.getName(), parameters);
        final String methodId = buildMethodId(methodSignature);

        final StringBuilder result = new StringBuilder();
        result.append(methodId);

        return encodeParameters(parameters, result);
    }

    protected static String buildMethodSignature(
            final String methodName, final List<Type> parameters) {

        final StringBuilder result = new StringBuilder();
        result.append(methodName);
        result.append("(");
        final String params =
                parameters.stream().map(Type::getTypeAsString).collect(Collectors.joining(","));
        result.append(params);
        result.append(")");
        return result.toString();
    }

這里拿的是 Type::getTypeAsString 方法

struct NFT {
    address collection;
    uint256 tokenId;
}

那 NFT 的getTypeAsString 的結(jié)果就是 (address,uint256) 如果是 NFT [] 那就是 (address,uint256)[] 如果是結(jié)構(gòu)體套結(jié)構(gòu)體就是一次遞歸。

event Name(address user,NFT[] nfts);

那么 Name 的 topic[0] 就是 keccak256("Name(address,(address,uint256)[])");

其實(shí)文檔有寫 但是寫的不太明白 我沒有看懂!

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

相關(guān)閱讀更多精彩內(nèi)容

  • 一.ABI ABI是和Ethereum生態(tài)系統(tǒng)的合約進(jìn)行交互的標(biāo)準(zhǔn)方式,所有合約的調(diào)用都是通過ABI.一個(gè)函數(shù)調(diào)用...
    mingmingz閱讀 1,043評(píng)論 0 1
  • 帶寬 每天每個(gè)賬號(hào)5000帶寬 抵扣手續(xù)費(fèi) 在波場(chǎng),除查詢之外的任何交易都需要消耗帶寬,系統(tǒng)每天給每個(gè)激活賬戶贈(zèng)送...
    a437e8f87a81閱讀 1,161評(píng)論 0 0
  • https://segmentfault.com/a/1190000015295148 流程 合約代碼編寫(Sol...
    JARVIS_STUDIO閱讀 2,445評(píng)論 0 0
  • 參考文檔Solidity的event事件(二十一)|入門系列http://me.tryblockchain.org...
    jection閱讀 1,182評(píng)論 0 1
  • 待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》,馬良老師講授。此簡(jiǎn)書文集記錄我的學(xué)習(xí)筆記...
    吉祥在成長(zhǎng)閱讀 1,711評(píng)論 0 1

友情鏈接更多精彩內(nèi)容