Web3j-OpenAPI使用教程

買賣虛擬貨幣
Web3 Labs的目標之一是使以太坊上的開發儘可能簡單。在過去的三年中,我們看到許多團隊(包括我們自己)在Web3j之上一次又一次地編寫RESTful服務,以便為他們的伺服器應用程式提供與以太坊的直接整合。今年早些時候,我們決定對此做一些事情,並高興地宣佈Web3j Open API專案。這個最新的專案使您可以輕鬆簽訂智慧合約並生成符合OpenAPI的伺服器應用程式(透過Swagger提供完整的OpenAPI文件)。Web3j OpenAPI生成器Web3j-OpenAPI是用於Solidity智慧合約的OpenAPI生成器。它提供了一種透過簡單直觀的HTTP請求與以太坊區塊鏈進行互動的方式。這些互動可以使用簡單的HTTP請求或透過每個專案生成的Swagger-UI來完成。工作流可概括為以下步驟:1. 編寫Solidity智慧合約
2. 使用Web3j-OpenAPI生成相應的OpenAPI專案3. 將生成的專案作為獨立伺服器執行4. 使用Swagger-UI或使用我們的客戶端實現從客戶端應用程式傳送HTTP請求以下是Hello World合約:// SPDX-License-Identifier: Apache-2.0pragma solidity ^0.7.0;
// Modified Greeter contract. Based on example at https://www.ethereum.org/greeter.contract Mortal {    /* Define variable owner of the type address*/    address owner;    /* this function is executed at initialization        and sets the owner of the contract */
    constructor () {owner = msg.sender;}    modifier onlyOwner {        require(            msg.sender == owner,            "Only owner can call this function."        );
        _;    }    /* Function to recover the funds on the contract */    function kill() onlyOwner public {        selfdestruct(msg.sender);    }
}contract HelloWorld is Mortal {    /* define variable greeting of the type string */    string greet;    /* this runs when the contract is executed */    constructor (string memory _greet) {
        greet = _greet;    }    function newGreeting(string memory _greet) onlyOwner public {        emit Modified(greet, _greet, greet, _greet);        greet = _greet;    }
    /* main function */    function greeting() public view returns (string memory)  {        return greet;    }    event Modified(        string indexed oldGreetingIdx, 
        string indexed newGreetingIdx,        string oldGreeting,         string newGreeting    );}

我們可以使用Web3j OpenAPI建立RESTful服務來部署該應用程式並與之無縫整合。Swagger UI包含在服務中,因此您可以輕鬆地嘗試使用它。

建立一個新的應用程式

要使用Web3j-OpenAPI生成器生成OpenAPI專案,您需要在計算機上安裝Epirus-CLI(注意-Epirus CLI替代了Web3j CLI)。

使用以下命令安裝Epirus-CLI

$ curl -L get.epirus.io | sh

要檢查安裝是否成功以及OpenAPI生成器是否正常工作,請執行以下命令:

$ epirus openapi import --help

您應該看到生成器幫助顯示:

在本文中,我們將使用上面的Hello World合約。首先將上述程式碼複製到名為HelloWorld.sol的檔案中,並將其複製到本地目錄中。

然後,執行以下命令:

$ epirus openapi import \
    -s=HelloWorld.sol \
    --package=com.tutorial \
    --project-name=HelloWorldProject \
    --output-dir=. 

您應該看到類似於以下內容的輸出:

這意味著OpenAPI專案已與SwaggerUI一起成功生成。確認目錄中有一個名為HelloWorldProject的資料夾。

如果是這樣,則您成功使用Web3j-OpenAPI生成了第一個OpenAPI專案。

下一步是執行專案。

您可以使用Epirus-CLI輕鬆執行專案,而無需指定任何配置。

如果不是,則需要指定執行時引數:例如用於簽名的私鑰或錢包檔案,要連線的節點端點等。

配置環境

要檢查所有可用選項,請使用--help標誌執行專案:

