开发者社区> 问答> 正文

Web3j error:Intrinsic gas too low

我是一个以太坊区块链ethereum blockchain开发新手,我一直尝试执行智能合约使用MetaMask和Remix在Chrome浏览器上。

我现在正在尝试使用web3j开发并通过Java部署相同的以太坊智能合约。

但是当我尝试执行我的智能合约时,得到以下错误:error Intrinsic gas too low

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: Error processing transaction request: Intrinsic gas too low at java.util.concurrent.CompletableFuture.reportGet(Unknown Source) at java.util.concurrent.CompletableFuture.get(Unknown Source) at com.solartis.bc.Sample.main(Sample.java:44) Caused by: java.lang.RuntimeException: Error processing transaction request: Intrinsic gas too low at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:43) at org.web3j.tx.Contract.lambda$deployAsync$24(Contract.java:288)...

我已经通过几个方法来增加gas的值,但是不管我支付多大的值,我仍然会得到同样的错误。

有没有其他人面临同样的问题,我不知道问题在哪儿。下面附上更多细节:

ContractRunner.java

package com.solartis.bc;

public class ContractRunner {

public static void main(String args[]) throws InterruptedException, ExecutionException, IOException, CipherException, TransactionTimeoutException {
    Web3j web3 = Web3j.build(new HttpService("http://xxxxxxx.westus.cloudapp.azure.com:8545/"));  // defaults to http://localhost:8545/
    Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get();
    String clientVersion = web3ClientVersion.getWeb3ClientVersion();
    System.out.println(clientVersion);
    Credentials credentials = WalletUtils.loadCredentials("Mxxxxxxxxe", "C:\\Users\\adheep_m\\AppData\\Roaming\\Ethereum\\keystore\\UTC--2017-07-07T13-52-18.006069200Z--3b0d3fa08f0e0b3da8fe1f8ac0e05861bfdada25");
    System.out.println(credentials.getAddress());

    BigInteger GAS = new BigInteger("30000000");
    BigInteger GAS_PRICE = new BigInteger("20");
    BigInteger ETH = new BigInteger("1");
    //LeisureTravelPolicyHolder contract = LeisureTravelPolicyHolder.deploy(web3,credentials,GAS,GAS_PRICE,ETH,test,test,test,test,test,test,test,test,test).get();

    Token con = Token.deploy(web3,credentials,GAS,GAS_PRICE,ETH).get();
    System.out.println(con.getContractAddress());
}

}

Token.sol:

pragma solidity ^0.4.0;

contract Token { mapping (address => uint) public balances;

function Token() { balances[msg.sender] = 1000000; }

function transfer(address _to, uint _amount) { if (balances[msg.sender] < _amount) { throw; }

 balances[msg.sender] -= _amount;
 balances[_to] += _amount;

} }

Token.java:

package com.solartis.bc;

import java.math.BigInteger; import java.util.Arrays; import java.util.Collections; import java.util.concurrent.Future; import org.web3j.abi.TypeReference; import org.web3j.abi.datatypes.Address; import org.web3j.abi.datatypes.Function; import org.web3j.abi.datatypes.Type; import org.web3j.abi.datatypes.generated.Uint256; import org.web3j.crypto.Credentials; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.tx.Contract; import org.web3j.tx.TransactionManager;

/** * Auto generated code.
* Do not modify!
* Please use {@link org.web3j.codegen.SolidityFunctionWrapperGenerator} to update. * *

Generated with web3j version 2.2.1. */ public final class Token extends Contract { private static final String BINARY = "6060604052341561000f57600080fd5b5b600160a060020a0333166000908152602081905260409020620f424090555b5b6101678061003f6000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166327e235e38114610048578063a9059cbb14610086575b600080fd5b341561005357600080fd5b61007473ffffffffffffffffffffffffffffffffffffffff600435166100b7565b60405190815260200160405180910390f35b341561009157600080fd5b6100b573ffffffffffffffffffffffffffffffffffffffff600435166024356100c9565b005b60006020819052908152604090205481565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040902054819010156100fc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff338116600090815260208190526040808220805485900390559184168152208054820190555b50505600a165627a7a7230582081fd33c821a86127abf00c9fafe2e14e4db6279ab9dd788e3ad3597d2280b6cf0029";

private Token(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
    super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
}

private Token(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
    super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
}

public Future<Uint256> balances(Address param0) {
    Function function = new Function("balances", 
            Arrays.<Type>asList(param0), 
            Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
    return executeCallSingleValueReturnAsync(function);
}

public Future<TransactionReceipt> transfer(Address _to, Uint256 _amount) {
    Function function = new Function("transfer", Arrays.<Type>asList(_to, _amount), Collections.<TypeReference<?>>emptyList());
    return executeTransactionAsync(function);
}

public static Future<Token> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue) {
    return deployAsync(Token.class, web3j, credentials, gasPrice, gasLimit, BINARY, "", initialWeiValue);
}

public static Future<Token> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue) {
    return deployAsync(Token.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "", initialWeiValue);
}

public static Token load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
    return new Token(contractAddress, web3j, credentials, gasPrice, gasLimit);
}

public static Token load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
    return new Token(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
}

}

展开
收起
景凌凯 2020-03-18 18:58:20 1732 0
1 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!

    问题出现在GAS_PRICE和GAS_LIMIT不合适。Web3j有默认的GAS_PRICE和GAS_LIMIT。以下是更新后的代码:

        BigInteger GAS = Contract.GAS_LIMIT;
        BigInteger GAS_PRICE = Contract.GAS_PRICE;
    

    Contract.GAS_LIMIT和Contract.GAS_PRICE被启用了,因此,使用下面的常数org.web3j.tx.gas.DefaultGasProvider来代替:

    DefaultGasProvider.GAS_PRICE;
    DefaultGasProvider.GAS_LIMIT;
    
    2020-03-18 18:58:31
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Web应用系统性能优化 立即下载
高性能Web架构之缓存体系 立即下载
PWA:移动Web的现在与未来 立即下载