第四章 自定义sol合约转化java代码,并实现调用
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407
准备工作
1、官方参考说明文档
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html
2、已经在ubuntu 上搭建好FISCO BCOS 底层,并且可以成功跑通
3、已经将对应如下证书等文件,从FISCO BCOS 底层copy到sdk项目中
4、官方 sdk 示例代码下载 https://github.com/FISCO-BCOS/spring-boot-starter
一、编写智能合约
1、可以用过以太坊的在线合约编辑器 编写合约代码
地址如下(是有需要翻墙):https://remix.ethereum.org/#optimize=true&version=soljson-v0.5.5+commit.47a71e8f.js&evmVersion=null
2、修改合约支持solidity的版本,目前bcos 支持0.4.25 所以版本设置为0.4.0
3、通过Remix 在线编辑器可以实现初步编译是否通过,编写简单测试合约代码如下
pragma solidity >=0.4.0 <0.7.0; contract test{ uint public aa=0; function set(uint tt) public{
aa=tt;
} function get() public view returns (uint) {
return aa;
}
}
二、在底层控制台将sol合约生成对应的java代码
1、将编写好的sol 合约代码导出,通过winscp 导入fisco 项目中/console/contracts/的solidity文件夹下面
图中1 是放合约地方,图中2 是执行命令后生成对应java代码的地方
2、执行如下操作(和官方差不多)
# 切换到fisco/console/目录
$ cd ~/fisco/console/
# 编译合约,后面指定一个Java的包名参数,可以根据实际项目路径指定包名
$ ./sol2java.sh org.fisco.bcos.asset.contract
3、查看生成的代码
三、项目中搭载新的合约
1、将生成代码copy 到项目中
2、编译项目可能出现问题
(1) 对应生成java 代码 报错
该方法是 'org.fisco-bcos:web3sdk:2.0.3' 新增的,笔者的 org.fisco-bcos:web3sdk:2.0.0 rc2,
通过官方开发人员指导:找到最新web3sdk:https://github.com/FISCO-BCOS/spring-boot-starter,
查看 文件 build.gradle,引入最新的 compile 'org.fisco-bcos:web3sdk:2.0.3'
(2) 官方demo 中另一个测试报错
原因是官方改了指定类名称,通过 import org.fisco.bcos.web3j.precompile.config.SystemConfigService;找到SystemConfigService,
修改指定类名称,成功编译
四、测试
1、编写单元测试代码
主要流程:先调用合约部署测试,调用测试 原始合约Get和set的方法,注意调用时候要加 上 指定方法.send(),进行测试
package customTest; import org.fisco.bcos.Application;
import org.fisco.bcos.solidity.Asset;
import org.fisco.bcos.solidity.SolToJavaTest;
import org.fisco.bcos.web3j.crypto.Credentials;
import org.fisco.bcos.web3j.crypto.gm.GenCredential;
import org.fisco.bcos.web3j.protocol.Web3j;
import org.fisco.bcos.web3j.tx.gas.StaticGasProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import java.math.BigInteger; @RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class MyAutoCreateSolToJavaTest { private Credentials credentials;
private static BigInteger gasPrice = new BigInteger("300000000");
private static BigInteger gasLimit = new BigInteger("300000000");
@Autowired
Web3j web3j; //这很重要,没有这个无法通过
@Before
public void setUp() throws Exception {
/* credentials =
GenCredential.create(
"b83261efa42895c38c6c2364ca878f43e77f3cddbc922bf57d0d48070f79feb6");
if (credentials == null) {
throw new Exception("create Credentials failed");
}*/ credentials = GenCredential.create();
} @After
public void tearDown() {
} @Test
//部署合约
public void DeploySolContract() throws Exception {
// 部署合约
SolToJavaTest asset = SolToJavaTest.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send(); if (asset != null) {
System.out.println("SolToJavaTest address is: " + asset.getContractAddress());
} } @Test
//调用合约
public void CallSolContract() throws Exception{
String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";
// 加载合约地址
SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
BigInteger temp = new BigInteger("100");
if (asset != null) {
System.out.println("aa 的原始值:"+asset.aa().send());
System.out.println("---设置值操作----------------------------------");
asset.set(temp).send();
System.out.println("aa 的设置后值:"+asset.get().send().toString());
}
} @Test
//调用合约之后,在次执行本方法,查看aa是否变化,经过上次的操作,aa的值已经固定为100了
public void GetChangeData() throws Exception{
String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";
// 加载合约地址
SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
BigInteger temp = new BigInteger("100");
if (asset != null) {
System.out.println("aa 的设置后值:"+asset.get().send().toString());
}
}
}
2、部署合约,得到合约部署后的地址
3、测试合约调用结果
以上就是笔者本次操作记录。
读后感觉不错,有收获可以微信请作者喝杯咖啡,读后有疑问请加微信,拉群研讨,注明来意
第四章 自定义sol合约转化java代码,并实现调用的更多相关文章
- “全栈2019”Java第四章:创建第一个Java程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java 代码中如何调用 第三方Api
在代码中调用第三方API 获取数据 package com.example.demo.utils; import com.alibaba.fastjson.JSONObject; import lom ...
- 啊哈算法第四章第二节解救小哈Java实现
package corejava; public class FourTwo { static int m;//(m,n)为几行几列 static int n; static int p;//(p,q ...
- gradle文件中自定义字段值在java代码中使用
1. 在build.gradle 中 buildConfigField 的参数有3个 第一个类型 第二个为名称 第三个是值 如果是字符串类型 请不要忘记 双引号! buildTypes { ...
- java代码--------构造方法的调用
总结: package com.sads; //构造方法何时被调用, //构造方法里的内容先执行 public class Sdw { static { System.out.println(&quo ...
- 【UML】Java代码与UML模型相互转换方法
最近重温了一下设计模式,看到大家的博客里面都是Java代码+UML视图,UML表达整体框架,然后再秀出具体的代码,点面结合.一目了然.所以也研究了一下Java代码与UML模型相互转换方法. 一.常用的 ...
- java并发编程的艺术——第四章总结
第四章并发编程基础 4.1线程简介 4.2启动与终止线程 4.3线程间通信 4.4线程应用实例 java语言是内置对多线程支持的. 为什么使用多线程: 首先线程是操作系统最小的调度单元,多核心.多个线 ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- Java程序设计(2021春)——第四章接口与多态笔记与思考
Java程序设计(2021春)--第四章接口与多态笔记与思考 本章概览: 4.1 接口(接口的概念和声明接口.实现接口的语法) 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方 ...
随机推荐
- qemu使用copy-on-write(COW)磁盘
写时复制(copy-on-write,缩写COW)技术不会对原始的镜像文件做更改,变化的部分写在另外的镜像文件中,这种特性在qemu中只有QCOW格式支持,多个 COW 文件可以指向同一映像同时测试多 ...
- Redis中的管道(PipeLine)与事物(Transactions)
Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...
- js小贴士
1.在js中 定义方法 方法名第一个字母小写.如果是定义类 则第一个字母大学 2.如果想在a标签中点击 触发js方法 而不跳转页面 可以使用类似 <a href="javascri ...
- 使用python3的base64编解码实现字符串的简易加密解密
import base64 copyright = 'Copyright (c) 2012 Doucube Inc. All rights reserved.' def main(): #转成byte ...
- error C2220: 警告被视为错误 - 没有生成“object”文件
原文:error C2220: 警告被视为错误 - 没有生成"object"文件 这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文. 解决方案: 1. ...
- C#同步SQL Server数据库Schema
C#同步SQL Server数据库Schema 1. 先写一个sql加工类: using System; using System.Collections.Generic; using System. ...
- Xamarin 设置可接受的版本
一共分三个版本,编译版本.最小版本.目标版本(最适应) 一般编译使用最新的版本,目标版本选择最主流的 参考资料 https://docs.microsoft.com/en-us/xamarin/and ...
- 在微信浏览器里使用js或jquery实现页面重新刷新
function refresh() { var random = Math.floor((Math.random() * 10000) + 1); var url = decodeURI(windo ...
- 在WPF中引用WinForm的控件
以ArcEngine为例: mapControl = new AxMapControl(); MapHost.Child = mapControl; //MapHost为WindowsFormHos ...
- Visual Studio更改编码格式为“UTF-8”
原文:Visual Studio更改编码格式为"UTF-8" 用VS2015新建了个Python文件,在VS2015打开时中文显示正常, 用Visual Studio Code文本 ...