标签: web3-java

仅使用公钥在 HD 钱包中生成以太坊地址 (bitcoinj/web3j)

我尝试为使用 bitcoinj 库实现的 HD 钱包密钥生成以太坊地址,但我感到困惑:

DeterministicSeed seed = new DeterministicSeed("some seed code here", null, "", 1409478661L);
DeterministicKeyChain chain = DeterministicKeyChain.builder().seed(seed).build();
DeterministicKey addrKey = chain.getKeyByPath(HDUtils.parsePath("M/44H/60H/0H/0/0"), true);
System.out.println("address from pub=" + Keys.getAddress(Sign.publicKeyFromPrivate(addrKey.getPrivKey())));
Run Code Online (Sandbox Code Playgroud)

此代码根据https://iancoleman.io/bip39/打印正确的以太坊地址。这里一切都很好。

但是,当我尝试避免使用私钥并使用公钥生成非强化密钥时,我只会得到不同的结果,即调用返回另一个结果:

System.out.println("address from pub=" + Keys.getAddress(addrKey.getPublicKeyAsHex()));
Run Code Online (Sandbox Code Playgroud)

看起来问题出在“不同的公钥”上,即Sign.publicKeyFromPrivate(addrKey.getPrivKey())和 的结果addrKey.getPublicKeyAsHex()是不同的。我对密码学没有经验,因此这可能是一个愚蠢的问题......但我会很感激这里的任何建议。

java cryptography bitcoinj ethereum web3-java

8
推荐指数
1
解决办法
2980
查看次数

Rinkeby 认证水龙头无法使用?

我需要为我的宠物项目测试以太坊。

我访问https://faucet.rinkeby.io/,在 MetaMask 中添加我的推文链接以及我的以太坊地址,然后选择3 Ethers / 8 hours在此输入图像描述

请求已接受,但 17 小时过去了,我还没有收到测试以太币。 在此输入图像描述 是我出了什么问题还是我必须再等一会儿?请解释一下,3 以太/8 小时到底意味着什么?

ethereum solidity web3-java

8
推荐指数
2
解决办法
2万
查看次数

Web3j:从智能合约获取最后事件

我正在使用org.web3j (4.8.4)Java 11。我在 Kovan 网络上部署了一份智能合约。我想订阅调用后发出的所有新事件subscribe(...)。我对之前发出的事件不感兴趣。这是我当前的代码:

public void subscribeToEvents() throws Exception {
    String wssUrl = "wss://kovan.infura.io/ws/v3/TOKEN";
    String contractAddress = "0x123...";
    
    // initialize web socket service
    WebSocketService wss = new WebSocketService(wssUrl, false);
    try {
        wss.connect();
    } catch (Exception e) {
        System.out.println("Error while connecting to WSS service: " + e);
        throw e;
    }

    // build web3j client
    Web3j web3j = Web3j.build(wss);

    // create filter for contract events
    EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contractAddress);

    // subscribe to …
Run Code Online (Sandbox Code Playgroud)

java ethereum smartcontracts web3-java

6
推荐指数
1
解决办法
3174
查看次数

Web3j Transfer.sendFunds() 返回错误“gas 资金不足 * 价格 + 价值”

当在我的私人测试区块链中使用 web3j 库进行区块链交易时,我当前遇到标题为响应错误:*gas 资金不足*价格+价值*

我想要转入一些以太币的账户余额为 10000 以太币。我注销的Gas价格的值为18000000000作为 BigInt (它是 WEI?),并且Gas 限制是 web3j 使用的默认值,值为21000

所以问题是为什么我的交易不起作用?例如我想转账 10 以太币:

TransactionReceipt transactionReceipt = Transfer.sendFunds(web3, credentials, toAccount, BigDecimal.valueOf(10.0), Convert.Unit.ETHER).send();
Run Code Online (Sandbox Code Playgroud)

更多细节

创世文件如下所示:

