java对区块链有用吗_区块链能用java实现吗?

区块链中每个区块包含以下基本内容:索引(index),Unix时间戳(timestamp),数据块(data)(包括交易,文字,申明,奖励等任何和合适的内容),证明或工作量证明(proof稍后解释)以及前一个区块的Hash值,Hash

用来链接数据块,同时确保数据块不被非法修改。

以下是一个区块的结构:

publicclassBlock {intiIndex; //索引 String sProof;

//工作量证明,在这个例子里面,其实就是一个经过验证的正确的成语String sPreviousHash; //前一个区块的Hash值 Timestamp

tsCreateTime; //区块创建时间戳/*数据块 * * 用户每接上一个成语,会得到系统10元钱的奖励,同时会赢得前面一个用户的2元钱 *

数据区同时需要记录自己的用户名和回答出上一个成语的用户名 * * */ String sSender; //回答出上一个成语的用户名 String

sRecipient; //回答出当前这个成语的用户名finalintiMoneyAward=10;

//系统奖励,数额固定finalintiMoneyWin=2; //赢取奖励,数额固定public Block(){ }}

区块链实现Blockchain类

import java.util.*;importblockchain.Block;publicclass BlockChain

{//用来存储区块private List lBlockchain=new ArrayList<>[]; public

BlockChain(){ }//创建新块public Block NewBlock(){ Block bRet=null;//在这里创建一个新块return

bRet; }//Hash 一个块public String Hash(Block block){ String sHash=null;//在这里Hash

一个块return sHash;}//其他方法//....}

Blockchain类用来管理链条,它能存储和更新链数据,加入新块等等,下面我们来进一步增加和完善里面的一些方法

创建新块和创世块

当一个用户按照成语接龙的规则,对上上一个成语,并且系统验证这成语正确(工作量被证明)。这个时候我们就可以创建一个新块,并且加到链里面。

一旦工作量证明确认,并且上一个块hash 生成后,就可以简单调用函数创建一个新块了。

创建新块方法如下:

//创建新块publicBlock NewBlock(inti,String proof,String hash,Timestamp c,String

sender,String recipient){ Block bRet=null;//在这里创建一个新块 bRet = new

Block(i,proof,hash,c,sender,recipient);return bRet; }

这里,我们需要提一下创世块的概念,创世块是区块链的第一个区块,它是没有前区块的。逻辑上只在第一个用户第一次启动系统的时候,才需要创建创世块,后面的都是通过同步获得。创世块索引是0,同样需要给它加上一个工作量证明,我们这里就是初始成语“海阔天空”,因为没有前面的块,所以hash=””,同时给一个固定的创建时间。方法如下:

//创始块的创建,创世块是一个块,必须是固定的信息//逻辑上来说,只有在区块链产品的第一个用户第一次启动的时候,才会需要创建创世块publicBlock

CreateFirstBlock(){try{ Timestamp t=new Timestamp((new

java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse("2018-01-01

01:01:01").getTime());return NewBlock(0,"海阔天空","",t,"","");}catch(Exception

e){returnnull; } }

这里顺便贴上生成块的Hash字符串的方法:

//Hash 一个块publicstaticString Hash(Block block){ String sHash=null;//在这里Hash

一个块 String

s=block.sPreviousHash+block.sProof+block.sRecipient+block.sSender+block.tsCreateTime.toString();sHash

= MD5(s);return sHash; }

publicstaticString MD5(String key) {char hexDigits[] = {'0', '1', '2', '3',

'4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E','F' };try {byte[] btInput

= key.getBytes();// 获得MD5摘要算法的 MessageDigest 对象 java.security.MessageDigest

mdInst = java.security.MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要

mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int

j = md.length;char str[] = newchar[j * 2];int k = 0;for (int i = 0; i < j;

i++) {byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf];

str[k++] = hexDigits[byte0 & 0xf]; }returnnew String(str); } catch

(Exception e) {returnnull; } }

理解工作量证明

新的区块生成,必须依赖工作量证明算法(PoW)来构造。

PoW的目标是找出一个能被公认的方法,来证明你所从事工作的正确性。

在当前区块链应用中,PoW经常是被设计成通过寻找某一个符合特定条件的数字来证明,这个数字可能很难计算出来,但很容易验证。

这就是工作量证明的核心思想。

为了方便理解,举个例子:

假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以两个零 ‘00’ 结尾,即 hash(x * y) = xxxxxx...00。设变量

x = 5,求 y 的值?

用Java实现如下:

intx=5;int y=0;while(true){ String

md5=BlockChain.MD5(""+(x*y));if(md5.charAt(md5.length()-1)=='0'){break; }

y+=1;}

最后得出 y=69

因为MD5(5*69)=D81F9C1BE2E08964BF9F24B15F0E4900

随着区块链应用的扩展,应该有更多合理的工作量证明算法。

在比特币中,使用称为Hashcash的工作量证明算法,它和上面的问题很类似。矿工们为了争夺创建区块的权利而争相计算结果,甚至动用N台电脑,这就是称之为挖矿。通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,会获得比特币奖励。当然,一旦计算出来,会非常容易验证这个结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值