遵循本教程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
但例外情况依然存在。请指导我如何解决这个例外,以及如何估计合同的天然气价格和天然气限额。
Web3j没有给出很好的默认天然气价格/限制值。我相信,无论你制定的合同或你试图采取的行动如何,它们都是硬编码的。也就是说,如果你的账户中有足够的以太币,它们的默认值应该是可以的(大多数时候(。
天然气价格
天然气价格的波动取决于网络上的活动量。你付的钱越多,你的交易就越有可能(也越快(被提取。天然气价格以圭为单位(1圭=1000000000韦(。你可以在MainNet上看到最近的天然气价格https://ethgasstation.info/.通常,你会看到大多数交易支付1-10圭。对于优先级较高的交易(通常是硬币/以太币转账,因为这些交易不会消耗大量天然气(,你可能会看到天然气价格为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。然而,当您通过以太坊钱包部署时,86440Wei几乎肯定不会起作用。
气体限值
Web3j只是使用一个旧的默认区块气体限制作为其默认值。随着时间的推移,它发生了变化,目前约为800万。Ropsten是固定的,大约有470万。Web3j默认为430万只是为了确保在测试环境中不会达到块大小限制。然而,如果您在22 Gwei开始指定430万天然气的交易,您的账户中必须有约0.1乙醚。您应该能够将气体限制降低到200000(基于部署的调试输出,但您需要发布合同代码进行确认(。
余额
最后,请确保您的帐户中有以太币!在geth
控制台中运行一个简单的web3.eth.getBalance()
来确认您的余额。您可以在genesis.json 中初始化您的专用网络中的帐户余额
{
...
"alloc": {
"<ACCT_ID>": {
"balance": "30000000000000000000000000000"
}
}
}