web3j常见问题解决方案

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

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

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

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

1
2
3
4
5
6
7
8
9
10
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
}

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

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

查看提交是否正在等待挖掘开采的最简单的方法是用Etherscan并使用https://testnet.etherscan.io/address/0x…搜索发送的交易的地。如果提交是成功的,在执行提交操作的几秒钟内应该在Etherscan就可以看到。然后就等着开采了。

如果没有任何迹象,交易就消失了。那么对不起,可能的原因是由于交易的随机数问题,以太币要么没有被设置,要么太低。有关更多信息,请参阅交易处理部分

我想了解JSON-RPC请求和响应的详细信息。

web3j使用SLF4J日志记录,可以轻松地与你的日志框架集成。一种轻量级的方法是使用LOGBack在集成测试模块中已经配置。

包括integration-tests/build.gradle 中列出的回退依赖项,以及integration-tests/src/test/resources/logback-test.xml的相关日志配置。

注意:如果你正在为应用程序(而不是测试)配置日志记录,则需要确保日志依赖关系被配置为编译依赖项,并且配置文件被命名并位于src/main/resources/logback.xml中。

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

请参考以太坊测试链testnets

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
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中定义了一个接口,但其中一个方法的实现与原始接口定义不匹配,则生成的二进制文件将是空白的。

在下面的例子中:

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

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

1
2
3
4
5
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获得。

以太坊常见问题集

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

  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j开发详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创翻译,转载请标明出处。这里是原文