使用Java與區塊鏈智能合約進行交互教程

簡介

本文是一個非常實用的分步教程,其目的是向Java開發人員(特別是)展示一種非常簡單的與區塊鏈智能合約進行交互的方式。瞭解使用庫與區塊鏈進行交互的難易程度。

環境要求

我們將使用Tezos區塊鏈。爲了使我們的Java代碼與現有的、部署的智能合同交互,我們需要來自TezosRio的TeZOSJ庫。 該庫有兩個版本,一個是專門爲Android應用程序開發編寫的版本(TezosJ_SDK),另一個是爲使用Eclipse IDE編寫的通用Java應用程序(TezosJ_plainJava)編寫的,我們將在這裏使用。 無需下載整個庫源代碼。 僅v1.1.0 JAR文件就足夠了。 作爲我們的開發IDE,Eclipse將是首選。

文章目標

我們要調用的智能合約是一個簡單的客戶基本註冊,可以在Tezos testnet上找到,地址如下:KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t

您可以通過Tezblock之類的Tezos區塊瀏覽器之一輕鬆查看智能合約的詳細信息。或通過使用Better-call.dev工具。 還有另一種選擇是與SmartPy資源管理器檢查智能合約。請記住,記住,要指定一個測試網服務器,例如https://tezos-dev.cryptonomic-infra.tech。

我們的智能合約稱爲“客戶”,它具有四個入口點(或方法):addCustomer,removeCustomer,transfer和updateBalance。基本上都是插入,刪除,轉移資金和更新基本功能。這是僅爲教育目的而創建的。它的作用是在Tezos區塊鏈的存儲中維護一個“客戶”列表。

調用方法

TezosJ可能是當今調用Tezos智能合約的最簡單方法之一。 基本上,我們的調用可以通過一個命令完成:

上面的代碼將一個新客戶Bob的餘額加爲10ꜩ,其ID爲123456789,電話號碼爲98769985,從而爲該客戶添加了一個新客戶。這是通過調用callContractEntryPoint方法完成的,該方法基本上需要與普通的Tezos .send()方法相同的參數,但具有一些額外的功能:智能合約入口點名稱和包含預期入口點參數的String Array

請一步一步來!

如果您還沒有完成,請下載並安裝Eclipse。打開它。第一步是創建一個新項目,選擇File->new->project選項,如下所示:

下一步是選擇項目類型:選擇Gradle Project:

將新項目的名稱設置爲“ callSmartContract”,然後單擊“完成”按鈕。等待Eclipse構建項目文件結構。現在,我們將創建一個Main類,以便我們可以運行和測試項目。右鍵單擊項目名稱“ SmartContract”,然後選擇New->Class:

然後,指定“Main”作爲新類的名稱,並確保選中“public void static Main(String args[])”創建框。然後單擊“完成”按鈕:

您會注意到Main類已創建。右鍵單擊Main class,然後選擇Run as-> Java Application。 這只是爲了配置從現在開始單擊play按鈕時項目的運行方式:

在控制檯中,您將看到項目已成功運行,但是當然還沒有任何反應。因此,您將看到“terminated”消息:

現在我們將添加TezosJ庫JAR文件。 轉到Tezos.Rio github存儲庫並下載文件tezosj-sdk-plain-java-1.1.0.jar

在文件瀏覽器上,複製tezosj-sdk-plain-java-1.1.0.jar文件(CTRL + C)。

回到Eclipse,單擊項目名稱,然後使用CTRL + V粘貼。

該文件將顯示爲已添加到項目結構中:

下一步是將JAR添加到項目的構建路徑中。右鍵單擊項目瀏覽器中的庫文件,然後選擇選項 Build Path-> Add to Build Path (or Build Path -> Configure Build Path):

選擇庫文件,然後單擊“應用並關閉”按鈕:

現在我們已經準備好一切,讓我們首先構建一個Tezos錢包:

上方(左側)的紅色“ X”提醒我們,需要導入類,才能使我們的代碼瞭解什麼是TezosWallet:

現在添加一些控制檯輸出,以檢查是否成功創建了我們的錢包。 我們將打印有關此信息:錢包的公鑰哈希(Tezos地址),其助記詞和當前餘額。 添加System.out.println命令後,運行項目,您將獲得類似以下內容(檢查控制檯):

好! 我們有一個功能齊全的Tezos錢包。現在我們可以調用客戶Tezos智能合約了。

關於智能合約的一點事….

