web3j处理交易请求时出错:资金不足的天然气*价格+价值

时间:2018-07-21 12:10:36

标签: smartcontracts go-ethereum web3-java

遵循本教程 https://github.com/web3j/web3j

启动geth客户端作为专用网络。 这是合同代码

pragma solidity ^0.4.10;

contract Counter {
    uint256 counter =0;

    function increase() public {
        counter++;
    }

    function  decrease() public{
        counter--;
    }

    function getCounter() public constant  returns (uint256) {
        return counter;
    }
}

编译合同并生成合同的包装器代码。 生成了Counter.sol的Java代码,然后我尝试部署合同

Web3j web3 = Web3j.build(new org.web3j.protocol.http.HttpService("http://localhost:8080"));
            Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();

Counter contract = Counter.deploy(web3, credentials,Counter.GAS_PRICE;,Counter.GAS_LIMIT).send();  // constructor params
            System.out.println("before increase counter "+contract.getCounter());
            contract.increase();
            System.out.println("after increase counter "+contract.getCounter());
            contract.decrease();
            System.out.println("after decrease counter "+contract.getCounter());

获取异常

ontract gas limit 4300000
[info] counter gas price 22000000000
[error] java.lang.RuntimeException: java.lang.RuntimeException: Error processing transaction request: insufficient funds for gas * price + value
[error]     at org.web3j.tx.Contract.deploy(Contract.java:350)
[error]     at org.web3j.tx.Contract.lambda$deployRemoteCall$5(Contract.java:384)
[error]     at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30)
[error]     at models.smartcontract.FirstContractJava.main(FirstContractJava.java:33)
[error] Caused by: java.lang.RuntimeException: Error processing transaction request: insufficient funds for gas * price + value
[error]     at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:67)
[error]     at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:51)
[error]     at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:87)
[error]     at org.web3j.tx.Contract.executeTransaction(Contract.java:275)
[error]     at org.web3j.tx.Contract.create(Contract.java:317)
[error]     at org.web3j.tx.Contract.deploy(Contract.java:346)
[error]     ... 3 more

然后,我使用以太坊钱包部署了该合同,因为它为我们估算了汽油限额和汽油价格。 估计

gas price 86440
gas limit 186440

所以我更改了这样的代码

BigInteger gp = BigInteger.valueOf(86440);
            BigInteger gl = BigInteger.valueOf(186440);
            Counter contract = Counter.deploy(web3, credentials,gp,gl).send();  // constructor params

但是例外保持不变。 请指导我如何解决此例外情况,以及如何估算合同的汽油价格和汽油限额。

1 个答案:

答案 0 :(得分:0)

Web3j没有提供非常好的默认汽油价格/限制值。我相信无论您订立的合同或尝试采取的措施,它们都是硬编码的。话虽如此,如果您的帐户中有足够的以太币,那么(大多数情况下)它们的默认值应该可以。

汽油价格

天然气价格根据网络上有多少活动而波动。您支付的金额越多,交易的可能性就越大(并且速度越快)。天然气价格以Gwei(1 Gwei = 1000000000 Wei)计量。您可以在https://ethgasstation.info/的MainNet中看到最近的天然气价格。通常,您会看到大多数交易支付1到10 Gwei。对于优先级较高的交易(通常是硬币/醚转移,因为这些交易不会消耗大量天然气),您可能会看到天然气价格为100甚至1000 Gwei。如果您正在运行专用网络,则可以使用任何您想要的天然气价格(甚至为0),但是您必须设置矿工以低价接受工作。例如,使用geth,您可以使用--gasprice选项设置最低汽油价格。

MINER OPTIONS:
  --mine                    Enable mining
  --minerthreads value      Number of CPU threads to use for mining (default: 8)
  --etherbase value         Public address for block mining rewards (default = first account created) (default: "0")
  --targetgaslimit value    Target gas limit sets the artificial target gas floor for the blocks to mine (default: 4712388)
  --gasprice "18000000000"  --> Minimal gas price to accept for mining a transactions <--
  --extradata value         Block extra data set by the miner (default = client version)

在您的情况下,默认的22 Gwei是可以的,但是您可以将其降低到1-5。但是,当您通过以太坊钱包进行部署时,86440 Wei 几乎肯定无法正常工作。

气体限制

Web3j仅使用旧的默认块气限制作为其默认值。随着时间的推移,它发生了变化,目前约为800万。 Ropsten是固定的,约为470万。 Web3j的默认值为430万,只是为了确保您在测试环境中不会遇到块大小限制。但是,如果您开始以22 Gwei的价格指定430万天然气的交易,则帐户中必须有〜0.1以太币。您应该能够将气体限制降低到200,000(基于来自部署的调试输出,但是您需要发布合同代码进行确认)。

余额

最后,确保您的帐户中有以太币!在web3.eth.getBalance()控制台中运行一个简单的geth,以确认余额。您可以在genesis.json

中在专用网络中初始化帐户余额。
{
   ...
   "alloc": {
     "<ACCT_ID>": {
       "balance": "30000000000000000000000000000"
     }
   } 
}