{
  "config": {
      "chainId": 9999,
      "homesteadBlock": 0,
      "eip155Block": 0,
      "eip158Block": 0,
      "byzantiumBlock": 0
   },
   "difficulty": "400",
   "gasLimit": "2100000",
   "alloc": {
      "0x9b6301bf2cfe11066dbd641f91a2b82e0783130e": { 
          "balance": "100000000000000000000000" 
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

代码如下所示:

// create new account 
Admin admin = Admin.build(new HttpService());
NewAccountIdentifier newAccount = admin.personalNewAccount("PASSWORD").send();

// get current created …
Run Code Online (Sandbox Code Playgroud)

java blockchain ethereum go-ethereum web3-java

5
推荐指数
1
解决办法
2434
查看次数

Web3j:如何获取以太坊交易信息(Java 而非 JS)

我刚刚开始使用 Web3j,但遇到了一些基本问题。

我已经成功地找到了如何获取 EthBlock 并检索其中的所有信息。我想查看区块中的交易列表,但我不知道如何查看。

我可以打电话

 List<TransactionResult> transactions = ethBlock.getBlock().getTransactions();
Run Code Online (Sandbox Code Playgroud)

我应该能够浏览此列表并获取有关每笔交易的信息。但是我似乎对 TransactionResult 所能做的就是将它强制转换为非常无用的 TransactionHash。我想要的是一个可以从中提取大量信息的 TransactionObject。

如何获取真实的交易数据?

另一个注意事项:是否有任何理由为什么似乎没有任何 Web3j JavaDoc?

java ethereum web3-java

5
推荐指数
1
解决办法
1806
查看次数

WEB3J Maven 插件出现问题,找不到 Solidity 编译器

我使用 web3j maven 插件自动生成智能合约 Java 代理。

但我有一个问题,找不到 Solidity 编译器版本。

[INFO]
[INFO] --- web3j-maven-plugin:4.8.2:generate-sources (default) @ web3j-client-lib ---
[INFO] Solidity: adding to process 'DZPayments.sol'
[INFO] Solidity: adding to process 'Migrations.sol'
[INFO] Solidity: adding to process 'Proxy.sol'
[INFO] Solidity: adding to process 'Storage.sol'
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  26.928 s
[INFO] Finished at: 2021-06-18T10:50:37+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to get solidity version from server
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?

我仅使用默认配置并将 SOL 文件复制到 src/main/resources

这是我的插件配置(最简单的!):

    <plugin>
        <groupId>org.web3j</groupId>
        <artifactId>web3j-maven-plugin</artifactId>
        <version>4.8.2</version>
        <configuration>
            <soliditySourceFiles/>
        </configuration> …
Run Code Online (Sandbox Code Playgroud)

java maven web3-java

5
推荐指数
1
解决办法
1997
查看次数

如何使用 web3j java 签署 erc20 令牌交易

我想将 erc20 代币从一个账户转移到另一个账户。我知道我可以使用智能合约包装类的transfer或transferFrom函数。但就我而言,erc20 代币交易需要在客户端进行签名。并且无法在智能合约包装函数中传递signedTransaction。那么,我如何签署erc20令牌交易并使用java中的web3j执行交易。

我发现了这个类似的问题。但是,它的代码不是用java编写的。我不知道如何在 ABI 中编码传递函数。 使用 web3 发送 ERC20 代币

提前致谢。

ethereum smartcontracts erc20 web3-java

4
推荐指数
1
解决办法
1903
查看次数

在web3j中使用ganache帐户

当尝试使用https://github.com/web3j/sample-project-gradle时遇到此代码:

    // We then need to load our Ethereum wallet file
    // FIXME: Generate a new wallet file using the web3j command line tools https://docs.web3j.io/command_line.html
    Credentials credentials =
            WalletUtils.loadCredentials(
                    "<password>",
                    "/path/to/<walletfile>");
    log.info("Credentials loaded");
Run Code Online (Sandbox Code Playgroud)

我想使用ganache-cli创建的网络.我成功连接到网络但我找不到钱包文件.有没有办法在这里使用ganache-cli生成的帐户?

blockchain ethereum truffle web3-java

3
推荐指数
1
解决办法
1451
查看次数

如何将 Metamask 连接到 Web3J (java)

我正在尝试将我的 Metamask 钱包连接到我的 Java Spring-Boot 后端。我试图遵循这里的例子。我能够自动生成随机数并毫无问题地接收钱包 ID。我正在尝试验证服务器上钱包中的签名随机数,以确保发件人确实是他们所说的人。但是,我无法在 Web3J 上找到任何文档来执行此操作。

web3j 不适合用于此目的吗?该示例展示了如何基于 javascript 在 NodeJS 上进行验证,但我没有找到任何关于如何在 Java 上执行此操作的示例。

我的理解是,公钥是钱包 ID 本身,而消息是由钱包私钥签名的随机数,由于明显的原因,该私钥不被共享。据此,我需要使用公钥“解密”消息,并查看解密的消息是否与后端发送到 Metamask 进行签名的随机数相同。它是否正确?

这是我创建随机数并将其发送到 UI 的代码:

public User findUserByPublicAddress(String publicWalletId) {
    User u = userRepository.findByPublicWalletId(publicWalletId);
    if(u == null) {
        u = new User("", "", "", null, publicWalletId, "");
        String nonce = StringUtil.generateRandomAlphaNumericString();
        u.setNonce(nonce);
        userRepository.saveAndFlush(u);
    }
    return u;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我查看用户是否已经在我的系统中,如果不是,那么我只需创建一个临时用户,并生成一个随机数并将其保存在数据库中。该随机数被发送到 UI 以供 Metamask 进行签名。但是,我不确定如何进行验证部分。

java authentication metamask cryptocurrency web3-java

3
推荐指数
1
解决办法
3349
查看次数

Web3j如何获取交易状态

我正在使用 web3j 查询以太坊区块链。现在我想检查交易是否被挖掘或刚刚发送到网络。我怎样才能做到这一点?

transactions ethereum web3-java

2
推荐指数
1
解决办法
6971
查看次数

尝试与 web3j (Android) 取得平衡,出现空指针异常

努力让任何东西在android上的web3j中工作,尝试这个例子(我已经替换了token和addr),我使用的地址确实有一些rinkeby ETH。在手机上测试,当我加载此类/活动时,应用程序崩溃,代码位于 oncreate 方法中。在清单中打开互联网权限,并在构建 gradle 中编译 android web3j。

 Web3j web3 = Web3jFactory.build(new 
 HttpService("https://rinkeby.infura.io/token"));

    EthGetBalance ethGetBalance = null;
    try {
        ethGetBalance = web3
                .ethGetBalance("addr",DefaultBlockParameterName.LATEST)
                .sendAsync()
                .get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

    BigInteger wei = ethGetBalance.getBalance();
Run Code Online (Sandbox Code Playgroud)

错误

06-30 02:15:47.115 18904-18904/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test.user.test, PID: 18904
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.user.test/com.test.user.test.balance}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
    at android.app.ActivityThread.access$900(ActivityThread.java:174)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5756)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515) …
Run Code Online (Sandbox Code Playgroud)

java android web3-java

2
推荐指数
1
解决办法
2999
查看次数

如何使用web3j通过交易获取合约?

我需要检查一笔交易是否是 ERC721/ERC1155 交易,并获取接收地址、代币地址、价值等信息。如果我理解正确,我必须加载该交易的合约并检查它是否继承 ERC165,以便确认这是一笔ERC721/ERC1155交易。

问题:我不明白如何获得具有交易对象的合同。我还没有找到获取令牌地址的方法。

我在 Infura 上有一个以太坊节点,我从那里读取区块并迭代交易。我收到一笔交易及其收据。我的代码如下所示:

var tr = web3j.ethGetTransactionByBlockNumberAndIndex(blockIdParam, transactionIndex).sendAsync().get();
var hash = tr.getTransaction().get().getHash();
var receipt = web3.ethGetTransactionReceipt(hash).send().getTransactionReceipt();
Run Code Online (Sandbox Code Playgroud)

现在我正在努力阅读事务日志,检查它们的主题并验证它们是否包含Transfer事件。但是转账事件也是由ERC20交易发出的,所以我在这里有点困惑。

java ethereum web3-java erc721

1
推荐指数
1
解决办法
1699
查看次数