【思前享后web3j】web3j开始

小猿“思前享后”为大家分享优质内容!————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猿”找到小猿哦!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 爷爷家养了两只可爱的小花猫。一只是花色的,另一只是黄色带斑纹,好像小老虎一样。 我每天放学都路过爷...
    五三胡连海阅读 400评论 0 0
  • 一、7条人生守则:采用对标的方法 1、早睡早起:晚十早五,午休5-15分钟。 2、真诚反思:日反思,周检视,月总结...
    员子圆梦阅读 231评论 0 0
  • 楔子 “下面播报一条简讯:2016年12月24日,北京某高校张某,因男友出轨而跳楼自杀……” 赵博一遍又一遍重复循...
    夜语2017阅读 371评论 0 1