想了解相关区块链开发,技术提问,请加QQ群:538327407

前提

已经部署好底层,外网可以正常请求访问。

正常流程

1、基础合约处理

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html#id2

将官方的Asset.sol 代码copy,使用vim Asset.sol 命令创建,copy 到里面。

上一小节,我们根据业务需求设计了合约Asset.sol的存储与接口,给出了完整实现,但是Java程序无法直接调用Solidity合约,需要先将Solidity合约文件编译为Java文件。

控制台提供了编译工具,可以将Asset.sol合约文件存放在console/contracts/solidity目录。利用console目录下提供的sol2java.sh脚本进行编译,操作如下:

# 切换到fisco/console/目录 $ cd ~/fisco/console/ # 编译合约,后面指定一个Java的包名参数,可以根据实际项目路径指定包名 $ ./sol2java.sh org.fisco.bcos.asset.contract

2、合约转化

用官方的asset_app,自己生成的在sdk 那边用有问题

运行成功之后,将会在console/contracts/sdk目录生成java、abi和bin目录,如下所示。

 SHAPE  \* MERGEFORMAT

java目录下生成了org/fisco/bcos/asset/contract/包路径目录,该目录下包含Asset.java和Table.java两个文件,其中Asset.java是Java应用调用Asset.sol合约需要的文件。

3、SDK配置

我们提供了一个Java工程项目供开发使用,首先获取Java工程项目:

# 获取Java工程项目压缩包 $ cd ~ $ curl -LO https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz # 解压得到Java工程项目asset-app目录 $ tar -zxf asset-app.tar.gz

 SHAPE  \* MERGEFORMAT

asset-app项目的目录结构如下:

4、使用sdk进行开发

将asset_app 的sol、指定的合约的java、abi、bin等文件copy 到项目中,使用winscp等软件copy

 SHAPE  \* MERGEFORMAT

5、底层部署和测试

·         编译

# 切换到项目目录 $ cd ~/asset-app # 编译项目 $ ./gradlew build

 SHAPE  \* MERGEFORMAT

编译成功之后,将在项目根目录下生成dist目录。dist目录下有一个asset_run.sh脚本,简化项目运行。现在开始一一验证本文开始定下的需求。

·         部署Asset.sol合约

# 进入dist目录 $ cd dist $ bash asset_run.sh deploy Deploy Asset succesfully, contract address is 0xd09ad04220e40bb8666e885730c8c460091a4775

 SHAPE  \* MERGEFORMAT

·         注册资产

$ bash asset_run.sh register Alice 100000 Register account succesfully=> account: Alice, value: 100000 $ bash asset_run.sh register Bob 100000 Register account succesfully=> account: Bob, value: 100000

 SHAPE  \* MERGEFORMAT

·         查询资产

$ bash asset_run.sh query Alice account Alice, value 100000 $ bash asset_run.sh query Bob account Bob, value 100000

 SHAPE  \* MERGEFORMAT

·         资产转移

$ bash asset_run.sh transfer Alice Bob 50000 Transfer successfully=> from_account: Alice, to_account: Bob, amount: 50000 $ bash asset_run.sh query Alice account Alice, value 50000 $ bash asset_run.sh query Bob account Bob, value 150000

 SHAPE  \* MERGEFORMAT

6、本地编写单元测试

 package customTest;

 import javafx.concurrent.Service;
import org.fisco.bcos.Application;
import org.fisco.bcos.solidity.Asset;
import org.fisco.bcos.temp.HelloWorld;
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.protocol.core.methods.response.TransactionReceipt;
import org.fisco.bcos.web3j.tuples.generated.Tuple2;
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.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.junit4.SpringRunner; import java.math.BigInteger; import static org.junit.Assert.assertTrue; @RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class AssetTest {
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 DoAsset() throws Exception {
AssetRegisterAndQuery();
//DeployAsset(); }
@Test
//部署合约
public void DeployAsset() throws Exception {
// 部署合约
Asset asset = Asset.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send(); if (asset != null) {
System.out.println("HelloWorld address is: " + asset.getContractAddress());
} }
@Test
//用户注册 资产查询
public void AssetRegisterAndQuery()throws Exception {
String contractAddress = "0xf9343346a8d80c3d2f2026bf72fff3aec48a4133";
// 加载合约地址
Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)); if (asset != null) {
System.out.println("Asset address is: " + asset.getContractAddress());
// call set function
System.out.println("1、注册用户,并注册资产--------------------------------------");
String assetAccount1="0x608153babb8b00f11523f6b1b2b225ea9e7dfd8b";
String assetAccount2="0x86f17b879ce121e5d00351a120de0bd39867bf4c";
// register接口调用
TransactionReceipt receipt1 = asset.register(assetAccount1, new BigInteger("121210000") ).send();
TransactionReceipt receipt2 = asset.register(assetAccount2, new BigInteger("121121213") ).send(); System.out.println("receipt1="+receipt1.toString());
System.out.println("receipt2="+receipt2.toString()); System.out.println("2、查询用户资产----------------------------------------------");
// select接口调用
Tuple2<BigInteger, BigInteger> result1 = asset.select("abc").send();
Tuple2<BigInteger, BigInteger> result2 = asset.select("ddd").send();
System.out.println("Tuple2<BigInteger, BigInteger> result1="+result1.toString());
System.out.println("Tuple2<BigInteger, BigInteger> result2="+result2.toString());
//assertTrue("Hello, World!".equals(result));
} } // 资产交易
@Test
public void AssetTransfer() throws Exception{ String contractAddress = "0xf9343346a8d80c3d2f2026bf72fff3aec48a4133";
// 加载合约地址
Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)); String fromAssetAccount="0x608153babb8b00f11523f6b1b2b225ea9e7dfd8b";
String toAssetAccount="0x86f17b879ce121e5d00351a120de0bd39867bf4c";
BigInteger amount = new BigInteger("121210000");
if (asset != null) {
// transfer接口
TransactionReceipt receipt = asset.transfer( fromAssetAccount,toAssetAccount, amount).send();
System.out.println("AssetTest.AssetTransfer receipt="+receipt.toString());
} }
}

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

