智能合约包装的交易哈希和超时例外

时间:2018-04-03 15:02:12

标签: android blockchain ethereum smartcontracts

我们目前正在开发一款使用web3j及其功能的Android应用程序。我们使用从Smart Contract创建的Generated SmartContract Wrapper。

现在合同创建可能需要一些时间(希望了解我们应该在Ropsten Testnet上设置天然气价格的高度)。我们使用这种方法:

TestContract contract = TestContract.deploy(web3, credentials,
        GAS_PRICE, GAS_LIMIT, eth.toBigInteger(),
        stringToBytes32(conditions), eth.toBigInteger(), Addresses, Roles).send();  // constructor params

现在这个方法可能需要很长时间。在Android中这是一个问题。我们似乎只能在完成后访问合同地址。 (这是合乎逻辑的,合同必须首先开采)我们想知道,如果我们能够以某种方式预先得到交易哈希,那么在出现错误的情况下(该方法似乎在合同5分钟后抛出异常而不是已部署)我们至少有一个点,我们可以检查它的进度,并进一步部署后的地址。

1 个答案:

答案 0 :(得分:1)

生成的包装器类有目的地抽象客户端,而不是了解发送事务的一些复杂性,包括事务哈希,签署事务,编码数据等。如果要访问它,则必须进行交互直接使用TransactionManager。经理公开了一个返回sendTransaction

EthSendTransaction方法
public abstract EthSendTransaction sendTransaction(BigInteger gasPrice, BigInteger gasLimit, String toAddress, String data, BigInteger value) throws IOException;

从那里,您可以调用EthSendTransaction.getTransactionHash()来获取事务哈希值。

如果你唯一关心的是增加超时,那么事务的轮询/超时是通过TransactionReceiptProcessor内使用的TransactionManager控制的:

  public static final int DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH = 40;
  public static final long DEFAULT_POLLING_FREQUENCY = 15000L;

您可以通过传递自己的PollingTransactionReceiptProcessor实例而不是使用TransactionManager中创建的默认实例来覆盖此内容:

RawTransactionManager manager = new RawTransactionManager(web3, credentials, CHAIN_ID, 
        new PollingTransactionReceiptProcessor(web3, SLEEP_IN_MILLIS, MAX_POLL_ATTEMPTS));
TestContract contract = TestContract.deploy(web3, manager,
        GAS_PRICE, GAS_LIMIT, eth.toBigInteger(),
        stringToBytes32(conditions), eth.toBigInteger(), Addresses, Roles).send();

加快交易的挖掘时间将取决于区块链的负载。大多数时候,您在等待合理的时间(<5分钟)内查看10-20 GWei的汽油价格。即使这样,有时您将支付> 20 GWei,并且需要10分钟以上,或者您将花费5 GWei,它将在30秒内开采。这一切都取决于负载。您可以使用添加到区块链的新块的元数据来确定负载和平均汽油价格(如果您需要在代码中动态执行此操作),或者您只需查看https://ethgasstation.info/