【问题标题】:How to speed-up Geth transactions in private blockchain?如何加速私有区块链中的 Geth 交易?
【发布时间】:2017-11-08 19:37:55
【问题描述】:

我正在使用web3jGeth 测试以太坊智能合约。 Geth 正在运行这样的脚本:

PASSFILE=/var/folders/_l/kl9pdj2x50v7416j8htb6w740000gn/T/pwd6597172766860806720.tmp
DATADIR=/var/folders/_l/kl9pdj2x50v7416j8htb6w740000gn/T/geth808290308908087582
IPCPATH=/var/folders/_l/kl9pdj2x50v7416j8htb6w740000gn/T/geth808290308908087582/geth.ipc

geth --datadir $DATADIR account new --password $PASSFILE
geth --datadir $DATADIR \
    --ipcpath $IPCPATH \
    --dev \
    --rpc \
    --mine \
    --networkid 1999

(路径在测试中生成)。

使用web3j-maven-plugin 生成智能合约包装器。

问题是每次send() 调用都需要几秒钟:

private TransactionReceipt deployFeature_() throws Exception {
    logger.info("Deploying feature ...");
    return contract.deployFeature(featureKey).send();
}

日志(您可以看到 1 笔交易耗时 16 秒):

166955 [main] INFO FeatureTest - Deploying feature ...
182006 [main] INFO FeatureTest - Checking feature is listed ...

Web3j 通过 IPC 连接:

web3 = Web3j.build(new UnixIpcService(ipcPath));

如何加快调用速度?如果使用TestRPC 进行测试,每次调用只需不到一秒!由于Geth--dev 开头,因此它会自行生成创世文件,因此我无法更改难度。我还可以看到块的开采速度非常快:

INFO [11-09|00:34:39] Commit new mining work                   number=9 txs=0 uncles=0 elapsed=2.000s
INFO [11-09|00:34:39] Successfully sealed new block            number=9 hash=b869ca…870644
INFO [11-09|00:34:39] ???? block reached canonical chain          number=4 hash=c758a0…a529af
INFO [11-09|00:34:39] ???? mined potential block                  number=9 hash=b869ca…870644
INFO [11-09|00:34:39] Commit new mining work                   number=10 txs=0 uncles=0 elapsed=84.12µs
INFO [11-09|00:34:40] Successfully sealed new block            number=10 hash=5e81a9…fc1364
INFO [11-09|00:34:40] ???? block reached canonical chain          number=5  hash=465c2b…78461a
INFO [11-09|00:34:40] ???? mined potential block                  number=10 hash=5e81a9…fc1364

由于某些原因,调用并不快。我能做什么?

【问题讨论】:

  • 尝试使用适当的缓存值启动geth --cache XXX。默认为 128MB
  • 我刚刚尝试过--fast --cache=1024,但每笔交易仍会持续约 15 秒,尽管每 1 秒会挖掘一次区块

标签: blockchain ethereum mining geth


【解决方案1】:

这是web3j 功能/问题,您可以更改此行为: https://github.com/web3j/web3j/issues/231

【讨论】:

    【解决方案2】:

    以下是如何更改合约中的 TransactionManager 的示例:

    // Using RawTransactionManager
    TransactionManager transactionManager = new org.web3j.tx.RawTransactionManager(web3j, <credentials>, 40, 500);
    
    // Or using ClientTransactionManager
    TransactionManager transactionManager = new org.web3j.tx.ClientTransactionManager(web3j, "0x<fromAddress>", 40, 500);
    
    // Now we'll poll every 500 ms for a transaction response
    YourContract contract = YourContract.deploy("0x<contracAddress>", web3j,
            transactionManager, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,
            <initialValue>, <constructorParam1>,...);
    

    这个例子来自here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 2021-01-15
      • 2018-08-12
      • 2018-08-25
      • 2021-10-08
      相关资源
      最近更新 更多