OSDN Git Service

merge tx signer
[bytom/bytom-java-sdk.git] / tx-signer / src / main / java / io / bytom / types / Entry.java
1 package io.bytom.types;\r
2 \r
3 import io.bytom.util.OutputUtil;\r
4 import org.bouncycastle.jcajce.provider.digest.SHA3;\r
5 import org.bouncycastle.util.encoders.Hex;\r
6 \r
7 import java.io.ByteArrayOutputStream;\r
8 import java.io.IOException;\r
9 import java.lang.reflect.Field;\r
10 \r
11 public abstract class Entry {\r
12 \r
13     public abstract String typ();\r
14 \r
15     public abstract void writeForHash(ByteArrayOutputStream out);\r
16 \r
17     public void mustWriteForHash(ByteArrayOutputStream out, Object data) {\r
18         try {\r
19             if (data == null) {\r
20                 return;\r
21             }\r
22             if (data instanceof Byte) {\r
23                 OutputUtil.writeByte(out, (byte) data);\r
24             } else if (data instanceof Long) {\r
25                 OutputUtil.writeLong(out, (long) data);\r
26             } else if (data instanceof byte[]) {\r
27                 OutputUtil.writeVarstr(out, (byte[]) data);\r
28             } else if (data instanceof byte[][]) {\r
29                 OutputUtil.writeVarstrList(out, (byte[][]) data);\r
30             } else if (data instanceof String) {\r
31                 OutputUtil.writeVarstr(out, ((String) data).getBytes());\r
32             } else if (data instanceof Hash) {\r
33                 out.write(((Hash) data).toByteArray());\r
34             } else if (data instanceof AssetID) {\r
35                 out.write(((AssetID) data).toByteArray());\r
36             } else if (data.getClass().isArray()) {\r
37                 Object[] array = (Object[]) data;\r
38                 OutputUtil.writeVarint(out, array.length);\r
39                 for (Object obj : array) {\r
40                     mustWriteForHash(out, obj);\r
41                 }\r
42             } else {\r
43                 Class<?> cls = data.getClass();\r
44                 Field[] fields = cls.getFields();\r
45                 for (Field field : fields) {\r
46                     mustWriteForHash(out, field.get(data));\r
47                 }\r
48             }\r
49         } catch (Exception e) {\r
50             throw new RuntimeException(e);\r
51         }\r
52     }\r
53 \r
54     public Hash entryID() {\r
55         SHA3.Digest256 digest256 = new SHA3.Digest256();\r
56         ByteArrayOutputStream hasher = new ByteArrayOutputStream();\r
57         ByteArrayOutputStream bh = new ByteArrayOutputStream();\r
58         try {\r
59             hasher.write("entryid:".getBytes());\r
60             hasher.write(this.typ().getBytes());\r
61             hasher.write(":".getBytes());\r
62 \r
63             this.writeForHash(bh);\r
64             hasher.write(digest256.digest(bh.toByteArray()));\r
65             return new Hash(digest256.digest(hasher.toByteArray()));\r
66         } catch (IOException e) {\r
67             throw new RuntimeException(e);\r
68         } finally {\r
69             try {\r
70                 bh.close();\r
71                 hasher.close();\r
72             } catch (IOException e) {\r
73                 e.printStackTrace();\r
74             }\r
75         }\r
76     }\r
77 }\r