我們將使用SmartPy.io在線IDE在Tezos區塊鏈測試網上創建並部署了我們將要使用的客戶智能合約。檢查下面的智能合約源代碼:

此處顯示的SmartPy智能合約的源代碼僅用於說明目的,我們不需要再次編譯和部署它。它已經位於Tezos區塊鏈測試網上,地址爲:KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t

現在我們擁有從Java調用合同所需的一切。首先我們將使用智能合約的“ addCustomer”入口點添加新客戶。讓我們考慮客戶的名字“Bob”,他的ID將是“ 98765”,電話號碼是“ 99876787”。 Bob的餘額爲10英鎊(1000萬個mutez)。 因此,我們的智能合約調用命令將如下所示:

首先,我們需要通知TezosJ我們將使用TezosTestNet(智能合約實際發佈的地方)。我們還需要設定交易金額和費用。這是用下面的Java代碼完成的:

複製代碼並將其粘貼到我們的Main類中,使其保持如下所示:

請注意,要使此調用正常工作,您首先需要注資並顯示您的Tezos帳戶。 否則,您可能會收到如下錯誤:

There were errors: kind ‘branch’ id ‘proto.005-PsBabyM1.implicit.empty_implicit_contract’

運行項目! 如果一切正常,您將獲得控制檯中顯示的操作哈希:

這表明我們已成功將callContract事務發送到Tezos testnet區塊鏈(因爲我們有一個操作哈希)。 現在讓我們檢查交易是否被Tezos區塊鏈接受。我們將使用TezBlock資源管理器執行此操作。在您喜歡的瀏覽器中打開https://tezblock.io,首先,在屏幕的右上角,將“ mainnet”更改爲“ balylonnet”(與testnet相同)。 然後,將從Java執行中獲得的操作哈希值粘貼到搜索框中,然後按“ enter”鍵:

這將顯示我們智能合約的結果以及操作細節。通過單擊“display”,您將能夠檢查從我們的Java代碼傳遞到Tezos區塊鏈的參數:

參數:

Left (Left (Left (Pair (Pair (Pair 1000000 "98765") "Bob") 99876787)))

這是我們從Java應用程序調用生成的Micheline格式的參數。部署時,Tezos智能合約以Michelson 語言編寫,它們期望以這種格式發送的輸入參數。使用TezosJ庫的好處之一是它可以實時生成Micheline格式的參數,而您不必擔心它是如何完成的。

到目前爲止,我們可以確保正確調用了智能合約,傳遞了參數並且操作已被Tezos區塊鏈接受。現在我們要做的最後一件事是檢查是否將新客戶Bob插入了智能合約的存儲中。爲此,我們將使用Better-call.dev工具。 只需打開瀏覽器並將其指向https://better-call.dev。 在搜索字段中輸入我們的客戶智能合約的地址(KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t),將網絡更改爲babylonnet,然後按Enter:

如果將是曾經發送到智能合約地址的所有操作的列表以及智能合約存儲的當前狀態。您將在此處檢查從Java傳遞過來的參數,以及它們是否正確保存在存儲器中:

更進一步

您可以嘗試智能合約的其他入口點,例如removeCustomer,transfer和updateBalance。切記始終檢查每個入口點所需的參數數量。

運行代碼時,如果遇到Java錯誤,則表示未發送事務。在這種情況下,您必須重新檢查參數,其順序,帳戶餘額,費用以及您正在使用的網絡(主網或測試網)。此外另一方面,如果您曾經獲得過操作哈希,則意味着您的Java應用程序已成功將交易發送到了區塊鏈。但是,您還必須檢查可能的與區塊鏈相關的錯誤。在這種情況下,當您使用TezBlock Explorer進行檢查時,它將顯示帶有鮭魚色背景的錯誤,這意味着在區塊鏈上下文中發生了錯誤(例如,傳遞的參數數量錯誤,參數Micheline格式錯誤,甚至合同未接受的條件-例如:您調用了轉移入口點,但“發件人”客戶沒有足夠的資金可發送)。還要檢查gasLimit和storageLimit參數。

結論

開發人員使用區塊鏈智能合約從未如此簡單。特別是Tezos,提供了許多出色的工具和無數的計算機語言庫,可促進與大多數系統的集成。TezosJ庫通過提供一種易於使用的callContractEntryPoint方法進行創新,該方法可以即時創建Micheline格式的參數。它具有Java開發人員在與區塊鏈無縫交互的應用程序開發中蓬勃發展所需的所有工具。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章