智能合约转java_第四章 自定义sol合约转化java代码,并实现调用

2023-11-17

鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407

准备工作

1、官方参考说明文档

2、已经在ubuntu 上搭建好FISCO BCOS 底层,并且可以成功跑通

3、已经将对应如下证书等文件,从FISCO BCOS 底层copy到sdk项目中

bd6fd37afdcb0a613d23830fda37c903.png

一、编写智能合约

1、可以用过以太坊的在线合约编辑器 编写合约代码

2、修改合约支持solidity的版本,目前bcos 支持0.4.25 所以版本设置为0.4.0

3、通过Remix 在线编辑器可以实现初步编译是否通过,编写简单测试合约代码如下

1 pragma solidity >=0.4.0 <0.7.0;2

3 contract test{4

5 uint public aa=0;6

7 functionset(uint tt) public{8 aa=tt;9 }10

11 functionget() public view returns (uint) {12 returnaa;13 }14 }

二、在底层控制台将sol合约生成对应的java代码

1、将编写好的sol 合约代码导出,通过winscp 导入fisco 项目中/console/contracts/的solidity文件夹下面

图中1 是放合约地方,图中2 是执行命令后生成对应java代码的地方

baf08a87015e1b840e6709a42fd0617c.png

2、执行如下操作(和官方差不多)

# 切换到fisco/console/目录

$ cd~/fisco/console/# 编译合约,后面指定一个Java的包名参数,可以根据实际项目路径指定包名

$ ./sol2java.sh org.fisco.bcos.asset.contract

3、查看生成的代码

512955dbe3a26b5bbc7ba6759950193c.png

d44ce8ce52ff2f9cc361edfbe3e14759.png

三、项目中搭载新的合约

1、将生成代码copy 到项目中

b445b09dadcce9620327f9613810d25d.png

2、编译项目可能出现问题

(1) 对应生成java 代码 报错

f6798f461c7c57f6ec86a282121acab6.png

该方法是 'org.fisco-bcos:web3sdk:2.0.3' 新增的,笔者的 org.fisco-bcos:web3sdk:2.0.0 rc2,

查看 文件 build.gradle,引入最新的 compile 'org.fisco-bcos:web3sdk:2.0.3'

(2) 官方demo 中另一个测试报错

2e6190bb0fed74e3e4cababaa2da004c.png

原因是官方改了指定类名称,通过 import org.fisco.bcos.web3j.precompile.config.SystemConfigService;找到SystemConfigService,修改指定类名称,成功编译

230a2f71ecaf9df0e45f26b3d613a538.png

四、测试

1、编写单元测试代码

主要流程:先调用合约部署测试,调用测试 原始合约Get和set的方法,注意调用时候要加 上  指定方法.send(),进行测试

1 packagecustomTest;2

3 importorg.fisco.bcos.Application;4 importorg.fisco.bcos.solidity.Asset;5 importorg.fisco.bcos.solidity.SolToJavaTest;6 importorg.fisco.bcos.web3j.crypto.Credentials;7 importorg.fisco.bcos.web3j.crypto.gm.GenCredential;8 importorg.fisco.bcos.web3j.protocol.Web3j;9 importorg.fisco.bcos.web3j.tx.gas.StaticGasProvider;10 importorg.junit.After;11 importorg.junit.Before;12 importorg.junit.Test;13 importorg.junit.runner.RunWith;14 importorg.springframework.beans.factory.annotation.Autowired;15 importorg.springframework.boot.test.context.SpringBootTest;16 importorg.springframework.test.context.junit4.SpringRunner;17

18 importjava.math.BigInteger;19