第三章 通过java SDK 实现个性化智能合约的部署与测试的更多相关文章

  1. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  2. 第三章 使用java实现面向对象 多态

    第三章 多态 一.编写父子类 1.多态是具有表现多种型生态的能力的特征,同一个实现接口,使用不同的实例而执行不同的操作 2.一个引用类型,使用不同的实例而执行不同操作.(父类引用子类对象) 使用多态的 ...

  3. 第三章 深入分析Java Web中的中文编码问题

    3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...

  4. 第三章 深入分析Java Web的中文乱码问题(待续)

    几种常见的编码格式 在Java中需要编码的场景 在Java中如何编解码 在Java Web中涉及的编解码 在JS中的编码问题 常见问题分析 一种繁简转换的实现方式

  5. Java语言程序设计(基础篇) 第三章 选择

    第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...

  6. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 【转载】Java垃圾回收内存清理相关(虚拟机书第三章),GC日志的理解,CPU时间、墙钟时间的介绍

    主要看<深入理解Java虚拟机> 第三张 P84 开始是垃圾收集相关. 1. 1960年诞生于MIT的Lisp是第一门采用垃圾回收的语言. 2. 程序计数器.虚拟机栈.本地方法栈3个区域随 ...

  8. 第三章 用SDK编译出第一个在Linux下的软件界面

    第三章 用SDK编译出第一个在Linux下的软件界面 先创建一个工程目录“mkdir project1”,进入目录,创建main.cpp文件,编写代码如下: 代码内容暂时可以先不理解,先让程序跑起来再 ...

  9. 深入Java虚拟机读书笔记第三章安全

    为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...

随机推荐

  1. 数据库----ORACLE和MYSQL数据库简介

    一.什么是数据库? 数据库(Database---DB)按照组织.储存和管理数据的仓库.(理解以下三个概念)   数据(Data)用来描述事物的记录都可称数据,如文字音乐图像.   数据库系统(Dat ...

  2. 一个不错的插件(软件).NET开发

    http://www.gcpowertools.com.cn/products/default.htm 葡萄城 先记录一下!

  3. 【水滴石穿】MyFirstRNDemo

    比较简单的项目 //index.js /** @format */ import {AppRegistry} from 'react-native'; //默认创建的类 import App from ...

  4. 字符串Hash算法比较

    基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m> ...

  5. vagrant up提示"Couldn't open file /path/to/base"的错误解决方法

    在vagrant使用命令vagrant up启动虚拟机时 出错: C:\Vagrant>vagrant up Bringing machine 'default' up with 'virtua ...

  6. 2018-8-10-WPF-编译为-AnyCPU-和-x86-有什么区别

    title author date CreateTime categories WPF 编译为 AnyCPU 和 x86 有什么区别 lindexi 2018-08-10 19:16:53 +0800 ...

  7. python 里内嵌函数是可以修改外部环境里的变量的

    python 里内嵌函数是可以修改外部环境里的变量的 关键是细节. 如果是简单变量类型, 那么不可以. 但是如果是容器类变量, 则没问题了. 代码如下: class G: pass def f(): ...

  8. docker保存容器的修改

    docker保存容器修改 通过在容器中运行某一个命令,可以把对容器的修改保存下来, 这样下次可以从保存后的最新状态运行该容器.docker中保存状态的过程称之为committing, 它保存的新旧状态 ...

  9. 关于使用JavaMail发送邮件抛出java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.<init>(Ljava异常的解决方法

    我们在使用JavaMail时有可能会如下异常: Exception in thread "main" java.lang.NoSuchMethodError: com.sun.ma ...

  10. oracle函数 SOUNDEX(c1)

    [功能]返回字符串参数的语音表示形式 [参数]c1,字符型 [返回]字符串 [说明]相对于比较一些读音相同,但是拼写不同的单词是非常有用的. 计算语音的算法: 1.保留字符串首字母,但删除a.e.h. ...