區塊鏈是什么
分布式賬本系統,由一個個區塊相互連接組成。
每一個區塊是由
區塊頭和區塊體構成
區塊頭有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);
}
}