主页 > imtoken官网电话 > 使用 Java 代码创建您的第一个区块链程序
使用 Java 代码创建您的第一个区块链程序
我们都看到了比特币和其他加密货币的规模。 虽然这种在线货币的波动性是出了名的,但它背后的技术有可能从内到外颠覆每个行业。 因为区块链有无限的应用范围,它每天都以新的方式出现。
在本文中,我们将探讨区块链背后的架构以及分布式账本的工作原理。 一旦亲眼所见,您就会明白为什么这么多开发人员将区块链视为新常态。 我们还将深入了解如何创建您自己的(基本)区块链序列和使用工作量证明(挖掘)系统的简短教程。
了解区块链
首先,在我们自己尝试之前,我们都需要就什么是区块链及其工作原理达成一致。 块具有标题信息,以及一组或块“块”数据。 这些数字通常是加密货币世界中的交易,但可以进行调整。 然后链从创世块开始,并根据块中存储的事务或数据集的数量创建新块。
一旦达到该阈值,将创建一个新块。 这个新的链接到前一个,这是术语区块链的来源。 区块链也是不可变的。 这是因为每个交易或数据集都涉及 SHA-256 哈希。 块中的内容也被散列。 这意味着每个块都有一个唯一的标识符,链接块的哈希值也存储在图中并进行哈希处理。
因为区块链是不可变的,所以它们非常安全。 基本上不可能惹到一个。 试图伪造交易数据或财产将具有挑战性。 更重要的是,随着链的增长,它变得更加安全。 破坏这个系统的技术还不存在,这是个好消息。
区块链分为三种类型:
贸易
接下来说一下区块链内部的交易。 区块链技术是分布式的。 因为它们是仅附加的,所以很容易在网络中的节点之间复制区块链。 虽然节点通常进行点对点通信(如比特币),但它们也可以通过基于 HTTP 的 API 进行去中心化。
交易可以是任何东西。 它可以有一个执行代码或只是存储信息。 随着新智能合约的推出,您可以看到这项技术的实际应用。 本质上,这些智能合约是促进和验证数字合约的计算机协议。 它们很可能成为制造业和银行业等行业的主流。
让我们以比特币为例。 有了比特币,就会有一笔交易,将一定数量的钱从所有者的账户转移到另一个账户。 此交易有一个公钥和帐户 ID 以确保其安全。 这些交易被添加到网络中并汇集在一起。 尽管它们在共享网络中,但它们本身并不在块或链中。
这是怎么回事? 说到底就是共识机制。 您可能已经知道比特币使用的一种称为挖矿的机制。 共识机制层出不穷,要一一列举可能需要很长时间。 你只需要知道它们是收集交易、构建区块并将这些区块添加到链中以进行验证的算法或模式。
开始
如上所述,区块链是一个链或块列表。 每个块都有自己的数字签名以及前一个块的数字签名。 有些还可能包含交易信息等数据。 数字签名称为散列。 每个块自己的哈希值是根据前一个块计算的。 一次更改将影响此后的所有哈希。 通过计算和比较,我们可以看到区块链是否有效。
由于数据的任何变化都会导致链断裂,让我们首先创建一个类块,它将构成 Buffic 链的基础。
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();
}
上面的代码以字符串哈希开头,这是我们制作数字签名的地方。 如您所见,previousHash 将保存最后一个块的哈希值,而字符串数据将保存整个块数据。 有了基础,我们就可以生成数字签名了。 这意味着您必须选择一种加密算法。 对于这个例子,我们将使用 SHA256。为了得到这个结果,我们将导入
java.security.MessageDigest。
import java.security.MessageDigest;
public class StringUtil {
public static String applySha256(String input){
try {
MessageDigest digest = MessageDigest.getInstance(“SHA-256”);
byte[] hash = digest.digest(input.getBytes(“UTF-8”));
StringBuffer hexString = new StringBuffer(); // 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 算法以返回生成的签名。 使用新的帮助程序,我们可以计算块类中的哈希值。 为了计算哈希值,我们需要使用块的所有部分,我们不想被弄乱。
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 = new Date().getTime();
this.hash = calculateHash(); /
}
Perfect 现在是测试它的时候了。 我们需要创建一些块并在屏幕上显示哈希值。 这样比特币标识图片,我们就知道一切正常。 由于 genesis(first) 块中没有前一个块,因此我们将输入“0”作为前一个哈希值。
public class Test {
public static void main(String[] args) {
Block genesisBlock = new Block(“Genesis block”, “0”);
System.out.println(“Hash for block 1 : ” + genesisBlock.hash);
Block secondBlock = new Block(“Second block”,genesisBlock.hash);
System.out.println(“Hash for block 2 : ” + secondBlock.hash);
Block thirdBlock = new Block(“Third block”,secondBlock.hash);
System.out.println(“Hash for block 3 : ” + thirdBlock.hash);
}
}
您的输出应该包含三个块,每个块都有自己的数字签名。 根据您独特的时间戳,您的数字签名将具有不同的值,但您正在取得进展。 现在,是时候将块存储在 ArrayList 中了。 同时,我们将输入gson,将其当成Json。
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
public class Test {
public static ArrayList blockchain = new ArrayList();
public static void main(String[] args) {
blockchain.add(new Block(“Genesis block”, “0”));
blockchain.add(new Block(“Second block”,blockchain.get(blockchain.size()-1).hash));
blockchain.add(new Block(“Third block”,blockchain.get(blockchain.size()-1).hash));
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
}
}
现在我们正在做更多的过程。 您的输出更接近于区块链应该看起来的样子。 最后,我们将检查我们的区块链的有效性。 我们将在我们的测试类中创建一个 ischainvalid() 布尔方法。 这将遍历我们到目前为止创建的所有块,并将比较哈希值以查看它是否等于计算的哈希值,等等。
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
for(int i=1; i < blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println(“Current Hashes not equal”);
return false;
}
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println(“Previous Hashes not equal”);
return false;
}
}
return true;
}
使用此代码,如果块有任何更改,那么您将返回错误。 如果你得到一个诚实的答案,你就成功了。 您将所有存储的数据块与唯一的数字签名链接在一起。 您已准备好开始挖掘。
最后的想法
因为区块链是去中心化的比特币标识图片,所以没有单一的权威来为接受的交易设置规则。 区块链涉及一定程度的信任,因为这些交易存储在开放网络上。 尽管围绕这项技术存在混淆,但正如您在上面看到的那样,它并不像许多人想象的那么复杂。
随着越来越多的开发人员尝试解决他们自己的挖矿问题,我们看到了更多可以帮助他们的工具。 Loggly 和 Microsoft Azure 等软件旨在使区块链更易于访问。 开发人员探索区块链世界的原因有很多。 首先,从上面可以看出,它是比较容易学的,而且在不久的将来也会成为热门的职业。
虽然区块链不是云端的神奇数据库,但它是复杂技术交易的现代解决方案。 毫无疑问,这项技术将继续存在。 只有时间才能证明它在未来将如何继续应用。