20 @RunWith(SpringRunner.class)21 @SpringBootTest(classes = Application.class)22 public classMyAutoCreateSolToJavaTest {23

24 privateCredentials credentials;25 private static BigInteger gasPrice = new BigInteger("300000000");26 private static BigInteger gasLimit = new BigInteger("300000000");27 @Autowired28 Web3j web3j;29

30 //这很重要,没有这个无法通过

31 @Before32 public void setUp() throwsException {33 /*credentials =34 GenCredential.create(35 "b83261efa42895c38c6c2364ca878f43e77f3cddbc922bf57d0d48070f79feb6");36 if (credentials == null) {37 throw new Exception("create Credentials failed");38 }*/

39

40 credentials =GenCredential.create();41 }42

43 @After44 public voidtearDown() {45 }46

47

48 @Test49 //部署合约

50 public void DeploySolContract() throwsException {51 //部署合约

52 SolToJavaTest asset = SolToJavaTest.deploy(web3j, credentials, newStaticGasProvider(gasPrice, gasLimit)).send();53

54 if (asset != null) {55 System.out.println("SolToJavaTest address is: " +asset.getContractAddress());56 }57

58 }59

60 @Test61 //调用合约

62 public void CallSolContract() throwsException{63 String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";64 //加载合约地址

65 SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, newStaticGasProvider(gasPrice, gasLimit));66 BigInteger temp = new BigInteger("100");67 if (asset != null) {68 System.out.println("aa 的原始值:"+asset.aa().send());69 System.out.println("---设置值操作----------------------------------");70 asset.set(temp).send();71 System.out.println("aa 的设置后值:"+asset.get().send().toString());72 }73 }74

75 @Test76 //调用合约之后,在次执行本方法,查看aa是否变化,经过上次的操作,aa的值已经固定为100了

77 public void GetChangeData() throwsException{78 String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";79 //加载合约地址

80 SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, newStaticGasProvider(gasPrice, gasLimit));81 BigInteger temp = new BigInteger("100");82 if (asset != null) {83 System.out.println("aa 的设置后值:"+asset.get().send().toString());84 }85 }86 }

2、部署合约,得到合约部署后的地址

f2ce42eb280237356fbd2ebad5e3111b.png

3、测试合约调用结果

ab7b657fab05901c672a3c3cf6b2e348.png

以上就是笔者本次操作记录。

