当前位置:网站首页 > Java教程 > 正文

区块链教程java



本系列教程的目的是帮助您了解如何开发区块链技术。

在本教程中,我们将:

面向对象编程有基本的了解

需要注意的是,本教程并没有生产区块链的完整功能。相反,这是一个概念实现的证明,以帮助您理解区块链,为以后的教程打基础。

  教程中使用 Java,当然你可以使用其他的面向对象编程语言。 开发工具是 Eclipse,同样你可以使用其他的文本编辑器(虽然你可能会错过很多好用的功能 。

  在Eclipse中创建一个(file> new>)Java项目。我将把我的项目称为“ noobchain ”,并使用相同的名称创建一个新类。


  哈希=数字签名

  每个区块不仅包含它前一个区块的哈希,也包含它自己的哈希(根据前一个区块的哈希和自己区块的数据计算得到)。如果前一区块的数据变化,则其哈希也变化(因为它的计算也与区块的数据有关),然后影响后面所有区块的哈希。计算和比较哈希可以检查区块链是否无效。

  这意味着什么?更改区块链中的任何数据,将更改签名并破坏区块链。

  所有我们先创建构造区块链的Block类:

  可以看到,我们的区块Block包含一个String类型的hash作为数字签名。变量previousHash作为前一个区块的hash,String类型的data作为区块数据。

  接下来我们需要一种方法生成数字签名:

  有很多密码算法供你选择,然而SHA256最为合适,我们可以导入java.security.MessageDigest来使用该算法。

  下面我们需要使用SHA256算法,所以我们创建一个StringUtil类并在其中定义了一个方法:

  不用担心看不懂,你只需要知道,它需要输入一个字符串,调用SHA256算法,然后就返回一个字符串签名。

  现在让我们在Block类中创建一个新方法,调用SHA256算法来计算哈希。我们必须根据不希望被篡改的所有区块来计算hash,所以我们的区块包括 ,

  把该方法添加到Block的构造函数中:

  是时候做些测试了

  在NoobChain类中创建些区块并打印它的哈希到屏幕上,确认它正常工作。

  第一个区块叫做初始区块,因为它没有前驱区块,所以我们把它前一区块的哈希设为“0”.

  输出如下:

(你的是不一样的,因为你的时间戳是不同的)

  现在每一个区块有自己的基于它自己的信息和前一区块数字签名的数字签名。

  现在它还不是区块链,所以我们存储我们的区块到ArrayList,然后导入gson包将其转化为Json来查看。

  现在我们的输出应该看起来接近我们所期望的区块链了。

  现在我们需要一种方法来验证区块链的完整性。

  在NoobChain类中创建一个isChainValid()方法,遍历所有的区块并比较它们的哈希。这个方法需要验证当前区块的哈希值是否等于计算得到的哈希值,前一区块的哈希值是否等于当前区块的哈希值。

  区块链中的区块有任何改变将导致该方法返回false。

  在比特币网络节点上共享其区块,并且网络接受最长的有效链。什么阻止某人篡改旧块中的数据然后创建一个全新的更长的区块链并将其呈现给网络?工作量证明。哈希工作量证明系统意味着创建新的区块需要相当长的时间和计算能力。因此攻击者需要有比其他所有同行加起来还有多的算力。

  我们要让矿机完成工作量证明机制,通过在区块中尝试不同的变量值直到它的哈希值以某个固定数量的0开头。

  在calculateHash()方法中添加一个整数类型变量nonce,添加一个mineBlock()方法。

  实际上每个矿机都从一个随机点开始迭代。一些矿机甚至尝试随机的nonce的值。更困难的可能不仅仅是整数。MAX_VALUE情况下,矿机可以尝试改变时间戳。

  mineBlock()方法输入一个整数变量difficulty,这是矿机必须找到的0的数量。在大多数计算机上可以立即处理1或2个0的情况,我建议用4到6个0进行测试。在写本文时,莱特币的难度大约是.

  我们将difficulty作为静态变量添加到NoobChain类:

  我们应该更新NoobChain类来触发每个新区块的mineBlock()方法。isChainValid()方法应该检查每个区块是否通过采矿得到哈希值。

  运行结果如下

  挖掘每个区块需要一些时间(大约3秒)。你应该更改difficulty的值(即挖矿难度)来看看对挖矿时间的影响。

  如果有人篡改了你的区块链中的数据:

  • 他们的区块链是无效的;
  • 他们不能创建一个更长的区块链;
  • 在你网络中诚实的区块链会在最长的链上有个时间优势。

  一个被篡改的区块链不肯赶上一个更长且有效的链。

  除非他们的算力比你网络中其他所有节点的算力总和还要多。

  你已经完成了基本的区块链!

  你的区块链:

  • 由存储数据的块组成。
  • 由数字签名把区块 链接起来。
  • 需要工作量证明挖矿来验证新的区块。
  • 可以验证其中的数据是否有效且未被篡改。

项目文件 : https://github.com/CryptoKass/NoobChain-Tutorial-Part-1

原文:https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa

版权声明


相关文章:

  • java实体约束教程2024-12-20 17:10:02
  • 部署java web 教程2024-12-20 17:10:02
  • 极简java教程2024-12-20 17:10:02
  • java se自学教程2024-12-20 17:10:02
  • 怎样复制java教程2024-12-20 17:10:02
  • java虚拟机优化教程2024-12-20 17:10:02
  • 高斯林java教程2024-12-20 17:10:02
  • java 基础案例教程2024-12-20 17:10:02
  • linux教程java2024-12-20 17:10:02
  • java 后端入门教程2024-12-20 17:10:02