当前位置: 首页 > 知识库问答 >
问题:

如何在java或kotlin中引用Web3j数组类型

濮佑运
2023-03-14

如何从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;
}

共有1个答案

蒋泰
2023-03-14

也许你对数组使用了错误的类型。我用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;
}

我希望这个例子能帮助你:)

 类似资料:
  • 如何拆分阵列?例如,我有一个如下字符数组: 现在,我想用位置6上可以看到的空格拆分数组。拆分后数组将如下所示: 我确实在这里找到了类似的帖子,但在java或Kotlin中没有。 我知道我可以这样做: 但是,如果可能的话,我想要另一种方式。这占用了大量内存,在大型数组上也需要大约30-40毫秒 如何使用java或静态编程语言做到这一点

  • 我已经在这里问了一个问题,但是这个问题只回答了字符串。我不能编辑它,因为那里已经有几个答案了。 现在,我明白了如何用那篇文章中给出的空格分割它。但是,我如何用像这样的自定义类对象分割它: 现在,我想在为false的地方拆分。例如,我有这个数组: 现在,如果将isAdult拆分为false,则如下所示: 那么,如何在java或静态编程语言中实现这一点

  • 让我们假设我在科特林有一门课,如下所示 此外,让我们定义一个内插函数生成电子邮件域,它基于给定域的名称生成电子邮件地址 现在,正如有人说Kotlin是100%可与Java互操作的,我如何在Java类中使用这个中缀函数? 上面使用infix可能不合适,但我想知道如何在Java中使用。 如果我的理解有误,请纠正。

  • 我试图用web3j编写一个Java应用程序,它可以读取任意的abi文件,向用户显示AbiDefinitions列表,并让用户调用自己选择的常量函数。我如何计算下面的输出类型? TypeReference 类对泛型类型使用技巧,当泛型类型在源代码中硬编码时,这些技巧可以正常工作,如下所示: 这就是生成的合约包装器要做的。 对于简单类型,我可以这样做: 对于“int256[2]”这样的数组类型,该怎么

  • 在Java中,可以初始化数组,例如: Kotlin的数组初始化是什么样子的?

  • [{“id”:1,“first_name”:“Lillis”,“last_name”:“Hawgood”,“cars”:[{“item”:“Savana 1500”},{“item”:“Vibe”},{“item”:“Estate”}]}] 数据类MyData(val id:Int=0,val first_name:String=“”,val last_name:String=“”,val car