2

按照本教程 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;
    }
}

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

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 限制和 gas 价格。它估计

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

但例外仍然相同。请指导我如何解决此异常以及如何估算合同的汽油价格和汽油限制。

4

1 回答 1

2

Web3j 没有给出很好的默认 gas 价格/限制值。我相信无论您开发的合同或您尝试采取的行动如何,它们都是硬编码的。话虽如此,如果您的帐户中有足够的以太币,它们的默认值应该没问题(大多数情况下)。

天然气价格

天然气价格会根据网络上的活动量而波动。您支付的越多,您的交易就越有可能(也就越快)被提走。天然气价格以 Gwei 为单位(1 Gwei = 1000000000 Wei)。您可以在https://ethgasstation.info/上查看 MainNet 中最近的天然气价格。通常,您会看到大多数交易支付 1-10 Gwei。对于更高优先级的交易(通常是硬币/以太币转账,因为这些交易不会消耗大量的 gas),您可能会看到 gas 价格为 100 甚至 1000 Gwei。如果你在运行一个私有网络,你可以使用你想要的任何 gas 价格(甚至是 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 以太币。您应该能够将 gas 限制降低到 200,000(基于部署的调试输出,但您需要发布合约代码以确认)。

平衡

最后,确保您的帐户中有以太币!web3.eth.getBalance()在您的geth控制台中运行一个简单的程序来确认您的余额。您可以在 genesis.json 中初始化您的私人网络中的帐户余额

{
   ...
   "alloc": {
     "<ACCT_ID>": {
       "balance": "30000000000000000000000000000"
     }
   } 
}
于 2018-07-22T00:47:52.497 回答