如何通過java打包以太坊智能合約

這篇文章主要講解了“如何通過java打包以太坊智能合約”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何通過java打包以太坊智能合約”吧!

成都創(chuàng)新互聯(lián)公司于2013年成立,公司以網(wǎng)站建設(shè)、成都做網(wǎng)站、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶上1000家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。

web3j簡介

web3j是一個輕量級、高度模塊化、響應(yīng)式、類型安全的Java和Android類庫提供豐富API,用于處理以太坊智能合約及與以太坊網(wǎng)絡(luò)上的客戶端(節(jié)點)進行集成。

可以通過它進行以太坊區(qū)塊鏈的開發(fā),而無需為你的應(yīng)用平臺編寫集成代碼。

可以快速啟動dmeo示例

想要快速啟動的話,有一個Web3j demo示例項目可用,演示了通過Web3j開發(fā)以太坊的許多核心特征,其中包括:

  • 連接到以太網(wǎng)網(wǎng)絡(luò)上的節(jié)點

  • 加載一個以太坊錢包文件

  • 將以太幣從一個地址發(fā)送到另一個地址

  • 向網(wǎng)絡(luò)部署智能合約

  • 從部署的智能合約中讀取值

  • 更新部署的智能合約中的值

  • 查看由智能合約記錄的事件

web3j開發(fā)入門

首先將最新版本的web3j安裝到項目中。

Maven

Java 8:

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

Android:

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

Gradle

Java 8:

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

Android:

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

啟動客戶端

需要啟動一個以太坊客戶端,當(dāng)然如果你已經(jīng)啟動了就不需要再次啟動。

如果是geth的話這么啟動:

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

如果是Parity啟動:

$ parity --chain testnet

如果使用Infura客戶端提供的免費的云端服務(wù),這么啟動:

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

如果想進一步的了解infura,請參閱Using Infura with web3j。

在網(wǎng)絡(luò)上如何獲得以太幣的相關(guān)文檔可以看這個:testnet section of the docs。

當(dāng)不需要Web3j實例時,需要調(diào)用shutdown方法來釋放它所使用的資源。

web3.shutdown()

發(fā)送請求

發(fā)送同步請求

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

** 使用CompletableFuture (Future on Android) 發(fā)送異步請求**

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/
...

IPC

Web3j還支持通過文件套接字快速運行進程間通信(IPC),支持客戶端在相同的主機上同時運行Web3j。在創(chuàng)建服務(wù)時,使用相關(guān)的IPCService就可以實現(xiàn)而不需要通過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中不可用。

通過java打包以太坊智能合約

Web3j可以自動打包智能合同代碼,以便在不脫離JVM的情況下進行以太坊智能合同部署和交互。

要打包代碼,需要先編譯智能合同:

$ 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

接下來就可以新建和部署智能合約了:

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

或者使用一個現(xiàn)有的智能合約:

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

然后就可以進行智能合約的交互了:

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

調(diào)用智能合約:

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

更多關(guān)于打包的資料可以看這里:Solidity smart contract wrappers

Filters

web3j的響應(yīng)式函數(shù)可以使觀察者通過事件去通知消息訂閱者變得很簡單,并能夠記錄在區(qū)塊鏈中。接收所有新的區(qū)塊并把它們添加到區(qū)塊鏈中:

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

接收所有新的交易并把它們添加到區(qū)塊鏈中:

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

接收所有已經(jīng)提交到網(wǎng)絡(luò)中等待處理的交易。(他們被統(tǒng)一的分配到一個區(qū)塊之前。)

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

或者你重置所有的區(qū)塊到最新的位置,那么當(dāng)有新建區(qū)塊的時候會通知你。

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

主題過濾也被支持:

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

當(dāng)不再需要時,訂閱也應(yīng)該被取消:

subscription.unsubscribe();

**注意:Infura中不支持filters。 **

需要了解更多有關(guān)過濾器和事件的信息可以查看Filters and Events和Web3jRx的接口。

交易

Web3j支持使用以太坊錢包文件(推薦的)和用于發(fā)送事務(wù)的以太坊客戶端管理命令。

使用以太錢包文件發(fā)送以太幣給其他人:

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的Transfer進行以太幣交易要簡單得多。

使用以太坊客戶端的管理命令(如果你的錢包密鑰已經(jīng)在客戶端存儲):

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’s Personal 或者 Trace 功能, 或者 Geth’s Personal 客戶端 APIs,可以使用org.web3j:parityorg.web3j:geth模塊。

命令行工具

web3j的jar包為每一個版本都提供命令行工具。命令行工具允許你直接通過一些命令使用web3j的一些功能:

  • 錢包創(chuàng)建

  • 錢包密碼管理

  • 資金從錢包轉(zhuǎn)移到另一個

  • solidity編寫的智能合同功能打包

請參閱文檔以獲得命令行相關(guān)的進一步的信息。

其他的細(xì)節(jié)

java8 bulid:

  • Web3j提供對所有響應(yīng)類型的安全訪問??蛇x的或null響應(yīng)java 8都支持。

  • 異步請求包在一個java 8的CompletableFutures。Web3j提供了圍繞所有異步請求的打包工具,以確保在執(zhí)行期間可以捕獲任何異常,而不只是丟棄。由于在完全檢查中會有很多缺少支持的異常情況,這些異常通常被確定為未檢測到的異常,導(dǎo)致檢測過程出現(xiàn)問題。有關(guān)詳細(xì)信息,請參見 Async.run()及其關(guān)聯(lián) test。

在java 8的Android版本:

  • 包數(shù)量作為 BigIntegers返回。對于簡單的結(jié)果,可以通過 Response.getResult()獲取字符串類型的數(shù)量結(jié)果。

  • 還可以通過在 HttpService和IpcService類中存在的includeRawResponse參數(shù)將原生的JSON包放置在響應(yīng)中。

感謝各位的閱讀,以上就是“如何通過java打包以太坊智能合約”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何通過java打包以太坊智能合約這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

本文題目:如何通過java打包以太坊智能合約
當(dāng)前路徑:http://muchs.cn/article44/jiocee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、云服務(wù)器、軟件開發(fā)、靜態(tài)網(wǎng)站做網(wǎng)站、網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)