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

Web3j 繼承StaticStruct的類所有屬性必須為Public <DynamicArray<StaticStruct>>

這篇具有很好參考價值的文章主要介紹了Web3j 繼承StaticStruct的類所有屬性必須為Public <DynamicArray<StaticStruct>>。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Web3j 繼承StaticStruct的類所有屬性必須為Public,屬性的順序和數(shù)量必須和solidity 里面的struct 屬性相同,否則屬性少了或者多了的時候會出現(xiàn)錯位

Web3j 繼承StaticStruct的類所有屬性不能為private,因?yàn)閣eb3j 是通過長度去截取返回值解析成對應(yīng)的屬性進(jìn)行賦值的。要獲取一個list對象時,web3j是按一個類的所有public屬性個數(shù)去截取總長度的,再進(jìn)行解析賦值到?jīng)]一個屬性里

StaticStruct類

import lombok.Data;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.StaticStruct;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;

@Data
public class ChildStaticStruct extends StaticStruct {

    public Uint256 attr1;
    public Uint256 attr2;
    public Address attr3;

    public ChildStaticStruct(Uint256 attr1, Uint256 attr2, Address attr3) {
         super(new Type[]{attr1,attr2,attr3});
    }
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.DynamicArray;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.EthCall;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class TestContract {
    private static final Logger logger = LoggerFactory.getLogger(TestContract.class);
    private String address;
    private Web3j web3j;
    public TestContract(String address, Web3j web3j) {
        this.address = address;
        this.web3j = web3j;
    }

    public List<ChildStaticStruct> getStaticStructList(String address) throws IOException {
        List<Type> inputParameters = Arrays.asList( new Address(address));
        List<TypeReference<?>> outputParameters = Arrays.asList(new TypeReference<DynamicArray<ChildStaticStruct>>(){});
        Function function = new Function("getStaticStructList",inputParameters,outputParameters);
        Transaction transaction = Transaction.createEthCallTransaction(null,address, FunctionEncoder.encode(function));
        EthCall response = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
        List<Type> output = FunctionReturnDecoder.decode(response.getValue(),function.getOutputParameters());
        List<ChildStaticStruct> results = (List<ChildStaticStruct>)output.get(0).getValue();
        return results;
    }
}

web3j的TypeDecoder 里的decodeArrayElements 驗(yàn)證了是否為StructType子類,

在currOffset += getSingleElementLength(input, currOffset, cls) * 64)判斷了截取的長度

if (StructType.class.isAssignableFrom(cls)) {
                elements = new ArrayList(length);
                currOffset = 0;

                for(currOffset = offset; currOffset < length; currOffset += getSingleElementLength(input, currOffset, cls) * 64) {
                    if (DynamicStruct.class.isAssignableFrom(cls)) {
                        value = decodeDynamicStruct(input, offset + DefaultFunctionReturnDecoder.getDataOffset(input, currOffset, typeReference), TypeReference.create(cls));
                    } else {
                        value = decodeStaticStruct(input, currOffset, TypeReference.create(cls));
                    }

                    elements.add(value);
                    ++currOffset;
                }

                String typeName = Utils.getSimpleTypeName(cls);
                return (Type)consumer.apply(elements, typeName);
            } 

getSingleElementLength 驗(yàn)證了截取長度是根據(jù)public屬性數(shù)量去截取Utils.staticStructNestedPublicFieldsFlatList(type).size(),pirvate計(jì)算長度

static <T extends Type> int getSingleElementLength(String input, int offset, Class<T> type) {
        if (input.length() == offset) {
            return 0;
        } else if (!DynamicBytes.class.isAssignableFrom(type) && !Utf8String.class.isAssignableFrom(type)) {
            return StaticStruct.class.isAssignableFrom(type) ? Utils.staticStructNestedPublicFieldsFlatList(type).size() : 1;
        } else {
            return decodeUintAsInt(input, offset) / 32 + 2;
        }
    }

?staticStructNestedPublicFieldsFlatList方面里面通過Modifier.isPublic(field.getModifiers())過濾了public??

public static List<Field> staticStructNestedPublicFieldsFlatList(Class<Type> classType) {
        return (List)staticStructsNestedFieldsFlatList(classType).stream().filter((field) -> {
            return Modifier.isPublic(field.getModifiers());
        }).collect(Collectors.toList());
    }

Modifier 里面比較了Public文章來源地址http://www.zghlxwxcb.cn/news/detail-703632.html

public static boolean isPublic(int mod) {
        return (mod & PUBLIC) != 0;
    }

到了這里,關(guān)于Web3j 繼承StaticStruct的類所有屬性必須為Public <DynamicArray<StaticStruct>>的文章就介紹完了。如果您還想了解更多內(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)文章

  • Java Web3J :使用web3j調(diào)用自己的智能合約,返回一個內(nèi)部有數(shù)組的對象結(jié)構(gòu)時出現(xiàn)NPE問題

    之前有寫過一篇文章Java Web3J :使用web3j調(diào)用自己的智能合約的方法(教程),當(dāng)時只是簡單的方法調(diào)用,也不涉及到什么復(fù)雜的數(shù)據(jù)類型,入?yún)⑹莑ong類型,出參是String類型。 遇到這個問題是因?yàn)橛幸粋€方法,需要通過提案的治理id,查詢鏈上提案數(shù)據(jù),這個就需要接收提案

    2024年01月19日
    瀏覽(24)
  • Java Web3j nonce 獲取

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

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

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

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

    2024年02月05日
    瀏覽(22)
  • Java與智能合約交互(Web3j)- write函數(shù)

    說在前頭 Web3是一種新興的網(wǎng)絡(luò)概念,由于某些原因?qū)е挛覀兡軌蚪佑|到的相關(guān)技術(shù)知識實(shí)在有限,每當(dāng)我遇見技術(shù)瓶頸總是不能找到充足的資料,這也讓我萌生了填補(bǔ)這片空白知識的沖動。 “Hello Web3” 這個專欄會盡力將我掌握的web3 知識分享給大家。如果分享的知識能幫助

    2023年04月08日
    瀏覽(27)
  • java web3j4.8.4版本的使用記錄

    java web3j4.8.4版本的使用記錄

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

    2023年04月14日
    瀏覽(28)
  • 【W(wǎng)EB3】如何使用Web3J庫開發(fā)應(yīng)用連接到以太坊區(qū)塊鏈網(wǎng)絡(luò)

    ? Web3j 是一個與以太坊智能合約交互并與以太坊節(jié)點(diǎn)集成的 Java 庫。它是高度模塊化、類型安全和反應(yīng)式的,專為以太坊上的 Java 和 Android 開發(fā)而構(gòu)建。Web3j 消除了編寫自定義集成代碼以連接到以太坊區(qū)塊鏈網(wǎng)絡(luò)的開銷。 通過 HTTP 和 IPC 實(shí)現(xiàn)完整的 Ethereum JSON-RPC客戶端 API,

    2024年02月02日
    瀏覽(34)
  • 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,部署智能合約在測試鏈上,并調(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上方便,而且部署的時候不需要自定義gasP

    2024年01月16日
    瀏覽(25)
  • 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)致請求多次失敗,是由于個人RPC節(jié)點(diǎn)的請求和數(shù)據(jù)有限,為了測試出結(jié)果,從13763721L block到當(dāng)前,結(jié)果毫秒級返

    2024年02月11日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包