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 呢?
kaikai
September 5, 2018, 6:25am
13
如果是sendRawTransaction没办法,只能得到错误信息,也就是只能知道成功或失败。获取值用call
你使用sendRawTransaction来发送交易来调合约方法,该方法所调用的合约方法本身就是没有返回值的。
发送交易来调用合约方法,不改变状态,只想得到返回值,要用call方法。
sendRawTransaction得到的hash是交易hash,只是表示你的这个交易验证通过进入交易池,然后可以通过该交易hash得到TransacionReceipt,TransactionReceipt会返回交易是否成功入块,如果成功,块Id,地址等信息,如果没有成功返回的是错误信息。