当前位置:首页 > 知识 >

Java编写初学者的第一款区块链程序

近期,加密货币的每个块中都包含了所有交易的集合签名。这个签名就是用 Merkle 树实现的。Merkle 树用于产生整个事务集合的整体数字指纹,提供了一个非常有效的过程来验证事务是否包括在块中。

下面是实现 Merkle 树的 Java 代码:

``` package test;

import java.security.MessageDigest; import java.util.ArrayList; import java.util.List;

public class MerkleTrees { // 交易列表 List txList; // Merkle 根节点 String root;

/**构造函数 * @param txList 交易列表 */ public MerkleTrees(List txList) { this.txList = txList; this.root = ""; }

/**执行 Merkle 树 */ public void merkle_tree() { List tempTxList = new ArrayList(); for (int i = 0; i < this.txList.size(); i++) { tempTxList.add(this.txList.get(i)); } List newTxList = getNewTxList(tempTxList); while (newTxList.size() != 1) { newTxList = getNewTxList(newTxList); } this.root = newTxList.get(0); }

/**返回节点哈希列表 * @param tempTxList * @return */ private List getNewTxList(List tempTxList) { List newTxList = new ArrayList(); int index = 0; while (index < tempTxList.size()) { // left String left = tempTxList.get(index); index++; // right String right = ""; if (index != tempTxList.size()) { right = tempTxList.get(index); } // sha2hexvalue String sha2HexValue = getSHA2HexValue(left + right); newTxList.add(sha2HexValue); index++; } return newTxList; }

/**返回 16 进制字符串 * @param str * @return */ public String getSHA2HexValue(String str) { byte[] cipher_byte; try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(str.getBytes()); cipher_byte = md.digest(); StringBuilder sb = new StringBuilder(2 * cipher_byte.length); for (byte b : cipher_byte) { sb.append(String.format("%02x", b & 0xff)); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }

/**获取 Merkle 树根节点 * @return */ public String getRoot() { return this.root; } }

```

我们将交易的数据放入到List中:

``` List tempTxList = new ArrayList(); tempTxList.add("a"); tempTxList.add("b"); tempTxList.add("c"); tempTxList.add("d"); tempTxList.add("e"); ```

计算出每个数据的hash值,从左到右逐步组成树的左右节点。执行循环直到最后只剩下一个数据。

``` private List getNewTxList(List tempTxList) { List newTxList = new ArrayList(); int index = 0; while (index < tempTxList.size()) { // left String left = tempTxList.get(index); index++; // right String right = ""; if (index != tempTxList.size()) { right = tempTxList.get(index); } // sha2hexvalue String sha2HexValue = getSHA2HexValue(left + right); newTxList.add(sha2HexValue); index++; } return newTxList; } ```

下面我们进行一个简单的测试:

``` package test;

import java.util.ArrayList; import java.util.List;

public class App { public static void main(String[] args) { List tempTxList = new ArrayList(); tempTxList.add("a"); tempTxList.add("b"); tempTxList.add("c"); tempTxList.add("d"); tempTxList.add("e"); MerkleTrees merkleTrees = new MerkleTrees(tempTxList); merkleTrees.merkle_tree(); System.out.println("root:" + merkleTrees.getRoot()); } } ```

猜你喜欢

关注我们

微信二维码

微信