教程 | 使用WeBASE开发智能合约Java应用
共 3616字,需浏览 8分钟
·
2021-10-22 22:09
区块链中间件平台WeBASE功能丰富、操作友好,备受社区关注。WeBASE也不断迭代优化,致力于为社区带来更好的开发体验。
在 WeBASE 的合约IDE中,“Java项目导出”功能除了提供可直接使用的SDK Client实例等功能之外,新增了导出脚手架时选中多个私钥用户、封装了ServiceManaver类以支持切换不同的私钥来调用合约的功能。
下面我们以合约仓库中的存证合约模板为例,一起熟悉一下WeBASE的“Java项目导出”功能,然后尽情地使用WeBASE开发智能合约Java应用吧。
前期准备
我们用 WeBASE-Front 节点前置进行操作。首先打开“合约管理”中的“合约仓库”,导出一份“存证合约”模板到合约IDE中,存证合约模板包含存证实体 Evidence 和业务合约 EvidenceSignersData 两个合约。
在合约仓库中查看应用模板的“预览和说明”,可以看到合约的简介文档。
我们导出存证合约模板到合约IDE后,分别创建一个名为 Issuer 和 Alice 的私钥用户,后面将用这两个私钥来发起合约的部署、调用等交易。
首先,我们在合约IDE中编译 EvidenceSignersData 合约,并使用 Issuer 用户部署。部署时 EvidenceSignersData 的构造函数需要传入私钥地址,用于初始化存证的 evidenceSigners,入参格式是地址数组address[],如下图所示,我们填入 Issuer 用户的地址作为初始的 evidenceSigners。
通过合约代码逻辑,我们可以了解到,调用 EvidenceSignersData 合约 newEvidence 方法创建一个新的存证时,需要使用部署时传入的evidenceSigners地址,也就是上文传入的 Issuer 私钥地址。
生成脚手架
合约部署后,我们执行导出操作,窗口会尝试自动填入当前连接的节点信息,如果节点前置未配置链节点的路径,则可以手动填入节点信息。填入后,我们可以通过“检测”按钮检查能否连上节点。同时,我们在用户的输入框中选中多个私钥用户,表示导出时将选中的私钥导入到即将生成的脚手架中。
值得注意的是,在最新版的WeBASE中点击“导出Java项目”按钮后,只要在弹窗里的合约列表中选中合约即可;如果合约是未编译的,IDE就会尝试自动完成合约编译,实现了无需关闭窗口即可完成编译的操作。
最后选中需要导出的合约后,点击确认按钮将会导出合约对应的Java项目脚手架。下面我们通过Java的IDE打开这个Java脚手架,了解一下脚手架包含了哪些内容。
运行脚手架
我们用Java的IDE打开脚手架项目后,可以看到项目是基于Gradle进行构建的。
如上图所示,项目的配置文件中配置了system.peer为节点的IP与端口,包含了节点的证书路径、合约的地址、加载的私钥地址以及项目的端口等。
基于WeBASE导出的Java项目也包含了WeBASE-Front节点前置中配置的sdk证书,如下图所示,用户无需编写Java-SDK中的Client初始化的代码,直接获取config包中SdkBeanConfig类初始化的Client的Bean实例即可。
raw包:智能合约Solidity代码转为Java代码的类 service包:在WeBASE 合约IDE中选中的智能合约对应的合约Service类。
和raw包中的合约Java类一样,每个合约Service类的实例都会绑定一个私钥。如果需要使用多个私钥时,则需要使用不同的私钥来初始化一个新的合约Service类。
此外,WeBASE v1.5.2的更新封装了一个 ServiceManager 类,可以根据私钥管理多个合约Service类实例。ServiceManager 根据项目配置文件 application.properties 中配置的system.hexPrivateKey 获取多个私钥,并且通过这些私钥初始化多个合约Service实例,保存在一个Map中。其中,Map以私钥的地址为Key,以绑定了私钥的合约Service实例为Value。
基于脚手架二次开发
我们进行业务的二次开发时,比如需要调用存证合约进行存证时(合约的newEvidence方法),怎么通过脚手架的代码进行合约调用呢?
在前文部署存证合约时我们使用了 Issuer 的私钥地址初始化了 EvidenceSignersData 的合约,因此调用 newEvidence 方法时,同样需要使用 Issuer 私钥来进行存证操作。因此我们可以在 ServiceManager 类中通过Issuer 的地址来获取绑定了Issuer 绑定的合约EvidenceSignersDataService实例。通过该实例调用合约即可。
如下图所示,我们用一个单元测试来演示存证的核心业务代码,代码中通过Spring自带的 Autowired+Qualifier 获取 ServiceMap 实例。
我们通过 Issuer 的地址“0x7553be421a08b702a337a2c2713656138049a9ad” 来获取ServiceMap 中绑定了 Issuer 私钥的 EvidenceSignersDataService 实例。这样我们在调用 EvidenceSignersDataService 实例中的 newEvidence() 方法时,实例会使用 Issuer 的私钥来发起交易,如果使用 Alice 私钥或者其他私钥,合约则会返回报错。
当然,我们也可以直接使用脚手架提供的Bean实例,结合raw包中的原生合约Java类或Java-SDK组装交易进行合约调用。完成应用的二次开发后,也可以通过WeBASE-APP-SDK接入到WeBASE应用管理中进行应用的运维管理。WeBASE应用管理地址:
https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-APP-SDK/index.html
构建Jar并运行
在完成基于脚手架的区块链应用的二次开发后,我们就可以通过脚手架提供的gradle-wrapper工具进行项目构建。
# 修改为可执行
cd demo && chmod +x ./gradlew
# 打包
./gradlew build -x test
# 查看文件
ls ./dist
执行"gradlew build -x test"即可构建得到一个dist安装包,如下图所示:
进入dist目录后,查看application.propertiest文件中连接的节点IP端口正确后,使用"java -jar demo.jar"命令即可运行项目,连接节点成功后会打印块高信息如"Chain connect successful. Current block number 261",应用成功启动后最后一行日志会打印如"Started Application in 5.812 seconds"的日志信息。
即刻使用
上述优化及功能所涉及的最新代码和技术文档已同步更新,欢迎体验和star支持。如需咨询技术问题,欢迎本公众号对话框回复【小助手】进技术交流群。
向我们报告问题,欢迎提交issue:
https://github.com/WeBankFinTech/WeBASE/issues