链眼社区:专注于区块链安全,区块链数据分析, 区块链信息整合,区块链技术服务和区块链技术咨询。

java以太坊库web3j文档:web3j常见问题解决方案
清风慕竹
2021-10-11 20:58:44

你有一个使用web3j开发的项目吗?

如果有的话,请参阅web3j快速入门

我提交了一个交易,但没有被开采。

创建和发送交易后,会收到交易hash,但是调用eth_getTransactionReceipt却总是返回空值,指示交易未被挖掘,代码如下:

String transactionHash = sendTransaction(...);

// you loop through the following expecting to eventually get a receipt once the transaction
// is mined
EthGetTransactionReceipt.TransactionReceipt transactionReceipt =
        web3j.ethGetTransactionReceipt(transactionHash).sendAsync().get();

if (!transactionReceipt.isPresent()) {
    // try again, ad infinitum
}

从未收到交易收据,而且不幸的是,在以太坊客户端中可能没有任何错误提示,说明交易有任何问题:

I1025 18:13:32.817691 eth/api.go:1185] Tx(0xeaac9aab7f9aeab189acd8714c5a60c7424f86820884b815c4448cfcd4d9fc79) to: 0x9c98e381edc5fe1ac514935f3cc3edaa764cf004

查看提交是否正在等待挖掘开采的最简单的方法是用Etherscan并使用https://testnet.etherscan.io/address/0x…搜索发送的交易的地。如果提交是成功的,在执行提交操作的几秒钟内应该在Etherscan就可以看到。然后就等着开采了。 如果没有任何迹象,交易就消失了。那么对不起,可能的原因是由于交易的随机数问题,以太币要么没有被设置,要么太低。有关更多信息,请参阅交易处理部分。

我想在测试链上获得一些以太,但我又不想自己去开采。

请参考以太坊测试链testnets。

如何从交易调用的智能合约方法中获取返回值?

不可能从被称为交易一部分的智能合约上返回方法的值。如果希望在交易期间读取值,则必须使用事件event。要从智能合约中查询值,必须使用与交易分开的调用。这些方法应该标记为常量函数。由web3j创建的solidity智能合约封装包为你处理这些差异。

下面的stackexchange帖子对于理解这个问题很有用。

是否可以用交易发送任意文本?

是的。文本应该是ASCII编码的,并在交易的数据中以十六进制字符串的形式提供。示例如下:

RawTransaction.createTransaction(
        <nonce>, GAS_PRICE, GAS_LIMIT, "0x<address>", <amount>, "0x<hex encoded text>");

byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, ALICE);
String hexValue = Numeric.toHexString(signedMessage);

EthSendTransaction ethSendTransaction =
        web3j.ethSendRawTransaction(hexValue).send();
String transactionHash = ethSendTransaction.getTransactionHash();
...

注:请确保你增加了交易的气体限制,以允许存储文本。

下面的stackexchange帖子对于理解这个问题很有用。

我已经生成了智能合约封装包,但是智能合约的二进制文件是空的?

如果在Solidity中定义了一个接口,但其中一个方法的实现与原始接口定义不匹配,则生成的二进制文件将是空白的。

在下面的例子中:

contract Web3jToken is ERC20Basic, Ownable {
    ...
    function transfer(address _from, address _to, uint256 _value) onlyOwner returns (bool) {
    ...
}

我们忘记了在一个继承的合同中定义from参数:

contract ERC20Basic {
    ...
    function transfer(address to, uint256 value) returns (bool);
    ...
}

solidity编译器不会在乎这一点,但是,web3jToken所生成的二进制文件将是空白的。

我的ENS查询失败了

你确定你正在连接到正确的网络来执行查找吗?

如果web3j告诉你该节点不同步,则可能需要更改ENS解析器中的同步阈值syncThreshold。

以太坊常见问题集

可以参考以太坊常见问题和错误。

web3j项目捐赠地址

当然,你可以捐献比特币Bitcoin或以太币Ether来帮助web3j开发基金。

以太币:0x2dfBf35bb7c3c0A466A6C48BEBf3eF7576d3C420 比特币:1DfUeRWUy4VjekPmmZUNqCjcJBMwsyp61G

我在哪里可以获得Web3J的商业支持?

商业支持可从blk.io获得。

合作伙伴