文档章节

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

o
 osc_in99ca4i
发布于 2019/04/10 10:10
字数 1078
阅读 56
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

 鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加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 在线编辑器可以实现初步编译是否通过,编写简单测试合约代码如下

 1 pragma solidity >=0.4.0 <0.7.0;
 2 
 3 contract test{
 4     
 5     uint public aa=0;
 6     
 7     function set(uint tt) public{
 8         aa=tt;
 9     }
10 
11      function get() public view returns (uint) {
12         return aa;
13     }
14 }

 

 

 

 

二、在底层控制台将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(),进行测试

 1 package customTest;
 2 
 3 import org.fisco.bcos.Application;
 4 import org.fisco.bcos.solidity.Asset;
 5 import org.fisco.bcos.solidity.SolToJavaTest;
 6 import org.fisco.bcos.web3j.crypto.Credentials;
 7 import org.fisco.bcos.web3j.crypto.gm.GenCredential;
 8 import org.fisco.bcos.web3j.protocol.Web3j;
 9 import org.fisco.bcos.web3j.tx.gas.StaticGasProvider;
10 import org.junit.After;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.junit.runner.RunWith;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.boot.test.context.SpringBootTest;
16 import org.springframework.test.context.junit4.SpringRunner;
17 
18 import java.math.BigInteger;
19 
20 @RunWith(SpringRunner.class)
21 @SpringBootTest(classes = Application.class)
22 public class MyAutoCreateSolToJavaTest {
23 
24     private Credentials credentials;
25     private static BigInteger gasPrice = new BigInteger("300000000");
26     private static BigInteger gasLimit = new BigInteger("300000000");
27     @Autowired
28     Web3j web3j;
29 
30     //这很重要,没有这个无法通过
31     @Before
32     public void setUp() throws Exception {
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     @After
44     public void tearDown() {
45     }
46 
47 
48     @Test
49     //部署合约
50     public void DeploySolContract() throws Exception {
51         // 部署合约
52         SolToJavaTest asset = SolToJavaTest.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send();
53 
54         if (asset != null) {
55             System.out.println("SolToJavaTest address is: " + asset.getContractAddress());
56         }
57 
58     }
59 
60     @Test
61     //调用合约
62     public  void CallSolContract() throws Exception{
63         String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";
64         // 加载合约地址
65         SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, new StaticGasProvider(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     @Test
76     //调用合约之后,在次执行本方法,查看aa是否变化,经过上次的操作,aa的值已经固定为100了
77     public  void GetChangeData() throws Exception{
78         String contractAddress = "0xc9997c3669f8667f88da5d956e7d946baac123f5";
79         // 加载合约地址
80         SolToJavaTest asset = SolToJavaTest.load(contractAddress, web3j, credentials, new StaticGasProvider(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、部署合约,得到合约部署后的地址

3、测试合约调用结果

 

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

 

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

 

 

 

原文出处:https://www.cnblogs.com/linbin524/p/11089873.html

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.7K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.4K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.2K
18
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

phpstorm 主题颜色

个人比较喜欢 复制文件保存为 red.icls <scheme name="1337" version="142" parent_scheme="Default"> <option name="FONT_SCALE" value="1.0" /> <metaInfo> <property name="c......

chenhongjiang
15分钟前
15
0
Hystrix核心原理和断路器源码解析

Hystrix运行原理 构造一个HystrixCommand或HystrixObservableCommand对象 执行命令。 检查是否已命中缓存,如果命中直接返回。 检查断路器开关是否打开,如果打开,直接熔断,走fallback逻辑...

xiaolyuh
今天
10
0
求职应聘,如何自我分析人格优势?

“你那里有没有合适的工作介绍给我啊?” “我想找份我喜欢的工作,可是好难啊怎么办啊?” “为什么我求职总是不成功呢?” 最近我总是接到朋友询问工作相关的消息,给她们提供招聘信息的同...

蛤蟆丸子
今天
17
0
Pycharm、Idea、Goland 官方汉化来了

作为软件开发的编辑器,不得不提大名鼎鼎的 JetBrains 公司,其出品的软件:Pycharm、Idea、WebStorm、phpstorm、CLion、RubyMine、AppCode、DataGrid,目前来讲都是最受欢迎的! 可是由于软...

猪哥66
今天
18
0
数据分析师必学第一课:构建完整的指标体系

本文分享自微信公众号 - 大数据架构师专家(xinsz08)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

致码高胜寒
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部