FISCO BCOS 2.9.1 从0部署到简单使用CRUD接口
前言
具体请参考官方文档
1. 部署fisoc bcos 2.9.1环境
1.1 安装centos依赖
sudo yum install -y openssl openssl-devel
1.2 创建fisco目录和脚本
使用gittee下载较快
curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod u+x build_chain.sh
1.3 搭建节点并启动fisco链
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545
启动fisco节点
bash nodes/127.0.0.1/start_all.sh
1.4 检查进程是否启动
ps -ef | grep -v grep | grep fisco-bcos
1.5 检查日志输出
tail -f nodes/127.0.0.1/node0/log/log* | grep connected
tail -f nodes/127.0.0.1/node0/log/log* | grep +++
2 配置使用控制台
2.1 安装依赖
sudo yum install -y java java-devel
cd ~/fisco && curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh && bash download_console.sh
2.2 启动并使用控制台
cd ~/fisco/console && bash start.sh
输出以下结果代表成功:
=============================================================================================
Welcome to FISCO BCOS console(2.6.0)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
________ ______ ______ ______ ______ _______ ______ ______ ______
| \| \ / \ / \ / \ | \ / \ / \ / \
| $$$$$$$$ \$$$$$$| $$$$$$\| $$$$$$\| $$$$$$\ | $$$$$$$\| $$$$$$\| $$$$$$\| $$$$$$\
| $$__ | $$ | $$___\$$| $$ \$$| $$ | $$ | $$__/ $$| $$ \$$| $$ | $$| $$___\$$
| $$ \ | $$ \$$ \ | $$ | $$ | $$ | $$ $$| $$ | $$ | $$ \$$ \
| $$$$$ | $$ _\$$$$$$\| $$ __ | $$ | $$ | $$$$$$$\| $$ __ | $$ | $$ _\$$$$$$\
| $$ _| $$_ | \__| $$| $$__/ \| $$__/ $$ | $$__/ $$| $$__/ \| $$__/ $$| \__| $$
| $$ | $$ \ \$$ $$ \$$ $$ \$$ $$ | $$ $$ \$$ $$ \$$ $$ \$$ $$
\$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$
=============================================================================================
会返回如下三个值,后期会用到第二个contract address进行合约测试。
使用call来进行调用合约,具体格式如下:
call sol合约名称(如HelloWorld) contract address 调用函数 输入数据
调用helloWorld的set示例:
call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 set "Hello, FISCO BCOS"
针对多个输入数据,只需要没输入一个数据再加一个空格继续输入即可,如:
call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 set "Hello, FISCO BCOS" “aa"
3 创建idea java 项目
3.1 创建gradle或者maven项目
- 首先创建项目,选择gardle或者maven都可以,目前推荐使用jdk14版本,jdk11版本目前有一些小问题,针对fisco bcos 2.9.1版本
由于改版的原因,不再使用文档中的compile,采用implementation 进行导入
implementation ('org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:2.9.1')
对于maven项目,在pom导入依赖刷新
<dependency>
<groupId>org.fisco-bcos.java-sdk</groupId>
<artifactId>fisco-bcos-java-sdk</artifactId>
<version>2.9.1</version>
</dependency>
3.2 配置证书
- 打开服务器,跳转到 /root/fisco/console路径下,复制 conf证书文件夹,存放到idea中。
3.3 编译合约 生成abi bin 和java
- 首先回到console文件夹,使用sol2java.sh脚本进行编译
cd ~/fisco/console
- -p指生成的最终Java文件位置(在sdk中)
- -s指编译合约名
我们所有的合约最终都需要存放在/root/fisco/console/contracts/solidity文件下,然后再进行编译。
编译所有sol文件如下:
bash sol2java.sh -p org
编译指定sol文件如下:
bash sol2java.sh -p org -s HelloWorld.sol
编译完成后可以进入sdk文件夹中,找到这三个文件夹:
如果是初始环境的话,这一步可能会出现如下的问题,导致java文件夹一直生成不出来:
tar (child): bzip2: Cannot exec: No such file or directory
原因是部分压缩包无法解压,下载对应压缩包即可
yum -y install bzip2
将jave文件夹放入 main中的java文件夹下:
3.4 idea配置
将生成的abi,bin文件放入main文件的resources中,并将conf中的config-example文件放入resources中,并创建log4j.propertise。
log4j.propertise文件内容如下:
#
# Copyright 2014-2020 [fisco-dev]
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
# in compliance with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
# or implied. See the License for the specific language governing permissions and limitations under
# the License.
#
#
### set log levels ###
log4j.rootLogger=DEBUG, file
### output the log information to the file ###
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern='_'yyyyMMddHH'.log'
log4j.appender.file.File=./log/console.log
log4j.appender.file.Append=true
log4j.appender.file.filter.traceFilter=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C{1}.%M(%L) | %m%n
###output the log information to the console ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C{1}.%M(%L) | %m%n
修改example.toml的内容,将peers中的地址改为服务器地址:
完成后对项目进行构建,没什么问题表示基本配置已经完成,接下来则是写代码进行调用合约了。
4 合约调用table
4.1 初始化sdk
在java目录下创建一个java项目,或者在test下创建测试也可以。
项目创建完成后,在class类里创建全局变量:
public final String configFile = School_fisco.class.getClassLoader().getResource("config-example.toml").getPath();
// 初始化BcosSDK
BcosSDK sdk = BcosSDK.build(configFile);
// 为群组1初始化client
Client client = sdk.getClient(Integer.valueOf(1));
CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
4.2 简单的查询和添加,其他函数调用类似
以tabletest为例,进行简单调用
- 对于select,首先打开TableTest.java,搜索select,发现只有如下的函数:
所以针对上述函数,首先读取表格,然后调用函数select搜索得到数据,转为相应的输出数据即可,具体代码如下:
//查询tabletest的表格
public ArrayList<List<String>> selectTableT(String name){
//读取调用表
TableTest tableTest = null;
Tuple3<List<String>, List<BigInteger>, List<String>> strs =null;
try {
tableTest= TableTest.deploy(client, cryptoKeyPair);
strs = tableTest.select(name);
} catch (ContractException e) {
e.printStackTrace();
}
ArrayList<List<String>> list=new ArrayList<List<String>>();
int len = strs.getValue1().size();
for(int i=0;i<len;i++){
List<String> list_str= new ArrayList<>();
list_str.add(strs.getValue1().get(i));
list_str.add(String.valueOf(strs.getValue2().get(i)));
list_str.add(strs.getValue3().get(i));
}
return list;
}
- 对于insert,update和remove都类似,返回是一个BigInteger数据,查询java文件后,可以看到我们需要调用的函数有两个:
具体函数和上述代码类似,只是需要将select修改为insert和对应的数据,然后通过得到的返回值调用output函数,判断调用是否成功以及错误代码。
具体代码如下:
//添加数据
public BigInteger insertTable(String name, BigInteger item_id,String item_name){
//读取调用school表
TableTest tableTest =null;
try {
tableTest= TableTest.deploy(client, cryptoKeyPair);
} catch (ContractException e) {
e.printStackTrace();
}
TransactionReceipt tran= tableTest.insert(name,item_id,item_name);
Tuple1<BigInteger> big = tableTest.getInsertOutput(tran);
return big.getValue1();
}
5. 小结
至此,基本上的简单CRUD进行fisco bcos 合约开发就完成了,目前只是完成了示例,之后我会在对自己创建新的sol合约下进行介绍,主要包括使用CRUD合约中可能出现的问题,对于java调用这方面按照上述介绍,增删改查只需要改改代码即可。
做为刚刚入门学习fisco bcos的萌新,对于fisco bcos还有很多不了解的地方,如果以上文档有不合理的地方,请指正。