遵循本教程 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
但是例外保持不变。 请指导我如何解决此例外情况,以及如何估算合同的汽油价格和汽油限额。
答案 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"
}
}
}