Web3j生成合约Wrapper中withdraw方法的BigInteger参数用途咨询
Web3j生成的payable函数Java封装中BigInteger参数的用途
问题背景
我正在使用Web3j CLI为以太坊智能合约生成Java Wrapper。
Solidity合约中的withdraw函数如下:
function withdraw() external payable { address _caller = msg.sender; uint256 _userBalance = recipientBalances[_caller]; if (isExpired() && _userBalance > 0) { uint256 _contractBalance = address(this).balance; recipientBalances[_caller] = 0; address payable _recipient = payable(_caller); if (_contractBalance > _userBalance) { _recipient.transfer(etherToWei(_userBalance)); } } }
生成的Java方法却多了一个BigInteger参数,而原Solidity函数没有定义任何参数:
public RemoteFunctionCall<TransactionReceipt> withdraw(BigInteger weiValue) { final Function function = new Function( FUNC_WITHDRAW, Arrays.<Type>asList(), Collections.<TypeReference<?>>emptyList()); return executeRemoteCallTransaction(function, weiValue); }
其他函数没有这个情况,想知道这个BigInteger参数的用途。
解答
这个BigInteger参数是用来指定调用该payable函数时,发起交易要附带的以太币数量(单位为wei)。
你的Solidity函数加了payable修饰符,这个修饰符的作用是允许函数接收外部转入的以太币。Web3j在生成Java封装方法时,会自动给所有带payable的函数添加这个参数,方便开发者在调用时设置转账金额。
你其他没有这个参数的函数,肯定是没加payable修饰符——这类函数不允许接收以太币,自然不需要这个参数。
另外,你的withdraw函数逻辑是从合约提取以太币给调用者,不需要调用者转钱进来,所以调用这个Java方法时传入BigInteger.ZERO就可以了。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

