一步一步成为区块链开发者3

David Zhuang 2019-04-15 04:59:46
区块链是区块的链接,每个区块都有自己的数字签名,它包含前一个区块的数字签名,除此之外还包含一些数据(这些数据可能是某些交易)。数字签名=哈希值(Hush)。每个块不仅包含前一个块的哈希值,并且它自己的哈希值(这个哈希值是从前一个块的哈希值计算来的)。如果前一个块所包含的数据改变,那么前一个块的哈希值将被改变(因为块的哈希值是部分由块所包含的数据计算得来),这会影响之后所有的块。因此,计算和比较哈希值能帮助我们了解一个区块链是否有效,因为任何数据的改变会破坏这个区块链。 我们开始创建一个区块: public class Block { public String hash; Public String previousHash; Private String data; Private long timeStamp; //Block Constructor. Public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); } 上面的代码从字符串hash开始,我们将会从hash生成电子签名。而previousHash会储存上一个块的hush,字符串data会储存整个块的数据。有了这些基础,我们可以生成电子签名,这表示我们可以选择加密算法。在这个例子里,我们会用SHA256加密算法。我们输入SHA256如下: import java.security.MessageDigest; public class StringUtil { public static StringapplySha256(String input){ try { MessageDigest digest= MessageDigest.getInstance(“SHA-256”); byte[] hash = digest.digest(input.getBytes(“UTF-8”)); StringBuffer hexString = newStringBuffer(); // This will contain hash as hexidecimal for (int i = 0; i < hash.length;i++) { String hex =Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append(‘0’); hexString.append(hex); } return hexString.toString(); } catch(Exception e) { throw new RuntimeException(e); } } } 这里创建了一个StringUtil应用类,之后会用到。它会接收字符串及调用SHA256算法,而返回一个电子签名。因此我们能在我们的块类型里计算hash:用块内所有的部分。 public String calculateHash() { String calculatedHash =StringUtil.applySha256( previousHash + Long.toString(timeStamp) + data ); return calculatedHash; } public Block(String data,String previousHash ){ this.data= data; this.previousHash = previousHash; this.timeStamp = newDate().getTime(); this.hash= calculateHash(); }
...全文
37 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

791

社区成员

发帖
与我相关
我的任务
社区描述
区块链技术专区
区块链 技术论坛(原bbs)
社区管理员
  • 区块链技术
  • ccc908
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