android - 智能合约包装器的交易哈希和超时异常

标签 android blockchain ethereum smartcontracts

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

现在,合约创建可能需要一些时间(希望获得关于我们应该在 Ropsten 测试网上将 Gas Prices 设置多高的提示)。我们使用这种方法:

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

现在就是这种方法,可能需要很长时间。在 Android 中这是一个问题。而且我们似乎只能在完成后才能访问合约地址。 (嗯,这是合乎逻辑的,契约(Contract)必须先被挖掘)我们想知道,如果我们能以某种方式事先得到交易哈希,所以在发生错误的情况下(该方法似乎在契约(Contract) 5 分钟后抛出异常,而不是已部署)我们至少有一点可以检查它的进度,并在部署后进一步检查它的地址。

最佳答案

生成的包装器类有意将客户端抽象出来,使其远离了解发送交易的一些复杂性,包括交易哈希、签署交易、编码数据等。如果你想访问它,你必须交互直接使用 TransactionManager。管理器公开了一个返回 EthSendTransaction

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

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

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

  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();

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

关于android - 智能合约包装器的交易哈希和超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633292/

相关文章:

android - Dagger + 改造动态 URL

android - 如何使用 viewpager 内容创建垂直嵌套的 ScrollView

blockchain - 一个流动性池可以有2个以上的代币吗

javascript - 在没有元掩码的情况下自动进行solidity传输

android - onDraw() - 我必须先清除 Canvas 吗?

android - 无法在 M 预览中从外部存储加载图像

java - OAN - Aion 质押池 - 将 blocksigner 放入 docker 容器中

node.js - 在node_modules中找不到bigchaindb驱动程序?

ethereum - 我可以通过另一个合约的构造函数将 eth 发送到合约吗?

ethereum - Solidity 文件中同一文件的多次导入