From 92d2cbd4027fc9446d7a1461fefe47d02a536707 Mon Sep 17 00:00:00 2001 From: Hou Date: Sun, 5 May 2019 14:58:20 +0800 Subject: [PATCH 1/2] Trigger contract interface to increase support for transfer --- .../org/tron/core/services/http/AbiUtil.java | 430 --------------- .../core/services/http/ByteArrayWrapper.java | 76 --- .../org/tron/core/services/http/DataWord.java | 509 ------------------ .../http/TriggerConstantContractServlet.java | 13 +- .../http/TriggerSmartContractServlet.java | 11 +- .../org/tron/core/services/http/Util.java | 311 ++++++----- 6 files changed, 175 insertions(+), 1175 deletions(-) delete mode 100644 src/main/java/org/tron/core/services/http/AbiUtil.java delete mode 100644 src/main/java/org/tron/core/services/http/ByteArrayWrapper.java delete mode 100644 src/main/java/org/tron/core/services/http/DataWord.java diff --git a/src/main/java/org/tron/core/services/http/AbiUtil.java b/src/main/java/org/tron/core/services/http/AbiUtil.java deleted file mode 100644 index 6d361dc0ae3..00000000000 --- a/src/main/java/org/tron/core/services/http/AbiUtil.java +++ /dev/null @@ -1,430 +0,0 @@ -package org.tron.core.services.http; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang3.StringUtils; -import org.spongycastle.util.encoders.Hex; -import org.tron.common.crypto.Hash; -import org.tron.common.utils.ByteUtil; -import org.tron.core.Wallet; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class AbiUtil { - - private static Pattern paramTypeBytes = Pattern.compile("^bytes([0-9]*)$"); - private static Pattern paramTypeNumber = Pattern.compile("^(u?int)([0-9]*)$"); - private static Pattern paramTypeArray = Pattern.compile("^(.*)\\[([0-9]*)]$"); - - static abstract class Coder { - - boolean dynamic = false; - - // DataWord[] encode - abstract byte[] encode(String value); - - abstract byte[] decode(); - - } - - public static String[] getTypes(String methodSign) { - int start = methodSign.indexOf('(') + 1; - int end = methodSign.indexOf(')'); - - String typeString = methodSign.subSequence(start, end).toString(); - - return typeString.split(","); - } - - private static Coder getParamCoder(String type) { - - switch (type) { - case "address": - return new CoderAddress(); - case "string": - return new CoderString(); - case "bool": - return new CoderBool(); - case "bytes": - return new CoderDynamicBytes(); - case "trcToken": - return new CoderNumber(); - } - - if (paramTypeBytes.matcher(type).find()) { - return new CoderFixedBytes(); - } - - if (paramTypeNumber.matcher(type).find()) { - return new CoderNumber(); - } - - Matcher m = paramTypeArray.matcher(type); - if (m.find()) { - String arrayType = m.group(1); - int length = -1; - if (!m.group(2).equals("")) { - length = Integer.valueOf(m.group(2)); - } - return new CoderArray(arrayType, length); - } - return null; - } - - static class CoderArray extends Coder { - - private String elementType; - private int length; - - CoderArray(String arrayType, int length) { - this.elementType = arrayType; - this.length = length; - if (length == -1) { - this.dynamic = true; - } - this.dynamic = true; - } - - @Override - byte[] encode(String arrayValues) { - - Coder coder = getParamCoder(elementType); - - List strings; - try { - ObjectMapper mapper = new ObjectMapper(); - strings = mapper.readValue(arrayValues, List.class); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - - List coders = new ArrayList<>(); - - if (this.length == -1) { - for (int i = 0; i < strings.size(); i++) { - coders.add(coder); - } - } else { - for (int i = 0; i < this.length; i++) { - coders.add(coder); - } - } - - if (this.length == -1) { - return ByteUtil.merge(new DataWord(strings.size()).getData(), pack(coders, strings)); - } else { - return pack(coders, strings); - } - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderNumber extends Coder { - - @Override - byte[] encode(String value) { - long n = Long.valueOf(value); - DataWord word = new DataWord(Math.abs(n)); - if (n < 0) { - word.negate(); - } - return word.getData(); - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderFixedBytes extends Coder { - - @Override - byte[] encode(String value) { - - if (value.startsWith("0x")) { - value = value.substring(2); - } - - if (value.length() % 2 != 0) { - value = "0" + value; - } - - byte[] result = new byte[32]; - byte[] bytes = Hex.decode(value); - System.arraycopy(bytes, 0, result, 0, bytes.length); - return result; - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderDynamicBytes extends Coder { - - CoderDynamicBytes() { - dynamic = true; - } - - @Override - byte[] encode(String value) { - return encodeDynamicBytes(value, true); - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderBool extends Coder { - - @Override - byte[] encode(String value) { - if (value.equals("true") || value.equals("1")) { - return new DataWord(1).getData(); - } else { - return new DataWord(0).getData(); - } - - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderAddress extends Coder { - - @Override - byte[] encode(String value) { - byte[] address = Wallet.decodeFromBase58Check(value); - if (address == null) { - return null; - } - return new DataWord(address).getData(); - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - static class CoderString extends Coder { - - CoderString() { - dynamic = true; - } - - @Override - byte[] encode(String value) { - return encodeDynamicBytes(value); - } - - @Override - byte[] decode() { - return new byte[0]; - } - } - - private static byte[] encodeDynamicBytes(String value, boolean hex) { - byte[] data; - if (hex) { - if (value.startsWith("0x")) { - value = value.substring(2); - } - data = Hex.decode(value); - } else { - data = value.getBytes(); - } - return encodeDynamicBytes(data); - } - - private static byte[] encodeDynamicBytes(byte[] data) { - List ret = new ArrayList<>(); - ret.add(new DataWord(data.length)); - - int readInx = 0; - int len = data.length; - while (readInx < data.length) { - byte[] wordData = new byte[32]; - int readLen = len - readInx >= 32 ? 32 : (len - readInx); - System.arraycopy(data, readInx, wordData, 0, readLen); - DataWord word = new DataWord(wordData); - ret.add(word); - readInx += 32; - } - - byte[] retBytes = new byte[ret.size() * 32]; - int retIndex = 0; - - for (DataWord w : ret) { - System.arraycopy(w.getData(), 0, retBytes, retIndex, 32); - retIndex += 32; - } - - return retBytes; - } - - private static byte[] encodeDynamicBytes(String value) { - byte[] data = value.getBytes(); - List ret = new ArrayList<>(); - ret.add(new DataWord(data.length)); - return encodeDynamicBytes(data); - } - - public static byte[] pack(List codes, List values) { - - int staticSize = 0; - int dynamicSize = 0; - - List encodedList = new ArrayList<>(); - - for (int idx = 0; idx < codes.size(); idx++) { - Coder coder = codes.get(idx); - Object parameter = values.get(idx); - String value; - if (parameter instanceof List) { - StringBuilder sb = new StringBuilder(); - for (Object item : (List) parameter) { - if (sb.length() != 0) { - sb.append(","); - } - sb.append("\"").append(item).append("\""); - } - value = "[" + sb.toString() + "]"; - } else { - value = parameter.toString(); - } - byte[] encoded = coder.encode(value); - encodedList.add(encoded); - - if (coder.dynamic) { - staticSize += 32; - dynamicSize += encoded.length; - } else { - staticSize += encoded.length; - } - } - - int offset = 0; - int dynamicOffset = staticSize; - - byte[] data = new byte[staticSize + dynamicSize]; - - for (int idx = 0; idx < codes.size(); idx++) { - Coder coder = codes.get(idx); - - if (coder.dynamic) { - System.arraycopy(new DataWord(dynamicOffset).getData(), 0, data, offset, 32); - offset += 32; - - System.arraycopy(encodedList.get(idx), 0, data, dynamicOffset, encodedList.get(idx).length); - dynamicOffset += encodedList.get(idx).length; - } else { - System.arraycopy(encodedList.get(idx), 0, data, offset, encodedList.get(idx).length); - offset += encodedList.get(idx).length; - } - } - - return data; - } - - public static String parseMethod(String methodSign, String params) { - return parseMethod(methodSign, params, false); - } - - public static String parseMethod(String methodSign, String input, boolean isHex) { - byte[] selector = new byte[4]; - System.arraycopy(Hash.sha3(methodSign.getBytes()), 0, selector, 0, 4); - System.out.println(methodSign + ":" + Hex.toHexString(selector)); - if (input.length() == 0) { - return Hex.toHexString(selector); - } - if (isHex) { - return Hex.toHexString(selector) + input; - } - byte[] encodedParms = encodeInput(methodSign, input); - - return Hex.toHexString(selector) + Hex.toHexString(encodedParms); - } - - public static byte[] encodeInput(String methodSign, String input) { - ObjectMapper mapper = new ObjectMapper(); - input = "[" + input + "]"; - List items; - try { - items = mapper.readValue(input, List.class); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - - List coders = new ArrayList<>(); - for (String s : getTypes(methodSign)) { - Coder c = getParamCoder(s); - coders.add(c); - } - - return pack(coders, items); - } - - public static String parseMethod(String methodSign, List parameters) { - String[] inputArr = new String[parameters.size()]; - int i = 0; - for (Object parameter : parameters) { - if (parameter instanceof List) { - StringBuilder sb = new StringBuilder(); - for (Object item : (List) parameter) { - if (sb.length() != 0) { - sb.append(","); - } - sb.append("\"").append(item).append("\""); - } - inputArr[i++] = "[" + sb.toString() + "]"; - } else { - inputArr[i++] = - (parameter instanceof String) ? ("\"" + parameter + "\"") : ("" + parameter); - } - } - return parseMethod(methodSign, StringUtils.join(inputArr, ',')); - } - - public static void main(String[] args) { - String method = "test(string,int2,string)"; - String params = "asdf,3123,adf"; - - String arrayMethod1 = "test(uint,uint256[3])"; - String arrayMethod2 = "test(uint,uint256[])"; - String arrayMethod3 = "test(uint,address[])"; - String byteMethod1 = "test(bytes32,bytes11)"; - String tokenMethod = "test(trcToken,uint256)"; - String tokenParams = "\"nmb\",111"; - - System.out.println("token:" + parseMethod(tokenMethod, tokenParams)); - - String method1 = "test(uint256,string,string,uint256[])"; - String expected1 = "db103cf30000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000014200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003"; - String method2 = "test(uint256,string,string,uint256[3])"; - String expected2 = "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003"; - String listString = "1 ,\"B\",\"C\", [1, 2, 3]"; - System.out.println(parseMethod(method1, listString)); - System.out.println(parseMethod(method2, listString)); - - String bytesValue1 = "\"0112313\",112313"; - - System.out.println(parseMethod(byteMethod1, bytesValue1)); - } -} diff --git a/src/main/java/org/tron/core/services/http/ByteArrayWrapper.java b/src/main/java/org/tron/core/services/http/ByteArrayWrapper.java deleted file mode 100644 index a26b883934f..00000000000 --- a/src/main/java/org/tron/core/services/http/ByteArrayWrapper.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.tron.core.services.http; -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ - -import org.spongycastle.util.encoders.Hex; -import org.tron.common.utils.FastByteComparisons; - -import java.io.Serializable; -import java.util.Arrays; - -public class ByteArrayWrapper implements Comparable, Serializable { - - private final byte[] data; - private int hashCode = 0; - - /** - * constructor. - */ - public ByteArrayWrapper(byte[] data) { - if (data == null) { - throw new NullPointerException("Data must not be null"); - } - this.data = data; - this.hashCode = Arrays.hashCode(data); - } - - - /** - * equals Objects. - */ - public boolean equals(Object other) { - if (other == null || this.getClass() != other.getClass()) { - return false; - } - byte[] otherData = ((ByteArrayWrapper) other).getData(); - return FastByteComparisons.compareTo( - data, 0, data.length, - otherData, 0, otherData.length) == 0; - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public int compareTo(ByteArrayWrapper o) { - return FastByteComparisons.compareTo( - data, 0, data.length, - o.getData(), 0, o.getData().length); - } - - public byte[] getData() { - return data; - } - - @Override - public String toString() { - return Hex.toHexString(data); - } -} diff --git a/src/main/java/org/tron/core/services/http/DataWord.java b/src/main/java/org/tron/core/services/http/DataWord.java deleted file mode 100644 index cda3f49a68d..00000000000 --- a/src/main/java/org/tron/core/services/http/DataWord.java +++ /dev/null @@ -1,509 +0,0 @@ -package org.tron.core.services.http; - -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import org.spongycastle.util.Arrays; -import org.spongycastle.util.encoders.Hex; -import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FastByteComparisons; - -import java.math.BigInteger; -import java.nio.ByteBuffer; - -public class DataWord implements Comparable { - - /* Maximum value of the DataWord */ - public static final BigInteger _2_256 = BigInteger.valueOf(2).pow(256); - public static final BigInteger MAX_VALUE = _2_256.subtract(BigInteger.ONE); - public static final DataWord ZERO = new DataWord(new byte[32]); - public static final DataWord ZERO_EMPTY_ARRAY = new DataWord(new byte[0]); - - private byte[] data = new byte[32]; - - public DataWord() { - } - - public DataWord(int num) { - this(ByteBuffer.allocate(4).putInt(num)); - } - - public DataWord(long num) { - this(ByteBuffer.allocate(8).putLong(num)); - } - - private DataWord(ByteBuffer buffer) { - final ByteBuffer data = ByteBuffer.allocate(32); - final byte[] array = buffer.array(); - System.arraycopy(array, 0, data.array(), 32 - array.length, array.length); - this.data = data.array(); - } - - @JsonCreator - public DataWord(String data) { - this(Hex.decode(data)); - } - - public DataWord(ByteArrayWrapper wrappedData) { - this(wrappedData.getData()); - } - - /** - * constructor. - */ - - public DataWord(byte[] data) { - if (data == null) { - this.data = ByteUtil.EMPTY_BYTE_ARRAY; - } else if (data.length == 32) { - this.data = data; - } else if (data.length <= 32) { - System.arraycopy(data, 0, this.data, 32 - data.length, data.length); - } else { - throw new RuntimeException("Data word can't exceed 32 bytes: " + data); - } - - } - - public byte[] getData() { - return data; - } - - /** - * constructor. - */ - - public byte[] getNoLeadZeroesData() { - return ByteUtil.stripLeadingZeroes(data); - } - - public byte[] getLast20Bytes() { - return Arrays.copyOfRange(data, 12, data.length); - } - - public BigInteger value() { - return new BigInteger(1, data); - } - - /** - * Converts this DataWord to an int, checking for lost information. - * If this DataWord is out of the possible range for an int result - * then an ArithmeticException is thrown. - * - * @return this DataWord converted to an int. - * @throws ArithmeticException - if this will not fit in an int. - */ - /** - * constructor. - */ - - public int intValue() { - int intVal = 0; - - for (byte aaData : data) { - intVal = (intVal << 8) + (aaData & 0xff); - } - - return intVal; - } - - /** - * In case of int overflow returns Integer.MAX_VALUE otherwise works as #intValue() - */ - public int intValueSafe() { - int bytesOccupied = bytesOccupied(); - int intValue = intValue(); - if (bytesOccupied > 4 || intValue < 0) { - return Integer.MAX_VALUE; - } - return intValue; - } - - /** - * Converts this DataWord to a long, checking for lost information. If this DataWord is out of the - * possible range for a long result then an ArithmeticException is thrown. - * - * @return this DataWord converted to a long. - * @throws ArithmeticException - if this will not fit in a long. - */ - public long longValue() { - - long longVal = 0; - for (byte aaData : data) { - longVal = (longVal << 8) + (aaData & 0xff); - } - - return longVal; - } - - /** - * In case of long overflow returns Long.MAX_VALUE otherwise works as #longValue() - */ - public long longValueSafe() { - int bytesOccupied = bytesOccupied(); - long longValue = longValue(); - if (bytesOccupied > 8 || longValue < 0) { - return Long.MAX_VALUE; - } - return longValue; - } - - /** - * constructor. - */ - - public BigInteger ssValue() { - return new BigInteger(data); - } - - public String bigIntValue() { - return new BigInteger(data).toString(); - } - - /** - * constructor. - */ - - public boolean isZero() { - for (byte tmp : data) { - if (tmp != 0) { - return false; - } - } - return true; - } - - // only in case of signed operation - // when the number is explicit defined - // as negative - public boolean isNegative() { - int result = data[0] & 0x80; - return result == 0x80; - } - - /** - * constructor. - */ - - public DataWord and(DataWord w2) { - - for (int i = 0; i < this.data.length; ++i) { - this.data[i] &= w2.data[i]; - } - return this; - } - - /** - * constructor. - */ - - public DataWord or(DataWord w2) { - - for (int i = 0; i < this.data.length; ++i) { - this.data[i] |= w2.data[i]; - } - return this; - } - - /** - * constructor. - */ - - public DataWord xor(DataWord w2) { - - for (int i = 0; i < this.data.length; ++i) { - this.data[i] ^= w2.data[i]; - } - return this; - } - - /** - * constructor. - */ - - public void negate() { - - if (this.isZero()) { - return; - } - - for (int i = 0; i < this.data.length; ++i) { - this.data[i] = (byte) ~this.data[i]; - } - - for (int i = this.data.length - 1; i >= 0; --i) { - this.data[i] = (byte) (1 + this.data[i] & 0xFF); - if (this.data[i] != 0) { - break; - } - } - } - - /** - * constructor. - */ - - public void bnot() { - if (this.isZero()) { - this.data = ByteUtil.copyToArray(MAX_VALUE); - return; - } - this.data = ByteUtil.copyToArray(MAX_VALUE.subtract(this.value())); - } - - /** - * constructor. - */ - - // By : Holger - // From : http://stackoverflow.com/a/24023466/459349 - public void add(DataWord word) { - byte[] result = new byte[32]; - for (int i = 31, overflow = 0; i >= 0; i--) { - int v = (this.data[i] & 0xff) + (word.data[i] & 0xff) + overflow; - result[i] = (byte) v; - overflow = v >>> 8; - } - this.data = result; - } - - // old add-method with BigInteger quick hack - public void add2(DataWord word) { - BigInteger result = value().add(word.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - // TODO: mul can be done in more efficient way - // TODO: with shift left shift right trick - // TODO without BigInteger quick hack - public void mul(DataWord word) { - BigInteger result = value().multiply(word.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - /** - * constructor. - */ - - // TODO: improve with no BigInteger - public void div(DataWord word) { - - if (word.isZero()) { - this.and(ZERO); - return; - } - - BigInteger result = value().divide(word.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - /** - * constructor. - */ - - // TODO: improve with no BigInteger - public void ssDiv(DataWord word) { - - if (word.isZero()) { - this.and(ZERO); - return; - } - - BigInteger result = ssValue().divide(word.ssValue()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - // TODO: improve with no BigInteger - public void sub(DataWord word) { - BigInteger result = value().subtract(word.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - // TODO: improve with no BigInteger - public void exp(DataWord word) { - BigInteger result = value().modPow(word.value(), _2_256); - this.data = ByteUtil.copyToArray(result); - } - - /** - * constructor. - */ - - // TODO: improve with no BigInteger - public void mod(DataWord word) { - - if (word.isZero()) { - this.and(ZERO); - return; - } - - BigInteger result = value().mod(word.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - /** - * constructor. - */ - - public void ssMod(DataWord word) { - - if (word.isZero()) { - this.and(ZERO); - return; - } - - BigInteger result = ssValue().abs().mod(word.ssValue().abs()); - result = (ssValue().signum() == -1) ? result.negate() : result; - - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - /** - * constructor. - */ - - public void addmod(DataWord word1, DataWord word2) { - if (word2.isZero()) { - this.data = new byte[32]; - return; - } - - BigInteger result = value().add(word1.value()).mod(word2.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - /** - * constructor. - */ - - public void mulmod(DataWord word1, DataWord word2) { - - if (this.isZero() || word1.isZero() || word2.isZero()) { - this.data = new byte[32]; - return; - } - - BigInteger result = value().multiply(word1.value()).mod(word2.value()); - this.data = ByteUtil.copyToArray(result.and(MAX_VALUE)); - } - - @JsonValue - @Override - public String toString() { - return Hex.toHexString(data); - } - - /** - * constructor. - */ - - public String toPrefixString() { - - byte[] pref = getNoLeadZeroesData(); - if (pref.length == 0) { - return ""; - } - - if (pref.length < 7) { - return Hex.toHexString(pref); - } - - return Hex.toHexString(pref).substring(0, 6); - } - - public String shortHex() { - String hexValue = Hex.toHexString(getNoLeadZeroesData()).toUpperCase(); - return "0x" + hexValue.replaceFirst("^0+(?!$)", ""); - } - - public DataWord clone() { - return new DataWord(Arrays.clone(data)); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - DataWord dataWord = (DataWord) o; - - return java.util.Arrays.equals(data, dataWord.data); - - } - - @Override - public int hashCode() { - return java.util.Arrays.hashCode(data); - } - - @Override - public int compareTo(DataWord o) { - if (o == null || o.getData() == null) { - return -1; - } - int result = FastByteComparisons.compareTo( - data, 0, data.length, - o.getData(), 0, o.getData().length); - // Convert result into -1, 0 or 1 as is the convention - return (int) Math.signum(result); - } - - /** - * constructor. - */ - - public void signExtend(byte k) { - if (0 > k || k > 31) { - throw new IndexOutOfBoundsException(); - } - byte mask = this.ssValue().testBit((k * 8) + 7) ? (byte) 0xff : 0; - for (int i = 31; i > k; i--) { - this.data[31 - i] = mask; - } - } - - /** - * constructor. - */ - - public int bytesOccupied() { - int firstNonZero = ByteUtil.firstNonZeroByte(data); - if (firstNonZero == -1) { - return 0; - } - return 31 - firstNonZero + 1; - } - - public boolean isHex(String hex) { - return Hex.toHexString(data).equals(hex); - } - - public String asString() { - return new String(getNoLeadZeroesData()); - } - - public String toHexString() { - return Hex.toHexString(data); - } -} diff --git a/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java b/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java index 039443fcab2..9e4fdfab6df 100644 --- a/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java +++ b/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java @@ -17,6 +17,7 @@ import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.common.crypto.Hash; import org.tron.common.utils.ByteArray; import org.tron.core.Wallet; import org.tron.core.capsule.TransactionCapsule; @@ -50,16 +51,12 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JsonFormat.merge(contract, build, visible); JSONObject jsonObject = JSONObject.parseObject(contract); String selector = jsonObject.getString("function_selector"); - String parameter = jsonObject.getString("parameter"); - boolean hexPara = true; - if (jsonObject.containsKey("parameter_string")) { - parameter = jsonObject.getString("parameter_string"); - hexPara = false; - } - String data = AbiUtil.parseMethod(selector, parameter, hexPara); + String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - + build.setCallTokenValue(jsonObject.getLongValue("call_token_value")); + build.setTokenId(jsonObject.getLongValue("token_id")); + build.setCallValue(jsonObject.getLongValue("call_value")); long feeLimit = jsonObject.getLongValue("fee_limit"); TransactionCapsule trxCap = wallet diff --git a/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java b/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java index 8a24b8fdd9d..38b142630c4 100644 --- a/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java +++ b/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java @@ -52,14 +52,11 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JSONObject jsonObject = JSONObject.parseObject(contract); String selector = jsonObject.getString("function_selector"); String parameter = jsonObject.getString("parameter"); - boolean hexPara = true; - if (jsonObject.containsKey("parameter_string")) { - parameter = jsonObject.getString("parameter_string"); - hexPara = false; - } - String data = AbiUtil.parseMethod(selector, parameter, hexPara); + String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - + build.setCallTokenValue(jsonObject.getLongValue("call_token_value")); + build.setTokenId(jsonObject.getLongValue("token_id")); + build.setCallValue(jsonObject.getLongValue("call_value")); long feeLimit = jsonObject.getLongValue("fee_limit"); TransactionCapsule trxCap = wallet diff --git a/src/main/java/org/tron/core/services/http/Util.java b/src/main/java/org/tron/core/services/http/Util.java index 39f61cef33c..8482cb9f3c8 100644 --- a/src/main/java/org/tron/core/services/http/Util.java +++ b/src/main/java/org/tron/core/services/http/Util.java @@ -6,10 +6,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; + import java.util.List; import java.util.Objects; +import javax.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.util.StringUtil; +import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI.BlockList; import org.tron.api.GrpcAPI.EasyTransferResponse; import org.tron.api.GrpcAPI.TransactionApprovedList; @@ -55,10 +59,9 @@ import org.tron.protos.Contract.WitnessUpdateContract; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.DeferredTransaction; -import org.tron.protos.Protocol.SmartContract; import org.tron.protos.Protocol.Transaction; -import javax.servlet.http.HttpServletRequest; + @Slf4j(topic = "API") @@ -72,7 +75,7 @@ public static String printErrorMsg(Exception e) { return jsonObject.toJSONString(); } - public static String printBlockList(BlockList list, boolean selfType ) { + public static String printBlockList(BlockList list, boolean selfType) { List blocks = list.getBlockList(); JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); JSONArray jsonArray = new JSONArray(); @@ -84,35 +87,36 @@ public static String printBlockList(BlockList list, boolean selfType ) { return jsonObject.toJSONString(); } - public static String printBlock(Block block, boolean selfType ) { + public static String printBlock(Block block, boolean selfType) { return printBlockToJSON(block, selfType).toJSONString(); } - public static JSONObject printBlockToJSON(Block block,boolean selfType ) { + public static JSONObject printBlockToJSON(Block block, boolean selfType) { BlockCapsule blockCapsule = new BlockCapsule(block); String blockID = ByteArray.toHexString(blockCapsule.getBlockId().getBytes()); JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(block, selfType)); jsonObject.put("blockID", blockID); if (!blockCapsule.getTransactions().isEmpty()) { jsonObject.put("transactions", printTransactionListToJSON(blockCapsule.getTransactions(), - selfType)); + selfType)); } return jsonObject; } - public static String printTransactionList(TransactionList list, boolean selfType ) { + public static String printTransactionList(TransactionList list, boolean selfType) { List transactions = list.getTransactionList(); - JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType )); + JSONObject jsonObject = JSONObject.parseObject(JsonFormat.printToString(list, selfType)); JSONArray jsonArray = new JSONArray(); transactions.stream().forEach(transaction -> { - jsonArray.add(printTransactionToJSON(transaction, selfType )); + jsonArray.add(printTransactionToJSON(transaction, selfType)); }); jsonObject.put("transaction", jsonArray); return jsonObject.toJSONString(); } - public static JSONArray printTransactionListToJSON(List list, boolean selfType ) { + public static JSONArray printTransactionListToJSON(List list, + boolean selfType) { JSONArray transactions = new JSONArray(); list.stream().forEach(transactionCapsule -> { transactions.add(printTransactionToJSON(transactionCapsule.getInstance(), selfType)); @@ -120,55 +124,56 @@ public static JSONArray printTransactionListToJSON(List list return transactions; } - public static String printEasyTransferResponse(EasyTransferResponse response, boolean selfType ) { + public static String printEasyTransferResponse(EasyTransferResponse response, boolean selfType) { JSONObject jsonResponse = JSONObject.parseObject(JsonFormat.printToString(response, selfType)); - jsonResponse.put("transaction", printTransactionToJSON(response.getTransaction(), selfType )); + jsonResponse.put("transaction", printTransactionToJSON(response.getTransaction(), selfType)); return jsonResponse.toJSONString(); } - public static String printTransaction(Transaction transaction, boolean selfType ) { + public static String printTransaction(Transaction transaction, boolean selfType) { return printTransactionToJSON(transaction, selfType).toJSONString(); } - public static String printCreateTransaction(Transaction transaction, boolean selfType ) { + public static String printCreateTransaction(Transaction transaction, boolean selfType) { JSONObject jsonObject = printTransactionToJSON(transaction, selfType); jsonObject.put("visible", selfType); return jsonObject.toJSONString(); } public static String printTransactionExtention(TransactionExtention transactionExtention, - boolean selfType ) { - String string = JsonFormat.printToString(transactionExtention, selfType ); + boolean selfType) { + String string = JsonFormat.printToString(transactionExtention, selfType); JSONObject jsonObject = JSONObject.parseObject(string); if (transactionExtention.getResult().getResult()) { JSONObject transactionOjbect = printTransactionToJSON( - transactionExtention.getTransaction(), selfType ); + transactionExtention.getTransaction(), selfType); transactionOjbect.put("visible", selfType); jsonObject.put("transaction", transactionOjbect); } return jsonObject.toJSONString(); } - public static String printTransactionSignWeight(TransactionSignWeight transactionSignWeight, boolean selfType ) { + public static String printTransactionSignWeight(TransactionSignWeight transactionSignWeight, + boolean selfType) { String string = JsonFormat.printToString(transactionSignWeight, selfType); JSONObject jsonObject = JSONObject.parseObject(string); JSONObject jsonObjectExt = jsonObject.getJSONObject("transaction"); jsonObjectExt .put("transaction", printTransactionToJSON(transactionSignWeight.getTransaction().getTransaction(), - selfType )); + selfType)); jsonObject.put("transaction", jsonObjectExt); return jsonObject.toJSONString(); } public static String printTransactionApprovedList( - TransactionApprovedList transactionApprovedList, boolean selfType ) { - String string = JsonFormat.printToString(transactionApprovedList, selfType ); + TransactionApprovedList transactionApprovedList, boolean selfType) { + String string = JsonFormat.printToString(transactionApprovedList, selfType); JSONObject jsonObject = JSONObject.parseObject(string); JSONObject jsonObjectExt = jsonObject.getJSONObject("transaction"); - jsonObjectExt - .put("transaction", - printTransactionToJSON(transactionApprovedList.getTransaction().getTransaction(), selfType)); + jsonObjectExt.put("transaction", + printTransactionToJSON(transactionApprovedList.getTransaction().getTransaction(), + selfType)); jsonObject.put("transaction", jsonObjectExt); return jsonObject.toJSONString(); } @@ -186,16 +191,17 @@ public static byte[] generateContractAddress(Transaction trx, byte[] ownerAddres } public static JSONObject printDeferredTransactionToJSON(DeferredTransaction deferredTransaction, - boolean selfType ) { - String string = JsonFormat.printToString(deferredTransaction, selfType ); + boolean selfType) { + String string = JsonFormat.printToString(deferredTransaction, selfType); JSONObject jsonObject = JSONObject.parseObject(string); - jsonObject.put("transaction", printTransactionToJSON(deferredTransaction.getTransaction(), selfType )); + jsonObject.put("transaction", printTransactionToJSON(deferredTransaction.getTransaction(), + selfType)); return jsonObject; } - public static JSONObject printTransactionToJSON(Transaction transaction, boolean selfType ) { + public static JSONObject printTransactionToJSON(Transaction transaction, boolean selfType) { JSONObject jsonTransaction = JSONObject.parseObject(JsonFormat.printToString(transaction, - selfType )); + selfType)); JSONArray contracts = new JSONArray(); transaction.getRawData().getContractList().stream().forEach(contract -> { try { @@ -205,118 +211,120 @@ public static JSONObject printTransactionToJSON(Transaction transaction, boolean case AccountCreateContract: AccountCreateContract accountCreateContract = contractParameter .unpack(AccountCreateContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(accountCreateContract, selfType)); + contractJson = JSONObject.parseObject(JsonFormat.printToString(accountCreateContract, + selfType)); break; case TransferContract: TransferContract transferContract = contractParameter.unpack(TransferContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(transferContract, selfType)); + contractJson = JSONObject.parseObject(JsonFormat.printToString(transferContract, + selfType)); break; case TransferAssetContract: TransferAssetContract transferAssetContract = contractParameter .unpack(TransferAssetContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(transferAssetContract, - selfType )); + selfType)); break; case VoteAssetContract: VoteAssetContract voteAssetContract = contractParameter.unpack(VoteAssetContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(voteAssetContract, - selfType )); + selfType)); break; case VoteWitnessContract: VoteWitnessContract voteWitnessContract = contractParameter .unpack(VoteWitnessContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(voteWitnessContract, - selfType )); + selfType)); break; case WitnessCreateContract: WitnessCreateContract witnessCreateContract = contractParameter .unpack(WitnessCreateContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(witnessCreateContract, - selfType )); + selfType)); break; case AssetIssueContract: AssetIssueContract assetIssueContract = contractParameter .unpack(AssetIssueContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(assetIssueContract, - selfType )); + selfType)); break; case WitnessUpdateContract: WitnessUpdateContract witnessUpdateContract = contractParameter .unpack(WitnessUpdateContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(witnessUpdateContract, - selfType )); + selfType)); break; case ParticipateAssetIssueContract: ParticipateAssetIssueContract participateAssetIssueContract = contractParameter .unpack(ParticipateAssetIssueContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(participateAssetIssueContract, selfType )); + .parseObject(JsonFormat.printToString(participateAssetIssueContract, selfType)); break; case AccountUpdateContract: AccountUpdateContract accountUpdateContract = contractParameter .unpack(AccountUpdateContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(accountUpdateContract, - selfType )); + selfType)); break; case FreezeBalanceContract: FreezeBalanceContract freezeBalanceContract = contractParameter .unpack(FreezeBalanceContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(freezeBalanceContract, - selfType )); + selfType)); break; case UnfreezeBalanceContract: UnfreezeBalanceContract unfreezeBalanceContract = contractParameter .unpack(UnfreezeBalanceContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(unfreezeBalanceContract, selfType )); + .parseObject(JsonFormat.printToString(unfreezeBalanceContract, selfType)); break; case WithdrawBalanceContract: WithdrawBalanceContract withdrawBalanceContract = contractParameter - .unpack(WithdrawBalanceContract.class); + .unpack(WithdrawBalanceContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(withdrawBalanceContract, selfType )); + .parseObject(JsonFormat.printToString(withdrawBalanceContract, selfType)); break; case UnfreezeAssetContract: UnfreezeAssetContract unfreezeAssetContract = contractParameter .unpack(UnfreezeAssetContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(unfreezeAssetContract, - selfType )); + selfType)); break; case UpdateAssetContract: UpdateAssetContract updateAssetContract = contractParameter .unpack(UpdateAssetContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(updateAssetContract, - selfType )); + selfType)); break; case ProposalCreateContract: ProposalCreateContract proposalCreateContract = contractParameter - .unpack(ProposalCreateContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(proposalCreateContract - , selfType )); + .unpack(ProposalCreateContract.class); + contractJson = JSONObject.parseObject(JsonFormat.printToString(proposalCreateContract, + selfType)); break; case ProposalApproveContract: ProposalApproveContract proposalApproveContract = contractParameter - .unpack(ProposalApproveContract.class); + .unpack(ProposalApproveContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(proposalApproveContract, selfType )); + .parseObject(JsonFormat.printToString(proposalApproveContract, selfType)); break; case ProposalDeleteContract: ProposalDeleteContract proposalDeleteContract = contractParameter - .unpack(ProposalDeleteContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(proposalDeleteContract - , selfType )); + .unpack(ProposalDeleteContract.class); + contractJson = JSONObject.parseObject(JsonFormat.printToString(proposalDeleteContract, + selfType)); break; case SetAccountIdContract: - Contract.SetAccountIdContract setAccountIdContract = - contractParameter.unpack(Contract.SetAccountIdContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(setAccountIdContract - , selfType )); + Contract.SetAccountIdContract setAccountIdContract = + contractParameter.unpack(Contract.SetAccountIdContract.class); + contractJson = JSONObject.parseObject(JsonFormat.printToString(setAccountIdContract, + selfType)); break; case CreateSmartContract: CreateSmartContract deployContract = contractParameter .unpack(CreateSmartContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(deployContract, - selfType )); + selfType)); byte[] ownerAddress = deployContract.getOwnerAddress().toByteArray(); byte[] contractAddress = generateContractAddress(transaction, ownerAddress); jsonTransaction.put("contract_address", ByteArray.toHexString(contractAddress)); @@ -325,62 +333,62 @@ public static JSONObject printTransactionToJSON(Transaction transaction, boolean TriggerSmartContract triggerSmartContract = contractParameter .unpack(TriggerSmartContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(triggerSmartContract, - selfType )); + selfType)); break; case UpdateSettingContract: UpdateSettingContract updateSettingContract = contractParameter - .unpack(UpdateSettingContract.class); + .unpack(UpdateSettingContract.class); contractJson = JSONObject.parseObject(JsonFormat.printToString(updateSettingContract, - selfType )); + selfType)); break; case ExchangeCreateContract: ExchangeCreateContract exchangeCreateContract = contractParameter .unpack(ExchangeCreateContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(exchangeCreateContract - , selfType )); + contractJson = JSONObject.parseObject(JsonFormat.printToString(exchangeCreateContract, + selfType)); break; case ExchangeInjectContract: ExchangeInjectContract exchangeInjectContract = contractParameter .unpack(ExchangeInjectContract.class); - contractJson = JSONObject.parseObject(JsonFormat.printToString(exchangeInjectContract - , selfType )); + contractJson = JSONObject.parseObject(JsonFormat.printToString(exchangeInjectContract, + selfType)); break; case ExchangeWithdrawContract: ExchangeWithdrawContract exchangeWithdrawContract = contractParameter .unpack(ExchangeWithdrawContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(exchangeWithdrawContract, selfType )); + .parseObject(JsonFormat.printToString(exchangeWithdrawContract, selfType)); break; case ExchangeTransactionContract: ExchangeTransactionContract exchangeTransactionContract = contractParameter .unpack(ExchangeTransactionContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(exchangeTransactionContract, selfType )); + .parseObject(JsonFormat.printToString(exchangeTransactionContract, selfType)); break; case UpdateEnergyLimitContract: UpdateEnergyLimitContract updateEnergyLimitContract = contractParameter - .unpack(UpdateEnergyLimitContract.class); + .unpack(UpdateEnergyLimitContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(updateEnergyLimitContract, selfType )); + .parseObject(JsonFormat.printToString(updateEnergyLimitContract, selfType)); break; case AccountPermissionUpdateContract: AccountPermissionUpdateContract accountPermissionUpdateContract = contractParameter .unpack(AccountPermissionUpdateContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(accountPermissionUpdateContract, selfType )); + .parseObject(JsonFormat.printToString(accountPermissionUpdateContract, selfType)); break; case CancelDeferredTransactionContract: CancelDeferredTransactionContract cancelDeferredTransactionContract = contractParameter .unpack(CancelDeferredTransactionContract.class); contractJson = JSONObject .parseObject(JsonFormat.printToString(cancelDeferredTransactionContract, - selfType )); + selfType)); break; case ClearABIContract: Contract.ClearABIContract clearABIContract = contractParameter - .unpack(Contract.ClearABIContract.class); + .unpack(Contract.ClearABIContract.class); contractJson = JSONObject - .parseObject(JsonFormat.printToString(clearABIContract, selfType )); + .parseObject(JsonFormat.printToString(clearABIContract, selfType)); break; // todo add other contract default: @@ -391,7 +399,7 @@ public static JSONObject printTransactionToJSON(Transaction transaction, boolean JSONObject jsonContract = new JSONObject(); jsonContract.put("parameter", parameter); jsonContract.put("type", contract.getType()); - if (contract.getPermissionId() > 0 ) { + if (contract.getPermissionId() > 0) { jsonContract.put("Permission_id", contract.getPermissionId()); } contracts.add(jsonContract); @@ -408,15 +416,16 @@ public static JSONObject printTransactionToJSON(Transaction transaction, boolean String txID = ByteArray.toHexString(Sha256Hash.hash(transaction.getRawData().toByteArray())); jsonTransaction.put("txID", txID); - if (Objects.nonNull(transaction.getRawData().getDeferredStage()) && - transaction.getRawData().getDeferredStage().getDelaySeconds() > 0) { - jsonTransaction.put("delaySeconds", transaction.getRawData().getDeferredStage().getDelaySeconds()); + if (Objects.nonNull(transaction.getRawData().getDeferredStage()) + && transaction.getRawData().getDeferredStage().getDelaySeconds() > 0) { + jsonTransaction.put("delaySeconds", + transaction.getRawData().getDeferredStage().getDelaySeconds()); jsonTransaction.put("deferredStage", transaction.getRawData().getDeferredStage().getStage()); } return jsonTransaction; } - public static Transaction packTransaction(String strTransaction, boolean selfType ) { + public static Transaction packTransaction(String strTransaction, boolean selfType) { JSONObject jsonTransaction = JSONObject.parseObject(strTransaction); JSONObject rawData = jsonTransaction.getJSONObject("raw_data"); JSONArray contracts = new JSONArray(); @@ -438,8 +447,8 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp break; case "TransferContract": TransferContract.Builder transferContractBuilder = TransferContract.newBuilder(); - JsonFormat - .merge(parameter.getJSONObject("value").toJSONString(), transferContractBuilder, selfType); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), + transferContractBuilder, selfType); any = Any.pack(transferContractBuilder.build()); break; case "TransferAssetContract": @@ -451,15 +460,15 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp break; case "VoteAssetContract": VoteAssetContract.Builder voteAssetContractBuilder = VoteAssetContract.newBuilder(); - JsonFormat - .merge(parameter.getJSONObject("value").toJSONString(), voteAssetContractBuilder, selfType); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), + voteAssetContractBuilder, selfType); any = Any.pack(voteAssetContractBuilder.build()); break; case "VoteWitnessContract": - VoteWitnessContract.Builder voteWitnessContractBuilder = VoteWitnessContract - .newBuilder(); - JsonFormat - .merge(parameter.getJSONObject("value").toJSONString(), voteWitnessContractBuilder, selfType); + VoteWitnessContract.Builder voteWitnessContractBuilder = + VoteWitnessContract.newBuilder(); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), + voteWitnessContractBuilder, selfType); any = Any.pack(voteWitnessContractBuilder.build()); break; case "WitnessCreateContract": @@ -471,8 +480,8 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp break; case "AssetIssueContract": AssetIssueContract.Builder assetIssueContractBuilder = AssetIssueContract.newBuilder(); - JsonFormat - .merge(parameter.getJSONObject("value").toJSONString(), assetIssueContractBuilder, selfType); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), + assetIssueContractBuilder, selfType); any = Any.pack(assetIssueContractBuilder.build()); break; case "WitnessUpdateContract": @@ -512,9 +521,9 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp break; case "WithdrawBalanceContract": WithdrawBalanceContract.Builder withdrawBalanceContractBuilder = WithdrawBalanceContract - .newBuilder(); + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - withdrawBalanceContractBuilder, selfType); + withdrawBalanceContractBuilder, selfType); any = Any.pack(withdrawBalanceContractBuilder.build()); break; case "UnfreezeAssetContract": @@ -527,110 +536,113 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp case "UpdateAssetContract": UpdateAssetContract.Builder updateAssetContractBuilder = UpdateAssetContract .newBuilder(); - JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), updateAssetContractBuilder, selfType); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), + updateAssetContractBuilder, selfType); any = Any.pack(updateAssetContractBuilder.build()); break; case "ProposalCreateContract": - ProposalCreateContract.Builder ProposalCreateContractBuilder = ProposalCreateContract - .newBuilder(); + ProposalCreateContract.Builder createContractBuilder = ProposalCreateContract + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - ProposalCreateContractBuilder, selfType); - any = Any.pack(ProposalCreateContractBuilder.build()); + createContractBuilder, selfType); + any = Any.pack(createContractBuilder.build()); break; case "ProposalApproveContract": - ProposalApproveContract.Builder ProposalApproveContractBuilder = ProposalApproveContract - .newBuilder(); + ProposalApproveContract.Builder approveContractBuilder = ProposalApproveContract + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - ProposalApproveContractBuilder, selfType); - any = Any.pack(ProposalApproveContractBuilder.build()); + approveContractBuilder, selfType); + any = Any.pack(approveContractBuilder.build()); break; case "ProposalDeleteContract": - ProposalDeleteContract.Builder ProposalDeleteContractBuilder = ProposalDeleteContract - .newBuilder(); + ProposalDeleteContract.Builder deleteContractBuilder = ProposalDeleteContract + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - ProposalDeleteContractBuilder, selfType); - any = Any.pack(ProposalDeleteContractBuilder.build()); + deleteContractBuilder, selfType); + any = Any.pack(deleteContractBuilder.build()); break; case "SetAccountIdContract": - Contract.SetAccountIdContract .Builder setAccountid = Contract.SetAccountIdContract - .newBuilder(); + Contract.SetAccountIdContract.Builder setAccountid = Contract.SetAccountIdContract + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - setAccountid, selfType); + setAccountid, selfType); any = Any.pack(setAccountid.build()); break; case "CreateSmartContract": CreateSmartContract.Builder createSmartContractBuilder = CreateSmartContract - .newBuilder(); + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - createSmartContractBuilder, selfType); + createSmartContractBuilder, selfType); any = Any.pack(createSmartContractBuilder.build()); break; case "TriggerSmartContract": TriggerSmartContract.Builder triggerSmartContractBuilder = TriggerSmartContract .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - triggerSmartContractBuilder, selfType); + triggerSmartContractBuilder, selfType); any = Any.pack(triggerSmartContractBuilder.build()); break; case "UpdateSettingContract": - UpdateSettingContract.Builder UpdateSettingContractBuilder = UpdateSettingContract - .newBuilder(); + UpdateSettingContract.Builder updateSettingContractBuilder = UpdateSettingContract + .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - UpdateSettingContractBuilder, selfType); - any = Any.pack(UpdateSettingContractBuilder.build()); + updateSettingContractBuilder, selfType); + any = Any.pack(updateSettingContractBuilder.build()); break; case "ExchangeCreateContract": ExchangeCreateContract.Builder exchangeCreateContractBuilder = ExchangeCreateContract .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - exchangeCreateContractBuilder, selfType); + exchangeCreateContractBuilder, selfType); any = Any.pack(exchangeCreateContractBuilder.build()); break; case "ExchangeInjectContract": ExchangeInjectContract.Builder exchangeInjectContractBuilder = ExchangeInjectContract .newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - exchangeInjectContractBuilder, selfType); + exchangeInjectContractBuilder, selfType); any = Any.pack(exchangeInjectContractBuilder.build()); break; case "ExchangeTransactionContract": ExchangeTransactionContract.Builder exchangeTransactionContractBuilder = ExchangeTransactionContract.newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - exchangeTransactionContractBuilder, selfType); + exchangeTransactionContractBuilder, selfType); any = Any.pack(exchangeTransactionContractBuilder.build()); break; case "ExchangeWithdrawContract": ExchangeWithdrawContract.Builder exchangeWithdrawContractBuilder = ExchangeWithdrawContract.newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - exchangeWithdrawContractBuilder, selfType); + exchangeWithdrawContractBuilder, selfType); any = Any.pack(exchangeWithdrawContractBuilder.build()); break; case "UpdateEnergyLimitContract": - UpdateEnergyLimitContract.Builder UpdateEnergyLimitContractBuilder = UpdateEnergyLimitContract - .newBuilder(); + UpdateEnergyLimitContract.Builder updateEnergyLimitContractBuilder = + UpdateEnergyLimitContract.newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - UpdateEnergyLimitContractBuilder, selfType); - any = Any.pack(UpdateEnergyLimitContractBuilder.build()); + updateEnergyLimitContractBuilder, selfType); + any = Any.pack(updateEnergyLimitContractBuilder.build()); break; case "AccountPermissionUpdateContract": - AccountPermissionUpdateContract.Builder AccountPermissionUpdateContractBuilder = + AccountPermissionUpdateContract.Builder accountPermissionUpdateContractBuilder = AccountPermissionUpdateContract.newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - AccountPermissionUpdateContractBuilder, selfType); - any = Any.pack(AccountPermissionUpdateContractBuilder.build()); + accountPermissionUpdateContractBuilder, selfType); + any = Any.pack(accountPermissionUpdateContractBuilder.build()); break; case "CancelDeferredTransactionContract": - CancelDeferredTransactionContract.Builder CancelDeferredTransactionContractBuilder = + CancelDeferredTransactionContract.Builder cancelDeferredTransactionContractBuilder = CancelDeferredTransactionContract.newBuilder(); JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), - CancelDeferredTransactionContractBuilder, selfType ); - any = Any.pack(CancelDeferredTransactionContractBuilder.build()); + cancelDeferredTransactionContractBuilder, selfType); + any = Any.pack(cancelDeferredTransactionContractBuilder.build()); break; case "ClearABIContract": - Contract.ClearABIContract.Builder clearABIContract = Contract.ClearABIContract.newBuilder(); - JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), clearABIContract, selfType ); + Contract.ClearABIContract.Builder clearABIContract = + Contract.ClearABIContract.newBuilder(); + JsonFormat.merge(parameter.getJSONObject("value").toJSONString(), clearABIContract, + selfType); any = Any.pack(clearABIContract.build()); break; // todo add other contract @@ -665,20 +677,18 @@ public static void checkBodySize(String body) throws Exception { } } - public static boolean getVisible(final HttpServletRequest request ) - { + public static boolean getVisible(final HttpServletRequest request) { boolean visible = false; - if ( StringUtil.isNotBlank(request.getParameter("visible")) ) { + if (StringUtil.isNotBlank(request.getParameter("visible"))) { visible = Boolean.valueOf(request.getParameter("visible")); } return visible; } - public static boolean getVisiblePost(final String input ) - { + public static boolean getVisiblePost(final String input) { boolean visible = false; JSONObject jsonObject = JSON.parseObject(input); - if ( jsonObject.containsKey("visible") ) { + if (jsonObject.containsKey("visible")) { visible = jsonObject.getBoolean("visible"); } @@ -690,22 +700,22 @@ public static String getHexAddress(final String address) { byte[] addressByte = Wallet.decodeFromBase58Check(address); return ByteArray.toHexString(addressByte); } else { - return null; + return null; } } public static String getHexString(final String string) { - return ByteArray.toHexString(ByteString.copyFromUtf8( string ).toByteArray()); + return ByteArray.toHexString(ByteString.copyFromUtf8(string).toByteArray()); } - public static Transaction setTransactionPermissionId(JSONObject jsonObject, Transaction transaction) - { - if (jsonObject.containsKey(PERMISSION_ID) ) { + public static Transaction setTransactionPermissionId(JSONObject jsonObject, + Transaction transaction) { + if (jsonObject.containsKey(PERMISSION_ID)) { int permissionId = jsonObject.getInteger(PERMISSION_ID); - if (permissionId > 0 ) { + if (permissionId > 0) { Transaction.raw.Builder raw = transaction.getRawData().toBuilder(); Transaction.Contract.Builder contract = raw.getContract(0).toBuilder() - .setPermissionId(permissionId); + .setPermissionId(permissionId); raw.clearContract(); raw.addContract(contract); return transaction.toBuilder().setRawData(raw).build(); @@ -714,14 +724,25 @@ public static Transaction setTransactionPermissionId(JSONObject jsonObject, Tran return transaction; } - public static boolean getVisibleOnlyForSign(JSONObject jsonObject) { + public static boolean getVisibleOnlyForSign(JSONObject jsonObject) { boolean visible = false; - if ( jsonObject.containsKey("visible") ) { + if (jsonObject.containsKey("visible")) { visible = jsonObject.getBoolean("visible"); - } else if ( jsonObject.getJSONObject("transaction").containsKey("visible")) { + } else if (jsonObject.getJSONObject("transaction").containsKey("visible")) { visible = jsonObject.getJSONObject("transaction").getBoolean("visible"); } return visible; } + public static String parseMethod(String methodSign, String input) { + byte[] selector = new byte[4]; + System.arraycopy(Hash.sha3(methodSign.getBytes()), 0, selector, 0, 4); + //System.out.println(methodSign + ":" + Hex.toHexString(selector)); + if (input.length() == 0) { + return Hex.toHexString(selector); + } + + return Hex.toHexString(selector) + input; + } + } From 4dcb04b656dbbb6529f4f4732b5474a4929228f6 Mon Sep 17 00:00:00 2001 From: Hou Date: Sun, 5 May 2019 15:14:38 +0800 Subject: [PATCH 2/2] delete useless parameters --- .../core/services/http/TriggerConstantContractServlet.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java b/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java index 9e4fdfab6df..a769826841c 100644 --- a/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java +++ b/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java @@ -54,9 +54,6 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String parameter = jsonObject.getString("parameter"); String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - build.setCallTokenValue(jsonObject.getLongValue("call_token_value")); - build.setTokenId(jsonObject.getLongValue("token_id")); - build.setCallValue(jsonObject.getLongValue("call_value")); long feeLimit = jsonObject.getLongValue("fee_limit"); TransactionCapsule trxCap = wallet