package test;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
public class MerkleTrees {
// transaction List
List txList;
// Merkle Root
String root;
/**
* constructor
* @param txList transaction List 交易List
*/
public MerkleTrees(List txList) {
txList = txList;
root = “”;
}
/**
* execute merkle_tree and set root.
*/
public void merkle_tree() {
List tempTxList = new ArrayList();
for (int i = 0; i < this.txList.size(); i++) {
add(this.txList.get(i));
}
List newTxList = getNewTxList(tempTxList);
while (newTxList.size() != 1) {
newTxList = getNewTxList(newTxList);
}
root = newTxList.get(0);
}
/**
* return Node Hash List.
* @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);
}
// sha2 hex value
String sha2HexValue = getSHA2HexValue(left + right);
add(sha2HexValue);
index++;
}
return newTxList;
}
/**
* Return hex string
* @param str
* @return
*/
public String getSHA2HexValue(String str) {
byte[] cipher_byte;
try{
MessageDigest md = MessageDigest.getInstance(“SHA-256”);
update(str.getBytes());
cipher_byte = md.digest();
StringBuilder sb = new StringBuilder(2 * cipher_byte.length);
for(byte b: cipher_byte) {
append(String.format(“%02x”, b&0xff) );
}
return sb.toString();
} catch (Exception e) {
printStackTrace();
}
return “”;
}
/**
* Get Root
* @return
*/
public String getRoot() {
return this.root;
}
}