加密 Hash 值, 一个通过 SHA256 算法对区块头进行二次哈希计算而得到的数字指纹 Hash 值用于确保 blockchain 的安全 Hash 计算是计算敏感的操作, 即使在高性能电脑也需要花费一段时间来完成计算(这也就是为什么人们购买高性能 GPU 进行比特币挖矿的原因)blockchain 架构设计有意使 Hash 计算变得困难, 这样做是为了加大新增一个 block 的难度, 进而防止 block 在增加后被随意修改
- /**
- <p> 创建新区块 </p>
- @param previousHash
- @param data
- @return
- */
- public static Block newBlock(String previousHash, String data) {
- Block block = new Block("", previousHash, data.getBytes(), Instant.now().getEpochSecond());
- block.setHash();
- return block;
- }
- /**
- 计算区块 Hash
- <p>
- 注意: 在准备区块数据时, 一定要从原始数据类型转化为 byte[], 不能直接从字符串进行转换
- @return
- */
- private void setHash() {
- byte[] prevBlockHashBytes = {};
- if (StringUtils.isNoneBlank(this.getPrevBlockHash())) {
- prevBlockHashBytes = new BigInteger(this.getPrevBlockHash(), 16).toByteArray();
- }
- byte[] headers = ByteUtils.merge(
- prevBlockHashBytes,
- this.getData().getBytes(),
- ByteUtils.toBytes(this.getTimeStamp()));
- this.setHash(DigestUtils.sha256Hex(headers));
- }
创建区块链
区块链本质上是一种有序反向链接链表的数据结构这意味着, block 按照插入的顺序存放, 同时每个 block 都保存指向上一个 block 的链接这种结构保证可以快速获取最新插入的 block 同时获取它的 hash 值这种结构保证可以快速获取最新插入的 block 同时 (高效地) 获取它的 hash 值
区块链数据结构
- /**
- <p> 区块链 </p>
- @author wangwei
- @date 2018/02/02
- */
- public class Blockchain {
- @Getter
- private List<Block> blockList;
- public Blockchain(List<Block> blockList) {
- this.blockList = blockList;
- }
- }
添加区块
新增一个添加区块链的方法
- /**
- <p> 添加区块 </p>
- @param data 数据
- */
- public void addBlock(String data) {
- Block previousBlock = blockList.get(blockList.size() - 1);
- this.addBlock(Block.newBlock(previousBlock.getHash(), data));
- }
- /**
- <p> 添加区块 </p>
- @param block 区块
- */
- public void addBlock(Block block) {
- this.blockList.add(block);
- }
创世区块
在添加区块之前, 区块链必须有个创世区块, 在 Block 中新增创世区块方法:
- /**
- <p> 创建创世区块 </p>
- @return
- */
- public static Block newGenesisBlock() {
- return Block.newBlock("","Genesis Block");
- }
创建区块链
再在 Blockchain 中新增创建区块链的方法:
- /**
- <p> 创建区块链 </p>
- @return
- */
- public static Blockchain newBlockchain() {
- List<Block> blocks = new LinkedList<>();
- blocks.add(Block.newGenesisBlock());
- return new Blockchain(blocks);
- }
测试运行
- /**
- 测试
- @author wangwei
- @date 2018/02/05
- */
- public class BlockchainTest {
- public static void main(String[] args) {
- Blockchain blockchain = Blockchain.newBlockchain();
- blockchain.addBlock("Send 1 BTC to Ivan");
- blockchain.addBlock("Send 2 more BTC to Ivan");
- for (Block block : blockchain.getBlockList()) {
- System.out.println("Prev. hash:" + block.getPreviousHash());
- System.out.println("Data:" + block.getData());
- System.out.println("Hash:" + block.getHash());
- System.out.println();
- }
- }
- }
- /**
- 输出如下信息:
- */
- Prev. hash:
- Data: Genesis Block
- Hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4
- Prev. hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4
- Data: Send 1 BTC to Ivan
- Hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04
- Prev. hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04
- Data: Send 2 more BTC to Ivan
- Hash: 42f78d6a86f88aa9b5b10e468494dfd1b3f558a9fb74a01eb348c2cbfc5d000a
给大家推荐一个 java 内部学习群: 725633148, 进群找管理免费领取学习资料和视频没有错就是免费领取! 大佬小白都欢迎, 大家一起学习共同进步!
总结
我们构建了一个非常简单的区块链原型: 它只是一个块的数组, 每个块都与前一个块有连接 实际的区块链要复杂得多
缺少交易信息: 我们的区块链还没有任何交易信息
缺少工作量证明: 我们的生产区块非常简单快捷, 实际的区块链中, 生产一个区块需要进行大量的计算
缺少共识机制: 区块链是一个非单一决策者的分布式数据库 因此, 一个新的区块必须得到网络的其他参与者的确认和批
在以后的文章中, 我们将介绍这些功能
来源: http://www.bubuko.com/infodetail-2538226.html