簡體   English   中英

如何在 java 或 kotlin 中引用 Web3j 數組類型

[英]how to reference Web3j array type in java or kotlin

錯誤部分 -

如何從 web3j 庫中引用數組類型? 我有一個合約函數,它返回訪問合約的人的地址數組。 我想將這些作為數組放入 java/kotlin 項目中。 這是代碼 -

//gets an array of addresses from the contract
fun getAddressValues(): RemoteCall<Array<Address>> {
    val function = Function(
        functionGetAddressValues,
        listOf(),
        listOf<TypeReference<*>>(object : TypeReference<Array<Address>>() {})
    )
    // TODO: NOTE - THIS ARRAY IS FROM THE WEB3J LIBRARY "org.web3j.abi.datatypes.Array"
    return executeRemoteCallSingleValueReturn(function, Array<Address>().javaClass) // TODO: error
}

我只想獲取數組的類類型,以便我可以將它傳遞給這個函數 -

executeRemoteCallSingleValueReturn(function, Array<Address>().javaClass) // TODO: error

錯誤出現在 -

Array<Address>().javaClass

如果您想看一下,這是合同代碼-

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract VotingContract {
    address[] addressStorage;

    uint256 partyOneVotes;
    uint256 partyTwoVotes;
    uint256 partyThreeVotes;

    constructor() {
        partyOneVotes = 0;
        partyTwoVotes = 0;
        partyThreeVotes = 0;
    }

    function registerVote(uint256 num) public {
        require(
            num < 4 && num > 0,
            "the given number is invalid as the number is out of range"
        );
        bool a = false;
        address messageSender = msg.sender;
        uint256 i;
        for (i = 0; i < addressStorage.length; i++) {
            if (messageSender == addressStorage[i]) {
                a = false;
                //set to true to block multiple entries.
            }
        }
        require(a == false, "Your vote has already been registered");
        addressStorage.push(messageSender);
        if (num == 1) {
            partyOneVotes++;
        } else if (num == 2) {
            partyTwoVotes++;
        } else {
            partyThreeVotes++;
        }
    }

    function getAddressValues() public view returns (address[] memory) {
        return addressStorage;
    }

    function getPartyOneVotes() public view returns (uint256) {
        return partyOneVotes;
    }

    function getPartyTwoVotes() public view returns (uint256) {
        return partyTwoVotes;
    }

    function getPartyThreeVotes() public view returns (uint256) {
        return partyThreeVotes;
    }
}

這就是我說的合約函數——

function getAddressValues() public view returns (address[] memory) {
    return addressStorage;
}

任何形式的幫助都可以得到...

也許您為數組使用了錯誤的類型。 我使用 DynamicArray 而不是 Array。

這種和平的代碼調用一個帶有參數地址的函數並返回一個 DynamicArray。 DynamicArray 的值顯示在控制台上:

val function = org.web3j.abi.datatypes.Function("getTokensFromOwner",
                                                       inputParameters, 
                                                       Arrays.asList<TypeReference<*>>(object: TypeReference<org.web3j.abi.datatypes.DynamicArray<Uint256>>() {}))
        
val encodedFunction = FunctionEncoder.encode(function)
val transaction = Transaction.createEthCallTransaction("0xD8e5D841C0db4c4b95fa9fCEc48936F51Aeeaed8", "0x6Ac98A430D17ef564091bA470785f1389d0b9371", encodedFunction)
val response: EthCall = web3j.ethCall(transaction, DefaultBlockParameter.valueOf("latest")).sendAsync().get()  // get the result of the smartcontract
val value = response.value
        
val someTypes = FunctionReturnDecoder.decode(value, function.outputParameters)
        
var tokens: DynamicArray<Uint256> = DynamicArray((someTypes.get(0).value as ArrayList<Uint256>).toList())
        
for (token: Uint256 in tokens.value)
{
    Log.v("token ", token.value.toString())
}

智能合約功能:

function getTokensFromOwner(address owner) external view returns (uint256[] memory)
{
    uint256 nbTokens = balanceOf(owner);
    uint256[] memory tokensId = new uint256[](nbTokens);
    for (uint256 i=0; i< nbTokens;i++)
    {
      tokensId[i] = (tokenOfOwnerByIndex(owner, i));
    }
    
    return tokensId;
}

我希望這個例子對你有幫助:)

暫無
暫無

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

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