同步操作将从 Gitee 极速下载/web3j 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
web3j is a lightweight, highly modular, reactive, type safe Java and Android library for working with Smart Contracts and integrating with clients (nodes) on the Ethereum network:
This allows you to work with the Ethereum blockchain, without the additional overhead of having to write your own integration code for the platform.
The Java and the Blockchain talk provides an overview of blockchain, Ethereum and web3j.
It has five runtime dependencies:
It also uses JavaPoet for generating smart contract wrappers.
Full project documentation is available at docs.web3j.io.
You can help fund the development of web3j by donating to the following wallet addresses:
Ethereum | 0x2dfBf35bb7c3c0A466A6C48BEBf3eF7576d3C420 |
Bitcoin | 1DfUeRWUy4VjekPmmZUNqCjcJBMwsyp61G |
Commercial support and training is available from blk.io.
A web3j sample project is available that demonstrates a number of core features of Ethereum with web3j, including:
Typically your application should depend on release versions of web3j, but you may also use snapshot dependencies for early access to features and fixes, refer to the Snapshot Dependencies section.
Java 8:
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.5.0</version>
</dependency>
Android:
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.3.1-android</version>
</dependency>
Java 8:
compile ('org.web3j:core:3.5.0')
Android:
compile ('org.web3j:core:3.3.1-android')
Start up an Ethereum client if you don't already have one running, such as Geth:
$ geth --rpcapi personal,db,eth,net,web3 --rpc --testnet
Or Parity:
$ parity --chain testnet
Or use Infura, which provides free clients running in the cloud:
Web3j web3 = Web3j.build(new HttpService("https://ropsten.infura.io/your-token"));
For further information refer to Using Infura with web3j
Instructions on obtaining Ether to transact on the network can be found in the testnet section of the docs.
To send synchronous requests:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
To send asynchronous requests using a CompletableFuture (Future on Android):
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
To use an RxJava Observable:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
web3.web3ClientVersion().observable().subscribe(x -> {
String clientVersion = x.getWeb3ClientVersion();
...
});
Note: for Android use:
Web3j web3 = Web3jFactory.build(new HttpService()); // defaults to http://localhost:8545/
...
web3j also supports fast inter-process communication (IPC) via file sockets to clients running on the same host as web3j. To connect simply use the relevant IpcService implementation instead of HttpService when you create your service:
// OS X/Linux/Unix:
Web3j web3 = Web3j.build(new UnixIpcService("/path/to/socketfile"));
...
// Windows
Web3j web3 = Web3j.build(new WindowsIpcService("/path/to/namedpipefile"));
...
Note: IPC is not currently available on web3j-android.
web3j can auto-generate smart contract wrapper code to deploy and interact with smart contracts without leaving the JVM.
To generate the wrapper code, compile your smart contract:
$ solc <contract>.sol --bin --abi --optimize -o <output-dir>/
Then generate the wrapper code using web3j's Command line tools:
web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name
Now you can create and deploy your smart contract:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile");
YourSmartContract contract = YourSmartContract.deploy(
<web3j>, <credentials>,
GAS_PRICE, GAS_LIMIT,
<param1>, ..., <paramN>).send(); // constructor params
Alternatively, if you use Truffle, you can make use of its .json output files:
# Inside your Truffle project
$ truffle compile
$ truffle deploy
Then generate the wrapper code using web3j's Command line tools:
$ cd /path/to/your/web3j/java/project
$ web3j truffle generate /path/to/<truffle-smart-contract-output>.json -o /path/to/src/main/java -p com.your.organisation.name
Whether using Truffle or solc directly, either way you get a ready-to-use Java wrapper for your contract.
So, to use an existing contract:
YourSmartContract contract = YourSmartContract.load(
"0x<address>|<ensName>", <web3j>, <credentials>, GAS_PRICE, GAS_LIMIT);
To transact with a smart contract:
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
To call a smart contract:
Type result = contract.someMethod(<param1>, ...).send();
To fine control your gas price:
contract.setGasProvider(new DefaultGasProvider() {
...
});
For more information refer to Smart Contracts.
web3j functional-reactive nature makes it really simple to setup observers that notify subscribers of events taking place on the blockchain.
To receive all new blocks as they are added to the blockchain:
Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
...
});
To receive all new transactions as they are added to the blockchain:
Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
...
});
To receive all pending transactions as they are submitted to the network (i.e. before they have been grouped into a block together):
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
...
});
Or, if you'd rather replay all blocks to the most current, and be notified of new subsequent blocks being created:
There are a number of other transaction and block replay Observables described in the docs.
Topic filters are also supported:
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
DefaultBlockParameterName.LATEST, <contract-address>)
.addSingleTopic(...)|.addOptionalTopics(..., ...)|...;
web3j.ethLogObservable(filter).subscribe(log -> {
...
});
Subscriptions should always be cancelled when no longer required:
subscription.unsubscribe();
Note: filters are not supported on Infura.
For further information refer to Filters and Events and the Web3jRx interface.
web3j provides support for both working with Ethereum wallet files (recommended) and Ethereum client admin commands for sending transactions.
To send Ether to another party using your Ethereum wallet file:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile");
TransactionReceipt transactionReceipt = Transfer.sendFunds(
web3, credentials, "0x<address>|<ensName>",
BigDecimal.valueOf(1.0), Convert.Unit.ETHER)
.send();
Or if you wish to create your own custom transaction:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/
Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile");
// get the next available nonce
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
address, DefaultBlockParameterName.LATEST).sendAsync().get();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
// create our transaction
RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
nonce, <gas price>, <gas limit>, <toAddress>, <value>);
// sign & send our transaction
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Hex.toHexString(signedMessage);
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
// ...
Although it's far simpler using web3j's Transfer for transacting with Ether.
Using an Ethereum client's admin commands (make sure you have your wallet in the client's keystore):
Admin web3j = Admin.build(new HttpService()); // defaults to http://localhost:8545/
PersonalUnlockAccount personalUnlockAccount = web3j.personalUnlockAccount("0x000...", "a password").sendAsync().get();
if (personalUnlockAccount.accountUnlocked()) {
// send a transaction
}
If you want to make use of Parity's Personal or Trace, or Geth's Personal client APIs, you can use the org.web3j:parity and org.web3j:geth modules respectively.
A web3j fat jar is distributed with each release providing command line tools. The command line tools allow you to use some of the functionality of web3j from the command line:
Please refer to the documentation for further information.
In the Java 8 build:
In both the Java 8 and Android builds:
You can run the integration test class CoreIT to verify clients.
For a .NET implementation, check out Nethereum.
For a pure Java implementation of the Ethereum client, check out EthereumJ and Ethereum Harmony.
Please submit a pull request if you wish to include your project on the list:
Please submit a pull request if you wish to include your company on the list:
web3j includes integration tests for running against a live Ethereum client. If you do not have a client running, you can exclude their execution as per the below instructions.
To run a full build (excluding integration tests):
$ ./gradlew check
To run the integration tests:
$ ./gradlew -Pintegration-tests=true :integration-tests:test
Snapshot versions of web3j follow the <major>.<minor>.<build>-SNAPSHOT
convention, for example: 3.6.0-SNAPSHOT.
https://oss.sonatype.org/content/repositories/snapshots
Please refer to the maven or gradle documentation for further detail.
Sample gradle configuration:
repositories {
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
Sample maven configuration:
<repositories>
<repository>
<id>sonatype-snasphots</id>
<name>Sonatype snapshots repo</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。