读后感觉不错,有收获可以微信请作者喝杯咖啡,读后有疑问请加微信,拉群研讨,注明来意

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能合约转java_第四章 自定义sol合约转化java代码,并实现调用 的相关文章

  • [坑]拦截器返回response.getWrite().println方法返回数据不全

    在SpringBoot项目中 前端ajax请求后端 拦截器进行登录拦截判断 如果超时返回false 则给前端返回一段json字符串 private static void returnJson HttpServletResponse res
  • C++ cin 实现循环读入

    习惯了使用while scanf d x 来实现循环读入 但是有时候使用泛型编程的时候就必须使用C 中的cin 但是当我想要实现循环读入的时候却发现有些困难 我们可以看一下下面这个简单的例子 include
  • 使用boost::units库进行信息单位转换的C++示例程序

    使用boost units库进行信息单位转换的C 示例程序 include
  • 电视机尺寸与观看距离

    电视机尺寸是指电视机屏幕对角线的长度 以英寸为单位 1英寸 2 54厘米 而且目前来看大多数液晶电视的标准屏幕比已经变成了宽的是16 9 根据勾股定理 对角线的长度是 337 根号337 开放得出 屏幕高度与对角线的比值就是9 337 一般
  • 【新版】系统架构设计师 - 案例分析 - 信息安全

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 架构 案例分析 信息安全 安全架构 安全模型 分类 BLP模型 Biba模型 Chinese Wall模型 信息安全整体架构设计 WPDRRC模型 各模型安全防范功能 网络安全体系架构设计
  • Linux中创建文件夹,删除文件夹

    Linux中创建目录 mkdir 文件夹 比如 mkdir test 删除文件夹 rm rf 文件夹 比如 rm rf soft vi强制不保存退出命令 q
  • const 定义数组问题

    const keysArr array aaa gt 11111 bbb gt 22222 ccc gt 33333 ddd gt 44444 上面是标准的错误格式 PHP编译不会报详细错误信息 500 查找半天的代码问题 一直未发现错误
  • 解决Jenkins构建前端时node-sass的.node文件下载报错问题的一种方案

    问题背景 公司的npm仓库未跟外网联通 为什么不联通 我也好鸡儿纳闷 使用Jenkins构建前端时 会在下载node sass的 node时报错 默认情况下会从github上去下 node文件 当然也可以通过配置 npmrc文件指定下载路径
  • 浅析Jetty与tomcat区别

    一 Jetty介绍 1 Jetty概述 Jetty是一个开源项目 最初由Mort Bay Consulting公司创建 它的目标是提供一个快速 灵活 可嵌入的Web服务器和Servlet容器 使Java开发人员能够轻松构建高性能的Web应用
  • 如何在 Mac 上录制屏幕?mac录屏教程分享

    您可以为整个屏幕或屏幕上的选定部分录制视频 1 使用 截屏 工具栏 要查看 截屏 工具栏 请同时按下以下三个按键 Shift Command 和 5 您将看到用于录制整个屏幕 录制屏幕的选定部分或拍摄屏幕静态图像的屏幕控制项 录制整个屏幕
  • 泛型的概念

    一 什么是泛型 参数化类型 为什么要引入泛型 1 将不同类型的数据添加到Arraylist中 取出数据要使用时 要进行强制转换 还原 向下转型 2 同时在编写程序时 不会报错 无类型安全监测机制 而结果出错ClassCastExceptio
  • 摄像头在H5的实时播放功能实现历程

    一 问题解决的路程 1 需求来源 因项目发展需求 需要在3D地图上进行实时摄像头监控展示 3D地图是基于浏览器H5页面展示的 在H5页面实时播放摄像头监控就需要可以直接拿到取流地址进行直接播放 以下各大摄像头产商取流方式 海康威视 默认IP
  • 网络层

    网络层 从它的名字可以看出 它解决的是网络与网络之间 即网际的通信问题 而不是同一网段内部的事 用于网络互联的设备都处于网络层 如 路由器 网络交互机等 一个底层网络内部只存在两层 即数据链接层 与 物理层 没有其它层
  • 考研C++/C数据结构之单链表两种查找方法

    继上篇文章我们探讨了单链表的两种创建方法 头插法和尾插法 今天我们来学习一下单链表的两种查找方法 按序查找和按值查找 按序查找的代码实现如下 按位查找 LinkList GetElem LinkList L int i int j 1 Li
  • python是真刑啊!爬虫这样用,离好日子越铐越近了~

    一个程序员写了个爬虫程序 整个公司200多人被端了 不可能吧 刚从朋友听到这个消息的时候 我有点不太相信 做为一名程序员来讲 谁还没有写过几段爬虫呢 只因写爬虫程序就被端有点夸张了吧 朋友说 消息很确认并且已经进入审判阶段了 01 对消息进
  • 求解视觉里程计(基于特征点法)

    目录 1 视觉里程计 VO 2 基于特征点法的视觉里程计算法 2 1 特征点 2 2 ORB特征点的提取与匹配 2 2 1 关键点与描述子 灰度质心法 特征描述子计算 2 2 2 特征点匹配 2 3 特征点法估计相机位姿 2 3 1 对极几
  • MySQL事务简介

    一 事务的起源 原子性 Atomicity 要么全做 要么全不做 一致性 Consistency 数据库中的数据全部符合现实中的约束 隔离型 Isolation 操作以原子性执行 且不同事务操作互不干扰 多种隔离级别 持久性 Durabil
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • 360n6pro刷鸿蒙系统,360N6和N6Pro通用刷机包MIUI9开发版V8.6.9紫火定制版

    本帖最后由 360fans 80867761 于 2018 8 7 19 44 编辑 360N6和N6Pro通用MIUI9开发版V8 6 9紫火定制版刷机包更新指纹解 除了有个小BUG 相机有时候加载有点慢 其他都很正常 无任何推广软件 刷

随机推荐