Nervosj 调用合约需要参数类型为Address数组 的问题

我欲用nervousj调用如下合约中的方法(第一个参数不知如何传
function create(address[] _owners, uint _required) public returns (address wallet) {
wallet = new MultiSigWallet(_owners, _required);
register(wallet);
}

nervousj 拼接方法名和参数时Java代码如下:
List inputParameters = new ArrayList<>();
List addressList = new ArrayList<>();
Address address1 = new Address(“a8d72d4744120ac28835ae1fc7fb2dfaf1b609ad”);
Address address2 = new Address(“22889780fc0460a374bcae396cad3a3b9afc6d77”);
Address address3 = new Address(“0d63310c98ff839633833c9ed02cf2b70d278691”);
addressList.add(address1);
addressList.add(address2);
addressList.add(address3);
StaticArray staticArray = new StaticArray(addressList);
inputParameters.add(staticArray);
Uint uint = new Uint(BigInteger.valueOf(1));
inputParameters.add(uint);
Function sayHiFunc = new Function(
functionName,
inputParameters,
Arrays.asList(new TypeReference(){}));
String funcCallData = FunctionEncoder.encode(sayHiFunc);
System.out.println("funcCallData = " + funcCallData);
return funcCallData;

    Call call = new Call(fromaddress, contractAddress, funcCallData);
    AppCall appCall = service.appCall(call, DefaultBlockParameter.valueOf("latest")).send();
    String callResult = appCall.getValue();

为题:为什么结果却总是 callResult = 0x ?

你能把你合约发出来我看一下吗?

pragma solidity ^0.4.15;
import “./Factory.sol”;
import “./MultiSigWallet.sol”;

/// @title Multisignature wallet factory - Allows creation of multisig wallet.
/// @author Stefan George - <[email protected]>
contract MultiSigWalletFactory is Factory {

    /*
     * Public functions
     */
    /// @dev Allows verified creation of multisignature wallet.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    /// @return Returns wallet address.
    function create(address[] _owners, uint _required)
        public
        returns (address wallet)
    {
        wallet = new MultiSigWallet(_owners, _required);
        register(wallet);
    }
}

补充:使用postman对rpc接口发请求是可以拿到正确结果的

在构建function的时候要使用solidity的datatype,在你的例子中就是org.nervos.appchain.abi.datatypes.Address和org.nervos.appchain.abi.datatypes.generated.Uint256。

tips:

  1. 理论上要的得到返回结果的合约函数是不会往链上记录任何数据的,这样调用的时候是一个call,所以合约建议加上constant(0.19之前)关键字。
  2. 在Nervosj中有个codeGen项目,用shadowJar生成的jar包可以帮你把solidity contract转换为java class,如果不太知道怎么编码函数,可以参考用codeGen来转移下。