$ cd HelloWorldProject
$ ./gradlew run --args="--help"

您將看到以下顯示:

有多種方法可以指定這些引數:

環境變數
配置檔案
直接從CLI

這裡我們將透過環境變數傳遞引數,但是您可以閱讀文件中的其他選項。

為此,請執行以下命令:

$ export WEB3J_ENDPOINT=<link_to_your_Ethereum_node>
$ export WEB3J_PRIVATE_KEY=<your_private_key>
$ export WEB3J_OPENAPI_HOST=localhost
$ export WEB3J_OPENAPI_PORT=9090

執行應用程式

按如下方式執行應用程式

$ ./gradlew run

您應該能夠執行伺服器並看到以下內容:

與API互動

執行專案後,將定義端點,等待請求。為了傳送請求,我們將使用生成的Swagger-UI。

使用SwaggerUI

可以透過以下連結訪問Swagger-UI:http://<host>:<port>/swagger-ui。

在我們的例子中,它將位於http//localhost:9090/swagger-ui。

然後,使用端點POST/HellowWorldProject/contracts/helloworld部署您的合約:

如果合約成功部署,您應該會看到一個交易收據模型:

如果沒有,您應該收到一條錯誤訊息,您可以在響應中或伺服器日誌中看到該錯誤訊息。

然後,我將透過提供在上一個交易收據中收到的合約地址來呼叫greeting GET方法:

您應該看到以下響應:

透過Java / Kotlin進行互動

我們還可以使用Java或Kotlin客戶端與OpenAPI專案進行互動。

為此,首先將Web3j-OpenApi客戶端依賴項新增到您的專案中:

dependencies {
    implementation "org.web3j.openapi:web3j-openapi-client:4.7.1"
}

然後與服務互動,如下所示:

var service = new ClientService("http://localhost:9090");
var helloWorldProject = ClientFactory.create(
    HelloWorldProjectApi.class, service
);

System.out.println("Deploying the HelloWorld contract...");

var deployParams = new HelloWorldDeployParameters("Hello");
var receipt = helloWorldProject.getContracts()
    .getHelloWorld().deploy(deployParams);

System.out.println("Deployed contract address: " +
    receipt.getContractAddress());

// Load the contract from the returned transaction receipt
var helloWorld = helloWorldProject.getContracts()
    .getHelloWorld().load(receipt.getContractAddress());

// Change the greeting message
var newReceipt = helloWorld.newGreeting(
    new NewGreetingParameters("Hello Web3j-OpenAPI")
);

System.out.println("NewGreeting transaction hash: " +
    newReceipt.getTransactionHash());

// Check that the smart contract has been updated
var greeting = helloWorld.greeting().getResult();
System.out.println("Greeting method result: " + greeting);

根據您使用的網路,部署可能需要一些時間。

處理事件

在Web3j-OpenAPI中,我們使用伺服器傳送事件(SSE)處理事件。

簡而言之,SSE是一種單向機制,一旦客戶端與客戶端建立連線,伺服器就可以將資料從伺服器非同步推送到客戶端。

要從Kotlin/Java查詢事件,請按照上面的步驟新增Web3j-OpenAPI-client依賴項。然後使用以下程式碼:

var countdownLatch = new CountDownLatch(1);

// Start listening for events
helloWorld.getEvents().getModified().onEvent(e -> {
    System.out.println("Received event: " +
        modifiedEvent.getNewGreeting());
    countdownLatch.countDown();
});

helloWorld.newGreeting(new NewGreetingParameters(
    "This will trigger a modified event"));

countdownLatch.await(); // Waits for the event

然後執行此程式碼。您應該可以在螢幕上看到事件列印。

結論

在這裡,演示了為智慧合約啟動API端點是多麼容易。考慮到現在可以輕鬆地生成它們,我們希望您可以開始考慮用於以太坊整合的api,而不是迄今為止一直是標準的討厭的整合程式碼。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;