搭建FISCO-BCOS区块链环境(参考FISCO-BCOS使用文档),操作系统为CentOS7.2。在此使用单个区块链节点来模拟区块链环境。
一键安装说明URL:https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master/sample
安装配置Java环境(jdk1.8),gradle环境(gradle-2.1或以上版本)。详情请查看官网:
jdk官网URL:http://www.oracle.com/technetwork/java/javase/downloads/index.html
gradle官网URL:http://www.gradle.org/downloads
Windows下将Depot服务源码导入Eclipse(本说明文档以Eclipse为例)。DepotSample工程为gradle工程,导入时通过“Gradle Project”导入。
DepotSample案例下载URL:https://github.com/FISCO-BCOS/evidenceSample/releases/tag/v1.0.0
在DepotSample工程的/depotSample/src/main/resources/applicationContext.xml文件配置区块链节点信息。
<bean id="channelService" class="org.bcos.channel.client.Service">
<property name="orgID" value="user" /><!-- 配置角色名称 -->
<property name="allChannelConnections">
<map>
<entry key="user"><!-- 配置本角色的区块链节点列表-->
<bean class="org.bcos.channel.handler.ChannelConnections">
<property name="connectionsStr">
<list>
<value>node@127.0.0.1:8541</value><!-- 格式:节点名@节点所在服务器IP地址:channelPort端口(节点名可以为任意名称)-->
</list>
</property>
</bean>
</entry>
</map>
</property>
</bean>
在DepotSample工程的/depot/src/main/resources/db.properties文件配置数据库信息。
db.ip=127.0.0.1
db.port=3306
db.user=root
db.password=123456
db.database=depot
智能合约语法及细节请参考solidity官方文档。
这里使用evidence_toolkit工具包contracts目录下的合约Evidence.sol进行说明。
合约路径:/evidence_toolkit/contracts/Evidence.sol
以下粘贴部分代码,详细代码参看文件。在Evidence.sol合约中创建埋点事件newSignaturesEvent,对证据ID(id)、证据hash(evi)、证据签名信息(v、r、s)、工厂合约地址(addr)进行埋点,然后在Evidence方法中调用newSignaturesEvent。
当发送创建证据(newEvidence)业务交易时,会执行Evidence方法,从而将埋点信息埋入区块中。
event newSignaturesEvent(string evi, string info, string id, uint8 v, bytes32 r, bytes32 s,address addr);
function Evidence(string evi, string info, string id, uint8 v, bytes32 r, bytes32 s, address addr, address sender) public {
signersAddr = addr;
if(CallVerify(sender))
{
evidence = evi;
evidenceInfo = info;
evidenceId = id;
_v.push(v);
_r.push(r);
_s.push(s);
signers.push(sender);
newSignaturesEvent(evi,info,id,v,r,s,addr);
}
else
{
errorNewSignaturesEvent(evi,info,id,v,r,s,addr);
}
}
安装solidity合约编译器。这里使用fisco-solc,将下载下来的fisco-solc拷贝到Linux的/usr/bin目录下,执行命令chmod +x fisco-solc,即可安装完成。
将下载的存证案例工具包evidence_toolkit上传到Linux。
将自己创建的业务合约复制到evidence_toolkit/contracts目录下。(编译前需要在此文件夹下需要先删掉其他无关合约)。
在evidence_toolkit/conf/applicationContext.xml文件中配置区块链节点信息(参考4.3)。
进入evidence_toolkit/bin目录,执行以下命令编译合约。
./compile.sh org.bcos.depot.contract
编译后会在/evidence_toolkit/output/org/bcos/depot/contract/目录生成合约的对应java解析文件。
开发者根据自己埋点的数据创建业务数据表。
这里以存证业务为例,创建证据信息表t_evidence_info,字段包括自增主键(id),交易发生所在块高(block_height),埋点事件名(event)、证据ID(evidence_id)、证据hash(evidence_hash)、证据签名信息(sign_data)、工厂合约地址(factory_address)。
CREATE TABLE t_evidence_info (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
block_height int NOT NULL COMMENT '交易所在块高',
event varchar(128) NOT NULL COMMENT 'event',
evidence_id varchar(128) NOT NULL COMMENT '证据ID',
evidence_hash varchar(256) NOT NULL COMMENT '证据hash',
sign_data varchar(256) DEFAULT '' COMMENT '签名数据',
factory_address varchar(256) DEFAULT '' COMMENT '工厂合约地址',
PRIMARY KEY (id)
) COMMENT='证据信息表' ENGINE=InnoDB DEFAULT CHARSET=utf8;
将5.2.6、5.3、5.4生成的文件放DepotSample工程以下目录。开发者根据自己的业务新建的文件也需要放在以下目录:
合约编译的Java文件:/depot/src/main/java/org/bcos/depot/contract/Evidence.java
业务数据表:/depot/script/db/t_evidence_info.sql
数据表对应Java实体类:/depot/src/main/java/org/bcos/depot/entity/EvidenceInfo.java
/depot/src/main/java/org/bcos/depot/entity/EvidenceInfoExample.java
数据表对应接口Dao:/depot/src/main/java/org/bcos/depot/mapper/EvidenceInfoDao.java
数据表对应Mapper文件:/depot/src/main/resources/mappers/EvidenceInfoDao.xml
开发者对自己的埋点业务数据进行解析时,需要重写DepotSample服务接口DepotFacade中的handleReceipt方法,将交易回执中的埋点数据解析存入到业务表中。
这里以存证业务为例,通过get埋点事件名"getNewSignaturesEventEvents"从交易回执"receipt"中获取证据id、证据hash、证据签名信息、工厂合约地址,存入到t_evidence_info表中。
接口实现类:/depot/src/main/java/org/bcos/depot/facade/impl/DepotFacadeImpl.java
实现类说明:①接口实现类参数为交易回执信息(receipt)、初始化web3j、当前交易所在块高(blockNumber)
②接口实现类返回类型为boolean,当解析存储成功返回true,失败则返回false
③实现类中首先通过合约对应Java类的load()方法实例化一个对象,由该对象通过埋点的事件名从交易回执信息(receipt)中获取埋点信息,然后解析存入数据库
@Override
public boolean handleReceipt(TransactionReceipt receipt, Web3j web3j, BigInteger blockNumber) {
try {
ECKeyPair ecKeyPair = Keys.createEcKeyPair();
evidence = Evidence.load("", web3j, Credentials.create(ecKeyPair), BCConstant.gasPrice, BCConstant.gasLimit);
List<NewSignaturesEventEventResponse> newSignaturesList = evidence.getNewSignaturesEventEvents(receipt);
logger.info("depot newSignaturesList.size:{}", newSignaturesList.size());
for (NewSignaturesEventEventResponse newSignatures : newSignaturesList) {
EvidenceInfo evidenceInfo = new EvidenceInfo();
evidenceInfo.setBlockHeight(blockNumber.intValue());
evidenceInfo.setEvent("newSignaturesEvent");
evidenceInfo.setEvidenceId(newSignatures.id.getValue());
evidenceInfo.setEvidenceHash(newSignatures.evi.getValue());
SignatureData signatureData = new SignatureData((byte) newSignatures.v.getValue().intValue(), newSignatures.r.getValue(), newSignatures.s.getValue());
String signData = Tools.signatureDataToString(signatureData);
evidenceInfo.setSignData(signData);
evidenceInfo.setFactoryAddress(newSignatures.addr.toString());
evidenceInfoDao.insert(evidenceInfo);
logger.info("depot newSignaturesEvent:{}", evidenceInfo.toString());
}
return true;
} catch (Exception e) {
logger.error("handleReceipt OnError, {}", e.getMessage());
return false;
}
}
通过gradle run编译DepotSample工程,生成depot文件夹,将其打包部署到Linux。部署前请确认是否正确配置区块链节点信息和数据库信息。
编译生成的depot目录:
depot/apps:depot工程编译后生成的jar包
depot/conf:depot工程jar包依赖的配置文件
depot/db:depot工程表信息
depot/lib:depot工程依赖的jar包
control.sh:执行脚本
区块链节点信息:depot/conf/applicationContext.xml
数据库信息:depot/conf/db.properties
在自己的数据库新建数据库(例子:depot)。
(存证业务跳过这一步)进入/depot/db/目录,在depot_tables.list里添加要初始化的表文件名,在depot_tables.sh里配置数据库信息(参考如下):
depot_tables.list:
#!/bin/sh
#blockheight表为默认表,不可删除
source blockheight.sql;
#业务数据表部分,根据实际业务进行修改
source t_evidence_info.sql;
depot_tables.sh:
#!/bin/sh
#dbIP
IP="127.0.0.1"
#dbPORT
PORT="3306"
#dbUser
DBUSER="root"
#dbPass
PASSWD="123456"
#dbName
DBNAME="depot"
#connect to database then execute init
cat depot_tables.list | mysql --user=$DBUSER --password=$PASSWD --host=$IP --database=$DBNAME --port=$PORT --default-character-set=utf8;
exit
在/depot/db/目录下执行以下命令,即可在对应数据库初始化表(警告可忽略)。
./depot_tables.sh
进入/depot目录,启动depot服务。启动后,服务会定时查询块高信息,当有交易发生,块高增加时,会通过接口实现类DepotFacadeImpl解析交易回执信息,如果交易回执信息中存在埋点事件,会将埋点业务数据解析存入数据库。
启动depot服务:./control.sh start
停止depot服务:./control.sh stop
重启depot服务:./control.sh restart
开发者根据自己的业务发起交易。
这里以存证案例的创建证据(newEvidence)业务为例,使用存证案例工具包evidence_toolkit发起交易。发起交易前先确认evidence_toolkit/conf/applicationContext.xml文件中是否正确配置区块链节点信息(参照4.3)。
进入/evidence_toolkit/bin目录,执行以下命令部署存证工厂合约:
./evidence deploy user.jks '123456' '123456'
上个命令会返回一个工厂合约地址,替换以下命令中的deployAddress,发起交易,新建证据:
./evidence new user.jks '123456' '123456' 'deployAddress' '1712071OA03998263894637100018685' '5e79e0e7a16b7804a59ad3de9b0ec0f817d225c24bb6f34a7278756fb45df724'
depot服务启动后,会在/depot/logs目录下生成日志文件depot.log,通过以下命令即可查看相关日志信息。
```
查看日志:tail -f depot.log
```
数据查看
使用以下命令配置数据库信息后,连接数据库,即可查询相关数据信息:
mysql -h ip -P port -u user -ppassword
例子:mysql -h 127.0.0.1 -P 3306 -u root -p123456
执行命令时提示“:没有那个文件或目录”
可能是Windows文件和Linux文件会有差异,特别是用tab代替空格这种情况会造成脚本无法执行,使用以下命令进行修改:
dos2unix 文件名
执行命令时提示“权限不够” 使用以下命令进行授权
chmod +x 文件名
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。