热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java调用fabric智能合约_使用Java与区块链智能合约进行交互教程

简介本文是一个非常实用的分步教程,其目的是向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智能合约的最简单方法之一。 基本上,我们的调用可以通过一个命令完成:

b227f2bddbe4b0b2f10f93ceda06d9aa.png

上面的代码将一个新客户Bob的余额加为10ꜩ,其ID为123456789,电话号码为98769985,从而为该客户添加了一个新客户。这是通过调用callContractEntryPoint方法完成的,该方法基本上需要与普通的Tezos .send()方法相同的参数,但具有一些额外的功能:智能合约入口点名称和包含预期入口点参数的String Array

请一步一步来!

如果您还没有完成,请下载并安装Eclipse。打开它。第一步是创建一个新项目,选择File->new->project选项,如下所示:

292e655c106bb0eb81db2220b6bad5e0.png

下一步是选择项目类型:选择Gradle Project:

ac3816b5d617321d87ebd5546e0a5343.png

将新项目的名称设置为“ callSmartContract”,然后单击“完成”按钮。等待Eclipse构建项目文件结构。现在,我们将创建一个Main类,以便我们可以运行和测试项目。右键单击项目名称“ SmartContract”,然后选择New->Class:

2654f04074b444fd57f8c74fa3ff0bd1.png

然后,指定“Main”作为新类的名称,并确保选中“public void static Main(String args[])”创建框。然后单击“完成”按钮:

c07511f442fe9990f29a84c848510086.png

您会注意到Main类已创建。右键单击Main class,然后选择Run as-> Java Application。 这只是为了配置从现在开始单击play按钮时项目的运行方式:

165414977674b68feb0d26d9d96059fa.png

在控制台中,您将看到项目已成功运行,但是当然还没有任何反应。因此,您将看到“terminated”消息:

bf7aaaa9e6f153783cd25e6ebc134016.png

现在我们将添加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粘贴。

该文件将显示为已添加到项目结构中:

f93defee17cf9fc0d26628fb58d167b2.png

下一步是将JAR添加到项目的构建路径中。右键单击项目浏览器中的库文件,然后选择选项 Build Path-> Add to Build Path (or Build Path -> Configure Build Path):

02149829edf2116fc1c8b95e05f97bd3.png

选择库文件,然后单击“应用并关闭”按钮:

4bb7b247078dff08ceb846dc736edec5.png

现在我们已经准备好一切,让我们首先构建一个Tezos钱包:

406e84f8662b6db1e7e78518ff6881ce.png

上方(左侧)的红色“ X”提醒我们,需要导入类,才能使我们的代码了解什么是TezosWallet:

f6ef5fc60aabaac6e3582ff0d67684dc.png

现在添加一些控制台输出,以检查是否成功创建了我们的钱包。 我们将打印有关此信息:钱包的公钥哈希(Tezos地址),其助记词和当前余额。 添加System.out.println命令后,运行项目,您将获得类似以下内容(检查控制台):

ac2e062a92b457dccdf9958973c06e8e.png

好! 我们有一个功能齐全的Tezos钱包。现在我们可以调用客户Tezos智能合约了。

关于智能合约的一点事….

我们将使用http://SmartPy.io在线IDE在Tezos区块链测试网上创建并部署了我们将要使用的客户智能合约。检查下面的智能合约源代码:

35a7ecf64f7a83f69b92786eb3377ca6.png

此处显示的SmartPy智能合约的源代码仅用于说明目的,我们不需要再次编译和部署它。它已经位于Tezos区块链测试网上,地址为:KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t

现在我们拥有从Java调用合同所需的一切。首先我们将使用智能合约的“ addCustomer”入口点添加新客户。让我们考虑客户的名字“Bob”,他的ID将是“ 98765”,电话号码是“ 99876787”。 Bob的余额为10英镑(1000万个mutez)。 因此,我们的智能合约调用命令将如下所示:

1bdf059b1df5dfcac695c9fa098e01c8.png

首先,我们需要通知TezosJ我们将使用TezosTestNet(智能合约实际发布的地方)。我们还需要设定交易金额和费用。这是用下面的Java代码完成的:

8a8ab66b53d1acddfb7b8025e15dcf85.png

并将其粘贴到我们的Main类中,使其保持如下所示:

b3d50e1bccb1ebfe6a6cefa9ce86c640.png

请注意,要使此调用正常工作,您首先需要注资并显示您的Tezos帐户。 否则,您可能会收到如下错误:

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

运行项目! 如果一切正常,您将获得控制台中显示的操作哈希:

c3e41d3570e81686733c1d34192a15d1.png

这表明我们已成功将callContract事务发送到Tezos testnet区块链(因为我们有一个操作哈希)。 现在让我们检查交易是否被Tezos区块链接受。我们将使用TezBlock资源管理器执行此操作。在您喜欢的浏览器中打开https://tezblock.io,首先,在屏幕的右上角,将“ mainnet”更改为“ balylonnet”(与testnet相同)。 然后,将从Java执行中获得的操作哈希值粘贴到搜索框中,然后按“ enter”键:

8bf865ad285836d24c0ea9d0bcdf97ec.png

这将显示我们智能合约的结果以及操作细节。通过单击“display”,您将能够检查从我们的Java代码传递到Tezos区块链的参数:

fe6f34824a314c80623b5fc90a987866.png

参数:

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:

1bbef9229dcbee541adfa8303e7e40e7.png

如果将是曾经发送到智能合约地址的所有操作的列表以及智能合约存储的当前状态。您将在此处检查从Java传递过来的参数,以及它们是否正确保存在存储器中:

64e9c8fb23f18bfcdda9319450130b7a.png

更进一步

您可以尝试智能合约的其他入口点,例如removeCustomer,transfer和updateBalance。切记始终检查每个入口点所需的参数数量。

运行代码时,如果遇到Java错误,则表示未发送事务。在这种情况下,您必须重新检查参数,其顺序,帐户余额,费用以及您正在使用的网络(主网或测试网)。此外另一方面,如果您曾经获得过操作哈希,则意味着您的Java应用程序已成功将交易发送到了区块链。但是,您还必须检查可能的与区块链相关的错误。在这种情况下,当您使用TezBlock Explorer进行检查时,它将显示带有鲑鱼色背景的错误,这意味着在区块链上下文中发生了错误(例如,传递的参数数量错误,参数Micheline格式错误,甚至合同未接受的条件-例如:您调用了转移入口点,但“发件人”客户没有足够的资金可发送)。还要检查gasLimit和storageLimit参数。

结论

开发人员使用区块链智能合约从未如此简单。特别是Tezos,提供了许多出色的工具和无数的计算机语言库,可促进与大多数系统的集成。TezosJ库通过提供一种易于使用的callContractEntryPoint方法进行创新,该方法可以即时创建Micheline格式的参数。它具有Java开发人员在与区块链无缝交互的应用程序开发中蓬勃发展所需的所有工具。



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
奥运精神永相随
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有