Nervosj开发中调用合约时传参问题

Call call = new Call(from, to, data);

比如我在cita链上部署了如下合约,并得到合约地址 0xe34D17bB37eB4c9DB8B1B069597912686E8dD589 :
contract HelloWorld {
string name;

constructor(string _name) public {
    name = _name;
}

function sayHi() public view returns (string) {
    return (name);
}

function changeName(string _name) public {
    name = _name;
}

}

问题,我如果想调用changeName,该如何传 new Call(from, to, data) 参数 data

from字段传入你的地址,to传入合约的地址,data是合约函数的bin code
Function sayHiFunc = new Function(
“sayHi”,
Collections.emptyList(),
Arrays.asList(new TypeReference() {
})
);
String funcCallData = FunctionEncoder.encode(sayHiFunc);

调用过程总是报错,代码如下:
Nervosj service = Nervosj.build(new HttpService(“http://39.105.54.203:1337”));

String superAdminAddress = “a887ab2bbff5b284529faf7b255cb5a32661f76f”;

String contractAddress = “0xe34D17bB37eB4c9DB8B1B069597912686E8dD589”;

Function sayHiFunc = new Function(
“sayHi”,
Collections.emptyList(),
Arrays.asList(new TypeReference(){}));
String funcCallData = FunctionEncoder.encode(sayHiFunc);

Call call = new Call(superAdminAddress, contractAddress, funcCallData);

AppCall appCall = service.appCall(call, DefaultBlockParameter.valueOf(“latest”)).send();

String callResult = appCall.getValue();

return callResult;

问题:总是会有error,经我debug:appCall.getError().getMessage() = invalid format: [a887ab…(omit 28)…61f76f]

这是为什么?

你需要把函数返回值的数据类型加上,String对应得数据类型是utf8string。在编码函数的时候要指明返回值的数据类型,否则无法正确解序列化。

调用changeName后,通过sayHi观察name变化,发现无论怎么调用changeName,都无法改变name。对CITA知之甚少,感到无比绝望,麻烦大神帮忙看看解决一下

如果你的方法要改变状态的话,这个需要被记录在链上。
任何需要改变链上信息的操作都不能使用call方法,要使用sendRawTransaction,因为交易入块需要你的签名和quota信息。

明白了,原来是这样,太感谢您了。

不客气哈,有问题多交流,共同进步。

按您说的,sendRawTransaction调用交易,在别的合约中遇到一个问题,如果所调用的方法应该返回一个address,在sendRawTransaction之后,只拿到一个交易的hash,我如何获取调用该方法的返回值address呢?

如果是sendRawTransaction没办法,只能得到错误信息,也就是只能知道成功或失败。获取值用call

你使用sendRawTransaction来发送交易来调合约方法,该方法所调用的合约方法本身就是没有返回值的。
发送交易来调用合约方法,不改变状态,只想得到返回值,要用call方法。
sendRawTransaction得到的hash是交易hash,只是表示你的这个交易验证通过进入交易池,然后可以通过该交易hash得到TransacionReceipt,TransactionReceipt会返回交易是否成功入块,如果成功,块Id,地址等信息,如果没有成功返回的是错误信息。