首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TransactionException:在web3j中部署契约时无法解除无效十六进制字符串的封送

TransactionException:在web3j中部署契约时无法解除无效十六进制字符串的封送
EN

Ethereum用户
提问于 2021-03-02 15:08:09
回答 2查看 366关注 0票数 1

我有一个java服务器,它使用以geth为提供者的web3j库。当我试图在我的私人测试网络上部署我的合同时。我发现了一个错误:

代码语言:javascript
复制
org.web3j.protocol.exceptions.TransactionException: Transaction 0x70fed47c9d291f0818ff239be085b2dc3a87f436f56b9c0b6750e568a24dbdf1 has failed with status: 0x0. Gas used: 6721975. Revert reason: 'invalid argument 0: json: cannot unmarshal invalid hex string into Go struct field CallArgs.data of type hexutil.Bytes'.
    at org.web3j.tx.Contract.executeTransaction(Contract.java:377)
    at org.web3j.tx.Contract.create(Contract.java:422)
    at org.web3j.tx.Contract.deploy(Contract.java:456)
    at org.web3j.tx.Contract.deploy(Contract.java:506)
    at org.web3j.tx.Contract.lambda$deployRemoteCall$5(Contract.java:549)
    at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:42)
    at java_ethereum.ContractController.deployContract(ContractController.java:41)

我的java代码如下所示:

代码语言:javascript
复制
Web3j web3 = Web3j.build(new HttpService("http://localhost:8545"));
Credentials credentials = WalletUtils.loadCredentials("", "path/to/geth/keystore");
String contractAddress = deployContract(web3, credentials);
MyContract myContract = loadContract(contractAddress, web3, credentials);
@SuppressWarnings("deprecation")
    private String deployContract(Web3j web3, Credentials credentials) throws Exception{
        return myContract.deploy(web3, credentials, GAS_PRICE, GAS_LIMIT).send().getContractAddress();
    }

我的web3j应该是最新版本(4.8.4),我不确定我是否遗漏了什么。契约的内容应该无关紧要(我认为),因为即使在尝试部署空白合同时,也会出现相同的错误。我怀疑从geth创建的凭据存在一些问题。任何帮助都将不胜感激。

初始化geth节点的命令:

代码语言:javascript
复制
geth  --identity "TestNode" --rpc -rpcaddr "0.0.0.0"  --rpcport "8545" --port "30303" --nodiscover  --rpcapi "db,eth,net,web3,miner,net,personal,net,txpool,debug,admin"  --networkid 1900    --datadir C:/Users/Documents/Test --allow-insecure-unlock  --ipcdisable   --dev --dev.period 1

@Majd建议在ganache上测试它,这次它返回不同的错误:

代码语言:javascript
复制
java.lang.RuntimeException: java.lang.RuntimeException: Error processing transaction request: VM Exception while processing transaction: invalid opcode
    at org.web3j.tx.Contract.deploy(Contract.java:460)
    at org.web3j.tx.Contract.deploy(Contract.java:506)
    at org.web3j.tx.Contract.lambda$deployRemoteCall$5(Contract.java:549)
    at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:42)
    at ContractController.deployContract(ContractController.java:52)
Caused by: java.lang.RuntimeException: Error processing transaction request: VM Exception while processing transaction: invalid opcode
    at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:162)
    at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:81)
    at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:127)
    at org.web3j.tx.Contract.executeTransaction(Contract.java:367)
    at org.web3j.tx.Contract.create(Contract.java:422)
    at org.web3j.tx.Contract.deploy(Contract.java:456)
    ... 11 more
EN

回答 2

Ethereum用户

回答已采纳

发布于 2021-03-07 14:07:50

好吧,我知道发生了什么。

提到这篇文章Web3j用加纳赫获取堆栈下溢误差,结果发现Web3j CLI不接受并正确处理从Remix生成的任何二进制文件(不知道原因,但肯定是一个bug)。

因此,我将IDE转换为Buidl编译,现在它在ganache和geth上都能很好地工作。

票数 0
EN

Ethereum用户

发布于 2021-04-02 10:29:27

作为另一种方式。如果您有智能契约,则可以实际使用Web3j-gradle-插件在执行过程中编译契约并进行部署(而无需手动复制生成的java包装器)。

要做到这一点,只需使用以下方法将插件应用于项目:

代码语言:javascript
复制
plugins {
  id "org.web3j" version "4.8.4"
}

如果你在使用gradle。如果没有,还可以为maven项目指定它。

然后,将智能契约放在src/main/solidity文件夹下,它将被自动拾取、编译并生成java包装器,并且还可以直接从代码中使用。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/94123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档