web3.js中的交易方法调用:
(1)调用方式1
contractAddr.register(amount, {from: account});
注意一定要传from参数,也就是哪一个账户去调用的。否则会调用失败。【from参数不能省略】
(2)调用方式2
contractAddr.register(amount, {from: account}).then(function(returnValue) {
console.log("交易hash:" + returnValue);
});
可以获得本次交易方法执行的交易hash;【from参数不能省略】
(3)调用方式3
contractAddr.register.sendTransaction(amount, {from: account});
相当于直接发送一个交易。【from参数也不能省略】
(4)调用方式4
contractAddr.register.sendTransaction(amount, {from: account}).then(function(returnValue) {
console.log(returnValue);
});
同样也可以捕获交易hash返回值。 【from参数也不能省略】
web3.js对于tx交易方法返回值的测试Event方式
经过测试,Event事件可以返回uint,int,address, bytes32, string, bool类型;
但是不能返回任何的数组类型。
合约中的实现:
event LogRegStatus(address user, bool result);
function register(int ui) {
if(ui != 0) {
LogRegStatus(msg.sender, true);
}
else {
LogRegStatus(msg.sender, false);
}
}
js中的实现:
contractAddr.register(amount, {from: account}).then(function() {
});
contractAddr.LogRegStatus().watch(function(err, event) {
if(event.args.result) {
console.log("成功啦");
}
else {
console.log("失败啦");
}
});
可以返回多个返回值。
合约中实现:
event LogRegStatus(address user, bool result1, int result2, string result3, bytes32 result4, address result5);
function register(int ui){
if(ui != 0) {
LogRegStatus(msg.sender, true, ui, "success", "bytes32", 0x75611bef6091d73546b0a9225105db3c95b9cf5c);
}
else {
LogRegStatus(msg.sender, false, ui, "fail", "bytes323232", 0x544e4107f7bd059f85495d2f8dfcbf7699797a04);
}
}
js中实现:
contractAddr.register(amount, {from: account}).then(function() {
});
contractAddr.LogRegStatus().watch(function(err, event) {
console.log(event.args.result1);
console.log(event.args.result2.valueOf());
console.log(event.args.result3);
console.log(hexCharCodeToStr(event.args.result4));
console.log(event.args.result5);
});
交易方法不能获得返回值的原因是:交易并不是实时的,在区块链上需要时间被处理。