您可以回答整个问题,只需在下面的大写字母中阅读我的问题,我想提供一些背景信息以防问题不明确
我正在重新创建区块链,因此需要验证创建的块是否满足给定的要求(散列整个块(矿工放入他的nonce解决方案)必须小于给定目标)。
所以我目前正在做的工作是什么:
private static boolean checkDifficulty(JSONObject message) {
try {
String blockString = message.get("block").toString();
JSONObject blockPayLoad = (JSONObject) JSONValue.parse(blockString);
BlockPayload block = new BlockPayload(blockPayLoad);
BigInteger base = new BigInteger("2",16);
String difficulty = Integer.toHexString(20+block.getDifficulty());
BigInteger exponent = new BigInteger(difficulty,16);
BigInteger totalSpace = base.pow(512);
BigInteger target = totalSpace.divide(base.pow(exponent.intValueExact()));
BigInteger hashedBlock3 = new BigInteger(1,hashSHA512(blockString));
return(hashedBlock3.compareTo(target) == -1);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return false;
我首先想到的是,我可以使用我的datastrucutre BlockPayload。相关部分如下所示:
public BlockPayload(JSONObject blockPayLoad) {
this.stringRepresentation = blockPayLoad.toString();
this.type = blockPayLoad.get("type").toString();
this.transactions = blockPayLoad.get("transactions").toString();
this.timestamp = blockPayLoad.get("timestamp").toString();
this.reward = blockPayLoad.get("reward").toString();
this.difficulty = Integer.parseInt(blockPayLoad.get("difficulty").toString());
this.nonce = blockPayLoad.get("nonce").toString();
this.parent = blockPayLoad.get("parent").toString();
}
my toString()返回stringReprensentation。 遗憾的是,尝试上述相同的事情(散列字符串表示)会产生不同的结果。
我认为这是b / c我的toString没有相同的顺序,这意味着JSONObject中的属性顺序发生了变化。
所以这是我的问题:我能否以某种方式自定义toString(),我保证属性以所需顺序显示?
答案 0 :(得分:0)
是的,你可以将它们放在树形图中,然后你可以对它们进行哈希处理,树形图是一个完全有序的地图而不做任何事情它是按键从低到高排序元素看看https://beginnersbook.com/2013/12/treemap-in-java-with-example/ < / p>
TreeMap<String, String> tmap =
new TreeMap<String, String>();
tmap.put("1", "Data1");
tmap.put("23", "Data2");
tmap.put("70", "Data3");
tmap.put("4", "Data4");
tmap.put("2", "Data5");
// this will be like this after converting it to Json using Gson lib
// new Gson ().toJson(tmap);
{"1":"Data1","2":"Data5","23":"data2","4":"data4","70":"Data3"}