1 package io.bytom.types;
\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
7 import java.io.ByteArrayOutputStream;
\r
8 import java.io.IOException;
\r
9 import java.lang.reflect.Field;
\r
11 public abstract class Entry {
\r
13 public abstract String typ();
\r
15 public abstract void writeForHash(ByteArrayOutputStream out);
\r
17 public void mustWriteForHash(ByteArrayOutputStream out, Object data) {
\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
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
49 } catch (Exception e) {
\r
50 throw new RuntimeException(e);
\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
59 hasher.write("entryid:".getBytes());
\r
60 hasher.write(this.typ().getBytes());
\r
61 hasher.write(":".getBytes());
\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
72 } catch (IOException e) {
\r
73 e.printStackTrace();
\r