美文网首页
【思前享后web3j】web3j开始

【思前享后web3j】web3j开始

作者: Share猿 | 来源:发表于2018-03-27 17:37 被阅读3979次

    小猿“思前享后”为大家分享优质内容!————Share猿

    Hi大家好:
      我是Share猿,Share是英文(SHARE),猿是猿猴的猿,在微信公众号、微博、简书、掘金、今日头条、CSDN都可以通过搜索“Share猿”找到我,我等你哦!小猿 “思前享后”为大家分享优质的内容!今天小猿为大家分享:开始

    web3j.png

      大家可以用最新的web3j构建项目。

    2.1Maven(java8)

    <dependency>
      <groupId>org.web3j</groupId>
      <artifactId>core</artifactId>
      <version>3.3.1</version>
    </dependency>
    

    2.2.Gradle(java8)

    java

    compile ('org.web3j:core:3.3.1')
    

    Android

    compile ('org.web3j:core:3.3.1-android')
    

    2.3.开始一个客户端

      如果你还没有运行一个Ethereum客户端,比如Geth可以如下运行:

    $ geth --rpcapi personal,db,eth,net,web3 --rpc --rinkeby
    

      Parity(钱包)

    $ parity --chain testnet
    

      或者用Infura,他提供了免费的客户端

    Web3j web3 = Web3j.build(new HttpService("https://morden.infura.io/your-token"));
    
    

      想进一步学习web3j和Infura,可以到运用他们的章节去查看。

    2.4.发送请求

      发送一个同步请求

    Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
    Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
    String clientVersion = web3ClientVersion.getWeb3ClientVersion();
    

      发送一个异步请求给Android

    Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
    Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get();
    String clientVersion = web3ClientVersion.getWeb3ClientVersion();
    

      用于RxJava Observable

    Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
    web3.web3ClientVersion().observable().subscribe(x -> {
        String clientVersion = x.getWeb3ClientVersion();
        ...
    });
    

      Android的运用

    Web3j web3 = Web3jFactory.build(new HttpService());  // defaults to http://localhost:8545/
    

    2.5.IPC

    web3j还支持通过文件套接字的快速进程间通信(IPC),与web3j运行在同一主机上的客户端。在创建服务时,只需使用相关的IpcService实现而不是HttpService:

    // OS X/Linux/Unix:
    Web3j web3 = Web3j.build(new UnixIpcService("/path/to/socketfile"));
    ...
    
    // Windows
    Web3j web3 = Web3j.build(new WindowsIpcService("/path/to/namedpipefile"));
    ...
    

    注意:IPC 不能应用在web3j-android.

    2.6.基于java包装的智能合约的运用

    在JVM中web3j可以自动生成智能合约,部署运行智能合约。
    常用生成智能合约的相关代码:

    $ solc <contract>.sol --bin --abi --optimize -o <output-dir>/
    

    运用web3j命令行工具生成智能合约代码:

    web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name
    

    用java代码实现智能合约

    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
    

    或者你可以用一个构造好的方法去实现智能合约:

    YourSmartContract contract = YourSmartContract.load(
            "0x<address>|<ensName>", <web3j>, <credentials>, GAS_PRICE, GAS_LIMIT);
    

    用一个智能合约去进行交易

    TransactionReceipt transactionReceipt = contract.someMethod(
                 <param1>,
                 ...).send();
    

    去访问一个智能合约

    Type result = contract.someMethod(<param1>, ...).send();
    

      更多的智能合约请参考Solidity的智能合约编写方法。

    2.7.过滤器

      web3j让大家在区块链上进行开发变的更加简单。
    把一个新的区块添加到区块链中:

    Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
        ...
    });
    

    把收到的所有交易添加到区块链中

    Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
        ...
    });
    

    接受一些待确认的交易记录

    Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
        ...
    });
    

    或者你已经收到了所有的区块链信息,同时又有新的区块被创建:

    Subscription subscription = catchUpToLatestAndSubscribeToNewBlocksObservable(
            <startBlockNumber>, <fullTxObjects>)
            .subscribe(block -> {
                ...
    });
    

      区块链和确认交易中还有好多过滤器和方法。
      主流的一些过滤器也被支持

    EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
            DefaultBlockParameterName.LATEST, <contract-address>)
                 .addSingleTopic(...)|.addOptionalTopics(..., ...)|...;
    web3j.ethLogObservable(filter).subscribe(log -> {
        ...
    });
    

    服务即是不用也要一直可以开着

    subscription.unsubscribe();
    

    注意:在Infura中不支持过滤器。

    2.8.交易

      web3j可以为以太坊钱包和以太坊客户端交易提供服务。
    发送以太坊给另一个账号通过你的以太坊钱包秘钥

    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();
    

    创建自定义的交易

    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).send();
    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 = Numeric.toHexString(signedMessage);
    EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
    // ...
    

      如此,基于web3j进行以太坊的交易和转移很简单!
    用管理员身份运行以太坊命令行(确保你有你钱包的秘钥)

    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
    }
    

      如果你想运用Parity的命令行、Trace、Geth命令行的API,你可以用 org.web3j:parity 和org.web3j:geth modules respectively.

    2.9.命令行工具

      在每个web3j的jar中都有命令行工具,命令行工具允许你通过一些简单的命令去操作web3j相关功能。

    • 钱包的创建
    • 钱包密码管理
    • 交易
    • 一般的Solidity智能合约

    2.10.更多详情

    在java 8中构建:

    • web3j提供安全的响应类型,它的类型在java 8有都有封装。
    • 异步请求被封装到了java8的CompletableFutures。web3j提供了一个异步的封装类,所有的异常都能被及时的捕获到,因为CompletableFutures对一些异常缺乏支持,经常会造成捕捉不到异常。

    java8和Android的构建:

    • 高负载的情况下返回BigInteger,对于简单的返回可以通过Response.getResual()获得String。
    • 还可以通过包容的响应参数包括原始JSON有效负载,在HttpService和IpcService类中出现。

    →→→目录阅读(小猿英语没过四级,翻译的过程中难免会有好多翻译不到位的地方,如果有错请在评论区及时指正!谢谢!!)

    参考文章:
    【1】web3j文档·web3j
    【2】区块链编程一翻译篇<一>:web3j介绍·Lucien_Lang

    扫描以下公众号关注小猿↓↓↓↓↓↓↓↓

    image

    更多资讯请在简书、微博、今日头条、掘金、CSDN都可以通过搜索“Share猿”找到小猿哦!!!

    相关文章

      网友评论

          本文标题:【思前享后web3j】web3j开始

          本文链接:https://www.haomeiwen.com/subject/iyyscftx.html