Java语言实现区块链(二)

一、增加hash值

(1)定义Block类,保存区块信息。

// 区块
public class Block {
    private int id; // 区块ID
    private String content; // 区块数据
    private String hash; // 区块哈希

    public Block() {}

    public Block(int id, String content, String hash) {
        this.id = id;
        this.content = content;
        this.hash = hash;
    }

    省略setter和getter方法....

}

(2)修改NoteBook类。

第一步:把List集合的数据类型修改为Block。

// 保存区块的集合
//private List<String> blocks = new ArrayList<>();
private List<Block> blocks = new ArrayList<>();

第二步:修改addGenesisBlock和addBlock方法。

//blocks.add(data);
blocks.add(new Block(
    blocks.size() + 1,
    data,
    HashUtils.sha256(data)
));

第三步:修改showList方法的返回值。

//public List<String> showList() {
public List<Block> showList() {
    return blocks;
}

第四步:修改NoteBook构造函数。

//JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, String.class);
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, Block.class);

(3)导入utils工具。

第一步:下载压缩文件并解压缩。

下载地址:https://pan.baidu.com/s/1Pe0IyTomPiSLKLuq9-zXDA  提取码:3grn

第二步:拷贝HashUtils.java和RSAUtils.java文件到项目的utils包下。

第三步:在build.gradle文件的dependencies节点中添加以下配置信息。

扫描二维码关注公众号,回复: 6108628 查看本文章
// https://mvnrepository.com/artifact/commons-io/commons-io
compile group: 'commons-io', name: 'commons-io', version: '2.5'

(4)修改前台页面,使用表格显示集合数据。

第一步:定义表格。

<table class="table">
    <thead>
        <tr>
            <th>ID</th>
            <th>内容</th>
            <th>哈希值</th>
        </tr>
    </thead>
    <tbody id="tbody"></tbody>
</table>

第二步:修改showList函数,遍历集合数据,然后拼接成表格行。

// 展示结果
//$("#result").html(data);
for (var i = 0; i < data.length; i++) {
    var block = data[i];
    var id = block.id;
    var content = block.content;
    var hash = block.hash;
    $("#tbody").append("<tr><th >" + id + "</th><td>" + content + "</td><td>" + hash + "</td></tr>")
}

 

二、校验哈希值

(1)修改页面

第一步:把“显示数据”按钮改为“校验数据按钮”,并指定事件。

<!--<button type="button" class="btn btn-default" onclick="showList()">显示数据</button>-->
<button type="button" class="btn btn-default" onclick="check()">校验数据</button>

第二步:定义check函数。

function check() {
    loading.baosight.showPageLoadingMsg(false) // 显示进度条
    // 发起请求
    $.get("check", function (data) {
        // 展示操作结果
        $("#result").html(data)
        // 隐藏进度条
        loading.baosight.hidePageLoadingMsg();
     })
}

(2)修改BlockController,添加check处理函数。

// 校验数据
@RequestMapping(value = "/check", method = RequestMethod.GET)
public String check() {
    NoteBook noteBook = new NoteBook();
    String result = noteBook.check();
    if (StringUtils.isEmpty(result)) {
        return "数据是安全的";
    }
    return result;
}

校验规则:把List集合中的每一个Block区块取出来,通过content字段生成一个哈希,然后再使用该哈希与它存储的hash字段的值进行比较。如果它们是一样的,代表数据没有被篡改。否则代表数据有问题。

(3)修改NoteBook,定义一个check方法。

// 校验数据
public String check() {
    StringBuilder sb = new StringBuilder();
    // 校验hash
    for (Block block : blocks) {
        String hash = block.getHash();
        String tempHash = HashUtils.sha256(block.getContent());
        if (!tempHash.equals(hash)) {
            sb.append("编号为" + block.getId() + "的区块哈希有问题,请检查...<br>");
        }
    }
    return sb.toString();
}

(4)运行程序测试代码。

猜你喜欢

转载自blog.csdn.net/zhongliwen1981/article/details/89706938