区块链是什么
分布式账本系统,由一个个区块相互连接组成。
每一个区块是由
区块头和区块体构成
区块头有index(索引),当前区块hash值,前一区块hash值,时间搓,工作量正面(一个随机数)
区块体主要用来存储我们需要存储的信息
package com.fj.blockchainmy.model;
import lombok.Data;
/**
* @author: yangchun
* @description:
* @date: Created in 2019-11-12 13:46
*/
@Data
public class Block {
private BlockHeader blockHeader;
private BlockBody blockBody;
}
package com.fj.blockchainmy.model;
import lombok.Data;
import java.util.List;
/**
* @author: yangchun
* @description:
* @date: Created in 2019-11-12 13:48
*/
@Data
public class BlockHeader {
/**
* 区块索引号
*/
private int index;
/**
* 当前区块的hash值,区块唯一标识
*/
private String hash;
/**
* 生成区块的时间戳
*/
private long timestamp;
/**
* 工作量证明,计算正确hash值的次数
*/
private int nonce;
/**
* 前一个区块的hash值
*/
private String previousHash;
}
package com.fj.blockchainmy.model;
import lombok.Data;
/**
* @author: yangchun
* @description:
* @date: Created in 2019-11-12 13:48
*/
@Data
public class BlockBody {
private Object data;
}
当前hash值是前一个区块值加上区块体加上随机数利用哈希函数计算出来的,所以当前区块和前一区块内容紧密相连系,如果篡改其中一个区块,在区块链效验时是无法通过的。
计算公式如下
CryptoUtil.SHA256(previousHash + JSON.toJSONString(currentTransactions) + nonce);
下面我来简单写一个如何添加区块,我们目前都是先将区块暂时存在内存中后面会逐步修改看起来更加正规。
package com.fj.blockchainmy.service;
import com.fj.blockchainmy.model.Block;
import com.fj.blockchainmy.model.BlockBody;
import com.fj.blockchainmy.model.BlockHeader;
import com.fj.blockchainmy.model.Transaction;
import java.util.ArrayList;
import java.util.List;
/**
* @author: yangchun
* @description:
* @date: Created in 2019-11-12 13:59
*/
public class BlockService {
/**
* 区块链存储结构
*/
private List<Block> blockChain = new ArrayList<Block>();
private Block createNewBlock(int nonce, String previousHash, String hash, List<Transaction> blockTxs) {
BlockHeader blockHeader = new BlockHeader(blockChain.size()+1,hash,System.currentTimeMillis(),nonce,previousHash);
BlockBody blockBody = new BlockBody(blockTxs);
Block block = new Block(blockHeader,blockBody);
if (addBlock(block)) {
return block;
}
return null;
}
/**
* 添加新区块
*
* @param newBlock
*/
public boolean addBlock(Block newBlock) {
if (isValidNewBlock(newBlock, getLatestBlock())) {
blockChain.add(newBlock);
return true;
}
return false;
}
public boolean isValidNewBlock(Block newBlock, Block latestBlock) {
return true;
}
public Block getLatestBlock() {
return blockChain.get(blockChain.size()-1);
}
}