我尝试为使用 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()是不同的。我对密码学没有经验,因此这可能是一个愚蠢的问题......但我会很感激这里的任何建议。
我需要为我的宠物项目测试以太坊。
我访问https://faucet.rinkeby.io/,在 MetaMask 中添加我的推文链接以及我的以太坊地址,然后选择3 Ethers / 8 hours。
请求已接受,但 17 小时过去了,我还没有收到测试以太币。
是我出了什么问题还是我必须再等一会儿?请解释一下,3 以太/8 小时到底意味着什么?
我正在使用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) 当在我的私人测试区块链中使用 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) 我刚刚开始使用 Web3j,但遇到了一些基本问题。
我已经成功地找到了如何获取 EthBlock 并检索其中的所有信息。我想查看区块中的交易列表,但我不知道如何查看。
我可以打电话
List<TransactionResult> transactions = ethBlock.getBlock().getTransactions();
Run Code Online (Sandbox Code Playgroud)
我应该能够浏览此列表并获取有关每笔交易的信息。但是我似乎对 TransactionResult 所能做的就是将它强制转换为非常无用的 TransactionHash。我想要的是一个可以从中提取大量信息的 TransactionObject。
如何获取真实的交易数据?
另一个注意事项:是否有任何理由为什么似乎没有任何 Web3j JavaDoc?
我使用 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) 我想将 erc20 代币从一个账户转移到另一个账户。我知道我可以使用智能合约包装类的transfer或transferFrom函数。但就我而言,erc20 代币交易需要在客户端进行签名。并且无法在智能合约包装函数中传递signedTransaction。那么,我如何签署erc20令牌交易并使用java中的web3j执行交易。
我发现了这个类似的问题。但是,它的代码不是用java编写的。我不知道如何在 ABI 中编码传递函数。 使用 web3 发送 ERC20 代币
提前致谢。
当尝试使用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生成的帐户?
我正在尝试将我的 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 进行签名。但是,我不确定如何进行验证部分。
我正在使用 web3j 查询以太坊区块链。现在我想检查交易是否被挖掘或刚刚发送到网络。我怎样才能做到这一点?
努力让任何东西在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) 我需要检查一笔交易是否是 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交易发出的,所以我在这里有点困惑。
web3-java ×12
ethereum ×9
java ×8
blockchain ×2
android ×1
bitcoinj ×1
cryptography ×1
erc20 ×1
erc721 ×1
go-ethereum ×1
maven ×1
metamask ×1
solidity ×1
transactions ×1
truffle ×1